関数のオフセットを使用して外部プロセスに関数をフックします。まだバイナリに存在して、印刷を行う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 *、...)を試してみました。
ありがとうございます - 別の解決策はありますか? – Steve
他の方法は、代わりにすべてのコールサイトを迂回することです – paulm