-
-
[原创]谈谈vmp的还原(2)
-
发表于:
2018-3-25 12:27
7390
-
写之前就在想该以一个怎样的方式阐述这些东西,最终还是决定以逆推的方式来描述
另外 先回答下问题 分析的是vmp的主程序,很早的版本
0x01 虚拟化后
测试的指令
先看看是cmp被vm之后的情况,因为既然大S提到了这个,看了他的帖子,所以叫他大S
0x10 原由
那么我们先来看看是如何得到这些hex
代码很简单
匹配就行了,那么我们来看看匹配表,注意到上一篇的handle_size == 1488 / 8
恩,vmp实现虚拟引擎的核心可以说就是这些虚拟规则。注意到我是用的这些,而不是186个,因为在写之前,我担心版本太老,所以又去逆了逆v2.12.3,发现框架太体差不多,不过代码量优化了很多。还有昨天看了看大Z哥的帖子,对里面有句话感触很深(它们的价值来自于本身的神秘面纱)。但毕竟吧,vmp也3.x,代码重构了,我想也可以谈一谈了。扯远了。
查看引用表的地方
在看看RandIndexArray的引用,来到这个地方
注意到这里可能是乱序之后的,那么如果说不乱序的话,这个表和vm_opcode的应该是一一对应的关系
举例:
定位到handler_table,
则有
Handle_471094:
LODS BYTE PTR DS:[ESI]
PUSH DWORD PTR DS:[EDI+EAX*4]
对应
01 02 02 00 00 00 00 00
如下:
Btw:不保证全对哈,最好看看,哈哈
接着我们看一看Vmp_GetVmHandleIndex的调用
ida的有点乱,把这个函数整理之后
1. 判断vm_mnemonic
2. 再判断寻址方式以及类型
继续,我们看看vm_mnemonic怎么得到的
可以发现由传参决定并对于某些方式递归调用
继续寻找怎么来的
定位到cmp。看看vmp是如何实现对cmp,jcc的膨胀的
首先可以很直观的看到,在早期版本中
把sub cmp sbb放在一起来处理
那么看看是如何usedisasmstruct的
结合刚开始给的,则有先读operand[1]
注意到:
然后其他的对应膨胀规则看看就明白了
分析sub_485884
分析sub_4857DC
可以看到这整套就是一个计算好初始eflags,然后压入_context的过程
分析sub_4858E0
这里就没注释了,可以对照规则
至此,早期版本中的cmp就这样vm了
一个细节的地方
注意到Vmp_SetEsiStruct函数
那么我们可以这样理解,在早期版本
vm的基本单位是指令,而指令通过反编译得到 ----> _struct_disasm
加上一个list,抽象出来
注意到esi是怎样生成的,通过那些规则,故
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-1-11 19:09
被kanxue编辑
,原因: