-
-
vmp2代码还原分享
-
发表于:
2022-4-3 17:06
10907
-
一般来说还原的话,要先能够像fkvmp这种插件先能从指令流中把虚拟机执行的流程弄出来,
弄出来之后分静态和动态两种方法,静态分析的缺点在于它本身就是堆栈机,堆栈这种本身就是一种动态的思想,静态无法获得堆栈信息,
但是他那个vJcc,也就是分支跳转,是在堆栈中各种运算出来的。如果是动态的话,也就是用unicorn或者triton什么玩意的仿真执行的引擎,
有可能执行的时候堆栈中的数和文件在真机下运行的堆栈情况不同,导致vJcc跳转目的地不对(这个我目前没找到问题在哪)。
```
vm-entry 到vm-exit的流程,这是第一步要获得的。
[vip 14000ace9]SREGQ
[vip 14000ace7]LCONSTDWSXQ
[vip 14000ace2]ADDQ
[vip 14000ace1]SREGQ
[vip 14000acdf]SREGQ
[vip 14000acdd]SREGQ
[vip 14000acdb]SREGQ
[vip 14000acd9]SREGQ
[vip 14000acd7]SREGQ
[vip 14000acd5]SREGQ
[vip 14000acd3]SREGQ
[vip 14000acd1]SREGQ
[vip 14000accf]SREGQ
[vip 14000accd]SREGQ
[vip 14000accb]SREGQ
[vip 14000acc9]SREGQ
[vip 14000acc7]SREGQ
[vip 14000acc5]SREGQ
[vip 14000acc3]SREGQ
[vip 14000acc1]SREGQ
[vip 14000acbf]SREGQ
[vip 14000acbd]SREGQ
[vip 14000acbb]SREGQ
[vip 14000acb9]SREGQ
[vip 14000acb7]LCONSTQ
[vip 14000acae]LREGQ
[vip 14000acac]ADDQ
[vip 14000acab]SREGQ
[vip 14000aca9]LCONSTQ
[vip 14000aca0]LREGQ
[vip 14000ac9e]ADDQ
[vip 14000ac9d]SREGQ
[vip 14000ac9b]LREGQ
[vip 14000ac99]LREGQ
[vip 14000ac97]LREGQ
[vip 14000ac95]LREGQ
[vip 14000ac93]LCONSTQ
[vip 14000ac8a]LREGQ
[vip 14000ac88]ADDQ
[vip 14000ac87]SREGQ
[vip 14000ac85]SREGQ
[vip 14000ac83]LREGDW
[vip 14000ac81]LREGDW
[vip 14000ac7f]LREGQ
[vip 14000ac7d]LCONSTQ
[vip 14000ac74]ADDQ
[vip 14000ac73]SREGQ
[vip 14000ac71]WRITEDW
[vip 14000ac70]SREGDW
[vip 14000ac6e]LCONSTBSXDW
[vip 14000ac6c]SREGDW
[vip 14000ac6a]LREGQ
[vip 14000ac68]LREGQ
[vip 14000ac66]LREGQ
[vip 14000ac64]LREGQ
[vip 14000ac62]LREGQ
[vip 14000ac60]LREGQ
[vip 14000ac5e]LREGQ
[vip 14000ac5c]LREGQ
[vip 14000ac5a]LREGQ
[vip 14000ac58]LREGQ
[vip 14000ac56]LREGQ
[vip 14000ac54]LREGQ
[vip 14000ac52]LREGQ
[vip 14000ac50]LREGQ
[vip 14000ac4e]LREGQ
vm-exit
```
其次为每个handler写lifter,lifter的作用就是生成同样作用的IR,我是用的llvm的ir,git上面有个东西叫vtil,他好像也能生成ir,还有能专门针对堆栈机的优化,最后代码还原的效果直接取决于优化的,但是他的项目没文档,c++新特性还用的多,代码看都看不懂。
比如下面这个lifter,
```
lifters addq
{
vm::handler::ADDQ,
[](_cvmp2& vmp2, std::variant<uint64_t, uint32_t, uint16_t, uint8_t> param1)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!