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

C++ 从内存中的某个位置加载DLL,c++,c,winapi,dll,C++,C,Winapi,Dll,正如问题所说,我想从内存中的某个位置而不是文件加载DLL,类似于LoadLibrary(Ex)。我不是WinAPI方面的专家,所以谷歌搜索了一下,发现MemoryModule库非常符合我的需要 另一方面,那里的信息非常陈旧,图书馆也有一段时间没有更新。所以我想知道是否有不同的、更新的和更好的方法来做到这一点。另外,如果有人使用了文章中提到的库,他们能否提供我在使用它时可能面临的问题的见解 对于好奇的人,我正在探索在不将解密版本存储在磁盘上的情况下为应用程序加密一些插件的概念。实现自己的DLL加载

正如问题所说,我想从内存中的某个位置而不是文件加载DLL,类似于LoadLibrary(Ex)。我不是WinAPI方面的专家,所以谷歌搜索了一下,发现MemoryModule库非常符合我的需要

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


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

实现自己的DLL加载程序可能会很快变得非常棘手。读了这篇文章,你很容易就会错过你会遇到的疯狂边缘案例。我强烈建议不要这样做。
只是为了品味——考虑到DLL上的代码不能使用任何常规的调试工具,因为您所执行的代码没有列出在OS所知道的任何DLL的区域中。
另一个严重的问题是在windows中处理。

那么,您可以根据创建一个RAM驱动器,然后将内存中的DLL复制到一个文件中,然后使用LoadLibrary() 当然,如果您计划将其部署为某种产品,这是不太实际的,因为人们会注意到正在安装驱动程序、安装后重新启动以及我的计算机下有一个新的驱动器号。而且,这并没有真正隐藏DLL,因为它只是放在RAM驱动器中供大家观看


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

感谢您的帮助。我同意重新实现DLL加载器不是一个好主意,所以我正在寻找其他方法来实现它——也许有可能以某种方式欺骗LoadLibrary或文件系统。这不是初学者的。但这是可能的。做得很好。唯一缺少的是创建激活上下文(用几行代码完成)。DEP不是一个问题。如果DLL使用图像\目录\条目\异常(很少使用),则已为x64 DLL注入实现此功能。对于32位来说,这是多毛的。但有一个黑客:是的,我可以模仿UPX的行为,并使用我的解包/解密程序作为入口点,然后可以与主应用程序协商密钥。我会将这个答案标记为已接受,谢谢你的众多想法!这两种“解决方案”都无助于防止逆向工程。UPX可以很容易地打开包装。您可以使用WinLicense或VMProtect来保护DLL,这会生成一个运行合理代码的虚拟机。这是很难破解的。最大的问题是,大多数防病毒软件不再能够分析DLL中发生的情况并发出病毒警告。尤其是微软的Windows Defender(最差的防病毒软件)提供了大量的假警报,使得加载DLL的速度非常慢。下面是从内存中加载DLL的现成源代码:代码陈旧没有问题。它仍然可以在Windows10上运行。MemoryModule中唯一缺少的是激活上下文。但如果你需要,它很容易添加。