2012-05-13 7 views
4

IATのフックを実行するコードをWindowsに作成しています。 IAT(Kernel32!GetCurrentProcessId)のターゲット関数のアドレスを変更することができますが、後でプログラムでKook32という名前の関数が呼び出されたときに!GetCurrentProcessIdがフックの代わりに呼び出されます。 !私はカーネルGetCurrentProcessIdの元のIATのアドレスを見ることができる午前プロセスをデバッグするにはIATがフックされているがフック機能が呼び出されていない

GetCurrentProcessIdアドレス:7C8099C0

私は交換したい機能は次のとおりです。

MyGetCurrentProcessIdアドレス: 100118BB

私はthunkIAT-> u1.Functionのアドレスをフックして7C8099C0から100118BBに変更しますが、progra内からGetCurrentProcessId()が呼び出されたときに前述したようにm Kernel32関数が呼び出されます(私が注入したものではありません)。

フックをキャリーアウトするコードの一部は次のとおりです。

if(strcmp(apiName,(char*)(*nameData).Name)==0) 
{ 
DBG_PRINT2("[processImportDescriptor]: found match for %s\n", apiName); 

VirtualProtect(
    &thunkIAT->u1.Function, // start addres of the zone to "unlock" 
    0x010, // size to protect 
    PAGE_EXECUTE_READWRITE, // new permission 
    &dwOldProtect   // old permission 
); 

procPtr = MyGetCurrentProcessId; 
thunkIAT->u1.Function = (DWORD)procPtr; 

DBG_PRINT2("MyGetCurrentProcessId() address: %08X\n", MyGetCurrentProcessId); 
DBG_PRINT2("procPtr address: %08X\n", procPtr); 
DBG_PRINT2("thunkIAT->u1.Function address: %08X\n", thunkIAT->u1.Function); 

VirtualProtect(
    &thunkIAT->u1.Function, // start addres of the zone to "relock" 
    0x0010,   // size to protect 
    dwOldProtect,  // new permission 
    &dwOldProtect2  // old permission 
); 

} 

任意の考え?ありがとうございました。私は単純にその報告をするために書かれた私のHelloworldプログラム内GetCurrentProcessId()に(これはクラッシュの結果として注入DLL IATS内のフックを挿入しませんでした)すべてIATS'関数呼び出しをフックすることができましたCreateToolhelp32Snapshot APIを利用して

+0

を、関数が呼び出されることがありますバイナリがそれをインポートしたとしても、GetProcAddressによって検索されます。しかし、質問そのものはあなたが与える少しの情報で、広すぎます。 – 0xC0000022L

+0

万が一、DLLを注入していますか?その場合は、実行可能ファイル内のすべてのモジュールに独自のIATがあることに注意してください。これは、DLLモジュールのIATをフックしただけで、メイン実行可能ファイルのIATをフックしていない可能性があることを意味します。 'Create32Toolhelp32Snapshot' /' Module32First'/'Next'を使ってモジュールを繰り返し処理し、それらをすべてフックできます。 –

+0

ご連絡ありがとうございます。ありがとうございます。もう少し詳しく説明すると、私はCreateRemoteThreadを使ってDLLを注入し、dspをmspaint.exeに注入しています。 DLLのコードは、mspaint内のIAT(Kernel32 IATを含む約12個)を反復処理することができます。 DLL内では、GetCurrentProcessId()を "case DLL_THREAD_DETACH:case"内で直接呼び出します(フックが実装された後)。 Windbgでプログラムを実行すると、GetCurrentProcessId()の呼び出しはIATでルックアップを呼び出しません(以前の呼び出しから値がキャッシュされる可能性があることを示唆しています)。まだplugg'n離れて。ありがとう。 – Chris

答えて

2

数秒ごとにプロセスID。 DLLの注入に続いて、GetCurrentProcessId()Helloworldのフックは、期待どおりフックされた機能を呼び出すようになった。私の研究の間に私は、IATのフックは、現代のプログラムで防御に建てによる特定の場合には動作しないことが理由としていくつかの情報を発見しました:1の場合

http://www.codeproject.com/Articles/12516/Win32-API-hooking-Another-reason-why-it-might-not
http://www.codeproject.com/Articles/21414/Powerful-x86-x64-Mini-Hook-Engine

関連する問題