首页
社区
课程
招聘
[原创]易语言静态编译的DLL注入到其他语言写的EXE中后的完美卸载
2013-2-16 21:46 36163

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

2013-2-16 21:46
36163
     首先,相信大家都知道易语言静态编译的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释放申请的内存
       好了,费话不多讲了,两种方法源码奉上。
          光下不顶木有小JJ

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

上传的附件:
收藏
点赞5
打赏
分享
最新回复 (39)
雪    币: 1789
活跃值: (766)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
yijun8354 12 2013-2-16 21:54
2
0
这诅咒有点恶毒哟
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
viphack 4 2013-2-16 22:55
3
0
好邪恶~
雪    币: 104
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
复古 2013-2-23 12:46
4
0
光下不顶木有小JJ
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
遗失灵魂 2013-2-23 13:09
5
0
SetTimer

KillTimer

FreeLirbrary

VirtualFreeEx
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qqqmxhqqq 2013-5-17 10:42
6
0
方法不错 正好研究下
雪    币: 6046
活跃值: (3970)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
pxhb 2 2013-5-17 10:49
7
0
看看ShellCode
雪    币: 6046
活跃值: (3970)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
pxhb 2 2013-5-17 11:15
8
0
期待楼主来一篇写ShellCode的文章
雪    币: 253
活跃值: (497)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
chengqiyan 2013-5-24 00:27
9
0
静态链接的DLL本来就跟动态一样。。。只是加载时机
雪    币: 72
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tymfl 2013-6-6 17:23
10
0
不错,顶顶
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jqjbacon 2013-6-19 12:11
11
0
最后一句话是关键……
雪    币: 125
活跃值: (161)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhangtaopy 1 2013-6-20 09:23
12
0
a. 两种方法远程卸载静编译DLL.7z (11.2 KB, 72 次下载)        [谁下载?]

b.【原创】易语言静态编译的DLL注入到其他语言写的EXE中后的完美卸载
技术专题       
iokey
2013-02-16        10/1,618

c. 光下不顶木有小JJ

a&&b&&c ==> 看雪上妹子好多
雪    币: 434
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zyicai 2013-6-20 09:58
13
0
好东西,得顶
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
誓言剑 2013-6-23 06:56
14
0
相信大家都知道(以下恕删

我怎么不知道?

FreeLibraryAndExitThread,楼主辛苦了
雪    币: 191
活跃值: (192)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rax 2013-7-24 17:43
15
0
看看代码怎么用
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunflover 2013-8-20 15:54
16
0
困扰我很久的问题,终于看见了答案,卸载dll进程一直奔溃,泪奔,头大啊
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kangcin 2013-8-20 16:13
17
0
楼主有小JJ
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiejienet 2013-8-20 20:18
18
0
确实木有小jj
因为jj很大
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
康承志 2014-1-12 22:12
19
0
方法不错 正好研究下
雪    币: 110
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ling林 2014-1-13 01:03
20
0
mark.
雪    币: 181
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
applean 2014-1-16 08:44
21
0
好东西,得顶
雪    币: 598
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bqyuncai 2014-1-16 08:55
22
0
这个方法好邪恶
雪    币: 11416
活跃值: (4158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 2014-1-27 17:16
23
0
好像很强大的样子哟
雪    币: 11416
活跃值: (4158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 2014-2-11 21:08
24
0
多谢楼主分享哟,不过好像多线程调用的DLL不起作用
雪    币: 293
活跃值: (232)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
瀚海云烟 1 2014-2-12 09:28
25
0
还有这个问题啊,调试了一下发现
DllMain在卸载的时候会GetCurrentThreadId跟this指针+0x234值的地方比较,如果不等而且是窗口程序的话,就发送给窗口消息
SendMessageA(hwnd, 0x83E7, 0, 0); // 这里死掉了
不知道这个 0x83E7 是啥子消息,请求主线程退出?IDA里面把倒2个产数翻译成 uExitCode,不会真是退出消息,而DllMain不可重入而死锁吧???
游客
登录 | 注册 方可回帖
返回