sri*_*sri 7 hook dll-injection setwindowshookex
我正在开发一个捕获所有用户交互的项目.MSDN告诉(这个)
SetWindowsHookEx可用于将DLL注入另一个进程.32位DLL无法注入64位进程,64位DLL无法注入32位进程.如果应用程序需要在其他进程中使用钩子,则需要32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,并且64位应用程序调用SetWindowsHookEx注入64位DLL进入64位进程.
我的问题是,如果构建了一个应用程序会发生什么Any CPU.我是否需要SetWindowsHookEx从构建的DLL 调用Any CPU.
我写了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++编写的.
当我点击构建的.NET应用程序时Any CPU,这些DLL会被注入(通过SetWindowHookEx).Windows操作系统挂起,我必须强行重启我的机器.
当针对x86或x64构建相同的.NET应用程序时,当我在HookLoggers(32位和64位)启动后单击应用程序时,一切正常.
这种未定义行为的任何原因.
我工作的平台是64位机器.
您需要从具有相应位元的 DLL 注入 - 即“任何 CPU”在运行时变为 32 位或 64 位...并且您的 DLL 必须与运行时位数匹配!
在您的情况下有用的东西称为“并排程序集”(同一程序集的两个版本,一个 32 位,另一个 64 位)...我认为您会发现这些很有帮助:
在这里您可以找到一个很好的演练,其中包含许多有用的信息片段 - 它描述了引用本机 DLL 的 .NET DLL 包装 C++/CLI DLL
更新:
为了使挂钩变得真正简单和强大,请参阅这个经过充分测试的免费库- 除其他外,它可以与 AnyCPU 一起使用!