【分享】我编写的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请回帖告诉我,我将不胜感激。
稳定性目前看还不错,就是不知道为什么如果不把ldr中的三个链表恢复原样就结束程序,程序会异常结束,是不是我对链表那部分的操作有什么问题 这个函数返回的地址可以直接转换为HMODULE类型作为GetModuleFileName GetProcAddress等函数作为句柄参数使用 楼主辛苦了,我下载试一下。 稳定性咋样啊 不错不错,这个是好东西,支持一下。 问一下各位老司机,是不是每次回帖都要回答问题啊! 表示很少用回答问题 你的用户组比较低吧 感谢分享,新手加入注释更有帮助!! 感谢!! 测试看看!! 不错不错,这个是好东西