我的应用程序编译为32位,因为我在64位Windows 7上运行,所以我的目标( notepad.exe )是64位。当我在第一个找到 notepad.exe 的线程上调用SetWindowsHookEx()
时,DLL根本没有被注入,但没有返回错误。我知道它没有被注入,因为在DLL_PROCESS_ATTACH
我显示带有消息Attached
的消息框,而对于DLL_PROCESS_DETACH
我在消息框中显示Detached
消息。这些消息仅在我调用LoadLibrary()
时显示一次,而在我的应用程序退出时则显示另一次。
根据MSDN文档here:
因为钩子在应用程序的上下文中运行,所以它们必须匹配 应用程序的“位数”。如果32位应用程序安装了 64位Windows上的全局钩子,32位钩子被注入每个钩子 32位进程(通常的安全边界适用)。在64位 进程中,线程仍被标记为“挂钩”。但是,因为一个 32位应用程序必须运行钩子代码,系统执行 挂钩应用程序的上下文;特别是,在线程上 叫做SetWindowsHookEx。这意味着挂钩应用程序必须 继续抽取消息或它可能阻止正常运作 64位进程。
这是否意味着它成功挂钩我自己的进程而不是实际返回错误?
编辑:我的钩子是WH_CBT类型。
答案 0 :(得分:1)
您需要进一步阅读文档:
对于指定的钩子类型,首先调用线程钩子,然后调用全局线程钩子 挂钩。请注意WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL, 可以在安装它的线程上调用低级钩子 钩子而不是处理钩子的线程。对于这些钩子,它 如果a,可能会调用32位和64位挂钩 32位钩子位于钩链中的64位钩子之前。
简而言之,如果您的dll完全注入目标进程,它将取决于钩子类型。如果您只想监视键盘和鼠标事件,则无需将自己注入其他进程。 Windows将在您自己的进程中回调您的挂钩。
我怀疑你的钩子类型是其中之一:
不会导致任何库注入目标进程。
答案 1 :(得分:1)
文档的这一部分没有明确说明当SetWindowsHookEx
无法将32位DLL注入64位进程而不是返回错误时,它会使用消息循环调用SetWindowsHookEx
来执行钩子过程的线程,就像它与低级鼠标/键盘钩子一样(WH_MOUSE_LL / WH_KEYBOARD_LL)。