c++ - 使用 C++ 和 EasyHook 注入(inject) x64 进程 Hook x86-DLL 的 x64-DLL 失败

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

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

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

我画了一个小图 enter image description here

最佳答案

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

编辑:等一下,等一下。当在 x86 模式下一切正常时,您能否在基础知识方面再多描述一下这个过程?比如,X 从 Y 加载一个函数,我在做 Z,因为看起来我不明白你在做什么。

您有一个注入(inject)目标和一个注入(inject)的 DLL,您正试图从中调用第三方 x86-only DLL 中的过程。所以正常的调用流程是 InjectionTarget -> InjectionLibrary -> HookTarget -> ExportedProcedure。这对你不起作用,因为 HookTarget 只是 x86,你不能改变它,所以当你为 x64 版本的 InjectionTarget 重新编译 x64 的 InjectionLibrary 时,它不再起作用,因为你的 x64 InjectionLibrary 正在尝试加载一个x86 HookTarget。

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

关于c++ - 使用 C++ 和 EasyHook 注入(inject) x64 进程 Hook x86-DLL 的 x64-DLL 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469051/

相关文章:

c++ - 在没有它们的笔记本电脑上创建 Alt 代码

git - 推送到服务器后执行自动 pull 请求

c++ - %ld 格式转换以实现便携性

c - E2045 错误的目标文件格式 :"XXX.obj"

ios - 64位安全性和uint32_t

c++ - Visual Studio C++ 复制 obj 文件而不是编译

c++ - 无法找到数字文字运算符 ‘operator""

winapi - 如何以编程方式操作 DLGTEMPLATE?

c++ - Qt Creator Ide,添加 QTcpSocket 实例后构建问题

c++ - QTest 和 void 函数