6

我通过函数偏移量在外部进程中挂钩函数。到目前为止,这对于我挂钩的函数来说效果很好——但是我发现了一个“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*,...)。

4

2 回答 2

4

“绕道”至少需要 5 个字节才能工作(x86)——debugMessage只有 3 个字节。

于 2011-08-20T16:09:16.613 回答
3

该函数可能太小而无法挂钩。Detours 必须覆盖挂钩函数的一部分以将调用重定向到其他地方,但是该日志存根中可能没有足够的空间供 Detours 编写针对您的替代品的 JMP 指令。

于 2011-08-20T14:18:08.067 回答