是否可以将DLL加载到地址空间而不是从文件系统文件?

时间:2012-06-26 12:08:34

标签: windows dll loadlibrary

我必须创建一个导出一些符号(函数)的包装器DLL。在其资源中,它包含另一个实际完成工作的加密 DLL。

在包装器DLL初始化时,它解密原始的DLL,将其保存在文件中,然后通过LoadLibrary加载到地址空间。但是,我想避免将此DLL保存在文件中。

我知道这不能保证防弹保护,实际上可以转储进程虚拟内存并在那里看到它。我也知道可以创建一个具有FILE_FLAG_DELETE_ON_CLOSE属性的文件,这可以确保在进程终止后立即删除该文件。但我还是想知道是否有一个选项可以加载DLL“而不是从文件中”。

到目前为止,我想到了以下内容:

  1. 为虚拟内存块分配足够的保护(PAGE_EXECUTE_READPAGE_EXECUTE_READWRITE)。最好是图像首选基地址。
  2. 在那里提取/解密DLL图像。
  3. 如果图像基地址不是其首选地址 - 请“手动”进行重定位。即 - 分析重定位表并就地修补图像。
  4. 处理图像导入。加载其依赖项DLL并填​​充符号地址。
  5. 调用其初始化函数(DllMain)。
  6. 也就是说,我可以完成装载机的工作。但不幸的是,在某些方面,由上述技巧加载的DLL将表现不同,因为从操作系统的角度来看,它不是正确加载的DLL。这包括以下内容:

    • DllMain需要DLL“模块句柄”,这只是它的基址。它可以在调用各种AP​​I函数时使用此句柄,例如LoadResource。那些电话可能会失败。
    • 异常处理会出现问题。操作系统不会看到DLL的SAFESEH部分,因此不会调用其内部异常处理代码(它是64位DLL,意味着SAFESEH 强制异常处理)。

    这是我的问题:是否有一个API可以将DLL正确加载到进程地址空间而无需将其放在文件中? LoadLibrary的替代变体,例如,在文件映射而不是文件系统文件上工作?

    提前致谢。

1 个答案:

答案 0 :(得分:3)

是的,可以加载位于另一个图像资源中的DLL并在不需要文件的情况下执行它!看看this article,这正是你想要的。它有效,我试过了。