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_CBTWH_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位)......我想你会发现这些有用:

  • 使用并行程序集加载DLL的x64或x32版本
  • http://blogs.msdn.com/b/gauravseth/archive/2006/03/07/545104.aspx
  • http://www.thescarms.com/dotnet/Assembly.aspx
  • 在这里,您可以找到一个很好的演练,其中包含大量有用的信息片段 - 它描述.NET DLL引用本机DLL封装C ++ / CLI DLL

    更新:

    为了让连接非常容易和强大,请参阅这个经过充分测试的免费库 - 除此之外,它还可以与AnyCPU一起使用!


    我想你的主要问题是你正试图将.NET程序集注入本地进程,并且肯定无法工作。 我甚至不确定SetWindowsHookEx是否支持在CLR流程中注入.NET程序集。 解决您的问题的方法是:

  • 用x86和x64平台的本机编译器(如C ++ / Delphi / VB等)重写/重新编译你的dll。
  • 确保你的DLL只依赖于系统库。 例如,它不应该依赖任何不随Windows提供的DLL,因为您可能会崩溃目标进程。 您可以使用“Dependency Walker”工具来确定依赖关系。
  • 正如MSDN中所提到的,您应该为每个想要支持的CPU提供一个可执行文件注入器。 在这种情况下,x86和x64。
  • 或者你可以使用更好的注入/挂钩库,如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"

    下一篇: Configuring JDO in Spring 3.1?