在 C/C++ (Win64) 中从内存中加载 64 位 DLL

Posted

技术标签:

【中文标题】在 C/C++ (Win64) 中从内存中加载 64 位 DLL【英文标题】:loading 64-bit DLLs from memory in C/C++ (Win64) 【发布时间】:2018-07-27 18:38:29 【问题描述】:

请告知我如何在 C/C++ 中从内存中加载 64 位 DLL, 我正在运行 Windows 64 位模式,我发现很少有解决方案 Win32 但在 64 位下无法正常工作

我不想创建任何临时文件,我想拥有 所有 req DLL 到单个 .bin 文件和延迟加载 DLL 进入我的 .exe 程序

欢迎提供链接和示例源代码!

谢谢

【问题讨论】:

你有没有办法简单地将这些你想“从内存加载”的库静态链接到你的.exe?据我所知,从内存中加载 DLL 是不可能的。至少不使用 Windows API。当然,您可以编写自己的 PE 加载器,但这将是很多工作...... 不幸的是,我有一些 DLL 没有可用的静态版本(如 fmodex.dll),你说得对,我已经准备好努力工作了...... 谷歌快速显示github.com/fancycode/MemoryModule 这是一个附加链接(来自同一作者):joachim-bauch.de/tutorials/loading-a-dll-from-memory 这个解释了这个过程。 【参考方案1】:

您可以在运行时在内存中加载和执行代码,无需临时文件。严格来说,它不是DLL,只是动态代码。

您将需要在运行时生成代码的程序所使用的相同 API 函数(如今许多语言都有即时编译器)。

原则上只有三个步骤:

将机器代码放入动态分配的内存中。无论您是从文件中读取它、通过网络传输它还是使用编译器生成它都无关紧要。 将包含代码的页面标记为可执行。在 Windows 上,这是通过 VirtualProtect 完成的。在 Linux 上,mprotect。 同步指令和数据缓存(现代 CPU 是哈佛和冯诺依曼架构的混合体)。在 Windows 上,这是FlushInstructionCache

后两个项目符号需要包含代码的缓冲区的基地址和大小。

更困难的是处理具有依赖关系的代码。由于您没有使用操作系统加载程序,因此您没有静态导入分辨率和修复。如果您的代码是为这种情况而设计的(接受指向主机应用程序数据的指针作为函数参数并通过该指针进行所有外部交互),这不一定是问题。不过,由于您考虑的是 DLL,因此很可能是这样。

不过,这远不是一个无法克服的问题。在继续进行修复和导入之前,先让一个与位置无关的函数开始工作。

【讨论】:

以上是关于在 C/C++ (Win64) 中从内存中加载 64 位 DLL的主要内容,如果未能解决你的问题,请参考以下文章

在 Kivy 中从内存中加载图像

如何在 C# 中从文件中加载 RSA 公钥

如何在 Symfony 2 中从功能测试中加载固定装置

如何在反应中从文件中加载数据?

如何在 Pig 中从 json 中加载 json 和 value?

如何在 iOS 8 Objective c 中的 UIWebView 中从文档中加载 png 图像