调用Windows Hook时,运行是哪个代码?
When a Windows Hook is Called, Which Code is Run?
SetWindowsHookEx 的文档说,
If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes.
这强烈暗示当挂钩过滤器回调被调用时,挂钩应用程序的挂钩 DLL 副本中的代码是 运行。
但是,当我安装挂钩时,我需要将一个函数指针传递给我的过滤器回调函数。这强烈暗示调用挂钩时,安装挂钩的是应用程序内部的代码 运行 。这是因为一个进程地址 space 内的函数指针在另一个进程的地址 space 内无效。
所以是哪个?调用挂钩过滤器回调时,哪个代码实际上是 运行、目标(挂钩)应用程序内部的代码,还是安装挂钩的应用程序内部的代码?
谢谢
SetWindowsHookEx
不仅仅需要一个函数指针:它需要一个函数指针 以及定义该函数的 DLL 句柄。 鉴于,内核可以计算出相对于DLL基地址的函数地址。然后它(至少在某些情况下)将 DLL 注入系统上的其他进程,重新计算地址(如有必要;DLL 基地址通常是固定的,因此代码不需要与位置无关。重定位仍然是可能的,但) 并在目标进程中设置挂钩。 (根据 Hans Passant 的评论,这只发生在某些钩子上,而其他钩子 运行 在源进程中)。
这意味着您可以传递DLL中存在的任何函数的地址;它不需要导出 AFAIK(这似乎是不使用名称的原因)但它需要存在于其磁盘映像中。
SetWindowsHookEx 的文档说,
If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes.
这强烈暗示当挂钩过滤器回调被调用时,挂钩应用程序的挂钩 DLL 副本中的代码是 运行。
但是,当我安装挂钩时,我需要将一个函数指针传递给我的过滤器回调函数。这强烈暗示调用挂钩时,安装挂钩的是应用程序内部的代码 运行 。这是因为一个进程地址 space 内的函数指针在另一个进程的地址 space 内无效。
所以是哪个?调用挂钩过滤器回调时,哪个代码实际上是 运行、目标(挂钩)应用程序内部的代码,还是安装挂钩的应用程序内部的代码?
谢谢
SetWindowsHookEx
不仅仅需要一个函数指针:它需要一个函数指针 以及定义该函数的 DLL 句柄。 鉴于,内核可以计算出相对于DLL基地址的函数地址。然后它(至少在某些情况下)将 DLL 注入系统上的其他进程,重新计算地址(如有必要;DLL 基地址通常是固定的,因此代码不需要与位置无关。重定位仍然是可能的,但) 并在目标进程中设置挂钩。 (根据 Hans Passant 的评论,这只发生在某些钩子上,而其他钩子 运行 在源进程中)。
这意味着您可以传递DLL中存在的任何函数的地址;它不需要导出 AFAIK(这似乎是不使用名称的原因)但它需要存在于其磁盘映像中。