troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

オープンソースのデバッガー x64_dbg を用いて、ソースコードを編集することなく、アプリにパッチを適用

オープンソースのデバッガーx64_dbg を用いて、ソースコードを編集することなく、アプリにパッチを適用

概要

オープンソースのデバッガーであるx64_dbg を用いて、ソースコードを編集することなく、アプリケーションにパッチを適用する方法を紹介します。

内容

x64_dbg とは?
x64_dbg とは、オープンソースのデバッガーです。x32 とx64 のWindows アプリケーションに対応しています。
公式サイトの”Download” から、x64_dbg のダウンロードが可能です。
x64_dbg のサイト

今回紹介する内容
x64_dbg を用いて、アプリケーションをアセンブラレベルで変更し、アプリにパッチを適用する方法を紹介します。
すなわち、アプリのソースコードやシンボルファイルは必要ありません。

今回用いるアプリは、実行するとメッセージボックスが表示される64bit のアプリです。
アプリを実行すると、メッセージボックスが表示される

このアプリを、アセンブラレベルで変更し、メッセージボックスを表示させないようにさせます。

x64_dbg を用いた、アプリにパッチを適用する方法
1. ダウンロードしたrar ファイルを展開し、x64 フォルダにある”x64_dbg.exe” を起動します。
x64_dbg.exe を起動

2. “File” → “Open” から、サンプルアプリ(名前は、mytest1.exe) を起動します。
Open

3. mytest1.exe のアセンブラを開きます。
3.1. “Symbols” タブの”mytest1.exe” をダブルクリックします。
“Symbols” タブの”mytest1.exe” をダブルクリック

3.2. タイトルの“Module” が”mytest1.exe” となっており、mytest1.exe のアセンブラが開かれている事が確認できます。
“Module” が”mytest1.exe” となっており、mytest1.exe のアセンブラが開かれている事が確認できる

4. 今回のパッチの目的はメッセージボックスを表示させないことです。
よって、メッセージボックスを呼び出している部分のアセンブラを探します。
4.1. アセンブラのウィンドウを右クリック → “Search for” → “Intermodular calls” を実行します。
Intermodular calls

4.2. MessageBoxW 関数を呼んでいるアセンブラの場所が表示されます。
”call qword ptr ds:[<&MessageBoxW>]” の行です。
この行をダブルクリックします。
MessageBoxW 関数を呼んでいるアドレスが確認できる

4.3. MessageBoxW 関数を呼んでいる部分のアセンブラが確認できます。
MessageBoxW 関数を呼んでいる部分のアセンブラが確認できる

5. 該当部分のアセンブラを解析すると、MessageBoxW を呼ばないようにするには、jle(= Jump if Less or Equal) の分岐を変更すればいいことがわかります。
具体的には、jle をjmp に変更し、無条件にジャンプさせればMessgaBoxW は呼ばれません。
5.1. jle をjmp に変更するために、”jle mytest1.7FF6AA7F131C” をダブルクリックします。
”jle mytest1.7FF6AA7F131C” をダブルクリック

5.2. jle をjmp に変更します。
変更前はjle
194-10

5.3. アセンブラが変更されたことが確認できます。
アセンブラが変更された

6. 変更されたアプリを保存します。
6.1 “View” → “Patches” をクリックします。
Patches

6.2. “Patch File” をクリックし、new_mytest1.exe で保存します。
Patch File

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アセンブリの編集


  1. 2014/09/09(火) 22:59:28|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<カーネルデバッグでユーザーモードプロセスのライブデバッグを行う方法 | ホーム | Message Analyzer のデーターをグラフ化>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/194-13d181aa
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。