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

loading 64-bit DLLs from memory in C/C++ (Win64)

本文关键字:内存 加载 64位 DLL C++ Win64      更新时间:2023-10-16

请告诉我如何在C/C++中从内存加载64位DLL,我正在运行Windows 64位模式,我发现了一些解决方案Win32,但没有与64位一起正常工作

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

欢迎链接和示例来源!

感谢

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

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

原则上,只有三个步骤:

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

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

更困难的是处理具有依赖关系的代码。由于您没有使用操作系统加载程序,因此没有静态导入解析,也没有修复程序。如果您的代码是为这种情况而设计的(接受指向主机应用程序数据的指针作为函数参数,并为所有外部交互进行处理(,那么这不一定是个问题。既然你是从DLL的角度考虑的,那么它很可能是。

尽管如此,这远不是一个无法克服的问题。在进行修正和导入之前,先让一个与位置无关的函数工作。