2011-08-20 9 views
6

関数のオフセットを使用して外部プロセスに関数をフックします。まだバイナリに存在して、印刷を行うdoes notの私は、「DEBUGLOG(文字...)」機能を発見した - しかし - それは、IM、これまでに引っ掛ける機能に適しています、それはこの"空"関数の外部プロセスでの迂回フックは機能しません。

debugMessage proc near    ; 
      xor  eax, eax  ; Logical Exclusive OR 
      retn     ; Return Near from Procedure 
debugMessage endp 

のように見えること私は単に、すでにバイナリで同様のFUNC(CHAR ...)にフックすることができたとして、今すぐデバッグメッセージは明らかに無効になっている。この

push offset debugString ; "This is a debug message"... 
call debugMessage ; Call Procedure 

のように呼ばれて、私はこれをフックしたかったです。

これはコードです:

typedef void (__stdcall* DebugLog)(const char*); 
DebugLog Real_DebugLog = (DebugLog)(0xCAFEBABE); 

extern "C" 
{ 
static void __stdcall Hook_DebugLog(const char*); 
} 

void __stdcall Hook_DebugLog(const char* text) { 
MessageBox(NULL, text, "MyDebugLog", MB_OK); 
return Real_DebugLog(text); 
} 

// in dll main attach.. 
DetourTransactionBegin(); 
DetourUpdateThread(GetCurrentThread()); 
DetourAttach(&(PVOID&)Real_DebugLog, (PVOID)Hook_DebugLog); 

同様のアプローチは、私がこれまでのところ、このバイナリにフックしている他のすべての機能のために動作します。また、debugMessageがデバッガでも呼び出されるようにしました。

このフックがまったく機能しない理由は何ですか?関数がvar argsを持つ可能性があるためでしょうか?私は既にconst char *、...)を試してみました。

答えて

2

機能が小さすぎてフックできない可能性があります。 Detoursは、呼び出しを他の場所にリダイレクトするために、フックされた機能の一部を上書きしなければなりませんが、Detoursがその交換用のJMP命令を書き込むためのロギングスタブに十分な空きがない可能性があります。

+0

ありがとうございます - 別の解決策はありますか? – Steve

+0

他の方法は、代わりにすべてのコールサイトを迂回することです – paulm

3

"detour"は、動作するには最低5バイト必要(x86) - debugMessageはわずか3バイトです。

+0

特定の答えをありがとう、別の解決策を知っていますか? – Steve

+0

ソフトウェアまたはハードウェアブレークポイントを使用できます。 http://msdn.microsoft.com/en-us/library/ms679274(v=vs.85).aspx – Nop

+0

はい、少なくともソフトウェアブレークポイントが役立つかもしれません。フックしたい関数の最初のバイトの代わりに0xcc(int 3)を入れ、トラップハンドラを提供することができます。ベクタードされた例外処理(VEH)Noergaardが参考になるかもしれません。 – Eugene

関連する問題