6

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

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

我画了一个小图 在此处输入图像描述

4

1 回答 1

6

您不能在 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,那么这是唯一的方法。

于 2011-06-24T14:51:16.430 回答