【发布时间】:2014-03-30 16:50:18
【问题描述】:
我的应用程序编译为 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 类型的。
【问题讨论】:
-
这个问题主要取决于钩子的类型
-
它没有义务返回错误,它肯定注入了一些进程。只是不是你想要的那个。这就是 64 位操作系统上的陷阱,您需要使用 64 位 DLL 启动程序的 64 位版本才能注入 64 位进程。