【问题标题】:A x64-DLL injected into a x64-process hooking a x86-DLL fails using C++ and EasyHook使用 C++ 和 EasyHook 将 x64-DLL 注入到挂钩 x86-DLL 的 x64 进程中失败
【发布时间】:2011-09-22 01:56:08
【问题描述】:

注入到 x64 进程的 x64-DLL 使用 C++ 和 EasyHook 挂钩 x86-DLL 失败。 如果 Loader、InjectionLibrary 和 InjectionTarget(它在两个版本中都可用,我需要同时连接)是 x86,它就可以工作。 获取导出过程的地址(GetProcAddress 本身)在 x64 上不是问题。 InjectionTarget 也有 HookTarget(Kernel32.dll) 作为 x64 的依赖项。 LhInstallHook(...) 返回 STATUS_NOT_SUPPORTED 源 cmets 说在以下情况下发生: "目标入口点包含不受支持的指令。"

由于源代码适用于 x86 构建,我决定不添加它。

我画了一个小图

【问题讨论】:

  • 可以在 x64 进程中映射 x86 DLL 吗?这对我来说是新的。
  • 我检查了dependencywalker 并列出了它,但不是我的领地。无论如何,我需要达到能够在 x64 上挂钩 GetProcAddress 或类似的目标。

标签: c++ hook 32bit-64bit 32-bit easyhook


【解决方案1】:

您不能在 64 位进程中使用 32 位 DLL,事实上,这很笼统 - 您不能混合和匹配 x86 和 x64 代码,单个进程要么完全是 x64,要么完全是 x86。这是 x86-64 的基础,您对此无能为力。在 Windows 控制台中,他们制作了一个 64 位进程和一个 32 位进程,并使用 IPC 控制 32 位进程来加载和处理所有 32 位 shell 扩展。如果你勇敢和/或绝望,你可以尝试类似的事情。

编辑:等一下,等一下。当一切都在 x86 模式下运行良好时,您能否更详细地描述这个过程?比如,X 从 Y 加载一个函数,我在做 Z,因为看起来我不明白你在做什么。

您有一个注入目标和一个注入的 DLL,您正试图从中调用第三方仅 x86 DLL 中的过程。所以正常的调用流程是从 InjectionTarget -> InjectionLibrary -> HookTarget -> ExportedProcedure 开始的。这对您不起作用,因为 HookTarget 仅适用于 x86 并且您无法更改它,因此当您为 x64 版本的 InjectionTarget 重新编译 InjectionLibrary 时,它不再起作用,因为您的 x64 InjectionLibrary 正在尝试加载x86 钩子目标。

解决此问题的唯一方法是创建一个 x86 进程并使用进程间通信使其调用 HookTarget 中您要调用的过程。如果您无法为 x64 重新编译 HookTarget,那么这是唯一的方法。

【讨论】:

  • 我肯定需要挂钩 x86-DLL 的导出过程。你能给我一个提示,让我朝着正确的方向迈出一步吗? IPC 似乎太笼统了。
  • @zEh:为什么不直接生成一个 x86 进程?如果你的目标是 x64 exe,那么它就不能加载 x86 DLL,它也必须是 x86。
  • 您的意思是注入到 InjectionTarget 中的 InjectionLibrary 产生 x86 进程?那么我将如何拦截 InjectionTarget 的 GetProcAddress 调用?
  • @zEh:如果 InjectionTarget 是 x86,则生成一个 x86 进程并执行普通挂钩。如果 InjectionTarget 是 x64,则生成一个 x64 进程并执行普通挂钩。无论哪种方式,您所要做的就是匹配 InjectionTarget 的架构。如果它从 HookTarget.dll 加载一个函数,那么它必须预先匹配 HookTarget.dll 的架构。
  • @zEh:目标在以 x64 方式运行时不能使用 x86 DLL - 这是不可能的,就像你不可能一样。
猜你喜欢
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2012-11-07
  • 2012-07-26
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多