:15.323KB : :1 :2019-11-12 15:24:00
告诉大家,可以卸载!下面以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了。
02-17会员管理插件源码
02-16动态创建菜单与响应事件源码,菜单编辑器
02-09画板快捷启动3.2源码修改版
02-09王者荣耀战力小程序源码分享
02-09简单的指定颜色抠图源码
02-05WinLicense授权SDK源码
02-05文本逐字分割源码及优化历程
02-05易语言调用cmd命令并编辑框显示执行结果
11-18office卸载不需要的组建
09-07C++的string的实现源码分析