CN105046117A - 一种具有指令集随机化的代码虚拟化软件保护系统 - Google Patents

一种具有指令集随机化的代码虚拟化软件保护系统 Download PDF

Info

Publication number
CN105046117A
CN105046117A CN201510375384.XA CN201510375384A CN105046117A CN 105046117 A CN105046117 A CN 105046117A CN 201510375384 A CN201510375384 A CN 201510375384A CN 105046117 A CN105046117 A CN 105046117A
Authority
CN
China
Prior art keywords
instruction
program
code
protected
file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201510375384.XA
Other languages
English (en)
Inventor
李光辉
房鼎益
汤战勇
匡开圆
陈晓江
郝朝辉
祁生德
樊如霞
任庆峰
王蕾
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Northwest University
Original Assignee
Northwest University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Northwest University filed Critical Northwest University
Priority to CN201510375384.XA priority Critical patent/CN105046117A/zh
Publication of CN105046117A publication Critical patent/CN105046117A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • G06F21/53Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种具有指令集随机化的代码虚拟化软件保护系统,属于计算机软件安全领域。所述发明包括在该系统中构建虚拟指令集,将待保护程序中的关键代码进行反汇编得到本地指令序列,接着根据以构架的虚拟指令集将本地指令序列转换为第一虚拟指令,并将第一虚拟指令进行编码得到字节码指令,将字节码指令与生成的附属虚拟机组件组合为附加文件,将附加文件与待保护程序组合为第一文件,在对第一文件进行垃圾数据填充后得到最终的保护程序。本发明能够提高待保护程序的复杂性,延长了分析者对待保护程序的分析时间,从而增强了待保护程序的保护能力。

Description

一种具有指令集随机化的代码虚拟化软件保护系统
技术领域
本发明属于计算机软件安全领域,特别涉及一种具有指令集随机化的代码虚拟化软件保护系统。
背景技术
软件的广泛应用在为社会带来巨大利益的同时,关于软件安全的问题也变得日益突出,软件防恶意逆向成为急需解决的问题。当前软件攻击技术和逆向工具的发展方便了攻击者对软件逆向分析。另外,软件一般运行在“白盒攻击”环境当中,攻击者可以完全控制软件的执行过程,查看指令执行的序列。因此,只要给定攻击者足够的时间,应该能够成功逆向分析该软件。
人在一定时间内处理信息量是有限的,如果攻击者在攻击时付出的代价超过他所获得的信息的价值或者分析过程的难度和复杂度可以导致攻击者放弃攻击,则采用的保护方法是有效的。因此软件保护的目的在于提高攻击者逆向分析的难度,增加攻击者的攻击开销。
为了阻碍恶意的逆向工程和保护软件中的智力成果,产业界和学术界提出了多种软件保护技术,主要包括:①注入垃圾指令来阻止反汇编,②使用程序加壳技术压缩和加密关键代码和数据,③应用代码混淆技术使攻击者更难从代码中提取有用的语义信息,等等。针对二进制代码的保护方法不受编程语言的限制,相比源代码级别应用范围更广。然而这些保护技术也存在着缺点,因为,注入的垃圾指令在程序运行时不会执行,而加壳技术中压缩和加密的代码在程序运行的时候也需要在解压和解密之后才能执行。所以,垃圾指令注入和加壳技术只能阻止攻击者的静态分析(在程序没有运行的状态下分析),但是不能阻止攻击者的动态分析(当程序运行在调试或者仿真环境下时分析)。当前常用的分析工具有OllyDbg和IDAPro等。代码混淆的原理是让一个程序转化为功能上等价,但静态表示或执行过程不同的等价程序,主要是通过指令替换和顺序重排,改变程序的控制流,但是这些简单的指令压缩变换是容易被理解的。并且当前应用于二进制代码的混淆技术主要是通过花指令或垃圾指令进行保护,保护效果差,容易被发现和去除。
发明内容
为了解决现有技术的问题,本发明提供了一种具有指令集随机化的代码虚拟化软件保护系统,所述具有指令集随机化的代码虚拟化软件保护系统,包括:
构建虚拟指令集;
对所述待保护程序进行PE文件检测;
在所述待保护程序中定位关键代码段;
对所述关键代码段进行反汇编,得到本地指令序列;
根据设计好的虚拟指令集将所述本地指令序列转换为第一虚拟指令;
将所述第一虚拟指令按预设的编码规则进行编码,得到字节码指令;
生成保护系统的附属虚拟机组件;
将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件与所述待保护程序构成第一文件,在所述第一文件中进行垃圾数据填充,获得保护后的程序。
可选的,所述构建虚拟指令集,包括:
确定待构建的虚拟指令;
确定与所述虚拟指令对应的解释程序;
其中,所述确定待构建的虚拟指令包括数据传输指令、算数和逻辑运算指令、控制转移指令。
可选的,所述在所述待保护程序中定位关键代码段,包括:
在所述待保护程序中的关键代码段的段首添加首标记;
在所述待保护程序中的关键代码段的段尾添加尾标记。
可选的,所述对所述关键代码段进行反汇编,得到本地指令序列,包括:
获取所述关键代码段的起始地址和结束地址;
使用反汇编工具将所述起始地址与所述结束地址中的二进制代码进行反汇编,得到本地指令序列;
其中,所述本地指令序列中的指令按照地址顺序进行排列。
可选的,所述根据设计好的虚拟指令集将所述本地指令序列转换为第一虚拟指令,包括:
将所述本地指令序列的操作数压入栈中;
执行所述本地指令序列的目标操作,获取执行结果,并存放于所述栈中;
将所述执行结果存入虚拟寄存器环境或内存中。
可选的,所述将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件与所述待保护程序构成第一文件,在所述第一文件中进行垃圾数据填充,获得保护后的程序,包括:
将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件附在所述待保护程序后,构成第一文件;
在所述第一文件中的所述关键代码段的起始位置处添加指向所述附加文件中虚拟机初始化入口起始地址的跳转指令,在所述第一文件中的所述关键代码段的剩余内容中随机填充垃圾数据,填充完毕后,获得保护后的程序。
本发明提供的技术方案带来的有益效果是:
相对于现有技术,能够提高待保护程序的复杂性,延长了分析者对待保护程序的分析时间,从而增强了待保护程序的防逆向分析能力。
附图说明
为了更清楚地说明本发明的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的一种具有指令集随机化的代码虚拟化软件保护系统的流程示意图;
图2是本发明提供的一种具有指令集随机化的代码虚拟化软件保护系统的控制跳转指令中内部跳转和外部跳转的示例图;
图3是本发明提供的一种具有指令集随机化的代码虚拟化软件保护系统的三种虚拟指令的两种不同编码结果的示例图;
图4是本发明提供的一种具有指令集随机化的代码虚拟化软件保护系统中保护后程序的详细结构示意图。
具体实施方式
为使本发明的结构和优点更加清楚,下面将结合附图对本发明的结构作进一步地描述。
实施例一
本发明提供了一种具有指令集随机化的代码虚拟化软件保护系统,所述具有指令集随机化的代码虚拟化软件保护系统,如图1所示,包括:
01、构建虚拟指令集。
02、对所述待保护程序进行PE文件检测。
03、在所述待保护程序中定位关键代码段。
04、对所述关键代码段进行反汇编,得到本地指令序列。
05、根据设计好的虚拟指令集将所述本地指令序列转换为第一虚拟指令。
06、将所述第一虚拟指令按预设的编码规则进行编码,得到字节码指令。
07、生成保护系统的附属虚拟机组件。
08、将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件与所述待保护程序构成第一文件,在所述第一文件中进行垃圾数据填充,获得保护后的程序。
在实施中,为了实现防止程序被逆向分析,特此提出了通过将本地x86指令转换为虚拟指令,在运行是利用嵌入的虚拟解释器对虚拟指令进行解释执行以达到和原始本地指令相同的功能。在该保护方法下,将原始指令进行复杂化处理,加大分析者理解的难度,从而起到对程序进行保护的效果。
具体的,本发明中提供的方法的主要思想为:
首先构建虚拟指令集和handler,这里的虚拟指令集的设计,需要能够替代任何的本地指令,要保证语义的完备性。Handler是指虚拟指令的解释程序,本地指令替换成虚拟指令,虚拟指令最终需要用handler来解释执行,handler由本地指令写成。
接着,对待保护程序进行PE检测,这里的PE为可执行文件PortableExecutable。所有Windows下的32位或64位可执行文件都是PE文件格式,其中包括DLL、EXE、FON、OCX、LIB和部分SYS文件。在Windows系统下的可执行文件的一种(还有NE、LE),是微软设计、TIS(ToolInterfaceStandard,工具接口标准)委员会批准的一种可执行文件格式。通过对待保护程序是否为可执行文件的检测,只有在确定待保护程序为可执行类型后,执行后续处理步骤。
后续的,在待保护程序中确定关键代码段的位置,将关键代码段进行反汇编得到本地指令序列,进而结合之前构建好的虚拟指令集将本地指令序列进行转换得到第一虚拟指令,进而得到对应的字节码指令和附属虚拟机组件,最后将字节码指令和附属虚拟机组件组合为附加文件,将附加文件与待保护程序构成第一文件,对第一文件进行处理,最终得到保护后的程序。
本申请提供一种具有指令集随机化的代码虚拟化软件保护系统,在该系统中构建虚拟指令集,将待保护程序中的关键代码进行反汇编得到本地指令序列,接着根据已构建的虚拟指令集将本地指令序列转换为第一虚拟指令,并将第一虚拟指令进行编码得到字节码指令,将字节码指令与生成的附属虚拟机组件组合为附加文件,将附加文件与待保护程序组合为第一文件,在对第一文件进行垃圾数据填充后得到最终的保护后的程序。相对于现有技术,能够提高待保护程序的复杂性,延长了分析者逆向分析程序的时间,从而增强了待保护程序的防逆向分析能力。
可选的,所述构建虚拟指令集,即步骤01包括:
确定待构建的虚拟指令;
确定与所述虚拟指令对应的解释程序;
其中,所述确定待构建的虚拟指令包括数据传输指令、算数和逻辑运算指令、控制转移指令。
在实施中,这里的虚拟指令集被设计为需要能够替代任何的本地指令,同时还要保证语义的完备性。
虚拟指令的设计,以及从本地x86汇编指令到虚拟指令的翻译过程和所选用的虚拟机的架构是密切相关的(虚拟机的架构主要有两种,一种是基于栈的,一种是基于寄存器的)。本发明选用的虚拟机架构是基于栈的,一旦虚拟机架构确定下来,虚拟指令的设计原则和本地x86指令到虚拟指令的翻译过程也就确定了。
在基于栈的实现中,对指令的解释一般经历三个阶段:
首先,本地x86指令的操作数被压入到栈中。
然后,针对栈顶的操作数进行预期的操作(比如求和)并把结果放到栈顶。
最后,把栈顶的数据进行保存(保存到虚拟寄存器环境或内存中)。
上述过程实际上描述了x86指令到虚拟指令的翻译过程,同时也指明了虚拟指令集中应该包括的虚拟指令(load用于将参数压栈,store用于弹栈并保存运算结果,另外还有其他的指令用于执行常见的操作,如加、减、逻辑与运算等)。所以,在本发明中虚拟指令设计这部分是和虚拟机架构相关的,一旦虚拟指令确定,如果再结合虚拟寄存器环境的内容,那么与虚拟指令对应的解释程序即handler的实现就可以确定,因为handler的目的就是实现虚拟指令所定义的对虚拟寄存器环境VMcontext或内存的操作。
为了实现本地指令向虚拟指令集的映射,这里将需要解释的本地指令分为三类,分别为数据传输指令、算数和逻辑运算指令、控制转移指令。
(1)数据传输指令:典型的为“load”和“store”指令。“load”指令是将操作数压入栈顶,“store”指令从栈顶取出结果存入虚拟环境当中。主要用在虚拟化本地指令的第一和第三步操作中,“load”指令的操作对象是虚拟寄存器、内存地址或者立即数;“store”指令操作对象是虚拟寄存器或者是内存地址。
其中,虚拟寄存器是存储在虚拟环境中的,是本地环境中寄存器在虚拟环境中的映射。除了操作数的类型,还需要考虑操作数的大小,8位、16位或者32位。在x86指令结构中,对栈的“pop”和“push”操作不支持8位的操作数,本系统的虚拟指令集将操作数的大小考虑过程放到虚拟化本地指令的第二步即执行目标操作中来实现。
表1给出了“load”和“store”的虚拟指令和相应的handler:
表1:“load”和“store”的虚拟指令和相应的handler
(2)算数和逻辑运算指令。这类虚拟指令相对于本地指令变化不大,区别在于寻址方式是固定的,即基于堆栈的;算数和逻辑运算虚拟指令不需要考虑操作数的问题,它的操作数已经通过“load”指令压栈;同时,在上一部分中说到将操作数的大小区分通过这类指令来实现,在32位系统中,操作数的大小可以是8位、16位或者32位,本系统针对每一种情况设计了对应的虚拟指令。表2给出了“add”操作的虚拟指令和对应handler:
表2:“add”操作的虚拟指令和handler
(3)控制跳转指令。该类指令用于改变字节码程序的控制流。在本地指令中,常用控制跳转指令包括“jmp”,“jcc”(条件跳转),“call”和“retn”。这类指令有不同的形式,每种形式都需要有对应的虚拟指令。
根据控制跳转指令的目的地址判断,如果目的地址仍然在关键代码段内部,称之为内部跳转;否则称为外部跳转。图2给出这两种跳转的示例。
根据目的指令的地址定位,需要考虑控制跳转指令的目的地址是否是静态可计算的。基于这一点,控制跳转指令可以分成两类:直接跳转和间接跳转。直接跳转,指通过偏移地址来计算跳转的目的地址,在静态时(即没有运行程序的情况下)能够计算出目的地址;间接跳转,指目的地址存储在寄存器或者内存当中,目的地址不是静态定义而是在程序运行过程中确定。表3给出了关于上述两种情况的不同指令的形式,表中“rel”指偏移地址。
表3:直接跳转和间接跳转指令示例
“jmp”指令是所有控制跳转指令的基础,表4给出了关于“jmp”指令的虚拟指令和其对应的处理程序的详细介绍来做示例。
其中:直接“jmp”指令的目的地址是可以静态计算的。如果目的指令是在关键代码段内部,则为直接内部“jmp”,否则为直接外部“jmp”。本系统的指令集针对以上两种情况设计相应的虚拟指令,“jmp_di”处理第一种情况,“jmp_do”处理第二种情况。对于“jmp_di”指令,目的字节码指令地址可在保护代码段内获得,用“jmp_di”的操作数来设置字节码指令地址,利用“load_i”指令将操作数压入栈中,然后“jmp_di”的处理程序从栈中获取地址并分配给VPC(虚拟程序计数器)。对于“jmp_do”指令,可直接跳转到本地程序的目的地址,但需要在跳转操作之前恢复本地寄存器环境;“jmp_do”的操作数就是本地目的指令的地址。
间接“jmp”指令同样需要做内部和外部“jmp”区分,对于在静态的程序保护过程中无法获得目的指令的地址,因此不能直接判断是内部跳转还是外部跳转,本系统的解决方案是在程序运行时进行判断。因此,该类指令只需要定义一个虚拟指令,即“jmp_in”,它的操作数是本地目的指令的地址。在程序运行过程中,处理程序从栈中获取目的地址并与关键代码段的起始地址比较。如果目的地址在关键代码段中,为内部“jmp”,否则为外部“jmp”。对于第一种情况,首先查找记录本地指令和字节码指令对应关系的映射表,找到本地目的指令对应字节码指令的地址分配给VPC。对于后一种情况,首先恢复本地寄存器环境,然后直接跳转到本地指令目的地址执行。
表4:“jmp”指令的虚拟地址和handler
至于其他控制跳转指令的虚拟化过程与“jmp”指令是相似,只有一些很小的差别。条件跳转指令(jcc)只支持直接跳转,并且在处理程序中需要几条额外的指令来判断跳转条件是否成立,进而决定是否进行跳转。“call”指令可以看作是一个“push”指令和一个“jmp”指令组合实现,“push”指令将返回地址压入栈中,“jmp”指令跳向函数的起始地址。“retn”指令是间接跳转指令,目的地址通过栈来获取。
通过上述对虚拟指令以及对应的本地指令类型的描述,从而确定了虚拟指令与本地指令的映射关系,便于后续步骤中对本地指令向虚拟指令的转换。
可选的,所述在所述待保护程序中定位关键代码段,即步骤03包括:
在所述待保护程序中的关键代码段的段首添加首标记;
在所述待保护程序中的关键代码段的段尾添加尾标记。
在实施中,关键代码段是指目标文件中需要被保护的代码,通常是待保护文件中核心算法的实现代码或对重要数据进行操作的代码。确定关键代码段后需要在关键代码段的段首和段尾分别添加首标记和尾标记;
具体的,采用的首尾标记如下:
#defineNISL_START_emit_(0xEB,0x0C,0x4E,0x49,0x53,0x4C,0x56,0x4D,0x53,0x54,0x41,0x52,0x54,0x00)
#defineNISL_END_emit_(0xEB,0x0C,0x4E,0x49,0x53,0x4C,0x56,0x4D,0x45,0x4E,0x44,0x00,0x00,0x00)
实际操作时,将NISL_START和NISL_END两个宏定义复制到待保护文件的源文件中,并将两个宏添加到关键代码段的首尾处,源文件编译后即可实现首尾标记的嵌入。
这里通过在关键代码段的首、尾分别添加标记的方法,使得在后续步骤中能够方便地确定该关键代码段所在的位置。
可选的,所述对所述关键代码段进行反汇编,得到本地指令序列,即步骤04包括:
获取所述关键代码段的起始地址和结束地址;
使用反汇编工具将所述起始地址与所述结束地址中的二进制代码进行反汇编,得到本地指令序列;
其中,所述本地指令序列中的指令按照地址顺序进行排列。
在实施中,在待保护程序中获取关键代码段的起始地址和结束地址,利用反汇编工具(如xde等)将得到的关键代码段的二进制代码反汇编得到汇编指令,按照汇编指令按照地址顺序组成本地指令序列。
可选的,所述根据设计好的虚拟指令集将所述本地指令序列转换为第一虚拟指令,即步骤05包括:
将所述本地指令序列的操作数压入栈中;
执行所述本地指令序列的目标操作,获取执行结果,并存放于所述栈中;
将所述执行结果存入虚拟寄存器环境或内存中。
在实施中,将本地指令序列转换为虚拟指令,主要分为如下步骤:
(1)通过“load”虚拟指令将本地指令的操作数压入栈中。
(2)执行目标操作的指令。执行本地指令的目标操作,该虚拟指令不需要考虑操作数的类型,直接从栈顶获取相关操作数,但需要考虑操作数的大小。
(3)通过“store”虚拟指令将操作执行的结果存入虚拟寄存器环境或内存中。
数据传输指令虚拟化过程主要使用“load”、“store”指令,如“mov”、“push”和“pop”指令;算数和逻辑运算指令的虚拟化过程严格按照上面的三步操作来实现;控制跳转指令虚拟化过程通过“load”指令和“jmp”指令组合实现。表5给出了一些本地指令虚拟化的示例。
有些本地指令有复杂的寻址方式,在虚拟化的过程中会反复用到上述虚拟指令,例如表5中的“moveeax,dword[esi+4]”指令;其中,表5中的“42a583h”是在地址“4020a8h”中存储的本地指令相对应的字节码指令的地址。
表5:本地指令和对应虚拟指令的示例
通过将本地指令按上述步骤转换为虚拟指令,从而在一定程度上提高了对待保护程序的保护效果。
可选的,所述将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件与所述待保护程序构成第一文件,在所述第一文件中进行垃圾数据填充,获得保护后的程序,包括:
将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件附在所述待保护程序后,构成第一文件;
在所述第一文件中的所述关键代码段的起始位置处添加指向所述附加文件中虚拟机初始化入口起始地址的跳转指令,在所述第一文件中的所述关键代码段的剩余内容中随机填充垃圾数据,填充完毕后,获得保护后的程序。
在实施中,步骤06中提出对第一虚拟指令按预设的编码规则进行编码后,得到对应的字节码指令。
关于字节码指令,具体为:虚拟指令和字节码指令是一种简单的对应关系,本系统采取一种简单的编码规则,即将虚拟指令中的操作码和操作数分别进行编码。在实现中,给每一个虚拟指令指定不同的ID,这些ID取值范围是0~255,用以表明虚拟指令的操作码,使用一个字节即可编码所有的操作码,。由于操作数的种类和大小不一样,所以需要使用一个或多个字节进行编码:虚拟寄存器的索引是8位,用一个字节编码;立即数的值可以是8/16/32位,分别用一个、两个、四个字节进行编码;内存地址是32位,使用四个字节进行编码。图3中给出了一些虚拟指令和它们对应的字节码的示例。
对于每一个保护实例,本发明的具有指令集随机化的代码虚拟化保护系统都会生成一个独特的编码规则对虚拟指令进行编码。同一个字节码指令在不同的保护实例中很可能是不同的,用一个字节来定义ID,所以两个字节码指令完全相同的概率是:
p = 1 256 ,
假设在保护系统中有N条虚拟指令,生成的不同的编码规则的总数是:
p ( 256 , N ) = 256 ! ( 256 - N ) ! ,
这是一个较大的数字。根据这样的编码规则可以实现虚拟指令随机化,编码时先随机化改变操作码和虚拟指令之间的对应关系,利用随机化后的对应关系来编码字节码指令。图3给出了三种虚拟指令的两种不同的编码结果。软件具有多样性,是阻止大规模开发和破解的有效策略,本发明的指令集随机化方法通过产生这种多样性的本质,进一步的增强了攻击的难度并且阻碍了软件攻击方法的自动化,能够有效的达到保护软件的目的。
步骤07中提出生成保护系统的附属虚拟机组件。关于附属虚拟机组件,具体为:包括:VMcontext、VMinit、VMloop、Handlers、VMexit:
生成的虚拟机各个组件功能说明如下:
(1)VMcontext是代码虚拟化保护系统的虚拟寄存器环境,对应了7个真实寄存器(即除了ESP之外的7个通用寄存器)一个标志寄存器。
(2)VMinit是虚拟机的入口,当保护后的程序运行到关键代码段时就会有个无条件跳转操作,跳向虚拟机的入口,开始虚拟寄存器环境的初始化,是虚拟机第一个运行的组件。VMinit开始工作后会将本地环境中通用寄存器的内容全部存入虚拟寄存器环境中对应的虚拟寄存器位置,然后转到VMloop继续执行。
(3)VMloop是虚拟机运行的核心部分,程序运行时,VMloop会逐条读取字节码指令,并根据操作码找到对应的handler去执行以解释字节码指令,直到解释执行完所有的字节码指令,最后将转到VMexit继续执行。
(4)Handlers是所有虚拟指令的解释程序的集合,集合中某一handler的执行完成对应虚拟指令所定义的操作。通过各个handler的先后执行,最终能够实现和原始关键代码段相同的功能。
(5)VMexit是虚拟机的出口,当VMloop解释执行完所有的字节码指令后,VMexit开始工作,它的功能是将虚拟寄存器环境恢复到本地环境,即将所有虚拟寄存器的内容恢复到对应的本地环境寄存器中。然后跳向受保护的关键代码段的下一条指令,继续执行关键代码段的后续指令。
当根据上述步骤获取字节码指令和附属虚拟机组件后,将二者组合为附加文件,并且将附加文件挂靠在待保护程序后方与待保护程序构成第一文件。这里的第一文件的结构如图4所示。
值得注意的是,此时的第一文件相对于待保护程序因为添加了附加文件导致原有的属性发生变化,因此此时需要在与待保护程序对应的属性中对文件大小以及包括的区段数目进行数据更新。
进一步的,需要将位于第一文件中的关键代码段的起始位置处添加一条无条件跳转语句,该跳转语句用于指向附加文件中所包含的虚拟机初始化入口即VMinit处代码段的起始地址处。除此之外,在关键代码的其余位置均使用垃圾数据进行随机填充。在具体执行时,这里填充的垃圾数据对应的代码不会被执行,不会对程序的功能进行影响,还可以对分析者起到迷惑作用,进一步提高了最终生成的保护后程序的安全性。
本申请提供一种具有指令集随机化的代码虚拟化软件保护系统,在该系统中构建虚拟指令集,将待保护程序中的关键代码进行反汇编得到本地指令序列,接着根据已构建的虚拟指令集将本地指令序列转换为第一虚拟指令,并将第一虚拟指令进行编码得到字节码指令,将字节码指令与生成的附属虚拟机组件组合为附加文件,将附加文件与待保护程序组合为第一文件,在对第一文件进行垃圾数据填充后得到最终的保护后的程序。相对于现有技术,能够提高待保护程序的复杂性,延长了分析者逆向分析程序的时间,从而增强了待保护程序的保护能力。
实验部分:
为了检验系统的性能和时空开销,进行了如下实验:
实验环境为Win7操作系统,3.0GHz处理器,4GB内存。选用的测试程序有四个,分别是md5.exe(md5消息摘要计算),gzip.exe(gzip压缩),bcrypt.exe(blowfish加密)和mat_mul.exe(矩阵乘法)。其中,前三个测试程序用于处理一个5KB大小的文本文件(test.txt),mat_mul.exe用于计算两个5阶矩阵的乘积。表6给出了四个测试程序的基本信息,对于每一个测试程序,都选取了一段关键的代码进行保护,表6中第二列给出了这些关键代码,第三列(IP)是这些关键代码对应的x86指令的条数,最后一列(IE)是这些程序在处理输入数据时,位于关键代码中的指令执行的条数,该数据是通过Pin动态跟踪得到的。
测试程序 保护的代码 IP IE
md5.exe Transform() 563 41662
gzip.exe deflate() 153 267771
bcrypt.exe Blowfish_Encrypt() 54 1570756
mat_mul.exe ijkalgorithm() 60 84325
表6测试程序的基本信息
利用所述的代码虚拟化保护系统对测试程序进行保护,得到各程序保护后的版本。分别记录原始程序和保护后程序的文件大小,并记录下原始程序和保护后程序运行的平均时间(前三个程序处理5KB的文本文件,mat_mul.exe计算两个5阶矩阵的乘积),结果显示在表7中。
所述保护系统对文件大小的影响体现在添加的虚拟机新节。在虚拟机新节中,除了字节码程序的大小是不固定的外,其余部分的大小都是固定的,和测试程序无关。由于Windows中PE文件中各个节都是按照一定的对齐值(0.5KB或4KB)进行对齐的,所以后面三个程序文件大小的增幅都为8KB,而md5.exe中由于需要保护的指令条数比较多,生成的字节码程序也比较大,所以文件大小的增幅最大。
从表7中可以看出,所述保护系统对测试程序的性能影响较小。其中所述保护系统对bcrypt.exe的性能影响最大,这是因为bcrypt.exe中被保护的指令执行的条数最多(表7最后一列),因此,保护后生成的字节码程序的执行次数也最多,时间消耗也最大。
表7所述代码虚拟化保护系统对文件大小和程序性能的影响
更进一步地,我们计算了所述保护系统对每条x86指令的平均性能消耗,计算方法为:
表8给出了所述保护系统对各测试程序每条x86指令的平均性能消耗。从表8中可以看出,md5.exe中每条x86指令的平均性能消耗最大,这是因为md5.exe程序中受保护的指令绝大部分都是算术和逻辑运算指令,而其他程序中则主要以数据传送指令为主。算术和逻辑运算指令比数据传送指令需要更多的handler来解释,因此性能消耗更大。
md5.exe gzip.exe bcrypt.exe mat_mul.exe
7.23 3.28 2.30 0.92
表8每条x86指令的平均性能消耗(10-5ms/条)
需要说明的是:上述实施例提供的一种具有指令集随机化的代码虚拟化软件保护系统进行代码保护的实施例,仅作为该代码虚拟化软件保护系统在实际应用中的说明,还可以根据实际需要而将上述代码虚拟化软件保护系统在其他应用场景中使用,其具体实现过程类似于上述实施例,这里不再赘述。
上述实施例中的各个序号仅仅为了描述,不代表各部件的组装或使用过程中的先后顺序。
以上所述仅为本发明的实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (6)

1.一种具有指令集随机化的代码虚拟化软件保护系统,其特征在于,所述具有指令集随机化的代码虚拟化软件保护系统,包括:
构建虚拟指令集;
对所述待保护程序进行PE文件检测;
在所述待保护程序中定位关键代码段;
对所述关键代码段进行反汇编,得到本地指令序列;
根据设计好的虚拟指令集将所述本地指令序列转换为第一虚拟指令;
将所述第一虚拟指令按预设的编码规则进行编码,得到字节码指令;
生成保护系统的附属虚拟机组件;
将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件与所述待保护程序构成第一文件,在所述第一文件中进行垃圾数据填充,获得保护后的程序。
2.根据权利要求1所述的具有指令集随机化的代码虚拟化软件保护系统,其特征在于,所述构建虚拟指令集,包括:
确定待构建的虚拟指令;
确定与所述虚拟指令对应的解释程序;
其中,所述确定待构建的虚拟指令包括数据传输指令、算数和逻辑运算指令、控制转移指令。
3.根据权利要求1所述的具有指令集随机化的代码虚拟化软件保护系统,其特征在于,所述在所述待保护程序中定位关键代码段,包括:
在所述待保护程序中的关键代码段的段首添加首标记;
在所述待保护程序中的关键代码段的段尾添加尾标记。
4.根据权利要求1所述的具有指令集随机化的代码虚拟化软件保护系统,其特征在于,所述对所述关键代码段进行反汇编,得到本地指令序列,包括:
获取所述关键代码段的起始地址和结束地址;
使用反汇编工具将所述起始地址与所述结束地址中的二进制代码进行反汇编,得到本地指令序列;
其中,所述本地指令序列中的指令按照地址顺序进行排列。
5.根据权利要求1所述的具有指令集随机化的代码虚拟化软件保护系统,其特征在于,所述根据设计好的虚拟指令集将所述本地指令序列转换为第一虚拟指令,包括:
将所述本地指令序列的操作数压入栈中;
执行所述本地指令序列的目标操作,获取执行结果,并存放于所述栈中;
将所述执行结果存入虚拟寄存器环境或内存中。
6.根据权利要求1所述的具有指令集随机化的代码虚拟化软件保护系统,其特征在于,所述将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件与所述待保护程序构成第一文件,在所述第一文件中进行垃圾数据填充,获得保护后的程序,包括:
将所述字节码指令和所述附属虚拟机组件组合为附加文件,将所述附加文件附在所述待保护程序后,构成第一文件;
在所述第一文件中的所述关键代码段的起始位置处添加指向所述附加文件中虚拟机初始化入口起始地址的跳转指令,在所述第一文件中的所述关键代码段的剩余内容中随机填充垃圾数据,填充完毕后,获得保护后的程序。
CN201510375384.XA 2015-06-30 2015-06-30 一种具有指令集随机化的代码虚拟化软件保护系统 Pending CN105046117A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510375384.XA CN105046117A (zh) 2015-06-30 2015-06-30 一种具有指令集随机化的代码虚拟化软件保护系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510375384.XA CN105046117A (zh) 2015-06-30 2015-06-30 一种具有指令集随机化的代码虚拟化软件保护系统

Publications (1)

Publication Number Publication Date
CN105046117A true CN105046117A (zh) 2015-11-11

Family

ID=54452657

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510375384.XA Pending CN105046117A (zh) 2015-06-30 2015-06-30 一种具有指令集随机化的代码虚拟化软件保护系统

Country Status (1)

Country Link
CN (1) CN105046117A (zh)

Cited By (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105608346A (zh) * 2015-12-25 2016-05-25 北京奇虎科技有限公司 基于arm指令虚拟化的elf文件保护方法及系统
CN106096338A (zh) * 2016-06-07 2016-11-09 西北大学 一种具有数据流混淆的虚拟化软件保护方法
CN106529296A (zh) * 2016-11-16 2017-03-22 武汉工程大学 一种基于模糊聚类的软件保护虚拟机攻击方法
CN106599627A (zh) * 2016-11-22 2017-04-26 江苏通付盾科技有限公司 基于虚拟机保护应用安全的方法及装置
CN106960141A (zh) * 2016-01-08 2017-07-18 阿里巴巴集团控股有限公司 虚拟机指令的编码、解码方法及装置、虚拟机保护系统
CN107194246A (zh) * 2017-05-19 2017-09-22 中国人民解放军信息工程大学 一种用于实现动态指令集随机化的cpu
CN107480476A (zh) * 2017-06-15 2017-12-15 西北大学 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法
CN107688728A (zh) * 2016-08-05 2018-02-13 上海木鸡网络科技有限公司 程序安全加密方法及装置
CN108121565A (zh) * 2016-11-28 2018-06-05 阿里巴巴集团控股有限公司 生成指令集编码的方法、装置和系统
CN108345773A (zh) * 2017-07-27 2018-07-31 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN108614960A (zh) * 2018-05-11 2018-10-02 西北大学 一种基于前端字节码技术的JavaScript虚拟化保护方法
CN109948308A (zh) * 2019-03-13 2019-06-28 智者四海(北京)技术有限公司 代码安全保护方法、装置、电子设备和计算机可读存储介质
CN110245468A (zh) * 2019-05-24 2019-09-17 阿里巴巴集团控股有限公司 一种编译方法、装置、设备及系统
CN110457046A (zh) * 2019-08-22 2019-11-15 广州小鹏汽车科技有限公司 混合指令集程序的反汇编方法、装置、存储介质及终端
CN110515652A (zh) * 2019-08-30 2019-11-29 腾讯科技(深圳)有限公司 代码摘要的生成方法、装置和存储介质
CN111752829A (zh) * 2020-06-22 2020-10-09 中国人民解放军海军工程大学 嵌入式系统固件程序的动态调试方法
CN112114933A (zh) * 2020-08-14 2020-12-22 咪咕文化科技有限公司 应用程序保护方法、电子设备和存储介质
CN112199160A (zh) * 2020-10-16 2021-01-08 常熟理工学院 虚拟指令还原方法、装置、设备及存储介质
CN112199163A (zh) * 2020-10-16 2021-01-08 常熟理工学院 分析解释例程的虚拟指令方法、装置、设备及存储介质
CN113536328A (zh) * 2020-04-21 2021-10-22 中国移动通信集团重庆有限公司 链接库文件加密的方法、装置及计算设备
CN113626773A (zh) * 2020-05-06 2021-11-09 上海蜚语信息科技有限公司 一种基于中间语言的代码保护方法
CN116756706A (zh) * 2023-06-05 2023-09-15 国网冀北电力有限公司信息通信分公司 一种嵌入式电力设备的固件代码保护方法及装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080127125A1 (en) * 2006-10-27 2008-05-29 Microsoft Corporation Virtualization For Diversified Tamper Resistance
CN101201883A (zh) * 2007-09-18 2008-06-18 北京赛柏科技有限责任公司 基于虚拟机的软件保护方法
CN101216775A (zh) * 2008-01-03 2008-07-09 北京深思洛克数据保护中心 一种软件程序的保护方法、装置及系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080127125A1 (en) * 2006-10-27 2008-05-29 Microsoft Corporation Virtualization For Diversified Tamper Resistance
CN101201883A (zh) * 2007-09-18 2008-06-18 北京赛柏科技有限责任公司 基于虚拟机的软件保护方法
CN101216775A (zh) * 2008-01-03 2008-07-09 北京深思洛克数据保护中心 一种软件程序的保护方法、装置及系统

Cited By (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2017107706A1 (zh) * 2015-12-25 2017-06-29 北京奇虎科技有限公司 基于arm指令虚拟化的elf文件保护方法及系统
CN105608346A (zh) * 2015-12-25 2016-05-25 北京奇虎科技有限公司 基于arm指令虚拟化的elf文件保护方法及系统
CN106960141A (zh) * 2016-01-08 2017-07-18 阿里巴巴集团控股有限公司 虚拟机指令的编码、解码方法及装置、虚拟机保护系统
CN106096338A (zh) * 2016-06-07 2016-11-09 西北大学 一种具有数据流混淆的虚拟化软件保护方法
CN107688728A (zh) * 2016-08-05 2018-02-13 上海木鸡网络科技有限公司 程序安全加密方法及装置
CN106529296A (zh) * 2016-11-16 2017-03-22 武汉工程大学 一种基于模糊聚类的软件保护虚拟机攻击方法
CN106599627A (zh) * 2016-11-22 2017-04-26 江苏通付盾科技有限公司 基于虚拟机保护应用安全的方法及装置
CN108121565A (zh) * 2016-11-28 2018-06-05 阿里巴巴集团控股有限公司 生成指令集编码的方法、装置和系统
CN107194246B (zh) * 2017-05-19 2020-10-02 中国人民解放军信息工程大学 一种用于实现动态指令集随机化的cpu
CN107194246A (zh) * 2017-05-19 2017-09-22 中国人民解放军信息工程大学 一种用于实现动态指令集随机化的cpu
CN107480476A (zh) * 2017-06-15 2017-12-15 西北大学 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法
CN107480476B (zh) * 2017-06-15 2020-05-19 西北大学 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法
CN108345773A (zh) * 2017-07-27 2018-07-31 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN108345773B (zh) * 2017-07-27 2020-09-08 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN108614960A (zh) * 2018-05-11 2018-10-02 西北大学 一种基于前端字节码技术的JavaScript虚拟化保护方法
CN109948308A (zh) * 2019-03-13 2019-06-28 智者四海(北京)技术有限公司 代码安全保护方法、装置、电子设备和计算机可读存储介质
CN110245468A (zh) * 2019-05-24 2019-09-17 阿里巴巴集团控股有限公司 一种编译方法、装置、设备及系统
CN110245468B (zh) * 2019-05-24 2023-06-16 创新先进技术有限公司 一种编译方法、装置、设备及系统
CN110457046A (zh) * 2019-08-22 2019-11-15 广州小鹏汽车科技有限公司 混合指令集程序的反汇编方法、装置、存储介质及终端
CN110457046B (zh) * 2019-08-22 2023-05-12 广州小鹏汽车科技有限公司 混合指令集程序的反汇编方法、装置、存储介质及终端
CN110515652A (zh) * 2019-08-30 2019-11-29 腾讯科技(深圳)有限公司 代码摘要的生成方法、装置和存储介质
CN113536328A (zh) * 2020-04-21 2021-10-22 中国移动通信集团重庆有限公司 链接库文件加密的方法、装置及计算设备
CN113626773A (zh) * 2020-05-06 2021-11-09 上海蜚语信息科技有限公司 一种基于中间语言的代码保护方法
CN113626773B (zh) * 2020-05-06 2024-04-02 上海蜚语信息科技有限公司 一种基于中间语言的代码保护方法
CN111752829A (zh) * 2020-06-22 2020-10-09 中国人民解放军海军工程大学 嵌入式系统固件程序的动态调试方法
CN112114933A (zh) * 2020-08-14 2020-12-22 咪咕文化科技有限公司 应用程序保护方法、电子设备和存储介质
CN112199160A (zh) * 2020-10-16 2021-01-08 常熟理工学院 虚拟指令还原方法、装置、设备及存储介质
CN112199163A (zh) * 2020-10-16 2021-01-08 常熟理工学院 分析解释例程的虚拟指令方法、装置、设备及存储介质
CN112199160B (zh) * 2020-10-16 2021-12-28 常熟理工学院 虚拟指令还原方法、装置、设备及存储介质
CN116756706A (zh) * 2023-06-05 2023-09-15 国网冀北电力有限公司信息通信分公司 一种嵌入式电力设备的固件代码保护方法及装置

Similar Documents

Publication Publication Date Title
CN105046117A (zh) 一种具有指令集随机化的代码虚拟化软件保护系统
CN108614960B (zh) 一种基于前端字节码技术的JavaScript虚拟化保护方法
Yadegari et al. Symbolic execution of obfuscated code
Sharif et al. Automatic reverse engineering of malware emulators
US10592263B2 (en) Emulating mixed-code programs using a virtual machine instance
US9921813B2 (en) Compiler generating operator free code
CN107729725A (zh) 一种基于虚拟机指令修改的Android应用加固系统及方法
TW201839644A (zh) 安卓平台上可執行程式的保護方法
TW201227394A (en) Security through opcode randomization
Liu et al. Binary code analysis
Anckaert et al. A model for self-modifying code
CN107577925B (zh) 基于双重ARM指令虚拟的Android应用程序保护方法
Popa Techniques of program code obfuscation for secure software
Hu et al. A semantics-based hybrid approach on binary code similarity comparison
Mu et al. ROPOB: obfuscating binary code via return oriented programming
Lan et al. Lambda obfuscation
Wang et al. Leveraging WebAssembly for numerical JavaScript code virtualization
Xue et al. Exploiting code diversity to enhance code virtualization protection
Cesare et al. Wire--a formal intermediate language for binary analysis
KR102430335B1 (ko) 가상화 코드의 난독화를 강화하는 방법 및 그 장치
CN114637988A (zh) 一种面向二进制的函数级软件随机化方法
Hawkins et al. Securing binary code
Xie et al. Random table and hash coding‐based binary code obfuscation against stack trace analysis
Borisov et al. On the Characteristics of Symbolic Execution in the Problem of Assessing the Quality of Obfuscating Transformations
Coglio et al. Adding 32-bit Mode to the ACL2 Model of the x86 ISA

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20151111

WD01 Invention patent application deemed withdrawn after publication