开源一个IDA小插件:修复VMP dump导入函数

简述:

通常我们在静态分析vmp加壳后的程序或者驱动时,都会选择将其跑开然后看dump文件。但是vmp会将某些函数地址进行混淆,所以当我们想看一个函数时,常常会见到如下图所示代码段:
在这里插入图片描述

面对上述情况,我之前一般都是默默的打开计算器,人肉去算地址,然后看落在哪个模块上,把对应模块扣出来,改基址,接着根据算出的地址看是哪个对应函数,最后回到dump文件,将名字标上!算一个,两个还能忍,但是当面对无数这样的函数,甚至说你算到最后发现竟然是之前已经标过的函数时,头已经大了。

于是,在经历这样的折磨之后,写了一个IDA小插件,能够帮助我们自动去标这样的函数。其实之前就已经写好了,一直用用修修bug,稳定了一段时间后,效果还行,支持x86与x64的vmp dump。下面简单介绍一下人肉去修和脚本去修的效果。

人肉操作:

以上图七个代代码段流程举例。我们最终目的是想要知道代码段1中sub_FFFFF880010787DE是哪个函数。
跟进sub_FFFFF880010787DE函数后发现几个关键点分别是:
代码段2中的

 xchg    rdi, [rsp-8+arg_0]

代码段3中的

push    rdi

代码段6中的

xchg    rdi, [rsp-8+arg_0]

代码段7中的

 retn

其实看上述4个关键指令可知,retn指令最终返回到的是rdi所对应的代码处继续执行。所以我们需要去追rdi值是什么。
观察代码段流程,最终得到rdi的表达式如下:

∵ rdi = [0xFFFFF8800101C5D0 + 0x1 + 0x539E9] + 0x1B6D0F9A
∴ rdi = 0xFFFFF80003ED5CA0

得到rdi所代表的真正函数地址后,我们需要看此地址落在哪个模块上,我这边是ntoskrnl模块,将其拿出来,根据此时系统实际情况修改基址,最后跳转到rdi对应的函数名称即可。最后算出结果如下图所示(得到的是ZwReadFile函数):

在这里插入图片描述

脚本操作:

从上文人肉操作看起来还是比较麻烦的,需要不断的记和算一些地址,最后还得去找。算多了其实会发现,流程还是比较固定的,关键指令也就是那几条。(整他个十个八个if else,脚本写出还不是谈笑间,听懂掌声!)嘿嘿,多说无益,看下图我按下快捷键后效果:
在这里插入图片描述

随着粗犷的日志输出后,发现效果还行。在 Fxxx 一个试一下,看下图:
在这里插入图片描述

通过上面两个效果图发现,确实比人肉计算舒服多了,但是需要达到上图的效果,还需要与一个小小的脚本配合。这个脚本就是用来得到模块的导出函数名和导出地址,正是结合这个信息,插件才能找到正确的函数名称并标注。以ntoskrnl模块为例,运行脚本后可得到如下文件信息:
在这里插入图片描述

总结:

上述两个脚本项目地址:https://github.com/YanStar/FixVmpDump
代码虽然写的一般,但是从中可以学到如何修vmp dump导入函数、idapython常见的一些函数用法、如何注册ida脚本快捷键等,还是对初学者有所帮助的。有问题欢迎大佬们指出!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值