2014-03-30 52 views
1

我的应用程序被编译为32位,并且由于我在64位Windows 7上运行,因此我的目标(notepad.exe)为64位。当我在notepad.exe的第一个线程上调用SetWindowsHookEx()时,DLL根本没有被注入,但没有返回错误。我知道它没有被注入,因为我在DLL_PROCESS_ATTACH上显示带有消息Attached的消息框,对于DLL_PROCESS_DETACH,我在消息框中显示Detached消息。这些消息只会在我拨打LoadLibrary()时显示一次,另一次是我的应用程序退出时显示。从32位进程挂钩64位进程时,SetWindowsHookEx()不会返回错误?

根据MSDN文档here

因为应用程序上下文中运行挂钩,它们必须匹配 的应用程序的“位数”。如果32位应用程序在64位Windows上安装了全局挂接,则将32位挂接注入到每个32位进程(通常的安全边界适用)中。在64位 进程中,线程仍被标记为“挂钩”。但是,由于32位应用程序必须运行该钩子代码,系统将在钩子应用程序的上下文中执行 挂钩;具体来说,在 调用SetWindowsHookEx的线程上。这意味着挂钩应用程序必须继续泵送消息,否则可能会阻止64位进程的正常运行。

这是否意味着它成功挂钩了我自己的进程而不是实际返回错误?

编辑:我的钩子是WH_CBT类型。

+0

这个问题关键取决于钩子的类型 –

+0

它没有义务返回错误,它肯定会注入* some *进程。只是不是你想要的。这是64位操作系统上的缺陷,您需要使用64位DLL启动64位版本的程序,以注入64位进程。 –

回答

1

您需要进一步的阅读文档:

对于指定的钩子类型,线程钩子先调用,那么全球 挂钩。请注意,可以在安装了 钩子的线程上调用WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL, 和低级钩子,而不是处理钩子的线程。对于这些钩子,如果32位钩子在钩子链中的64位钩子之前,则它可能会调用32位和64位钩子,即 。

总之它取决于钩子类型,如果你的dll被注入到目标进程中。如果您只想监视键盘和鼠标事件,则无需将自己注入其他进程。 Windows会在你自己的进程中回调你的钩子。

我怀疑你的钩型是其中之一:

  • WH_MOUSE_LL
  • WH_KEYBOARD_LL

不会引起任何库注入到目标进程。

+2

只有_LL挂钩不使用注射。 –

+0

修正了一个。 –

1

该文档的那一部分没有明确说明的是,当SetWindowsHookEx未能将32位DLL注入64位进程而不是返回错误时,它会诉诸使用线程的消息循环,调用SetWindowsHookEx来执行钩子程序,就像它在低级别的鼠标/键盘钩子(WH_MOUSE_LL/WH_KEYBOARD_LL)中的工作方式一样。

+0

这是超级怪异的。我看到'SetWindowsHookEx'成功(有点),同时试图挂接一个32位的64位线程:返回值不是NULL,并且似乎是一个有效的'HHOOK',因为'UnhookWindowsHookEx'运行得很好。但是(对于'WH_GETMESSAGE')我的钩子程序永远不会被调用。 – manuell