下你所需,载你所想!
汇集开发技术源码资料

静态编译的DLL注入到任意EXE中可卸载

: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了。

静态编译的DLL注入到任意EXE中可卸载

热门推荐

相关文章