从内存中的某个位置加载DLL

时间:2009-03-12 11:50:23

标签: c++ c winapi dll

正如问题所说,我想从内存中的位置而不是文件加载DLL,类似于LoadLibrary(Ex)。我不是WinAPI的专家,所以用Google搜索了一下,发现this article和MemoryModule库一起完全满足了我的需求。

另一方面,信息很旧,图书馆也没有更新一段时间。所以我想知道是否有不同的,更新的和更好的方法来做到这一点。此外,如果有人使用了文章中提到的库,他们是否可以提供有关使用它时可能遇到的问题的见解?

对于好奇的,我正在探索加密应用程序的一些插件的概念,而不将解密版本存储在磁盘上。

2 个答案:

答案 0 :(得分:5)

实现自己的DLL加载器可以非常快速地实现。阅读这篇文章很容易错过你可以融入的疯狂边缘案例。我强烈建议不要这样做 只是为了尝试 - 考虑到您不能使用任何传统的调试工具来处理您正在加载的DLL中的代码,因为您执行的代码未列在操作系统已知的任何DLL的区域中。
另一个严重问题是在Windows中处理DEP

答案 1 :(得分:3)

好吧,您可以根据these instructions创建一个RAM驱动器,然后将您可以在内存中的DLL复制到那里的文件并使用LoadLibrary()。
当然,如果您计划将其部署为某种产品,这是不太实际的,因为人们会注意到安装了驱动程序,安装后重新启动以及“我的电脑”下的新驱动器号。此外,这实际上没有隐藏DLL,因为它只是坐在RAM驱动器中供所有人观看。

我感兴趣的另一件事是你为什么要这么做?也许你的最终结果可以通过除了从内存加载DLL以外的其他方法来实现。例如,当使用诸如UPX之类的二进制打包器时,磁盘上的DLL与最终执行的DLL不同。在使用LoadLibrary正常加载DLL之后,解包器立即启动并使用未压缩的二进制文件重写DLL加载到的内存(DLL头确保分配了足够的空间)