【发布时间】:2012-02-20 07:54:01
【问题描述】:
我正在开发一个捕获所有用户交互的项目。 MSDN 告诉 (this)
SetWindowsHookEx 可用于将 DLL 注入另一个进程。一种 32位DLL不能注入64位进程,64位DLL 不能注入到 32 位进程中。如果应用程序需要 在其他进程中使用钩子,需要一个 32 位的 应用程序调用 SetWindowsHookEx 将 32 位 DLL 注入 32 位 进程,以及一个 64 位应用程序调用 SetWindowsHookEx 来注入一个 将 64 位 DLL 转换为 64 位进程。
我的问题是,如果应用程序是针对 Any CPU 构建的,会发生什么情况。我是否需要从针对Any CPU 构建的DLL 调用SetWindowsHookEx。
我已经编写了 HookLogger_32.exe 加载 HookFunctions_32.dll(均为 x86)和 HookLogger_64.exe 加载 HookFunctions_64.dll(均为 x64)设置 WH_CBT 和 WH_MOUSE 全局(不是特定线程)。
HookLogger_32.exe、HookLogger_64.exe、HookFunctions_32.dll 和 HookFunctions_64.dll 是用 C++ 编写的。
当我单击针对 Any CPU 构建的 .NET 应用程序时,这些 DLL 会被注入(通过 SetWindowHookEx)。 Windows 操作系统挂起,我必须强制重启我的机器。
当针对 x86 或 x64 构建相同的 .NET 应用程序时,当我在 HookLoggers(32 位和 64 位)启动后单击该应用程序时,一切正常。
这种未定义行为的任何原因。
我工作的平台是 64 位机器。
【问题讨论】:
-
在为 32/64 构建时它是否正常工作或在那里崩溃?
-
@pst:它在为 32/64 构建时可以正常工作。它是一个 hello world WPF 应用程序。
-
听起来可能是相关的:stackoverflow.com/questions/1507268/…
-
您遗漏了“32 位和 64 位 DLL 必须具有不同的名称。”少量。如果将 DLL 构建为 Any CPU,则对于 .NET 可能无关紧要——运行时可以加载相同的二进制文件,而不管主机进程目标体系结构如何——但 Windows 中的挂钩实现可能取决于文件名的不同。因此,只需制作两份以任何 CPU 为目标的 DLL 副本,并尝试从 32 位进程加载“32 位”一份,并从 64 位进程加载“64 位”一份。
-
@cynic:我有不同名称的 DLL。并且 DLL 是针对 x86 和 x64 用 C++ 构建的(我无法针对任何使用 C++ 的 CPU 构建)
标签: hook dll-injection setwindowshookex