首页
社区
课程
招聘
vmp是如何修复api的
发表于: 2020-7-2 19:12 17739

vmp是如何修复api的

2020-7-2 19:12
17739

1.vmp 在执行完形如以下指令时 完成了对api的解密以及调用

2.先说 imm1 因为 reg+imm1 位于 vmp0 区段之中
eg:
vmp0的区段 base 以及 size 分别为

00007FFDAFA54840 为 jmp qword ptr ds:[<&GetModuleFileNameW>]

此时 kernel32.dll 的 base 为

设想以下情况:
假如电脑关机后重启 重新打开 而此时kernel32.dll 的 base 变成了

那此时 [00000001400F1360] 应该填上多少比较合适呢

至此就修复了该api的调用

所以我们是不是就可以这样了
弄点代码 跑在原本oep之前 根据记录到的dllname,dllbase,dllsize以及api的name
然后在对vmp0进行暴搜
进行修复就可以了

回到最开始 我们发现还有个imm2 而这个立即数会导致
[reg+imm1]里面存放的数可能不属于[dllbase, dllbase + dllsize]

3.看看vmp是如何完成映射的

写入

先看看 映射空间 0x000007FEEAC2C999 怎么计算得到的

rax 来自于 mov rax,qword ptr ss:[rbp]

我们不难发现 这个偏移来自于vmp的bytecode里面
再看看 数据 0x0000000020A44E60 怎么计算得到的

先看 0xFFFFFFFFA90235F0

偏移也来自于vmp的bytecode里面

再看关键的 0x77A21870
首先 kernel32.dll 的 base为 0x77A10000

接下来 我们看看获得序号0x8F后做了哪些事情

获取到 rdi 之后
设置好 rsi 开始

在根据Export Names的不同序号(如:aCreatefilew)进行比较
得到想要的api的地址 只是这个api的name是写死在vm的字节码中
然后在写入 vmp0 或者像 LocalAlloc开辟的空间里
其实就是我们去获取api地址的那些常规逻辑

vmp类似去处理字符串的方式还是很多
比方说xjun师傅的插件绕过syscall的处理方式
就是因为vmp就是去读ntdll .rsrc里面的版本信息的

样本中 处理的api:

以上过程就是vmp在LocalAlloc之后
LoadLibrary dll修复完vmp0中各个api的地址的过程
LocalAlloc中的数据填写也类似 此外还有cpuid的运算

btw:
明白了 就能去处理这些东西了
思路会有一些 不同思路会处理起来不一样
一些思路上一些需要注意的点
1.
vmp1里面会调用到一些api,涉及到空间问题
2.
0xAAA: call 0xBBB
0xBBB: call 0xCCC // CCC去解密调用api
这种需要将 BBB 修复成 jmp
3.
反汇编引擎search 0xe8会得到两种 // 感谢大表哥(hzqst)提供的暴搜0xe8以及开源的unicorn_pe
一种为5字节的
一种为6字节的 即opcode中会包含前缀 // 前面如果会有 push reg opcode也会有前缀 即2字节
4.
根据堆栈情况
call/jmp
前移/补ret

还有的 等我遇到再补充

 
 

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

收藏
免费 7
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  Editor   +1.00 2020/07/06 精品文章~
最新回复 (9)
雪    币: 9036
活跃值: (5286)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs
2
珍爱生命,远离VMP
2020-7-2 19:55
0
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害了,一系列文章分析的很透彻
2020-7-2 22:09
0
雪    币: 2214
活跃值: (3271)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
楼主分析的很认真,可惜内容还有些错漏,你想要修复VMP的API调用入口,可以直接参考我的帖子https://bbs.pediy.com/thread-219292.htm,思路脚本都有
2020-7-5 14:32
0
雪    币: 911
活跃值: (1358)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
5
xiaohang 楼主分析的很认真,可惜内容还有些错漏,你想要修复VMP的API调用入口,可以直接参考我的帖子https://bbs.pediy.com/thread-219292.htm,思路脚本都有
  1. 我表达的是 vmp2.x 怎么动态修复这些api的

  2. 错误和遗漏分别指的是

  3. 看了你的帖子 你说那些 [修复VMP的API调用入口] 是指 那些 0xe8 到 解码api地址 调用的 那些地方么

          3.0 search 0xe8我列出了需要注意的问题一些问题

          3.1 vmp1中也这样去修么

          另:帖子最后有一处文字错误 // 上传了脚步

最后于 2020-7-5 15:52 被waiWH编辑 ,原因: 补充
2020-7-5 15:16
0
雪    币: 2214
活跃值: (3271)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
6
waiWH xiaohang 楼主分析的很认真,可惜内容还有些错漏,你想要修复VMP的API调用入口,可以直接参考我的帖子https://bbs.pediy.com/thre ...

se和vmp有很大的相似之处,尤其是早起版本的vmp。
错漏比如,程序调用API的地方不止0xe8,考虑一下为什么有的地方是5字节,有些地方是6字节?
还有,谢谢指正,早就发现了,懒得改

最后于 2020-7-5 17:01 被xiaohang编辑 ,原因:
2020-7-5 16:59
0
雪    币: 911
活跃值: (1358)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
7
    xiaohang 楼主分析的很认真,可惜内容还有些错漏,你想要修复VMP的API调用入口,可以直接参考我的帖子https://bbs.pediy.com/thread-219292.htm,思路脚本都有

除了没说为什么有的情况字节码会带前缀? 以及还有 mov reg, [api]? // 这只是一些思路中的其中一种

还有呢


最后于 2020-7-5 19:20 被waiWH编辑 ,原因: 增加了下引用
2020-7-5 17:09
0
雪    币: 36207
活跃值: (7170)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
看懂这个还是很头大的。
2020-7-5 19:03
0
雪    币: 3744
活跃值: (3151)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
9
学习
2020-7-5 22:24
0
雪    币: 29177
活跃值: (63591)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
10
感谢分享!mark了
2020-7-6 09:24
0
游客
登录 | 注册 方可回帖
返回
//