看流星社区

 找回密码
 注册账号
查看: 39450|回复: 145

[易语言源码] [开源]静态编译的DLL注入到其他语言写的EXE中后的完美卸载

[复制链接]

该用户从未签到

发表于 2013-2-25 09:09:13 | 显示全部楼层 |阅读模式
首先,相信大家都知道易语言静态编译的DLL远线程注入到易语言写的EXE中后,可以远线程调用FreeLibrary进行卸载,但如果被注入的EXE是其他语言写的,就不行了。远线程调用FreeLibrary卸载DLL会导致EXE崩溃。所以很多人认为静态编译的DLL只能注入,不能卸载。
       今天我就告诉大家,可以卸载!下面以Delphi7为例来举例说明一下我的分析过程:
       打开Delphi7,在窗体中添加两个按钮,按钮的Caption分别改成"加载DLL”和"卸载DLL",两个按钮事件的代码分别为:
LoadLibrary('mydll.dll');  //加载本EXE目录下的mydll.dll(易语言静态编译的DLL)

FreeLibrary(GetModuleHandle('mydll.dll'));//卸载DLL
       编译运行测试加载DLL和卸载DLL功能一切正常,但是如果把卸载DLL的代码写到一个函数里,然后用CreateThread创建一个线程来调用这个卸载函数,问题就出来了,一用线程调用卸载DLL,EXE程序就崩溃。这说明什么问题?这说明易语言静态编译的DLL加载到其他语言写的EXE中之后,只能在EXE程序的主线程中调用FreeLibrary进行卸载!
       知道这个原理就好办了,我们有两种方法进行远程卸载DLL:一、修改EXE主线程EIP,申请一块内存插入一段ShellCode进行卸载DLL,然后VirtualFree申请的内存再跳回原EIP。二、向EXE中申请一块内存写入一段ShellCode,这段ShellCode的功能是SetTimer创建一个时钟(因为时钟周期函数也属于EXE的主线程),在时钟周期函数里先调用KillTimer销毁时钟,再调用FreeLibrary卸载DLL.完事儿后VirtualFreeEx释放申请的内存
       好了,费话不多讲了,两种方法源码奉上。

ps:纠正一下:如果其他语言写的EXE是在主线程中调用LoadLibraryA载入易语言静态编译的DLL,则只能在EXE的主线程中调用FreeLibrary卸载DLL,如果是远线程(CreateRemoteThread)调用LoadLibraryA加载易语言静态编译的DLL的话,就不能在EXE的主线程中调用FreeLibrary卸载DLL了。

游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2013-2-26 19:00:25 | 显示全部楼层
可能吧!!!!!!!!!

该用户从未签到

发表于 2013-2-27 09:33:52 | 显示全部楼层
顶顶顶顶顶顶顶

该用户从未签到

发表于 2013-3-2 23:08:52 | 显示全部楼层
什么东西。那么神秘

该用户从未签到

发表于 2013-3-3 15:36:43 | 显示全部楼层
看看啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

该用户从未签到

发表于 2013-3-3 15:42:15 | 显示全部楼层
试试看。。。。。。

该用户从未签到

发表于 2013-4-3 17:00:55 | 显示全部楼层
zhaogezhehenjiule

该用户从未签到

发表于 2013-4-15 20:15:33 | 显示全部楼层
32a1sdxzcdsfc

该用户从未签到

发表于 2013-4-27 19:05:35 | 显示全部楼层
学习,想知道为什么总报错

该用户从未签到

发表于 2013-4-29 20:43:41 | 显示全部楼层
无限顶楼主
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 20:16

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表