-
-
[原创]谈谈vmp的还原(1)
-
发表于:
2018-3-19 12:51
16505
-
首先文章不同于其他的文章,从vmp是如何vm opcode入手,看完以后不说还原,相信爆破,静态分析也应该有所帮助。
主要是vmp3.x以下。
0x01 简介vmp的流程
大体如下:
直接定位到流程:
首先读了vmp_opcode_begin_block end_block
然后计算_vm_opcode_size
没错,之前的帖子有提到,vmp作者设计了4套handle,就是这4套了。
注意到上上图113行之后,同时我们也可以看出早期版本的构造
下面这个,之前也有提到
注意到+8,之后会说
先允许我跳过esi的构造以及修复,继续讲下去
可以看到vmp通过这样方式实现jmp vm_entry,所以有些vm插件会通过这种方式来定位到入口
68 xx xx xx xx e9 xx xx xx xx
之后,创建区段vmp0
set jmp_entry
之后写之前的push esi jmp vm_entry了
然后写完之后写vmp1区段,流程大概就这个样子,当然我跳过了构造esi以及对esi的修正
0x10 反汇编引擎
之所以会先谈谈这个,因为如果不看懂这个,后面的vm流程肯定看不懂
为了逆出这个反汇编引擎,我看了几遍opcode的构造方式以及一份开源的反汇编引擎(libudis86)。不过正因为如此,我才大概猜测出来一部分,vmp作者是如何构造这套vm的。
这个函数大概3000+行
这下面通过这两条指令来看看是怎么反汇编的,当然需要一些基础知识。
注意到*(a2-10)其实是对应的这个东西
再上个图就明白为什么是 (xx & 2 ) == 2了
然后读modrm 0x7D进行查找mnemonic
对应的mnemonic
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-2-1 19:22
被admin编辑
,原因: