“空”功能的外部过程中的弯路钩子不起作用
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 添加令牌不起作用