首页
社区
课程
招聘
[原创]开源一个IDA小插件:修复VMP dump导入函数
发表于: 2021-1-19 01:23 4847

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

2021-1-19 01:23
4847

简述:

(菜鸟发帖,不足之处欢迎指正,大佬轻喷。。。。。)
通常我们在静态分析vmp加壳后的程序或者驱动时,都会选择将其跑开然后看dump文件。但是vmp会将某些函数地址进行混淆,所以当我们想看一个函数时,常常会见到如下图所示代码段:

 

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

 

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

人肉操作:

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

1
xchg    rdi, [rsp-8+arg_0]

代码段3中的

1
push    rdi

代码段6中的

1
xchg    rdi, [rsp-8+arg_0]

代码段7中的

1
retn

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

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

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

 

脚本操作:

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

随着粗犷的日志输出后,发现效果还行。在 Fxxx 一个试一下,看下图:

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

总结:

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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (9)
雪    币: 6172
活跃值: (4947)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
2
mark
2021-1-19 04:59
0
雪    币: 4215
活跃值: (4267)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
3
第二
2021-1-19 08:32
0
雪    币: 355
活跃值: (435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2021-1-19 08:33
0
雪    币: 1519
活跃值: (2127)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
5
mark
2021-1-19 12:46
0
雪    币: 6360
活跃值: (3807)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

首先感谢作者!!!


学习代码后在下做了部分优化分享出来。

优化如下:

1.直接放\plugins目录即可

2.Fix_Vmp_Dump_API和Get_Export_Fun_Name_Addr能在IDA插件列表中找到

3.D:\fix_vmp_dump目录改为\plugins\fix_vmp_dump

4.修复Run_2 函数中 调用Get_Need_Addr时未填flag_list参数,导致发生异常并使功能不可用。

5.提高部分代码效率


链接:https://pan.baidu.com/s/1diUovdUwNW-nQaUUtazvNw 

提取码:gbpb 

复制这段内容后打开百度网盘手机App,操作更方便哦




2021-1-19 18:09
0
雪    币: 5859
活跃值: (748)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
涙涙涙 首先感谢作者!!!学习代码后在下做了部分优化分享出来。优化如下:1.直接放\plugins目录即可2.Fix_Vmp_Dump_API和Get_Export_Fun_Name_Addr能在IDA插件列 ...
感谢指出的问题,Run_2 函数为全局自动修复导入函数,当时写出来只记得用过一次,那时没毛病,因为未多做测试,担心有问题所以标注了“use carefully”。昨晚推代码时只测试了修复单个导入函数,导致未对Run_2 进行测试,确实少填了一个参数flag_list,是我的问题,git代码已经修改更新。我将你的代码放入plugins目录进行简单测试,本地环境发现有报错信息。我再仔细看下代码,排下错,没问题的话之后会合入git项目里。谢谢!
2021-1-19 23:03
0
雪    币: 89
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
感谢分享 
2021-1-23 10:53
0
雪    币: 7
活跃值: (195)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
仰望大佬
2021-1-23 15:55
0
雪    币: 14539
活跃值: (17553)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
10
感谢分享
2021-1-23 16:21
0
游客
登录 | 注册 方可回帖
返回
//