Win32将DLL注入钩由“任何CPU”构建的应用程序
我正在开发一个捕获所有用户交互的项目。 MSDN告诉(这个)
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(均为86)和HookLogger_64.exe加载HookFunctions_64.dll(均为64)设置WH_CBT
和WH_MOUSE
全球(不特定线程)。
HookLogger_32.exe,HookLogger_64.exe,HookFunctions_32.dll和HookFunctions_64.dll是用C ++编写的。
当我点击针对Any CPU
构建的.NET应用程序时,这些DLL会被注入(通过SetWindowHookEx
)。 Windows操作系统挂起,我必须强制重启我的机器。
当相同的.NET应用程序针对x86或x64构建时,以及当HookLogger(32位和64位)启动后单击该应用程序时,所有工作都正常。
任何未定义行为的原因。
我工作的平台是一台64位机器。
你需要从DLL注入相应的位 - 即“任何CPU”在运行时变为32位或64位......并且你的DLL必须匹配运行时位数!
在你的情况中有用的东西被称为“并排装配”(同一装配的两个版本,一个32和另一个64位)......我想你会发现这些有用:
在这里,您可以找到一个很好的演练,其中包含大量有用的信息片段 - 它描述.NET DLL引用本机DLL封装C ++ / CLI DLL
更新:
为了让连接非常容易和强大,请参阅这个经过充分测试的免费库 - 除此之外,它还可以与AnyCPU一起使用!
我想你的主要问题是你正试图将.NET程序集注入本地进程,并且肯定无法工作。 我甚至不确定SetWindowsHookEx是否支持在CLR流程中注入.NET程序集。 解决您的问题的方法是:
或者你可以使用更好的注入/挂钩库,如madCodeHook或Detours。 这样你就可以克服第三个问题,而不是提到他们提供的几十个专业人员。
从你对这个问题的描述中,我的猜测是......你的任何一个CPU编译的程序正在加载一个x86存根,它正在触发你的32位挂钩,然后x86存根检查并看到该环境支持64位并启动64位CLR版本。
在这种情况下,您的32位挂钩DLL正在获取WH_SHELL消息,并且正在尝试注入已经结束的进程(x86存根),或者将32位挂钩注入64位CLR进程。 因此,你的“非常模糊,需要详细阐述”系统崩溃。
如果你关心的是你的代码实际上在做什么,那么会给出更多的帮助(以及更少的概括和'只使用程序A')。 实际上是将代码注入进程还是使用进程的dwThreadId调用SetWindowsHookEx?
链接地址: http://www.djcxy.com/p/10349.html上一篇: Win32 Hooks DLL injection into Applications Built against "Any CPU"