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

时间:2018-07-27 18:38:30

标签: c++ dll win64

pls建议如何从C / C ++的内存中加载64位DLL, 我正在运行Windows 64位模式,我发现一些解决方案 Win32,但无法在64位上正常工作

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

最欢迎链接和示例源!

谢谢

1 个答案:

答案 0 :(得分:0)

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

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

原则上,只有三个步骤:

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

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

更困难的是处理具有依赖关系的代码。由于您未使用OS加载程序,因此没有静态导入解析和修补程序。如果您的代码是针对这种情况而设计的(将指向主机应用程序数据的指针作为函数参数,并针对所有外部交互进行遍历),那么这不必是问题。但是,由于您在考虑DLL,因此很可能会。

仍然,这远不是一个无法解决的问题。首先,让位置无关的功能开始工作,然后再进行修正和导入。