谢 鑫 马 凌 陈 亮
(湖南信息学院 湖南 长沙 410151)
一种基于虚拟机Handler动态加解密的软件保护方法及实现
谢 鑫 马 凌 陈 亮
(湖南信息学院 湖南 长沙 410151)
考虑到Handler序列为逆向分析者的重点攻击对象。针对Handler指令序列的内存转储分析以及起始和终止点的断点分析,提出一种基于虚拟机Handler动态加解密的软件保护方法,在基于虚拟机的软件保护方法上,增加加密和解密代码模块,并将所有Handler进行加密保存。当程序执行到某个Handler时,先将加密过的Handler进行解密并执行,执行完成后再次对其进行加密,直到所有Handler序列执行结束。实验和分析表明:该方法能够有效防止攻击者对于Handler的起始和终止位置进行断点调试分析和内存转储分析。
逆向分析 虚拟机保护 动态加密和解密 内存转储 断点调试
随着现代社会的快速发展,软件技术也得以不断更新,新开发出来的软件产品应用于人们日常生活的各个领域,同时产生了如反汇编、反编译、动态断点调试和内存转储分析等众多程序理解方法[1]。这些方法不仅可以用于分析软件的安全性和维护软件功能,同时可以用来对软件进行逆向分析,分析软件中的关键算法和核心数据,并结合篡改、移植和重构等方法构造盗版软件。最后通过拷贝、邮件、论坛和即时通信工具等方式进行传播,获取非法经济利益。
为了抵御针对软件核心数据和关键代码的逆向分析,防止软件中的核心模块被恶意利用,软件加密[2-3]、软件水印[4]、代码混淆[5]和防篡改[6]技术等相继被提出。而基于虚拟机的保护技术为软件保护领域近些年来对抗软件逆向分析和破解的新技术,其为代码混淆技术的延伸和增强,也为软件保护领域研究的热点方向。现有对于虚拟机保护的研究主要有:Shi等采用两种方式比较了基于栈架构和寄存器架构虚拟机之间的异同,分析了两类虚拟机的代码量和运行时间[7]。为了平衡性能开销和保护强度,房鼎益等将扭曲变换的思想引入到虚拟机保护之中,通用模块采用低强度保护,核心模块采用高强度保护[8]。王怀军等利用寄存器轮转思想从虚拟机上下文出发对虚拟机进行强度提升,并在其虚拟机保护框架中引入反调试指令[9]。接着为了抵御累计经验攻击,其又引入路径多样性的方法对虚拟机进行保护强度的升级[10-11]。杨明等分析了单虚拟机原理,提出多重虚拟机嵌套保护软件的方法。这种保护使得攻击者必须要完全分析清楚前一层虚拟机,才能对下一层嵌套的虚拟机进行分析,但这种方法给虚拟机引入了极大的时间开销[12]。谢鑫等人从代码并行化和虚拟机多样化的角度提出了一种软件保护方法。该方法使得攻击者需要分析不同虚拟机的机制和并行代码片断才能分析得到受保护代码的语义[13]。之后又从Handler序列多样化的角度对虚拟机保护进行了强度的改进[14]。除了虚拟机保护的正向研究,部分学者还从对虚拟机的反向攻击的角度开展研究,如Coogan等引入语义识别的思想,重点识别基于代码混淆的虚拟指令[15],这些指令影响了程序的可观察行为。Sharif等利用程序理解方法对被混淆的软件进行动态分析,并在虚拟机保护软件运行时利用模拟器记录了指令的执行轨迹[16]。雷远晓先将虚拟机种的Handler处理函数运用指令追踪的方法动态提取后,再采用程序分析方法对其进行静态理解,从而达到对Handler序列的还原[17]。
对于虚拟机保护的攻击往往需要对Handler进行语义分析和还原处理,而该过程的第一步为Handler序列的定位分析,攻击者通常采用内存断点调试和转储分析的形式对Handler的起始,终止位置以及指令序列进行分析。针对对于虚拟机Handler序列的断点调试和转储分析,在一般虚拟机保护框架上,提出了一种基于Handler序列的动态加解密虚拟机(EDVM)保护方法以及具体实现过程。
根据现有文献对虚拟机保护原理的描述可知,Handler序列为不同虚拟机保护框架的核心部分,也是逆向攻击者对于虚拟机进行反向攻击的重点对象。针对Handler序列的还原分析往往需要通过多次断点分析确定单个Handler的起始和终止位置,并通过内存转储的手段分析各个Handler序列的具体语义。为了增强虚拟机保护强度,抵御上述分析手段,对虚拟机中Handler执行过程进行改进,采用多种加解密算法对Handler序列的执行进行处理。
1.1 基本思想
虚拟机保护方法在Handler序列生成时候,首先运用多种不同的加密算法对Handler序列的字节码进行加密,保存不同加密算法的使用顺序。当程序运行到第一个Handler序列时,依据加密算法使用顺序选择解密算法对Handler进行解密,执行完成该Handler序列时,再对其进行加密。然后对下一个Handler进行同样的解密和加密处理,反复该过程,直到所有Handler序列的执行结束。基于Handler序列的动态加解密原理如图1所示。
图1 基于Handler序列的动态加解密思想
1.2 实现步骤
基于虚拟机保护的一般框架和Handler动态加解密思想,Handler序列的动态加解密虚拟机保护具体实现步骤如下:
1) 构建N种加解密算法集合S={
2) 提取虚拟机指令对应的Handler字节码集合SH={BH1,BH2,BH3,…,BHM}。
3) 在加密算法集合中随机挑选加密算法函数对Handler字节码进行加密生成加密后的Handler字节码集合ESH={Ei(BH1,key1),Ej(BH2,key2),Ek(BH3,key3),…,Ed(BHM,keyM)}和加密密钥集合KSH={key1,key2,key3,…,keyM},将其保存到程序新节之中。
4) 依据Handler加解密执行顺序,修改虚拟机保护中的分派函数和Handler序列结束时的转移指令。
5) 当程序Handler执行时,首先运用对应的解密算法和密钥对加密Handler进行解密处理,如Di(Ei(BH1,key1),key1)。然后执行原始Handler序列BH1,执行完成后再将其加密回去Ei(BH1,key1)。处理下一个加密Handler,直到Handler处理结束。
依据该实现步骤,原始程序和EDVM保护后的PE程序内存布局如图2所示。原始PE程序为标准的Windows可执行程序内存布局组织结构,VM保护后的PE程序修改了待保护的汇编指令流,增加了跳转表、虚拟指令系统、ByteCode等数据。而EDVM保护在VM保护的框架上添加了多种加密和解密函数模块,并且增加了密钥和Handler序列长度数据信息,以便于实现动态Handler序列的加密和解密。
图2 原始PE和EDVM保护后PE内存布局
为了实现Handler序列的动态加解密,需要对虚拟机Handler调度器进行重新设计,依据Handler的加密顺序以及相应的加密函数,EDVM的Handler调度器原理如图3所示。首先受保护程序基于初始化代码进入EDVM调度器中的分派函数,根据调度地址表和加密函数使用顺序,选择解密函数队Handler进行解密操作。执行完解密后的Handler,跳转到相应加密函数,再次对执行完的Handler进行加密,该过程执行完成后返回到分派函数重新进行调度执行。循环该过程,一直到所有需要执行的Handler序列全部执行完毕后,退出虚拟机保护框架。
图3 EDVM调度器原理示意
2.1 强度分析
强度分析为基于EDVM虚拟机保护的程序抵御逆向攻击者采用静态和动态程序逆向分析方法的能力。未经过改进的虚拟机所有Handler指令序列都以明文的形式保存在被保护程序中新增加的节里,攻击者通过内存断点、转储和反汇编分析,能够准确地分析Handler指令序列的语义。而基于Handler加解密的虚拟机保护方法,使得所有Handler指令序列只有在将要执行的时候才以明文的形式加载在内存中。通过内存转储分析,每次只能获取单个解密后的Handler指令序列,其他Handler指令序列都以加密数据形式保存在内存中。此种方式可有效抵御程序执行时的Handler转储分析。
对于未经过改进的虚拟机的Handler序列分析,可以通过在Handler的起始和终止位置进行断点设置,多次执行、追踪和分析Handler指令序列的运行轨迹。若基于EDVM保护,在Handler指令序列解密后对其起始和终止位置进行断点设置。再次加载程序时,由于Handler指令序列的加密保存,无法在加密情况下对Handler指令序列的起始和终止位置进行断点设置,需要Handler完全解密后才能对相关指令进行断点设置。该方式在一定程度上防止了断点调试分析。
采用多种加密函数对不同的Handler进行处理,若要静态分析所有的Handler指令序列,则需要获取相关密钥,并对不同的加解密函数进行逆向分析。相比未经过改进的虚拟机保护,大大提升了分析难度。
2.2 开销分析
开销分析主要包括原始受保护程序应用Handler动态加解密虚拟保护后的时间和空间开销。基于EDVM保护和原虚拟机的程序,其所增加的时间开销为对所有执行Handler序列的加密和解密的时间开销。若原始代码经过虚拟机保护后执行Handler1,Handler2,…,Handlern,而基于Handler动态加解密的虚拟机保护则对其中的Handler1,Handler2,…,Handleri采用E1和D1进行加解密,Handleri+1,…,Handlerj,采用E2和D2进行加解密,Handlerj+1,…,Handlern采用E3和D3进行加解密。若T为加解密时间,则时间增加了:T(E1(Handler1))+T(D1(Handler1))+…+T(E1(Handleri))+T(D1(Handleri))+T(E2(Handleri+1))+T(D2(Handleri+1))+…+T(E2(Handlerj))+T(D3(Handlerj))+T(E3(Handlerj+1))+T(D3(Handleri+1))+…+T(E3(Handlern))+T(D3(Handlern))。
基于Handler动态加密和解密的空间开销主要包含在以下几个部分,如图 2所示。增加了多种加密和解密函数模块,用于加解密的密钥和Handler指令序列大小数据。设单个加密密钥占k大小程序空间,单个Handler指令序列大小数据占d大小程序空间。S表示加解密函数模块所占程序空间,则空间增长S(E1)+S(D1)+…+S(E3)+S(D3)+n×(k+d)。
本文的试验环境的基本配置如下:采用的处理器为Intel(R) Core(TM) 2 CPU 1.86 GHz,程序运行的系统为XP Professional 5.1.2600 SP3,运行的环境为VS 2008。在公开其源代码的虚拟机上[18],实现了一个基于EDVM保护原型验证系统,对插入、希尔、快速、和冒泡四款排序程序进行了相关实验和分析。
3.1 内存代码对比分析
使用开源轻量级虚拟机VM和基于Handler动态加解密虚拟机EDVM分别对四款基准程序进行保护,其中EDVM的加解密函数模块采用简单的xor加解密方式进行实现,生成相应保护后的PE程序。采用二进制动态调试工具OllyDbg对其进行反汇编分析,对采用VM和EDVM保护后的希尔排序程序进行分别分析。两者的分派函数如图4所示,VM的分派函数直接根据跳转地址表跳转到Handler中执行,而EDVM的分派函数则需要首先根据密钥,解密数据大小和解密函数地址跳转到解密函数模块,基于解密代码解密需要执行的Handler序列。然后再根据Handler地址表跳转到解密后的Handler进行执行,执行完成后跳转到加密函数进行执行,如图5所示,最终返回到分派函数。提取VM和EDVM中的VBegin虚拟指令进行对比分析,如图6(左)所示,其为实现VBegin虚拟指令的x86汇编指令序列,图6(右)为经过加密后的VBegin虚拟指令,在没有进行解密时无法直接对VBegin虚拟指令的语义进行分析。
图4 基于VM(左)和EDVM(右)保护的PE程序分派函数
图5 基于EDVM保护的加密(左)和解密(右)函数模块
图6 基于VM(左)和EDVM(右)保护的VBegin指令Handler函数序列
3.2 时间和空间开销对比和分析
使用开源轻量级虚拟机VM、虚拟机CV、VMP和基于Handler动态加解密虚拟机EDVM分别对四款基准程序进行保护。其中CV类型参数为TIGER32 (White) VM,VMP的编译参数设置为虚拟,EDVM的加解密函数包含TEA、RC4、BlowFish和Xor四种加解密算法。在EDVM中随机运用四种加解密算法对虚拟机中的除分派函数和堆栈平衡检查函数的所有Handler序列进行加密,并在程序执行的过程中动态加解密。
设有4组每组500个随机数的基准测试数据,运用基准测试程序对其进行排序,虚拟机保护前后程序大小为表1所示。可以发现由于四种加解密函数模块、加解密密钥和Handler长度数据的写入保护程序,基于EDVM保护的程序相比基于VM保护的程序空间增长了40 KB左右,而商业级虚拟机CV和VMP保护由于其中的Handler数目比VM和EDVM数量要多,保护后程序的空间开销大大增长。
表1 虚拟机保护前后程序大小 KB
执行原始程序和应用不同虚拟机保护后的程序,测量其执行时间可以发现由于EDVM引入了多样化Handler的动态加解密技术,在执行每一条虚拟机指令时都要进行Handler的解密、执行和加密。该种方式能够防止程序在执行过程中对于Handler完整指令数据的转储分析,但却较大地增加了程序的运行时间,尤其是对包含多次循环执行的排序程序。具体时间开销如表2所示,采用Handler动态加解密的虚拟机保护的程序,运行时间将大幅度增加,因此需要考虑保护强度和性能开销平衡的问题。一般来说,采用EDVM只对少量核心代码进行保护,否则将产生较大的时间开销。
表2 虚拟机保护前后运行时间 ms
3.3 不同虚拟机保护程序的信息比较和分析
分析不同虚拟机保护后的程序,其中Handler数目、序列状态和新增数据如表3所示。可知商业级虚拟机软件CV和VMP中虚拟指令对应的Handler数目较多,而对于轻量级虚拟机VM和基于VM改进的动态加解密EDVM中的Handler数目较少。CV、VMP和VM虚拟机保护中的Handler为非加密明文指令序列,在程序执行过程中直接进行执行。动态加解密EDVM虚拟机保护中的Handler为加密密文数据,在程序执行过程中通过解密后才能执行。由于CV、VMP和VM基于虚拟机保护一般性实现框架,保护中程序新增的数据为跳转表、虚拟指令系统和字节码序列。而由于EDVM需要实现Handler序列的动态加解密,则向程序增加了多种加解密函数模块、加解密密钥数据和用于Handler加解密的长度信息。
表3 不同虚拟机保护后程序的信息比较
本文针对Handler的内存断点分析和转储分析,对轻量级虚拟VM进行改进,提出一种基于虚拟机Handler动态加解密的软件保护方法和具体实现,提升了Handler序列对于静态反汇编、内存断点和内存转储的分析难度,提升了利用虚拟机框架对软件进行保护的安全强度。然而不足的是对Handler进行动态加解密需在程序中添加加解密函数、密钥、Handler长度等信息,给程序引入了一定的空间开销,而且由于Handler的动态加解密执行,使得程序的时间开销有较大的增长,该方法需要进一步的优化和完善。
[1] 薛芳芳,房鼎益,王怀军,等.基于攻击目的的软件攻击分类方法研究[J].计算机应用与软件,2015,32(2):283-287.
[2] Kleber S,Unterstein F,Matousek M,et al.Secure Execution Architecture based on PUF-driven Instruction Level Code Encryption[J].IACR Cryptology ePrint Archive,2015,651:1-26.
[3] 高琦,刘克胜,常超,等.基于自修改字节码的Android软件保护技术研究[J].计算机应用与软件,2016,33(4):230-234.
[4] 王叶茂,车生兵.软件水印及其研究现状概述[J].计算机应用与软件,2015,32(4):6-10.
[5] 宣以广,周华.基于字符熵的JavaScript代码混淆自动检测方法[J].计算机应用与软件,2015,32(1):309-312.
[6] 马巧梅,胡沙沙,陈够喜.基于完整性验证的软件防篡改方案[J].计算机应用与软件,2016,33(8):312-314,318.
[7] Shi Y H,Kevin C,Anton E,et al.Virtual machine showdown:stack versus registers[J].ACM Transactions on Architecture and Code Optimization,2008,4(4):1-36.
[8] Fang D,Gao L,Tang Z,et al.A Software Protection Framework Based on Thin Virtual Machine Using Distorted Encryption[C]//International Conference on Network Computing and Information Security.IEEE,2011:266-271.
[9] Wang H J,Fang D Y,Li G H.NISLVMP:improved virtual machine-based software protection[C]//Proceedings of Ninth International Conference on Computational Intelligence and Security,2013:479-483.
[10] Wang H,Fang D,Li G,et al.TDVMP:Improved Virtual Machine-Based Software Protection with Time Diversity[C]//ACM Sigplan on Program Protection and Reverse Engineering Workshop.ACM,2014:1-9.
[11] 王怀军,房鼎益,董浩,等.白盒环境中防动态攻击的软件保护方法研究[J].电子学报,2014,42(3):529-537.
[12] 杨明,黄刘生.一种采用嵌套虚拟机的软件保护方案[J].小型微型计算机系统,2011,32(2):237-241.
[13] 谢鑫,刘粉林,芦斌,等.一种基于代码并行化和虚拟机多样化的软件保护方法[J].小型微型计算机系统,2015,36(11):2588-2593.
[14] 谢鑫,刘粉林,芦斌,等.Handler混淆增强的虚拟机保护方法[J].计算机工程与应用,2016,52(15):146-152.
[15] Kevin C,Gen L,Saumya D.Deobfuscation of virtualization-obfuscated software a semantics-based approach[C]//Proceedings of the 18th ACM conference on Computer and Communications Security,2011:275-284.
[16] Sharif M,Lanzi A,Giffin J,et al.Automatic reverse engineering of malware emulators[C]//Proceedings of 30th IEEE Symposium on Security and Privacy,2009:94-109.
[17] 雷远晓.针对虚拟机软件保护的攻击方法研究[D].西北大学,2013.
[18] 段钢.加密与解密[M].3版.电子工业出版社,2008:471-490.
ASOFTWAREPROTECTIONMETHODBASEDONDYNAMICENCRYPTIONANDDECRYPTIONOFVIRTUALMACHINEHANDLERSANDITSIMPLEMENTATION
Xie Xin Ma Ling Cheng Liang
(HunanInstituteofInformationTechnology,Changsha410151,Hunan,China)
Virtual instruction handlers are the core targets for reverse analyzers to be attacked. Aiming at memory dump and breakpoint analysis for handler sequences, a software protection method based dynamic encryption and decryption of virtual machine handlers is proposed. On the basis of framework of virtual machine protection, code modules of encryption and decryption are embedded into the framework, and all encrypted handlers are restored. When a Handler is executed, the encrypted Handler is decrypted and executed. After execution, it is encrypted again until all Handler sequences are finished. Experiments and analysis showed that the method effectively prevented attackers from memory dumping and breakpoint debugging.
Reverse analysis Virtual machine protection Dynamic encryption and decryption Memory dump Breakpoint debug
2017-02-07。谢鑫,讲师,主研领域:软件安全,软件保护。马凌,副教授。陈亮,高工。
TP3
A
10.3969/j.issn.1000-386x.2017.12.060