干货:木马DLL实现热更新的骚批操作

以前开发木马有个需求:木马是一个DLL文件,DLL需要注入到某个进程常驻,该DLL具备自我升级能力,当发现新的可用版本时,立即Free自己,加载新的。

下面是我的一个实现方案:

开启一个监听线程,从网络上拉新的可用版本,下载放到一个临时目录,如果发现需要升级,则立即FreeLibrary自身,然后执行更新过程。

由于FreeLibrary之后当前模块的内存区域已经无效,所以更新的过程使用一个单独的线程,并将要更新过程的代码通过shellcode的形式写到分配的内存中执行。

更新过程中将会使用一些系统API函数,这里不能直接通过函数名来调用,因为这样会访问导入表,而DLL此时已经Free掉了。所以事先通过准备一个参数传递给该线程,该参数有更新线程要用到的一些数据和地址:

在这里插入图片描述 下面看看更新监听线程如何工作以及如何准备这些参数: 在这里插入图片描述 创建好更新线程后,自己得及时退出并Free自己,这里需要用特殊的技巧调用FreeLibray(这样更新线程才能把自己删掉): 在这里插入图片描述 下面看看更新线程如何工作: 在这里插入图片描述 同Free自己模块一样,最后VirtualFree参数和当前代码所占内存页面后,不能再回来,通过构建栈参数的形式,结束当前线程。这个函数编译后的二进制指令保存到全局数组中:

在这里插入图片描述 下面是测试的效果(XP、Win7 32 &64均测试通过): 在这里插入图片描述 最后有几个地方要说明的是:

1、 加载新的dll前要把临时目录下的文件删除掉,防止出现递归循环更新过程。

2、 执行更新过程前需要判断dll的版本信息,同样是为防止出现递归循环过程。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前