虚拟机指令的混淆方法及装置、虚拟机保护系统与流程

文档序号:11707944阅读:419来源:国知局
虚拟机指令的混淆方法及装置、虚拟机保护系统与流程

本发明涉及软件安全领域,具体而言,涉及一种虚拟机指令的混淆方法及装置、虚拟机保护系统。



背景技术:

随着软件工业的飞速发展,软件的安全日益重要,如何保证软件的完整性成为一个重要的问题。代码混淆作为一种重要的软件保护手段用在越来越多场合。o-llvm代码混淆的实现方式主要有以下几种:(1)虚假分支插入,通过在程序的流程中插入永远不会被执行到的虚假分支来达到干扰破解者分析的目的;(2)流程复杂化,通过将程序原来简单的控制流转换为复杂的控制流来加大分析难度;(3)ir层面的指令替换,通过恒等方式将原有指令进行变换,例如加法转换为等价的减法。但是,上述几种实现方式仍然可以被反编译,存在一定的风险,例如:对于第(1)种实现方式,插入的虚假分支容易被识别,通过符号执行等手段可以识别出虚假分支,并将其删除;对于第(2)种实现方式,虽然经过流程复杂化依然可以通过符号执行确定正确的程序流程,从而被还原;(3)对于第三种实现方式,通过反编译等手段,还原出来的代码,只要稍加理解,依然可以识别原来的逻辑。

通过o-llvm混淆后的代码依然可以被正确反编译,通过理解反编译的高级语言代码来实现理解软件的逻辑也是有可能的。因此,相关技术中提供的上述o-llvm代码混淆的实现方式仍然存在易被反编译的风险。



技术实现要素:

根据本申请实施例的一个方面,提供了一种虚拟机指令的混淆方法,包括:对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令,其中,所述目标输出指令为编译器(compiler)后端(backend)输出的与所述待编译程序对应的指令;将所述目标指令作为编译器的最终输出指令并输出该最终输出指令。

根据本申请实施例的另一方面,还提供了一种虚拟机指令的混淆装置,包括:混 淆模块,用于对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令,其中,所述目标输出指令为编译器后端输出的与所述待编译程序对应的指令;输出模块,用于将所述目标指令作为编译器的最终输出指令并输出该最终输出指令。

根据本申请实施例的另一方面,还提供了一种虚拟机指令的校验系统,包括:虚拟机解释引擎和虚拟机保护编译器;其中,所述虚拟机保护编译器,用于对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令;以及将所述目标指令作为所述虚拟机保护编译器的最终输出指令并输出该最终输出指令;其中,所述目标输出指令为虚拟机保护编译器后端输出的与所述待编译程序对应的指令;所述虚拟机解释引擎,用于加载并执行所述虚拟机保护编译器输出的所述最终输出指令。

在本申请实施例中,采用对编译器后端输出的与待编译程序对应的目标输出指令进行代码混淆处理,并输出进行代码混淆处理后的目标指令的技术手段,从而代替了相关技术中将与待编译程序对应的未经代码混淆处理后的指令作为最终输出指令的方案,提高了反编译的难度,进而解决了相关技术中反编译方案仍然存在易被反编译的风险的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1为根据本申请实施例1的一种可选的虚拟机保护(virtualmachineproject,简称为vmp)系统的架构示意图;

图2为根据本申请实施例1的一种可选的虚拟机保护(virtualmachineproject,简称为vmp)编译器的结构示意图;

图3为根据本申请实施例1的一种可选的vmpcompiler的另一结构框图;

图4为根据本申请实施例的一种可选的虚拟机解释引擎的工作流程示意图;

图5是根据本申请实施例的一种可选的虚拟机指令的混淆方法的示意图;

图6是根据本申请实施例的一种可选的用于实现虚拟机指令的混淆方法的计算机终端的结构示意图;

图7是根据本申请实施例的一种可选的虚拟机指令的混淆装置的结构框图;

图8是根据本申请实施例的一种可选的虚拟机指令的保护系统的结构框图;

图9是根据本申请实施例的一种可选的虚拟机指令的保护系统的另一结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

为了便于理解,现将本申请实施例中可能涉及到的术语解释如下:

1.bc:全称bytecode,字节码,表示生成的虚拟机指令,其区别于nativecode(即直接运行在物理机上的代码);

2.guest:客户机,运行字节码指令的虚拟机;

3.host:宿主机,运行客户机的物理机,区别于客户机;

4.opcode:指令操作码,用于指明指令操作类型;

5.llvm:全称lowlevelvirtualmachine,一款开源的编译器框架;

6.ir:全称intermediaterepresentation,中间表示,编译器对于源程序进行扫描后生成的内部表示,代表源程序的语义和语法结构;

7.o-llvm:obfuscator-llvm,基于llvm框架开发的代码混淆工具;

8.基于栈的虚拟机:进程级虚拟机的一种实现方式,指令执行时用于运算的输入操作数和输出操作数均存放在栈中;

9.基于寄存器的虚拟机:进程级虚拟机的一种实现方式,指令执行时用于运算的输入操作数和输出操作数均存放在寄存器中;

10.加壳:软件加密保护的一种方法,通过将原程序做压缩加密变换,并在外层增加一层壳代码来实现软件保护。壳代码优先于原程序执行,其功能是还原原程序内容,并跳回还原后的原程序执行。

11.risc:精简指令集,cpu的一种设计模式,这种指令集对指令的种类和寻址方式等做了简化。

12.代码混淆:又称为花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。

实施例1

根据本申请实施例,还提供了一种虚拟机指令的混淆方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的虚拟机保护系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

如图1所示:虚拟机保护系统在对指令进行校验时大致分为两个过程:

(一)字节码生成过程,对应于模块vmp编译器(compiler)

被保护代码(即待编译程序的程序代码)以c语言源代码形式提供,通过avmpcompiler最终生成虚拟机字节码。需要说明的是,源代码的表现形式不仅限于c语言,还可以为fortran语言、ada语言等。

(二)字节码解释执行过程,对应于模块vmpsdk,其中,vmpsdk中主要依据虚拟机解释引擎来完成字节码的执行过程。

其中,图1中的普通逻辑指的是不会被vmp保护的代码,由于其安全性比较低,所以不是软件需要保护的核心逻辑(即图1中的核心程序.h.c)。其作用是负责初始化和调用vmpsdk。目前由于各种系统的程序的启动过程都不一致,vmpsdk没有针对不同系统做不同的初始化处理,所以需要普通逻辑代码来初始化和调用vmpsdk。例如,android程序的入口点是在java代码中,而ios程序的入口点在object-c中,这些代码就是普通逻辑,负责初始化和调用vmpsdk。

当需要调用被保护代码的功能时通过vmpsdk来调用被保护代码,vmpsdk加载并执行虚拟机字节码文件。

其中,对于上述实施例及其优选实施例中所涉及的虚拟机可以通过以下架构实现, 但不限于此:

1)虚拟cpu架构:

1.32位risc指令集,内存地址和寄存器均为32位。

2.指令编码存储格式为小端模式。

3.指令寻址方式为立即数和寄存器寻址,针对内存的访问必须通过load/store指令完成;

2)内存架构

如图2所述,图2左侧的主机(host)代表运行时的被保护程序,图2右侧的客户端(guest)代表运行的vm。

host通过vmpsdk来调用vm,由于vmpsdk封装了vm实现细节,所以host可以做到平台无关,即可以兼容目前所有主流操作系统以及cpu。

guest以沙盒模式运行,具有自己独立的内存地址空间,guest内存空间被划分为以下部分:

1)以0x0开始的无效地址空间,即图2中的无效区域;

2)虚拟机字节码(vmbytecodes)区域,用于存放需要运行的虚拟机指令;

3)堆区域(vmheap),满足虚拟机代码执行时动态内存分配需求;

4)栈区域(vmstack),满足虚拟机代码运行时临时变量以及返回地址存放等临时空间分配需求。

需要说明的是,上述实施例及其可选实施例中所涉及的编译器和虚拟机解释引擎可以以软件或硬件的形式实现,对于后者,可以表现为可以实现编译器和虚拟机解释引擎的功能的计算机或处理器等,但不限于此。

图3左侧为llvm前端(frontend)30,支持各种编程语言,例如图3中左侧所示的c前端(支持c/c++语言的前端)、公式翻译(formulatranslation,简称为fortran)前端(即支持fortran语言的前端)、ada语言等。图3中间为llvmir32,用于支持llvm的中间表示语言;图3右侧为llvm后端34,llvm项目支持已有的多种后端(backend),包括x86后端和powerpc后端等。本申请实施例中的vmpcompiler在此基础上增加了一种新型的后端vmprisc后端,并实现了从llvmir到vmprisc指令集的生成过程。

虚拟机解释引擎作为vmp保护程序工具中的重要组件,其工作流程如图4所示,包括:

步骤s402,取指令过程,获取当前虚拟机pc寄存器指向的虚拟机字节码内容;

步骤s404,解码指令,根据读取的虚拟机字节码内容,解码出虚拟机指令结构;

步骤s406,调用指令模拟函数,根据指令解码结果,调用相应指令的处理过程,模拟指令的运行;

步骤s408,移动pc,将pc步进一条指令,也就是pc=pc+4;

步骤s410,判断停机条件,如果不满足停机条件则转步骤s402,否则结束。

本申请实施例中主要对编译器的指令编译过程进行改进,即主要针对ir至后端的指令编译过程进行改进。图5是根据本申请实施例的一种可选的虚拟机指令的混淆方法的示意图。需要说明的是,图5中所示流程可以运行于上述虚拟机保护系统中,但不限于此。如图5所示,本申请实施例提供的虚拟机指令的混淆方法包括步骤s502-504:

步骤s502,对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令,其中,上述目标输出指令为编译器后端输出的与上述待编译程序对应的指令;

可选地,步骤s502在具体实现时,可以表现为以下实现过程,但不限于此:在编译待编译程序时,将上述待编译程序的源代码转换为中间表示ir指令;对于上述待编译程序的每一条上述ir指令,从指令模板库中选择与上述ir指令匹配的上述目标指令。

需要说明的是,“从指令模板库中选择与上述ir指令匹配的上述目标指令”中的选择过程可以按照与上述目标输出指令对应的指令的优先级确定最终选定的指令,也可以随机从指令模板库中选择。对于后者,可选地,可以通过以下方式实现:在上述指令模板库中查找与上述目标输出指令具有相同功能的所有指令;在上述所有指令中随机选择一条指令作为最终选定的指令。当然对于上述选择过程,在具体实施时,可以根据实际情况灵活调整:例如,在指令模板库中不存在与上述目标输出指令功能相同的指令时,则直接利用相关技术中与待编译程序对应的未经代码混淆处理的指令作为最终输出指令;在指令模板库中仅存在一条与上述目标输出指令功能相同的指令时,则仅能选择指令模板库中的这一条指令;在指令模板库中存在多条与上述目标输出指令功能相同的指令时,则可以随机从多条指令中选择一条指令作为最终选定的指令。

具体地,上述指令模板库中存储的指令可以是根据不同的指令变换规则得到的,例如,通过以下至少之一方式获取:

(1)将上述目标输出指令扩展为用于实现与上述目标输出指令相同功能的指令序列,并将上述指令序列存储至上述指令模板库;

可选地,可以按照以下之一方式进行指令的扩展:

第一种方式,利用等价算术构造规则扩展:即利用上述目标输出指令与指令序列之间的等价关系进行扩展,其中,上述等价关系用于指示上述目标输出指令与上述指令序列之间所满足的运算规则。以加减运算规则为例,可以利用大数运算流程进行构造,假设原指令为addr1,13,利用7811-7798=13这一恒等式,将指令扩充为addr1,7811;subr1,7798两条指令。

第二种方式,利用栈操作变换构造规则进行扩展,即修改上述目标输出指令的栈操作方式。由于函数调用过程中是通过栈来传递参数的,数据压栈通常通过push指令完成,因此,利用栈操作变换构造规则进行扩展就是通过将栈操作复杂化来实现。例如pushr1指令变换为movr2,sp;subr2,4;str1,[r2]的指令序列,这里改变了r2,实际规则中在变换前会保存r2的值,并且在变换后恢复r2的值。

(2)将上述目标输出指令替换为其它指令,并将上述其它指令存储至上述指令模板库,其中,该其它指令为用于实现与上述目标输出指令相同功能的指令;可选地,该“替换”过程可以通过以下之一方式实现:

第一种方式,利用使用频率低于预设阈值的指令替换所述目标输出指令;即利用生僻指令替换构造规则。例如arm中mvn指令是一条生僻指令,movr0,-5指令可以等效转换为mvnr0,4。相对来说,mov指令使用频率较高,人工阅读是非常方便的,而mvn指令使用频率较少,人工阅读比较困难,这样,替换后便进一步增强了反编译的难度。

第二种方式,利用上述目标输出指令的边际效应所对应的操作替换上述目标输出指令,即指令的边际效应构造规则。通常一条机器指令除了其操作码描述的操作外,还有一些边际效应,例如pushr1指令其主要操作是将r1压入当前栈顶,同时还有将sp减去4的操作。这里将sp减去4的操作即为pushr1的边际效应。边际效应构造规则就是忽略指令的主要功能而仅考虑边际效应的方式来构造替换指令。

(3)在上述目标输出指令中插入垃圾指令,并将插入上述垃圾指令的目标输出指令存储至上述指令模板库。可选地,在上述目标输出指令中插入垃圾指令的方式有多种,例如可以通过以下之一方式实现:

第一种方式,基于恒等式的虚假分支加入规则,即在上述目标输出指令中插入无效的分支指令(又称为虚假分支指令),得到上述垃圾指令,其中,上述无效的分支指 令是在执行上述待编译程序时不会被执行到的指令。例如a*(a+1)始终是偶数,可以随机产生一个立即数n,并计算n*(n+1),并将结果与2进行取模运算,判断最终结果是否为0。其中结果为1所在的分支代码永远不会被执行到,是虚假分支。在虚假分支中可以随机构造一些复杂计算,例如移位,位运算等。假设指令序列a1,a2,a3;其中对a2做虚假分支加入,则插入虚假分支后的指令序列为a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3。其中指令序列b1,b2,b3则为干扰分析的垃圾指令。

第二种方式,无效寄存器赋值方式:即在上述目标输出指令中插入无效的分支指令,并构造上述无效的分支指令中涉及指定寄存器地址的指令,其中,上述指定寄存器地址满足以下条件:在上述无效的分支指令执行过程中,在上述寄存器地址被读取后,未执行访问上述指定寄存器地址所对应寄存器的操作。例如,基于前面所述的虚假分支中的垃圾指令,如果该垃圾指令中一开始读取了某个寄存器的值,而分支之后没有访问该寄存器的操作,则可以针对该寄存器构造垃圾运算指令。假设a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3为上述构造出来的指令序列,a3之后的指令没有读取r1寄存器的内容,而b1,b2,b3中有读取r1的内容,则可以针对r1构造垃圾指令序列c1,c2,c3,并将其加入a1之后。

步骤s504,将上述目标指令作为编译器的最终输出指令并输出该最终输出指令。

需要说明的是,上述实施例及其可选实施例中所涉及的编译器和虚拟机解释引擎可以以软件或硬件的形式实现,对于后者,可以表现为可以实现编译器和虚拟机解释引擎的功能的计算机或处理器等,但不限于此。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

实施例2

实施例1中所示方法可以运行于移动终端、计算机终端或者类似的运算装置中执行。以运行在计算机终端上为例,图6是本申请实施例的一种用于实现虚拟机指令的混淆方法的计算机终端的硬件结构框图。如图6所示,计算机终端60可以包括一个或多个(图中仅示出一个)处理器602(处理器602可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)、用于存储数据的存储器604、以及用于通信功能的传输装置606。本领域普通技术人员可以理解,图6所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,计算机终端60还可包括比图6中所示更多或者更少的组件,或者具有与图6所示不同的配置。

存储器604可用于存储应用软件的软件程序以及模块,如本申请实施例中的虚拟机指令的混淆方法对应的程序指令/模块,处理器602通过运行存储在存储器604内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的虚拟机指令的混淆方法。存储器604可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器604可进一步包括相对于处理器602远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端60。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

传输装置606用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端60的通信供应商提供的无线网络。在一个实例中,传输装置606包括一个网络适配器(networkinterfacecontroller,nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置606可以为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。

可选地,在本实施例中,上述计算机终端可以位于计算机网络的多个网络设备中的至少一个网络设备。

在本实施例中,上述计算机终端可以执行虚拟机指令的混淆方法中以下步骤的程序代码:对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令,其中,上述目标输出指令为编译器后端输出的与上述待编译程序对应的指令;将上述目标指令作为编译器的最终输出指令并输出该最终输出指令。

处理器可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:在编译待编译程序时,将上述待编译程序的源代码转换为中间表示ir指令;对于上述待编译程序的每一条上述ir指令,从指令模板库中选择与上述ir指令匹配的上述目 标指令。

处理器可以通过传输装置调用存储器存储的信息及应用程序,以执行下述步骤:在上述指令模板库中查找与上述目标输出指令具有相同功能的所有指令;在上述所有指令中随机选择一条指令作为最终选定的指令。

可选的,上述处理器还可以执行如下步骤的程序代码:将上述目标输出指令扩展为用于实现与上述目标输出指令相同功能的指令序列,并将上述指令序列存储至上述指令模板库;将上述目标输出指令替换为其它指令,并将上述其它指令存储至上述指令模板库,其中,该其它指令为用于实现与上述目标输出指令相同功能的指令;在上述目标输出指令中插入垃圾指令,并将插入上述垃圾指令的目标输出指令存储至上述指令模板库。

本领域普通技术人员可以理解,图6所示的结构仅为示意,计算机终端也可以是智能手机(如android手机、ios手机等)、平板电脑、掌上电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。图6其并不对上述电子装置的结构造成限定。例如,计算机终端6还可包括比图6中所示更多或者更少的组件(如网络接口、显示装置等),或者具有与图6所示不同的配置。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。

实施例3

本申请实施例还提供一种虚拟机指令的混淆装置。图7是根据本申请实施例的一种可选的虚拟机指令的混淆装置的结构框图,如图7所示,该装置包括:

混淆模块70,用于对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令,其中,上述目标输出指令为编译器后端输出的与上述待编译程序对应的指令;

输出模块72,连接至混淆模块70,用于将上述目标指令作为编译器的最终输出指令并输出该最终输出指令。

可选地,混淆模块70,还用于在编译待编译程序时,将待编译程序的源代码转换为ir指令;以及对于待编译程序的每一条ir指令,从指令模板库中选择与ir指令匹 配的上述目标指令。需要说明的是,混淆模块70在“从指令模板库中选择与ir指令匹配的上述目标指令”过程中的选择过程可以按照与上述目标输出指令对应的指令的优先级确定最终选择的指令,也可以随机从指令模板库中选择。对于后者,可以表现为以下实现形式:混淆模块70,还用于在上述指令模板库中查找与上述目标输出指令具有相同功能的所有指令。

其中,上述指令模板库中存储的指令通过以下至少之一方式获取:具体地,上述指令模板库中存储的指令可以根据不同的指令变换规则得到,例如,通过以下至少之一方式获取:

(1)将上述目标输出指令扩展为用于实现与上述目标输出指令相同功能的指令序列,并将上述指令序列存储至上述指令模板库;

可选地,可以按照以下之一方式进行指令的扩展:

第一种方式,利用等价算术构造规则扩展:即利用上述目标输出指令与指令序列之间的等价关系进行扩展,其中,上述等价关系用于指示上述目标输出指令与上述指令序列之间所满足的运算规则。以加减运算规则为例,可以利用大数运算流程进行构造,假设原指令为addr1,13,利用7811-7798=13这一恒等式,将指令扩充为addr1,7811;subr1,7798两条指令。

第二种方式,利用栈操作变换构造规则进行扩展,即修改上述目标输出指令的栈操作方式。由于函数调用过程中是通过栈来传递参数的,数据压栈通常通过push指令完成,因此,利用栈操作变换构造规则进行扩展就是通过将栈操作复杂化来实现。例如pushr1指令变换为movr2,sp;subr2,4;str1,[r2]的指令序列,这里改变了r2,实际规则中在变换前会保存r2的值,并且在变换后恢复r2的值。

(2)将上述目标输出指令替换为其它指令,并将上述其它指令存储至上述指令模板库,其中,该其它指令为用于实现与上述目标输出指令相同功能的指令;可选地,该“替换”过程可以通过以下之一方式实现:

第一种方式,利用使用频率低于预设阈值的指令替换所述目标输出指令;即利用生僻指令替换构造规则。例如arm中mvn指令是一条生僻指令,movr0,-5指令可以等效转换为mvnr0,4。相对来说,mov指令使用频率较高,人工阅读是非常方便的,而mvn指令使用频率较少,人工阅读比较困难,这样,替换后便进一步增强了反编译的难度。

第二种方式,利用上述目标输出指令的边际效应所对应的操作替换上述目标输出指令,即指令的边际效应构造规则。通常一条机器指令除了其操作码描述的操作外, 还有一些边际效应,例如pushr1指令其主要操作是将r1压入当前栈顶,同时还有将sp减去4的操作。这里将sp减去4的操作即为pushr1的边际效应。边际效应构造规则就是忽略指令的主要功能而仅考虑边际效应的方式来构造替换指令。

(3)在上述目标输出指令中插入垃圾指令,并将插入上述垃圾指令的目标输出指令存储至上述指令模板库。可选地,在上述目标输出指令中插入垃圾指令的方式有多种,例如可以通过以下之一方式实现:

第一种方式,基于恒等式的虚假分支加入规则,即在上述目标输出指令中插入无效的分支指令,得到上述垃圾指令,其中,上述无效的分支指令是在执行上述待编译程序时不会被执行到的指令。例如a*(a+1)始终是偶数,可以随机产生一个立即数n,并计算n*(n+1),并将结果与2进行取模运算,判断最终结果是否为0。其中结果为1所在的分支代码永远不会被执行到,是虚假分支。在虚假分支中可以随机构造一些复杂计算,例如移位,位运算等。假设指令序列a1,a2,a3;其中对a2做虚假分支加入,则插入虚假分支后的指令序列为a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3。其中指令序列b1,b2,b3则为干扰分析的垃圾指令。

第二种方式,无效寄存器赋值方式:即在上述目标输出指令中插入无效的分支指令,并构造上述无效的分支指令中涉及指定寄存器地址的指令,其中,上述指定寄存器地址满足以下条件:在上述无效的分支指令执行过程中,在上述寄存器地址被读取后,未执行访问上述指定寄存器地址所对应寄存器的操作。例如,基于前面所述的虚假分支中的垃圾指令,如果该垃圾指令中一开始读取了某个寄存器的值,而分支之后没有访问该寄存器的操作,则可以针对该寄存器构造垃圾运算指令。假设a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3为上述构造出来的指令序列,a3之后的指令没有读取r1寄存器的内容,而b1,b2,b3中有读取r1的内容,则可以针对r1构造垃圾指令序列c1,c2,c3,并将其加入a1之后。

需要说明的是,本实施例中的模块是可以通过软件或硬件的形式来实现的,例如,对于后者可以通过以下方式实现,但不限于此:混淆模块70和输出模块72位于同一处理器中;混淆模块70和输出模块72分别位于第一处理器和第二处理器中。

实施例4

本申请实施例还提供一种虚拟机指令的保护系统。图8是根据本申请实施例的一种可选的虚拟机指令的保护系统的结构框图。如图8所示,该系统包括:虚拟机保护编译器80和虚拟机解释引擎82;其中,

虚拟机保护编译器80,用于对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令;以及将上述目标指令作为上述虚拟机保护编译器的最终输出指令并输出该最终输出指令;其中,上述目标输出指令为虚拟机保护编译器后端输出的与上述待编译程序对应的指令。

可选地,虚拟机保护编译器80,还用于在编译待编译程序时,将上述待编译程序的源代码转换为ir指令;以及对于上述待编译程序的每一条上述ir指令,从指令模板库中选择与上述ir指令匹配的上述目标输出指令。

可选地,虚拟机保护编译器80,用于在上述指令模板库中确定与上述ir指令匹配的所有指令;在该所有指令中随机选择一条指令作为最终选定的指令。

在一个可选实施例中,虚拟机保护编译器80,还用于通过以下之一方式获取上述指令模板库中存储的指令:(1)将上述目标输出指令扩展为用于实现与上述目标输出指令相同功能的指令序列,并将上述指令序列存储至上述指令模板库;(2)将上述目标输出指令替换为其它指令,并将上述其它指令存储至上述指令模板库,其中,该其它指令为用于实现与上述目标输出指令相同功能的指令;(3)在上述目标输出指令中插入垃圾指令,并将插入上述垃圾指令的上述目标输出指令存储至上述指令模板库。

虚拟机解释引擎82,用于加载并执行虚拟机保护编译器输出的最终输出指令。

在一个可选实施例中,如图9所示,虚拟机保护编译器80,包括:编译器前端800,用于接收指定编程语言格式的待编译程序的源代码;中间表示ir端802,用于将上述源代码转换为上述ir指令;编译器后端804,用于对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令;以及将上述目标指令作为上述虚拟机保护编译器的最终输出指令并输出该最终输出指令。编译器前端800、ir端802和编译器后端804的优选实现方式可以参见图3所示实施例中的llvm前端30、llvmir32和llvm后端34,需要注意的是,图9中的编译器后端和图3中的llvm后端在功能上是不同的。

可选地,编译器前端800可以支持多种编程语言格式的源代码输入;和/或上述编译器后端804可以支持多种类型的指令集。

需要说明的是,虚拟机保护编译器80和虚拟机解释引擎82的优选实施方式可以参见实施例1中虚拟机保护编译器和虚拟机解释引擎的描述,但不限于此,例如,虚拟机保护编译器80和虚拟机解释引擎82的结构或功能多于或少于实施例1中所述的虚拟机保护编译器和虚拟机解释引擎,以及其应用场景包括但不限于实施例1所述的场景。

实施例5

本申请的实施例还提供了一种存储介质。可选地,在本实施例中,上述存储介质可以用于保存上述实施例1所提供的虚拟机指令的混淆方法所执行的程序代码。

可选地,在本实施例中,上述存储介质可以位于计算机网络中计算机终端群中的任意一个计算机终端中,或者位于移动终端群中的任意一个移动终端中。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:对与待编译程序对应的目标输出指令进行代码混淆处理,得到目标指令,其中,上述目标输出指令为编译器后端输出的与上述待编译程序对应的指令;将上述目标指令作为编译器的最终输出指令并输出该最终输出指令。

可选地,在本实施例中,存储介质被设置为存储用于执行以下步骤的程序代码:在编译待编译程序时,将上述待编译程序的源代码转换为中间表示ir指令;对于上述待编译程序的每一条上述ir指令,从指令模板库中选择与上述ir指令匹配的上述目标指令

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时, 可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1