lizhirui 发表于 2016-8-2 23:20

【分享】我编写的DLL的内存文件加载代码

本帖最后由 Cizel 于 2016-8-3 22:30 编辑

为了保密性,有时候我们不想将DLL释放出后进行加载,而想直接在内存中进行加载,我根据PE格式规范用了3天写了这个程序,在VS2015+WIN7 64Bit旗舰版下调试通过。本程序使用Visual C++编写完成

原理如下:
读取DLLPE头获取有关信息
将DLL加载到内存
修复IAT
修复重定向地址
将DLL加入PDR的LDR中的三个双向循环链表中

并且附带了释放函数

以下两个函数是需要外部调用的函数
char* DLLMemLoad(char* DLLFileBuf, DWORD DLLFileSize, char* MemDLLBaseName, char* MemDLLFullName);//DLL内存加载函数,注意为了保证一些DLL模块的正常运行,请保证MemDLLBaseName参数和MemDLLFullName参数的结尾是“.dll”(不区分大小写)

void DLLMemFree(char* DLLMemBaseAddress);//DLL内存释放函数,请在程序结束之前调用它释放加载的DLL,否则程序可能会异常退出


运行易语言编译的一个测试DLL的截图如下:



源代码中附带了大量的注释,方便阅读。
由于附件过大,所以我将百度云的下载地址上传了,如果大家发现程序有什么BUG请回帖告诉我,我将不胜感激。


lizhirui 发表于 2016-8-2 23:36

稳定性目前看还不错,就是不知道为什么如果不把ldr中的三个链表恢复原样就结束程序,程序会异常结束,是不是我对链表那部分的操作有什么问题

lizhirui 发表于 2016-8-3 09:40

这个函数返回的地址可以直接转换为HMODULE类型作为GetModuleFileName GetProcAddress等函数作为句柄参数使用

sumile 发表于 2016-8-2 23:24

楼主辛苦了,我下载试一下。

邪恶博士 发表于 2016-8-2 23:27

稳定性咋样啊

cncrypt 发表于 2016-8-2 23:31

不错不错,这个是好东西,支持一下。

13977856649 发表于 2016-8-2 23:46

问一下各位老司机,是不是每次回帖都要回答问题啊!

lizhirui 发表于 2016-8-2 23:47

表示很少用回答问题 你的用户组比较低吧

copit 发表于 2016-8-2 23:50

感谢分享,新手加入注释更有帮助!!

peter_king 发表于 2016-8-3 00:58

感谢!! 测试看看!!

dosnow 发表于 2016-8-3 07:22

不错不错,这个是好东西
页: [1] 2 3
查看完整版本: 【分享】我编写的DLL的内存文件加载代码