吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13831|回复: 48
收起左侧

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

  [复制链接]
沭阳 发表于 2021-1-19 01:43
本帖最后由 沭阳 于 2021-1-19 01:46 编辑

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

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

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

人肉操作:

以上图七个代代码段流程举例。我们最终目的是想要知道代码段1中sub_FFFFF880010787DE是哪个函数。
跟进sub_FFFFF880010787DE函数后发现几个关键点分别是:
代码段2中的
[Asm] 纯文本查看 复制代码
xchg    rdi, [rsp-8+arg_0]

代码段3中的
[Asm] 纯文本查看 复制代码
push    rdi

代码段6中的
[Asm] 纯文本查看 复制代码
xchg    rdi, [rsp-8+arg_0]

代码段7中的
[Asm] 纯文本查看 复制代码
retn

其实看上述4个关键指令可知,retn指令最终返回到的是rdi所对应的代码处继续执行。所以我们需要去追rdi值是什么。
观察代码段流程,最终得到rdi的表达式如下:
[Asm] 纯文本查看 复制代码
∵ rdi = [0xFFFFF8800101C5D0 + 0x1 + 0x539E9] + 0x1B6D0F9A
∴ rdi = 0xFFFFF80003ED5CA0

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

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

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

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

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

免费评分

参与人数 37威望 +2 吾爱币 +138 热心值 +35 收起 理由
徽霖 + 1 + 1 用心讨论,共获提升!
水平气压梯度力 + 1 我很赞同!
zymix + 1 + 1 用心讨论,共获提升!
夏520 + 1 + 1 我很赞同!
52pojie61022109 + 1 + 1 用心讨论,共获提升!
hgfty1 + 1 + 1 我很赞同!
wh2510 + 1 谢谢@Thanks!
Jack2002 + 1 + 1 难道VMP已被彻底攻破?
不谙世事的骚年 + 1 + 1 我很赞同!
hxtlcc + 1 我很赞同!
gaosld + 1 + 1 我很赞同!
boyving + 1 + 1 热心回复!
bullshit + 1 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
我是大力呀 + 1 + 1 谢谢@Thanks!
hellowmykami + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
niushengsan + 1 + 1 热心回复!
evea + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
20000418 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
舒默哦 + 1 我很赞同!
fengbolee + 1 + 1 用心讨论,共获提升!
flea033 + 1 + 1 用心讨论,共获提升!
ievnkai + 1 + 1 我很赞同!
x51zqq + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
劣酒先生 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
正己 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
9527kk + 1 + 1 谢谢@Thanks!
wanttobeno + 2 + 1 谢谢@Thanks!
asq56747277 + 1 + 1 谢谢@Thanks!
zsr849408332 + 1 + 1 谢谢@Thanks!
xieemengxin + 1 + 1 谢谢@Thanks!
小菜鸟一枚 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Hmily + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pizazzboy + 1 + 1 谢谢@Thanks!
pk8900 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
luli1111 + 1 + 1 谢谢@Thanks!
alphires + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Heiye_Hack 发表于 2021-1-19 17:35
不错,感谢分享,收下了
 楼主| 沭阳 发表于 2021-2-2 13:05
本帖最后由 沭阳 于 2021-2-2 13:06 编辑
hszt 发表于 2021-2-2 11:28
有人实际操作过吗,我运行脚本,生成了txt,但是内容是空的     先到入口,dump出文件---拖入ida,运行Get_ ...
运行Get_Export_Fun_Name_Addr.py这个脚本实际是将模块的导出函数地址与函数名称导出来,不应该为空啊,可以将程序发来看下
pk8900 发表于 2021-1-19 08:22
这个很有用,不知道是针对特定的VMP版本还是通用的,试试再说。
arg10 发表于 2021-1-19 08:33
谢谢分享。
xieemengxin 发表于 2021-1-19 09:13
谢谢大佬分享  mark了
9527kk 发表于 2021-1-19 09:29
非常感谢,已经收藏;
 楼主| 沭阳 发表于 2021-1-19 10:03
pk8900 发表于 2021-1-19 08:22
这个很有用,不知道是针对特定的VMP版本还是通用的,试试再说。

具体vmp版本我没测试。但是写的还是很通用的,只要符合类似于上文所述的算地址流程形式,都是可以的,不行就是bug,欢迎去提
fangchang819 发表于 2021-1-19 10:40
膜拜大神!
hello_c_world 发表于 2021-1-19 18:30
强无敌,插眼闲下来学习一下!
听风没有雨 发表于 2021-1-19 21:31
插眼学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 00:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表