我通过函数偏移量在外部进程中挂钩函数。到目前为止,这对于我挂钩的函数来说效果很好——但是我发现了一个“debugLog(char ...)”函数,它仍然存在于二进制文件中但不做任何打印——它看起来像这样
debugMessage proc near ;
xor eax, eax ; Logical Exclusive OR
retn ; Return Near from Procedure
debugMessage endp
它是这样称呼的
push offset debugString ; "This is a debug message"...
call debugMessage ; Call Procedure
现在调试消息显然已被禁用,我想连接到这个,因为我已经能够简单地连接到二进制文件中的类似 func(char..)。
这是代码:
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*,...)。