1

問題:

プログラムに注入して呼び出しにパッチを当てていますが、アプリケーションを 1 行ずつ見て特定の呼び出しを見つける方法があるかどうか疑問に思っていました。_IE: プログラム 'Foo.exe' がメモリ内のある場所でMessageBoxを呼び出しているとします。

次のコードを実行した場合:(大まかな考えです)

a = GetModuleHandle ( "<dll>" ); 
b = GetProcAddress ( a , "<name>" );
swap ( b , (DWORD)*fake_function );

-- 実際の関数の呼び出しを開始するまで、すべてがうまく機能します。これにより、永遠に続く巨大なループが作成されます (痛い)。

今、私はこれについて確信が持てず、間違っているかもしれませんが...上記のコードはメモリ内の「Foo.exe」呼び出しを置き換えますか、それともdllの関数を「fake_function」に置き換えますか?

私はいくつかのことに興味があります...

A ) MessageBoxを呼び出す 'Foo,exe' 内のすべてのメモリ ロケーションを見つけて、それらのメモリ ロケーションを 'fake_function' の呼び出しに置き換えるにはどうすればよいですか?

B )迂回路はこの問題をどのように解決しますか?

4

1 に答える 1

1

MessageBox が呼び出されるすべてのインスタンスを見つける必要はありません。代わりに、関数をフックできます。あなたは一般的な考えを持っているように見えますが、あなたがしたいことは、問題のモジュールの PE インポート テーブルをたどることです。歩いているときは、フックしたい関数を探してから、スワップを行います。それ以降、モジュールが MessageBox 関数を呼び出すたびに、インポート テーブル内の関数への参照が検索され、以前は Microsoft の MessageBox の実装へのアドレスが見つかったはずの関数へのアドレスが検出されます。あなたの関数では、好きなことをすることができ、スワップ時に保存しなければならなかった MessageBox 関数の元のアドレスを呼び出すことさえできます。

于 2012-11-17T04:34:00.807 に答える