- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
首先,相信大家都知道易语言静态编译的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了。
|
|