我必须创建一个导出一些符号(函数)的包装器DLL。在其资源中,它包含另一个实际完成工作的加密 DLL。
在包装器DLL初始化时,它解密原始的DLL,将其保存在文件中,然后通过LoadLibrary
加载到地址空间。但是,我想避免将此DLL保存在文件中。
我知道这不能保证防弹保护,实际上可以转储进程虚拟内存并在那里看到它。我也知道可以创建一个具有FILE_FLAG_DELETE_ON_CLOSE
属性的文件,这可以确保在进程终止后立即删除该文件。但我还是想知道是否有一个选项可以加载DLL“而不是从文件中”。
到目前为止,我想到了以下内容:
PAGE_EXECUTE_READ
或PAGE_EXECUTE_READWRITE
)。最好是图像首选基地址。DllMain
)。也就是说,我可以完成装载机的工作。但不幸的是,在某些方面,由上述技巧加载的DLL将表现不同,因为从操作系统的角度来看,它不是正确加载的DLL。这包括以下内容:
DllMain
需要DLL“模块句柄”,这只是它的基址。它可以在调用各种API函数时使用此句柄,例如LoadResource
。那些电话可能会失败。SAFESEH
部分,因此不会调用其内部异常处理代码(它是64位DLL,意味着SAFESEH
强制异常处理)。这是我的问题:是否有一个API可以将DLL正确加载到进程地址空间而无需将其放在文件中? LoadLibrary
的替代变体,例如,在文件映射而不是文件系统文件上工作?
提前致谢。