以前开发木马有个需要:木马是一个DLL文件,DLL须要注入到某个过程常驻,该DLL具备自我降级能力,当发现新的可用版本时,立刻Free本人,加载新的。
上面是我的一个实现计划:
开启一个监听线程,从网络上拉新的可用版本,下载放到一个长期目录,如果发现须要降级,则立刻FreeLibrary本身,而后执行更新过程。
因为FreeLibrary之后以后模块的内存区域曾经有效,所以更新的过程应用一个独自的线程,并将要更新过程的代码通过shellcode的模式写到调配的内存中执行。
更新过程中将会应用一些零碎API函数,这里不能间接通过函数名来调用,因为这样会拜访导入表,而DLL此时曾经Free掉了。所以当时通过筹备一个参数传递给该线程,该参数有更新线程要用到的一些数据和地址:
上面看看更新监听线程如何工作以及如何筹备这些参数:
创立好更新线程后,本人得及时退出并Free本人,这里须要用非凡的技巧调用FreeLibray(这样更新线程能力把本人删掉):
上面看看更新线程如何工作:
同Free本人模块一样,最初VirtualFree参数和以后代码所占内存页面后,不能再回来,通过构建栈参数的模式,完结以后线程。这个函数编译后的二进制指令保留到全局数组中:
上面是测试的成果(XP、Win7 32 &64均测试通过):
最初有几个中央要阐明的是:
1、 加载新的dll前要把长期目录下的文件删除掉,防止出现递归循环更新过程。
2、 执行更新过程前须要判断dll的版本信息,同样是为防止出现递归循环过程。