ImageVerifierCode 换一换
格式:PPT , 页数:31 ,大小:1.41MB ,
资源ID:501451      下载积分:10 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-501451.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VMProtect的逆向分析和静态还原.PPT)为本站会员(国***)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

VMProtect的逆向分析和静态还原.PPT

1、,VMProtect的逆向分析和静态还原,Bughoho,目录,VMProtect逆向分析(一)VMP简单介绍(二) VMP逆向分析执行流程图全貌VMP的HandlerVMP指令分类逻辑运算指令寄存器轮转字节码加密和随机效验阶段总结VMProtect静态跟踪(一)虚拟执行特点(二)执行引擎的虚拟执行(三)分析条件跳转的两条出边字节码反编译(一)中间表示语言(二)指令化简和优化(三)转换汇编指令树模式匹配(四)归类映射寄存器(五)转换汇编指令动态规划(六)寄存器染色基本块内的寄存器轮转基本块间的寄存器轮转寄存器的二义性问题识别寄存器的二义性的步骤,VMProtect的逆向分析和静态还原,一. V

2、MProtect逆向分析,一. VMProtect逆向分析,(一)VMP简单介绍VMProtect是一款虚拟机保护软件,是目前最为流行的保护壳之一,与其他类型保护软件不同的是,它使用的是虚拟机保护技术,侧重点在于保护所指定的函数,增加逆向分析的复杂度虚拟机保护特征将由编译器生成的本机代码(Native Code)转换成字节码(Bytecode)将控制权交由虚拟机,由虚拟机来控制执行转换后的字节码非常难以阅读,增加了破解的复杂性,一. VMP逆向分析,(A) VMProtect Demo版本 流程图,虚拟机其实就是一个字节码解释器,它循环的读取指令并执行,并且它只有一个入口和一个出口(vm_ex

3、it)。通过静态分析,我们可以分析出整个执行引擎的完整代码,graph.demo.pdf,一. VMP逆向分析,(B) Vmprotect Professional 版本 流程图,所有选项全部开启后的结果虚假跳转垃圾指令大量的fake jcc(虚假跳转)和垃圾指令使原来十分简单的代码变得非常复杂,一. VMP逆向分析,(C) 清理了垃圾分支并做了伸直化处理后的结果,设定一些规则,将虚假分支清除后,流程图就跟原来一样清晰了。如果再清除掉垃圾指令,几乎就跟demo版本的代码一样经过清理之后,新的流程图分析起来难度将会降低很多。,一. VMP逆向分析,2.VMP的HandlerVMP是基于堆栈的虚拟

4、机(Stack-Based VirtualMachine)虚拟机指令并不显式的使用某个参数,而是先将参数压入堆栈,然后直接从堆栈中读取表达式:Add eax,ecx可以翻译为:Push ecxPush eaxAddPop eax无论push进来的是谁,Add指令总是读取并弹出堆栈中存放的值,然后Add算出结果再压入堆栈。,一. VMP逆向分析,3.VMP指令分类,汇编指令在转换到虚拟机的指令体系的过程中,被最大限度的化简和归类了,VMP中的指令大体分五类:算术运算和移位运算堆栈操作内存操作系统相关(无法模拟指令)逻辑运算其中最复杂的是逻辑运算指令,一. VMP逆向分析,4.逻辑运算指令Vmp中

5、的逻辑运算只有一条指令:nor。这个指令在电路门中叫NOR门,它由三条指令组成,即not not and,与NAND门一样,用它可以模拟not and xor or这四条逻辑运算指令转换公式 :P(a,b) = a & bnot(a) = P(a,a) and(a,b)= P(P(a,a),P(b,b)or(a,b) = P(P(a,b),P(a,b)xor(a,b)= P(P(P(a,a),P(b,b),P(a,b),NOR闸,一.VMP逆向分析,5.寄存器轮转VMP将所有寄存器都存放在了堆栈的结构中(VM_CONTEXT),结构中的每一项代表一个寄存器或者临时变量。但在运行过程中,其中的项

6、所映射的真实寄存器都是不固定的,可以把它比作一个齿轮,每做完一个动作,部分项的映射就互换了一下位置,或者执行完一段指令,齿轮就按不固定的方向和度数转动一下,然后全部的项映射就改变了。VMP在生成字节码的过程中,维护了一份结构中每一项所映射的真实寄存器,但这只存在于编译过程,而在运行时是没有明确的信息的。这直接导致了分析和识别的难度。,R0,R1,R2,R3,R7,R4,R5,R6,一.VMP逆向分析,6.字节码加密和随机效验VMP把解码算法分布到了Dispatch和每个Handler中,只有在取指令和取数据时才会解密,而每个解码的算法也都是不同的,并且它的Seed每次解密都会变化的。要写出字节

7、码的逆算法不是不可以,但是复杂度太高,有些得不偿失。所以如果想要修改数据,还是使用HOOK的方式比较轻松。,一.VMP逆向分析,但是HOOK的方式得解决代码检测的问题,VMP注册版除了会加密字节码以外,还会随机对一段代码做检测,如果有错将无法运行。VMP注册版中有一条叫指令( calchash),就是用来做检测的。VMP会在编译好的字节码中加一些自己的指令,每次执行都会随机对一段代码生成一个Hash结果,然后与另一个随机的数相加,结果必须为0,否则就会出错。如果要爆破或者修改VMP的代码,还需要处理这个过程。,calchash,一. VMP逆向分析,7.阶段总结:VMP作者的原则最简单的正向设

8、计导致最困难的逆向分析,VMProtect的逆向分析和静态还原,二.VMProtect静态跟踪,二. VMProtect静态跟踪,(一)虚拟执行特点虚拟执行是静态分析与动态执行的一个折中办法虚拟执行时对内存访问做了一定的控制以防止出现异常允许读写静态内存与堆栈内存忽略其他内存访问与修改解决了异常问题后,就可以从入口点一直虚拟执行到出口了,记录得到的字节码日志,二. VMProtect静态跟踪,(二)执行引擎的虚拟执行,分析虚拟机的一般传统方法找到关键位置动态执行并使用记录断点记录数据输出记录日志优点:寻找关键位置时间相对较短缺点:多路径时只能走其中一条路径分析多个虚拟机时要重复做相同的工作,虚

9、拟执行方法虚拟执行代码根据已分析字节码灵活控制代码流程输出记录日志优点:虚拟执行不会对系统造成任何伤害完整的字节码流程缺点:指令正确但操作数的值不可靠复杂度较高,开发时间较久,二. VMProtect静态跟踪,(三)分析条件跳转的两条出边因为虚拟执行是不依赖运行时信息的,所以它无法判断应该走哪一条,必须把两条边都走过一遍。在基本块(BasicBlock)执行前备份运行时环境执行到跳转处分析指令流,获得修改路径关键点退回基本块起始位置重新执行并控制路径,true,false,虚拟机,备份环境,分析跳转相关指令,识别出路径后的流程图(pcode.pdf),基本块,跳转指令,分析指令流,VMProt

10、ect的逆向分析和静态还原,三.字节码反编译,三.字节码反编译,(一)中间表示语言VMP的Handler只能算是低级中间语言,缺少一些例如数据依赖、流程走向等信息,还不满足反编译的条件。需要将其转换为包含更多信息的高级中间语言形式。去掉了对堆栈的依赖,转为直接关联变量表达式被转换成了SSA(静态单赋值)形式,方便对指令做优化处理,Push cPush bAdd.dPop EFLPop A,Stk1 = push cStk2 = push bStk3,Stk4 = Add.d stk2,stk1EFL = stk4A = stk3,Stk1 = cStk2 = bStk3,Stk4 = Add.

11、d stk2,stk1EFL = stk4A = stk3,三.字节码反编译,(二)指令化简和优化常数收缩活跃变量分析删除无关代码VMP在生成的字节码中夹杂了一些自己的指令流,这些指令与原汇编代码没有任何关系,且对还原分析没有任何好处,只会起到干扰的作用。需要根据特征制定一些规则来识别这些垃圾指令。,Push 1A2FBCA0Push F80499D8Add.dPop EFL,Push 12345678,Stk0 = Ctx24Skt1 = Ctx10Stk2,EFL1 = Add.d Stk0,Stk1Ctx28 = EFL1Ctx30 = Stk2Stk3 = Ctx30Stk4 = 11

12、11Stk5,EFL2 = Add.d Stk3,Stk4Ctx28 = EFL2Ctx34 = Stk5,Ctx30,Ctx28 = Add.d Ctx24, Ctx10Ctx34,Ctx28 = Add.d Ctx30,1111,Ctx30 = Add.d Ctx24,Ctx10Ctx34,Ctx28 = Add.d Ctx30,1111,去除中间变量后,去除无用变量后,三.字节码反编译,(三)转换汇编指令树模式匹配文本表达转换为树形表达收集转换规则这是最麻烦的一个过程,需要分析VMP将汇编生成字节码的特征来收集将字节码逆向转换回去的规则,这是一个不得不做的体力活。使用匹配规则迭代匹配汇编

13、指令,Ctx30 = Add.d Ctx24,Ctx10Ctx34,Ctx28 = Add Ctx30,1111,匹配结果,三.字节码反编译,(四)归类映射寄存器经过迭代后的最终结果是这样:Add Ctx30(Ctx24),Ctx10Add Ctx34(Ctx30),1111虽然已经转换为汇编指令,但是还无法确定寄存器到底是哪一个,以目前所知的信息也的确无法判断。不过,我们可以尽可能的确定一些信息,以供后面的分析参考。在转换规则中,预先明确定义了Add指令的第一个参数与结果是同一个寄存器(其他指令也差不多,类似xchg的指令除外),所以可以推理得到,在指定的区间内,Ctx34、Ctx30、Ct

14、x24是同一个寄存器。这样后面在做专门针对寄存器识别的分析时,就可以一下确定这四个寄存器所映射的寄存器了。,匹配结果,字节码反编译,(五)转换汇编指令动态规划考虑右边两段指令所谓动态规划,通俗的讲就是制定一些规则,根据实际情况来选择最终匹配结果。这里的意思是对每一个匹配规则设一个权值,使用计算后值最大的那个匹配规则来进行转换。第二段的情况有些特殊,其中两条指令唯一的不同只有目标操作数。Add指令认为目标操作数与源操作数1相同,而lea指令则无此限制。当出现权值一样的情况时,可以同时作为结果,在识别出寄存器后,再根据实际情况来匹配规则,在这两个指令中选出更像的那一个。,mov eax,dword

15、 ptr edi+0x100add edi,100,其中第一条里面包含了第二条的指令第一条的权值应该设得更高,add edi,100Lea ebx,edi+100,两条指令仅仅是目标寄存器不同两条指令的权值应该相等,(六)寄存器染色,要识别前面所代表的寄存器,要从以下几个方面进行分析:初始化虚拟机时各项所映射的寄存器根据汇编转换规则映射或者结束映射某项到某寄存器退出虚拟机时通过弹出各项时确定各项最终映射的寄存器从这三方面可以大体推理出各项所映射的寄存器但仅仅是这样的话,只有在没有跳转指令的字节码中,成功率才最高。因为还得考虑寄存器轮转,(六)寄存器染色,1.基本块内的寄存器轮转基本块内的寄存器

16、轮转比较容易简单,只要转换规则正确,就可以识别出寄存器,Ctx30 = Add.d Ctx24(eax),Ctx10(ebx)假设 这条指令是add eax,ebx那么 Ctx30 = Ctx24(eax),寄存器区间分析,(六)寄存器染色,2.基本块间的寄存器轮转在执行set.jmp之前,将Context中所有位置的值都临时存放到了堆栈中,跳向目标地址后又再全部把它弹出到不同位置中去,这样就完成了一次轮换。它比基本块内的寄存器轮转更麻烦,因为其中涉及到了二义性的问题,push.reg.d 00000024.push.reg.d 00000020push.reg.d 00000004push.

17、reg.d 00000014push.reg.d 0000003Cset.jmppop.reg.d 00000020.pop.reg.d 0000002Cpop.reg.d 00000028,(六)寄存器染色,3.寄存器的二义性问题寄存器的二义性问题是一个很严肃的问题,因为如果不能正确的分析和处理,将会造成一子放错,满盘皆错的局面。寄存器的二义性由指令的二义性衍生出,要解决指令的二义性,需要先解决寄存器的二义性问题。PushPop的二义性PushPop在VMP中存在一种二义性,即传值与传引用。传值当pop指令的作用是传值时,表示将源项中的值放到目标项中去,所映射寄存器不变传引用当pop指令的作

18、用是传引用时,不但将值从源项放到目标项中去,且目标项所映射的寄存器也将被覆盖。传值是一般情况,即汇编指令的pushpop指令对,传引用是特殊情况,如寄存器轮换等。Add与Lea等其他指令的二义性这两条指令广义的讲也是PushPop的二义性。为Add指令时, pop指令的含义为传引用为Lea指令时,pop指令的含义为传值,普通PushPop指令对:Push Ctx20(edx)Pop Ctx24(esi)寄存器轮换:Push Ctx20(edx)Pop Ctx24(edx),(六)寄存器染色,4.识别寄存器的二义性的步骤根据转换规则尽可能确定一些特性,缩小可能的寄存器范围无法判断的寄存器将其加入此项的可能性列表中,并建立起传递链表退出虚拟机时可知各项真实的寄存器,排除其他可能的寄存器确定寄存器后,再重新排除有二义性的指令,VMProtect的逆向分析和静态还原,参考资料:高级编译器设计与实现(Steven S.Muchnick)编译原理及实践(Louden, K.C)decompilers and beyond white paper(Ilfak Guilfanov)破解vmp程序的关键点(海风月影)以及其他众多互联网资料,感谢,看雪论坛组委会参考资料以及各位观众,Thank You !,,

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。