微信号:ikanxue

介绍:致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号.

人肉跟踪VMProtect入口至出口运行全过程(1)

2018-10-10 17:59 爱吃菠菜


一 、前言

跟vmp正面刚的起因是想自己实现一个ARM VMProtect的保护软件,作者在查阅了大量资料以后还是不太理解 VMProtect 到底是怎么实现的,

终于意识到没有扎实分析过 VMProtect ,只停留在看别人分析的臆想阶段,是不可能理解VMProtect的。所以下定决心耐心分析,追随大佬们的脚印前行,也开始自己为技术疯狂的年月。


二 、分析的样本

是使用vmp v2.04 虚拟难度下的最快速度(所有都不勾选)设置,对一条mov eax,0x77指令加保护的最简单样本,从头到尾跟踪完这个样本,就理解 VMProtect的入口出口,虚拟寄存器、虚拟栈。分析记录无视了一些并非新手最应该关注的细节,分析过程不保证完全准确,甚至有一些错误,希望大家能理解。


三、附件的内容

pdf和rar中是本菜跟vmp初次正面交锋全过程记录,逐条人肉记录了指令执行的每一次堆栈和寄存器变化,争取追究每个细节,过程写的详细而罗嗦,比较费时间,不适合高手看,不适合没时间的人看,适合想写出vmp的新手看。


四 、没精力的同学


可以看贴子中提炼后的重点内容和附件.xlsx。希望对写vmp感兴趣但一知半解的人有所帮助。


五 、另外

建议动手调试vmp样本前,最好看过其他一些几篇文章,对vmp有一个初步的认识。


    1 、虚拟机保护技术浅谈

    https://bbs.pediy.com/thread-139586.htm

    

    2 、VMP虚拟机加壳的原理学习

    https://www.tuicool.com/articles/bIFrMz

    

    3 、动手实现代码虚拟机

    http://www.mottoin.com/87374.html

    

    4 、VMProtect2.04加壳程序从入门到精通

    https://bbs.pediy.com/thread-121412.htm


六 、重点内容提炼


提炼了下重点内容,没时间的同学直接看这个过程:


首先打开附件(点击文末“阅读原文”即可获取附件)


" 用Excel颜色标记出_VMProtect样本Trace的内容的结构.xlsx ",


  • 表格中我标出四中颜色,紫色、蓝色、橙色、黄色


  • 大概的规律是,紫色部分只出现了一次,后面全都是蓝橙黄的组合


  • 所以代码分为两个部分:(1)紫色(2)蓝橙黄



1、 最开始紫色部分作用(vmp指令执行前的准备)


(1) 向正常栈push所有真实寄存器。
·
(2) 意图在正常栈中构建出一个给vmp使用的空间。
·
(3) 此空间原则上一分为二


上部分称为context区,16个4字节空间,每1个代表一个vmp虚拟寄存器,EDI记录着它的上边界。


下部分称为运算区(或者叫vmp运算栈),是vmp指令执行用的栈,使用EBP记录该vmp运算栈的栈顶。

(4) 第一步的push所有真实寄存器操作完成后,这些寄存器值正位于vmp运算栈中。

(5) 给ESI一个指向,后面会用这个指向去加载vmp的字节码。




2、蓝-橙-黄部分作用(一条vmp指令的执行)


每一个蓝橙黄组合,代表执行完一条vmp指令。


  • 蓝色:加载并解密字节码。


  • 橙色:根据字节码数值计算出handler地址。


  • 黄色:执行该handler逻辑。



3、前十几个蓝橙黄


前十几个蓝橙黄都是一种handler,是一种类似pop的操作,我们称之它为vPop。

 

这十几个vPop在做什么呢?是将紫色部分向vmp运算栈存放的一堆真实寄存器值,移动到vm context区,一个vPop移动一个值。



·
每一个蓝橙黄组合,代表执行完一条vmp指令,这十几个蓝橙黄,全是同样的vPop操作。在专门的VMProtect调试器中,就是这样的。相应的蓝橙黄handler汇编代码,这里就不列出了。




4、对被保护代码"mov eax,0x77"的模拟


为什么说VMProtect是栈式虚拟机呢?

实现一条mov操作也要通过VMProtect运算栈完成,77  --> vmp栈 --> eax

 

所以mov eax,0x77对应的vmp代码是:


vPush 0x77
vPop   vR13





5、最后十几个蓝橙黄


全是同样的vPush操作:



·
将context区的vmp虚拟寄存器值,移动到vmp运算栈中。





6、最后一个vRet的作用


将压入vmp运算栈中vmp虚拟寄存器值,更新到真实cpu寄存器中,
至此,退出虚拟机。




- End -



看雪ID:爱吃菠菜               

https://bbs.pediy.com/user-760871.htm



本文由看雪论坛 爱吃菠菜 原创

转载请注明来自看雪社区




热门技术文章推荐:





公众号ID:ikanxue
官方微博:看雪安全

商务合作:wsc@kanxue.com




戳原文,看看大家都是怎么说的?
 
看雪学院 更多文章 代码混淆之我见 看雪CTF 国庆赛 落幕,是谁slay全场? CVE-2017-5123 waitid本地提权分析 CVE-2018-17405漏洞预警及OpenZepplin详解预告 2015 plaidctf datastore(off by one)
猜您喜欢 又有好东西了!这两部新番让我欲罢不能 不会做动画的前端不是好开发 「免费赠票」全球软件案例研究峰会5个免费席位,先到先得 UI自动化测试基于Activity的封装模式 验证码的故事 (1)