基于图变换的虚拟机保护增强方法
2021-12-01罗莉霞
谢 鑫,罗莉霞,陈 敏
(湖南信息学院 计算机科学与工程学院,长沙 410151)
0 引言
伴随着全球通信产业链的不断升级,通信软件在不断革新和优化的通信产业生态环境中,所处的地位变得越来越重要。但随之而来的是,对于通信软件的侵权及其漏洞的攻击,也变得越发的频繁。恶意攻击者通过采用静态和动态的软件逆向分析方法和工具,探查通信软件内部数据和代码,明晰软件内部的安全保护机制,通过修改和控制通信软件的内部逻辑,绕过内置安全保护机制,实现对于关键数据,算法和功能模块的获取。
目前对于通信软件的保护研究聚焦在于采用代码混淆技术,在保证通信软件功能不变的前提下,对指令进行变形和膨胀,对逻辑和结构进行复杂和模糊,或采用加密技术对关键代码和数据进行保护。而与代码混淆和代码加密不同的是,采用代码虚拟化技术对通信软件进行保护,既不是在原始代码层面进行功能等价变换,也不是提前将重要代码或数据进行加密,需要执行时再在内存中进行解密。而是将目标代码翻译成攻击者不熟悉的其他类型中间语言,在原指令系统中又叠加了另一套指令系统。攻击者要想正确理解目标代码,需要分析目标代码所对应的指令系统框架和新叠加的虚拟指令系统。
针对单虚拟机框架内部模块安全的研究工作如下。虚拟指令解释函数(Handler)模块:采用模拟退火算法随机化对Handlers进行指令乱序[1];通过等价指令替换和切分乱序对Handlers进行多样化[2];对Handlers序列进行动态加解密[3];基于时间多样性设计对Handlers进行多样化[4];采用数据混淆引擎对Handlers进行变形[5]。虚拟指令调度器(Dispatcher)模块:基于控制流迭代混淆和随机切分加密方法的Dispatcher安全性增强[6];防止攻击者对虚拟机进行定位的Dispatcher模块隐藏[7];增加程序多样性的多Dispatchers程序控制单元插入[8]。虚拟机指令(Bytecode)模块:采用虚拟花指令序列与虚拟指令模糊变换技术改进虚拟机指令模块强度[9];对虚拟指令字节码进行加解密[10]。虚拟机上下文(VMContext)模块:基于多组寄存器值变形的虚拟机上下文复杂化[11]。
针对单虚拟机框架模块连接安全的研究工作有:打乱字节码指令的操作码和处理程序之间的对应关系的虚拟指令随机化[12];减少静态虚拟指令内存暴露的基于多样化调度器的虚拟代码折叠[13]。
针对虚拟机整体框架安全的研究工作有:采用多虚拟机框架混淆从虚拟机操作码到本地机器指令的映射[14];采用多套虚拟机环境随机选择和执行所构造的混淆基本块和关键代码[15];基于不同强度的多重虚拟机嵌套保护框架[16];基于多虚拟机的核心代码并行化保护框架[17]。
上述研究工作从不同角度提升了虚拟机保护技术的安全性,但从虚拟机整体框架看,不同模块间的连接结构具有较强的固定性,攻击者依旧较容易实现:先从高维视角整体理解虚拟机保护框架,然后再进一步分析各模块内部功能,从而实现保护机制的破解。本文针对虚拟机模块连接的固定结构,提出一种基于图变换的代码虚拟化安全保护方法:首先对虚拟机基本结构图进行变形,然后采用花指令嵌入、等价指令变换和代码数据跳变方法对不同模块内部指令序列进行变形,生成多样化虚拟机集,最后对虚拟机不同模块进行嵌套变形。
1 基于图变形的虚拟机保护框架增强
攻击者对受虚拟机保护的代码分析流程为:先明晰虚拟机保护整体结构和解释执行框架,再深入对各模块功能进行分析。为了增加虚拟机模块间连接结构和模块内部代码的复杂性,提升虚拟机保护强度,基于图的基本操作,对虚拟机的框架结构进行混淆,提出一种基于图变换的虚拟机框架变形方法,如图1。
基本思想为:首先构建虚拟机结构图如图1(a),然后通过增加不透明谓词和逻辑分支将其转化为正则图如图1(b),再运用花指令嵌入、等价指令替换和代码数据跳变方法,对正则图节点中部分指令序列进行等价变形如图1(c),最后基于宽度和深度嵌套策略,对部分节点中的核心指令序列进行多虚拟机保护如图1(d)。
图1 基于图变换的虚拟机混淆
1.1 相关定义
首先给出虚拟机结构图,虚拟机结构图混淆等相关定义如下。
定义1(虚拟机VM):在虚拟机框架VM中,VM={BC,HD,DP,JT,VMC,VMS,VME},BC表示字节码,HD表示虚拟指令解释函数,DP表示虚拟指令调度器,JT表示跳转表,VMC表示虚拟机上下文,VMS表示虚拟机入口代码,VME表示虚拟机出口代码。
定义2(虚拟机结构图VMG):由虚拟机框架VM各模块构成的结构图VMG,VM={V,E},V表示虚拟机VM所有模块集合,E表示模块间构成的控制流关系集合,若结构图不含平行边和环,则称有向简单虚拟机结构图。
定义3(虚拟机结构图混淆OBVMG):设VM结构构成n阶有向简单图,C为VM中的核心代码,OBVMG(VM) =f1(f2,f1为将有向简单虚拟机结构图VMG转换为语义等价且每个顶点都邻接到其余m-1个顶点上的m阶有向完全虚拟机结构图的变换算法,f2为一种将C变换为语义等价的混淆代码CO的代码混淆算法。
定义4(多样化虚拟机集OBVMS):用OBVMG对VM进行混淆,生成多样化虚拟机集OBVMS={VM1,VM2,VM3, …,VMn},对于(i,j(n,VMi=VMj,表示虚拟机VMi和VMj,表示虚拟机VMi和VMj功能等价,|VMS|表示多样化虚拟机的数量。
1.2 虚拟机框架混淆方法
基于图变换的虚拟机框架变形原理,对虚拟机框架VMG进行混淆分三步进行。首先采用虚拟机结构图变换算法对虚拟机框架进行变形,再基于混淆策略生成多样化虚拟机框架集OBVMS,最后进行嵌套保护构建GOB-VM保护框架,具体如下。
1)虚拟机结构图变换。
步骤1:基于虚拟机VM保护代码构建其结构图VMG;
步骤2:对VM={BC,HD,DP,JT,VMC,VMS,VME}代码模块进行切分,每一模块切分后子模块数目分别记为{kBC,kHD,kDP,kJT,kVMC,kVMS,kVME};
步骤3:构建切分后的虚拟机VM结构图VMG’= {V,E};
步骤4:将VMG’转化为k=kBC+kHD+kDP+kJT+kVMC+kVMS+kVME阶有向完全虚拟机结构图。
2)多样化虚拟机框架集生成。
花指令嵌入策略:将对程序语义不产生影响的花指令,嵌入到目标指令序列上下文中,花指令和目标指令之间不产生依赖关系,嵌入前后的目标指令序列语义不发生改变,如图2(a)所示。
等价指令替换策略:采用等价指令模板对目标指令序列进行替换,目标指令经过混淆后不出现在混淆指令序列之中,替换后的指令片段相互之间具有依赖关系,如图2(b)所示。
图2 花指令嵌入和等价指令替换
代码数据跳变的基本过程,如图3所示。
图3 基于Mealy机膨胀的代码数据跳变
步骤1:设原始指令序列为(c1,c2,c3,…,ck),将其表示为十六进制数据序列,记为D;
步骤2:将D进行随机切分,切分后的序列记为(d1,d2,d3,…,dl);
步骤3:将(d1,d2,d3,…,dl)转化为能输出对应数据序列的Mealy自动机代码,记为(M1,M2,M3,…,Ml);
步骤4:对(M1,M2,M3,…,Ml)进行(m1,m2,m3,…,ml) 次迭代膨胀变形[18],转化为(M1’,M2’,M3’,…,Ml’)对应的代码模块;
步骤5:对(M1’,M2’,M3’,…,Ml’)代码模块进行拼接,使其能输出数据序列D,并最终转化为原始指令序列(c1,c2,c3,…,ck)。
3)虚拟机嵌套。
采用宽度或深度嵌套策略如图4,对多样化虚拟机集合中的单虚拟机核心代码模块进行多虚拟机保护。
图4 虚拟机框架核心代码嵌套
宽度嵌套策略:针对单虚拟机VM1中的所有模块,随机选择部分核心指令序列,采用生成的多样化虚拟机集{VM2,VM3,…,VMd}对其进行保护。
深度嵌套策略:针对单虚拟机VM1中的单个模块,随机选择部分核心指令序列,采用虚拟机VM2对其进行保护,生成虚拟机VM1’模块然后再采用虚拟机VM3对VM1’相同模块进行保护,生成VM1’’,依次类推。
2 系统关键技术
2.1 基于不透明谓词的结构图连接
考虑到让混沌系统具有更不确定的属性和更复杂的相空间,选用二次映射混沌系统来构造安全性更高的不透明谓词集合{OP1,OP2,…,OPn},然后再从该集合中随机选取不透明谓词对虚拟机框架模块进行连接,实现m阶有向简单虚拟机结构图向m阶有向完全虚拟机结构图的变换。
若该图中m个节点所对应的出度,分别为{o1,o2,…,om},则在每个节点和下个节点连接中,添加{m-o1-1,m-o2-1,…,m-om-1}个不透明谓词,增加{2(m-o1-1), 2(m-o2-1),…, 2(m-om-1)}条控制连接边,如图5所示。
图5 基于跳转表的结构图连接
2.2 基于跳转表的结构图混淆
将基于不透明谓词的虚拟机混淆结构图投射到内存空间,在每一个不透明谓词结束的地方,都会有类如jmpb1无条件或jnzb2, …,jgbn等有条件等指令;然后针对虚拟机变换后模块中所有跳转指令,构建统一的跳转表,采用统一的callf对其进行控制流转移,如图6所示。若想进一步增强跳转表的安全性,可以将其嵌入到更大的随机地址表空间中[2],从而实现基于跳转表隐藏的结构图连接混淆。
图6 基于跳转表的结构图连接
3 实验分析
3.1 实验环境和测试用例
Windows10家庭中文版64位操作系统,CPU为Intel(R) Core(TM)i7-8700 CPU,内存为16 GB,主频为3.2 GHz。
采用IDA7.2对6款测试程序进行分析,获取程序的大小和所包含的函数个数,并采用Local Windows Debugger调试器,对以mspaint.exe画图程序的图片粘贴关键代码段图7为例的所有测试程序进行跟踪分析,获取执行指令数目以及执行时间,基本信息如表1所示。
表1 测试用例描述
图7 画图程序分析信息
3.2 性能分析
首先构建虚拟机代码保护原型系统M-VM,然后再运用基于图变换的虚拟机保护方法对原型系统M-VM进行混淆增强变换生成GOB-VM虚拟机。变换过程中:设定模块切分参数为2,数据和代码跳变中随机切分片段数目为2,进行3次迭代膨胀变形,嵌套深度和宽度次数为1次,并采用二次映射混沌系统所构造出来的多样化不透明谓词进行模块逻辑的连接。
然后基于表1中的测试程序,分别采用M-VM,GOB-VM,以及商用软件Code Virtualizer(CV),VMProtect对其进行保护,其中CV版本号为3.0.8.0使用的虚拟机类型为Tiger32 White;VMP版本号为3.5,采用默认设置策略进行虚拟机保护。表2为保护前后软件大小的变化,表3为保护前后关键代码指令执行时间的变化。由于每次执行时间都有所不同,因此图表中执行时间为20次执行时间的平均值。
从表2和3可得,通过不同虚拟机框架对程序进行保护,保护后的程序无论在程序大小还是在运行时间上都会有较大的增长,如果采用虚拟机框架对程序进行保护,一般只对程序核心代码和核心数据进行保护。GOB-VM与商用保护软件进行对比:其空间和时间的增长开销与CV基本持平,但远高于商用软件VMP和原型虚拟机系统M-VM。在实际使用GOB-VM对软件进行保护的时候,如果要提高其安全强度,需要提升模块切分参数值,数据和代码跳变中随机切分片段数目,迭代膨胀变形次数,虚拟机嵌套深度和宽度次数,以及挑选安全强度更高的混沌不透明谓词,这样会使得程序的空间和时间开销有进一步的增长。
表2 保护前后程序大小
表3 保护前后关键代码执行时间
如果要降低虚拟机保护带给程序的时间开销,增强虚拟机保护的应用性,则需要降低模块切分参数值,数据和代码跳变中随机切分片段数目,迭代膨胀变形次数,控制虚拟机嵌套层次,以及挑选能够实现快速运算的混沌不透明谓词。
4 结束语
本文针对虚拟机核心模块连接结构的固定性,提出一种基于图变换的虚拟机安全性增强方法,方法基于虚拟机结构图变换算法,三策略组合的多样化虚拟机框架集生成算法,以及虚拟机嵌套算法,在算法实现过程中,采用混沌不透明谓词对变换后的结构进行连接,并运用跳转表对连接结构进行隐藏,基于等价变换规则的复合生成多样化代码。基于M-VM原型虚拟机实现了加固型GOB-VM虚拟机系统,通过相关分析和测试表明:基于图变换的虚拟机混淆方法,能够大大提升虚拟机系统内部结构理解的难度,对于核心代码和数据能够有更高的保护强度,可以极大的提高数据安全性。
在实际虚拟机系统的变换实现过程中,由于涉及到多种不同的参数,如果为了更进一步提升保护的安全性,可以将模块切分更细粒度,迭代次数更多,嵌套层数更深,但随时将带来程序时间开销极大的增加,导致虚拟机保护方法应用性大大降低,但如果粗粒度切分,降低迭代次数和嵌套层数,会导致虚拟机保护方法安全性的降低。因此,下一步工作是虚拟机混淆保护方法的开销和安全性的平衡问题,并进行更大规模测试用例和参数的相关实验。