我通过函数偏移挂钩外部进程中的函数。这对于我到目前为止挂钩的函数效果很好 - 但是我发现了一个“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 *,...)。
答案 0 :(得分:3)
“绕道”需要至少5个字节才能工作(x86) - debugMessage
只有3个字节。
答案 1 :(得分:2)
该功能可能太小而无法挂钩。 Detours必须覆盖一个钩子函数的药水,以便将调用重定向到其他地方,但是Detours的日志记录存根可能没有足够的空间来编写针对您替换的JMP指令。