我可以从内存流加载库吗

Can I load a library from a memory stream?

本文关键字:加载 内存 我可以      更新时间:2023-10-16

我可以从内存流加载库吗?例如,我的库被编码为一个文件。我检查了一些条件,并将文件解密为内存流。现在,我需要将解密后的库从该流加载到我的应用程序中,并使用其功能等。

在windows中,DLL只能从文件加载-正如链接所建议的,您可以创建一个ramdisk并将其作为驱动器安装,但无法绕过需要通过文件系统中存在的文件加载的DLL。部分原因是DLL是"按需加载"的,即系统不会一次将整个文件加载到内存中,而是加载实际使用的部分,每次4KB(通常)。它也不会交换到交换区域,如果系统内存不足,它只是被丢弃并从DLL重新加载。

Linux的工作方式非常相似(我知道它默认情况下使用相同类型的需求加载,但不确定是否有办法绕过它),所以我也不相信有任何其他方法,但我还没有深入研究它。

当然,如果你只想要一段可以在应用程序中使用的代码,并且你想将其以加密/压缩/其他形式存储在可执行文件中,那么你可以分配一些可执行内存(在Windows中,你可以使用VirtualAlloc来分配可执行内存)。但是,如果这样做,您需要确保重新定位代码中的任何绝对内存地址,因此您需要将重新定位信息存储在可执行文件中。

显然,简单的解决方案是将内容解压缩到文件系统中的一个文件中,然后从那里加载。