主程序调用wi.dll中的函数SetHook来安装全局WH_CBT钩子。
bool WI_API SetHook()
{
if (!g_hHook)
{
g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstDll, 0);
}
return g_hHook != NULL;
}
我假设在安装全局钩子之后,应该将wi.dll加载到每个进程的地址空间中。但是wi.dll仅加载到某些进程。例如,如果我启动Skype,MS Word我可以看到wi.dll也加载到这些进程中(使用Process Explorer),但是如果我运行Firefox,uTorrent,Adobe Reader,那么wi.dll不会加载到这些进程中
我使用的是W7 64位主程序,wi.dll是32位,这里提到的所有程序都是32位程序。
为什么会发生这种情况?
提前致谢。
答案 0 :(得分:1)
来自MSDN:
SetWindowsHookEx可用于将DLL注入另一个进程。 32位DLL无法注入64位进程,64位DLL无法注入32位进程。如果应用程序需要在其他进程中使用钩子,则需要32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,并且64位应用程序调用SetWindowsHookEx注入64位DLL进入64位进程。 32位和64位DLL必须具有不同的名称。
因此,您应该创建32位应用程序以从32位dll调用SetWindowsHookEx,然后将消息重定向到主应用程序,并使您的主应用程序在x64中从64位dll调用SetWindowsHookEx以接收来自x64进程也是如此。
答案 1 :(得分:0)
钩链机制不是防弹的,并且依赖于遵守规则的每个人。如果应用程序安装了自己的每个线程WH_CBT
挂钩并且在其挂钩过程中没有调用CallNextHookEx
,则不会调用先前的挂钩。请参阅CallNextHookEx
的MSDN文档。