“空”功能的外部过程中的弯路钩子不起作用

Posted

技术标签:

【中文标题】“空”功能的外部过程中的弯路钩子不起作用【英文标题】:Detours Hook in external process for "empty" function does not work 【发布时间】:2011-08-20 11:29:55 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢您的具体回答,您知道另一种解决方案吗? 您可以使用软件或硬件断点。看看msdn.microsoft.com/en-us/library/ms679274(v=vs.85).aspx 是的,至少软件断点可能会有所帮助。您可以使用 0xcc (int 3) 代替要挂钩的函数的第一个字节,并提供陷阱处理​​程序。 Noergaard 提到的向量异常处理 (VEH) 在这里可能会有所帮助。【参考方案2】:

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

【讨论】:

唯一的其他方法是绕过所有呼叫站点

以上是关于“空”功能的外部过程中的弯路钩子不起作用的主要内容,如果未能解决你的问题,请参考以下文章

完全外部连接不起作用 - 无论空活动如何,都需要返回所有日期

autoHideDuration 在使用钩子的 Snackbar 中不起作用[关闭]

反应:通过状态钩子在 loginHandler 函数中向 localStorage 添加令牌不起作用

我的钩子不起作用

尽管控制台没有显示错误,但 useHistory 钩子不起作用

使用 jest 模拟 react-router-dom 钩子不起作用