简述:
通常我们在静态分析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脚本快捷键等,还是对初学者有所帮助的。有问题欢迎大佬们指出!
本文链接:https://my.lmcjl.com/post/7395.html
4 评论