【发布时间】:2011-06-28 03:26:18
【问题描述】:
我的应用程序由一个 EXE 和多个 DLL 组成。阅读Windows via C/C++ 后,我尝试在其中一个DLL 中对Sleep 函数执行挂钩,并期望挂钩将在EXE 和所有DLL 中工作。请注意,CAPIHook 代码来自 Windows via C/C++'s sample code
在 DLL 项目中
void WINAPI MySleep( DWORD dwMilliseconds );
CAPIHook g_Sleep("Kernel32.dll", "Sleep", (PROC)MySleep);
typedef void (WINAPI *Sleep_Type)( DWORD dwMilliseconds );
// Hook function.
void WINAPI MySleep( DWORD dwMilliseconds )
{
printf ("-------> In MySleep\n");
((Sleep_Type)(PROC)g_Sleep)(dwMilliseconds);
}
// This is an example of an exported function.
DLL_API int dll_function_which_is_going_to_call_sleep(void)
{
printf ("DLL function being called\n");
printf ("Call Sleep in DLL function\n");
Sleep(100);
return 42;
}
在 EXE 项目中
void CexeDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
printf ("Button being clicked\n");
printf ("Call Sleep in EXE function\n");
Sleep(100);
dll_function_which_is_going_to_call_sleep();
printf ("Call Sleep in EXE function\n");
Sleep(100);
dll_function_which_is_going_to_call_sleep();
}
这是我得到的输出
Button being clicked
Call Sleep in EXE function
-------> In MySleep
DLL function being called
Call Sleep in DLL function
Call Sleep in EXE function
-------> In MySleep
DLL function being called
Call Sleep in DLL function
让我感到奇怪的是,我期待CAPIHook 将在整个单个进程中生效。由于 EXE 和 DLL 属于同一个进程,因此两者都应该能够到达MySleep。但是,我的观察是,只有来自 EXE 的调用会到达MySleep,而不是 DLL。
我在这里找到示例代码CAPIHook-doesnt-have-effect-in-entire-process.zip,它包含dll 和exe 项目。
我也曾经将CHookAPI 替换为apihijack 中的代码。同样的问题仍然发生。挂钩效果不会扩散到整个流程。
有什么我错过的吗?请不要建议我使用 EasyHook、Detours 等,因为我只是想知道为什么上面的代码不起作用,以及如何修复它。
【问题讨论】: