オープンソースのデバッガーであるx64_dbg を用いて、ソースコードを編集することなく、アプリケーションにパッチを適用する方法を紹介します。
x64_dbg とは?
x64_dbg とは、オープンソースのデバッガーです。x32 とx64 のWindows アプリケーションに対応しています。
公式サイトの”Download” から、x64_dbg のダウンロードが可能です。
今回紹介する内容
x64_dbg を用いて、アプリケーションをアセンブラレベルで変更し、アプリにパッチを適用する方法を紹介します。
すなわち、アプリのソースコードやシンボルファイルは必要ありません。
今回用いるアプリは、実行するとメッセージボックスが表示される64bit のアプリです。
このアプリを、アセンブラレベルで変更し、メッセージボックスを表示させないようにさせます。
x64_dbg を用いた、アプリにパッチを適用する方法
1. ダウンロードしたrar ファイルを展開し、x64 フォルダにある”x64_dbg.exe” を起動します。
2. “File” → “Open” から、サンプルアプリ(名前は、mytest1.exe) を起動します。
3. mytest1.exe のアセンブラを開きます。
3.1. “Symbols” タブの”mytest1.exe” をダブルクリックします。
3.2. タイトルの“Module” が”mytest1.exe” となっており、mytest1.exe のアセンブラが開かれている事が確認できます。
4. 今回のパッチの目的はメッセージボックスを表示させないことです。
よって、メッセージボックスを呼び出している部分のアセンブラを探します。
4.1. アセンブラのウィンドウを右クリック → “Search for” → “Intermodular calls” を実行します。
4.2. MessageBoxW 関数を呼んでいるアセンブラの場所が表示されます。
”call qword ptr ds:[<&MessageBoxW>]” の行です。
この行をダブルクリックします。
4.3. MessageBoxW 関数を呼んでいる部分のアセンブラが確認できます。
5. 該当部分のアセンブラを解析すると、MessageBoxW を呼ばないようにするには、jle(= Jump if Less or Equal) の分岐を変更すればいいことがわかります。
具体的には、jle をjmp に変更し、無条件にジャンプさせればMessgaBoxW は呼ばれません。
5.1. jle をjmp に変更するために、”jle mytest1.7FF6AA7F131C” をダブルクリックします。
5.2. jle をjmp に変更します。
5.3. アセンブラが変更されたことが確認できます。
6. 変更されたアプリを保存します。
6.1 “View” → “Patches” をクリックします。
6.2. “Patch File” をクリックし、new_mytest1.exe で保存します。
7. パッチされたNew_mytest1.exe を実行してみます。
すると、メッセージボックスが表示されないことが確認できます。
今回用いたアプリのソースコード
今回用いたアプリのソースコードは以下です。
void MyFunc(int i){
if (i > 0){
MessageBox(NULL, _T("テストです"), _T("Message"), MB_OK);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
MyFunc(10);
printf("Test Application\n");
return 0;
}
x64_dbg の公式サイト (英語)
・http://x64dbg.com/#start
関連記事
・共にフリーで使えるJustDecompileとReflexilで、.NETアセンブリの編集