2016-03-29 28 views
3

MSデトゥルスのようないくつかのWindows API関数をフックする必要があります。外部ディスアセンブラライブラリを使わずにを実行します。ほとんどの32ビットWinAPIの関数として
バイトの次のシーケンスで開始:0x8B 0xFF 0x55 0x8B 0xEC、この作業はかなり簡単だった
x64 API逆アセンブラライブラリなしでフックする

mov edi, edi 
push ebp 
mov ebp, esp 

に変換されます。しかし、x64に関しては、状況は異なります。機能の冒頭にある指示は、ディスアセンブラエンジンを使用しないトランポリンにこれらの命令を再配置することは非常に困難です。

質問:私は本当にこれを行うために逆アセンブラエンジンが必要ですか、それとも別の方法ですか?

+0

「私は実際に逆アセンブラエンジンが必要ですか」 - 私の経験からは、そうです。 – Paul

答えて

1

機能コード自体の変更は、唯一のフック方法ではありません。 IAT (Import Address Table)フッキングも使用できます。 PE (portable executable)には、DLLファイルからインポートする必要がある機能のテーブルが含まれています。ローダーはこのテーブルを受け取り、要求された関数を探し、コードに制御を渡す前にプロセスメモリにアドレスを書き込みます。コード内のAPI関数呼び出しは、それらのアドレスを使用して、API関数がメモリ内のどこにロードされているかを認識します。関数呼び出しをコードにリダイレクトするためにローダが終了した後にメモリ内のIATを変更することによって、関数をフックできます。ここで

は、より多くの情報と例といくつかのリンクです:

+3

この方法は必ずしも機能しません。 DLL関数が動的にロードされている場合、IATには含まれていないので、代わりに 'GetProcAddress()'をフックし、要求された名前をチェックしてフック関数ポインタを返さなければなりません。いずれにしても、一部のアプリではIATを実行時のパッチ適用から積極的に保護しています。 [Win32 APIフック:それがうまくいかない別の理由]を参照してください(http://www.codeproject.com/Articles/12516/Win-API-hooking-Another-reason-why-it-might-not)。 –

+0

そして、EXE自体からの呼び出しをフックしたい場合は、関連するDLLのIATもフックする必要があります。 – kichik

1

私たちは私たち自身のライブラリを使用して、Windowsの機能の多くをフックするために使用されるが、ある時点で私たちはこれを見つけました:https://github.com/TsudaKageyu/minhook/、私は全面的にお勧めできます。 x86とx64の両方で動作します。

仮想テーブル内の仮想関数ポインタを変更することで、DirectXおよびComオブジェクトを引き続きフックしますが、他のすべてのフックの目的ではminhookを使用します。

これは逆アセンブラライブラリを含んでいますので、これが答えになるかどうかわかりませんが、コンパクトです。

関連する問題