SetWindowsHookEx的文档中说,
如果一个应用程序需要在其他进程中使用钩子,则要求32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,64位应用程序则调用SetWindowsHookEx将64位DLL注入64位进程。
这强烈意味着,当调用钩子过滤器回调时,运行的是钩子DLL的钩子应用程序副本中的代码。
但是,当我安装钩子时,我需要将一个函数指针传递给我的过滤器回调函数。这强烈地意味着,是应用程序内部的代码安装了在调用钩子时运行的钩子。这是因为一个进程地址空间内的函数指针在另一个进程的地址空间内无效。
那是哪一个呢?当调用钩子过滤器回调时,实际运行的代码是哪一个,目标(钩子(应用程序中的代码,还是安装钩子的应用程序内的代码?
谢谢
SetWindowsHookEx
不仅仅需要一个函数指针:它需要一个功能指针以及在其中定义函数的DLL的句柄。在此情况下,内核可以计算相对于DLL基地址的函数地址。然后(至少在某些情况下(将DLL注入系统上的其他进程,重新计算地址(如果必要;DLL基地址通常是固定的,因此代码不需要与位置无关。不过,重新定位仍然是可能的(,并在目标进程中设置挂钩。(根据Hans Passant的评论,这种情况只发生在某些钩子上,而其他钩子则在源进程中运行(。
这意味着您可以传递DLL中存在的任何函数的地址;它不需要导出AFAIK(这似乎是不使用名称的原因(,但它需要存在于其磁盘映像中。