CN110673929B - 一种保护异常机制的方法、智能终端及存储介质 - Google Patents
一种保护异常机制的方法、智能终端及存储介质 Download PDFInfo
- Publication number
- CN110673929B CN110673929B CN201910934611.6A CN201910934611A CN110673929B CN 110673929 B CN110673929 B CN 110673929B CN 201910934611 A CN201910934611 A CN 201910934611A CN 110673929 B CN110673929 B CN 110673929B
- Authority
- CN
- China
- Prior art keywords
- exception
- virtual
- function
- instruction
- interpreter
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45587—Isolation or security of virtual machine instances
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明所提供的一种保护异常机制的方法、智能终端及存储介质,包括:通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令,并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令;所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行。本发明能够通过编译器将待虚拟化保护的源函数中的异常翻译成虚拟异常指令,之后调用解释器对所述虚拟异常指令解释执行,从而了保护了待虚拟化保护的源函数中表示异常的代码。
Description
技术领域
本发明涉及信息安全技术领域,尤其涉及的是一种保护异常机制的方法、智能终端及存储介质。
背景技术
虚拟机保护技术是信息安全领域中一种新的软件保护技术,其保护原理是:在虚拟机中定义一套指令集,将待保护函数的源代码翻译成机器和人都无法识别的虚拟字节码,在程序运行时再利用虚拟机中的解释器对这些虚拟字节码进行解释执行。
目前的虚拟机保护技术并不能保护所有的源代码,以C++为例,在将C++源代码翻译成虚拟字节码时,避开了C++源代码中和异常相关的代码,并不能将异常相关的代码翻译成虚拟字节码,因而不能够保护C++源代码中与异常相关的代码。
因此,现有技术存在缺陷,有待改进与发展。
发明内容
本发明要解决的技术问题在于,针对现有技术的上述缺陷,提供一种保护异常机制的方法、智能终端及存储介质,旨在解决现有技术中利用虚拟机保护技术保护原始函数时,无法保护原始函数的代码中与异常相关的代码的问题。
本发明解决技术问题所采用的技术方案如下:
一种保护异常机制的方法,其中,包括:
通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令,并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令;
所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行。
进一步地,所述通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令的同时,还生成了第一IR指令对应的第一IR文件,所述第一IR文件包括:待保护的函数、非保护的函数、包装函数、异常类型表和包装函数表;所述包装函数表中存储有包装函数,所述包装函数用于调用本地函数。
进一步地,所述并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令的同时,所述第一IR文件转化成第二IR文件,所述第二IR文件包括:异常类型表、包装函数表、虚拟异常表的合并表、虚拟异常表的索引表及虚拟字节码表;所述虚拟字节码表中存储有虚拟字节码,所述虚拟字节码包括多条虚拟异常指令;所述虚拟异常表的合并表中存储有多个虚拟异常表。
进一步地,所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行具体包括:
所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述第二IR指令调用解释器对所述一组虚拟异常指令逐条执行,所述一组虚拟异常指令包括多条虚拟异常指令,所述解释器调用所述本地函数;
当所述本地函数抛出异常时,解释器捕获所述异常,执行所述异常处理的虚拟字节码。
进一步地,所述当所述本地函数抛出异常时,解释器捕获所述异常,执行所述异常处理的虚拟字节码具体包括:
当所述本地函数抛出异常时,解释器捕获所述异常;
通过所述虚拟异常表的索引表查看所述当前被保护函数是否存在虚拟异常表,若不存在虚拟异常表,则解释器重新抛出所述异常;若存在虚拟异常表,则获取当前被保护函数的虚拟异常表;
查看所述当前被保护函数的虚拟异常表,当当前被保护函数不能捕获所述异常时,重新抛出所述异常;
当当前被保护函数能够捕获所述异常时,则设置vpc,控制所述vpc指向捕获所述异常后应执行的异常处理的虚拟字节码,解释器解释执行所述异常处理的虚拟字节码。
进一步地,所述重新抛出所述异常之后包括:沿函数调用链向上,解释器继续捕获所述异常。
进一步地,所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行之后还包括:
所述第二IR文件转化成二进制目标文件,调用链接器,将所述二进制目标文件与所述解释器链接,形成二进制可执行文件。
进一步地,所述源函数为C++函数。
本发明还包括一种智能终端,其中,包括处理器,以及与所述处理器连接的存储器,所述存储器存储有保护异常机制的方法的程序,所述保护异常机制的方法的程序被所述处理器执行时能够实现如上所述的保护异常机制的方法。
本发明还包括一种存储介质,其中,所述存储介质存储有保护异常机制的程序,所述保护异常机制的程序能够被执行用于实现如上所述的保护异常机制的方法。
本发明所提供的一种保护异常机制的方法、智能终端及存储介质,包括:通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令,并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令;所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行。本发明能够通过编译器将待虚拟化保护的源函数中的异常翻译成虚拟异常指令,之后调用解释器对所述虚拟异常指令解释执行,从而了保护了待虚拟化保护的源函数中表示异常的代码。
附图说明
图1是本发明中保护异常机制的方法的较佳实施例的流程图。
图2是本发明中保护异常机制的方法的较佳实施例中的虚拟异常表的结构框图。
图3是本发明中保护异常机制的方法的较佳实施例中ExceptionTableIndexArray与MET对应关系流程图。
图4是本发明中保护异常机制的方法的较佳实施例中虚拟异常表的解释器在处理异常的原理图。
图5是本发明中保护异常机制的方法的较佳实施例中虚拟异常表中的call sitetable部分的原理图。
图6是本发明中智能终端的较佳实施例的功能原理图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明中的内容均以C++为例,可以理解的是本发明所采用的技术方案并不限于C++领域,也可应用于C或者JAVA等编程语言程序涉及的领域。
本发明解决技术问题所采用的技术方案如下:
具体地,现有的虚拟化保护技术中,被保护函数是开发者进行了虚拟化保护标识的,执行方式是:开发者在需要被保护的函数原型后面增加虚拟化保护标识,使得源文件(存储被保护函数的文件)中需要虚拟化的被保护函数能够被提取出来。
进一步地,开发者使用定制的LLVM编译器进行编译(所述定制的LLVM编译器即为本发明中所述的编译器,下文称作编译器),通过预设的编译选项,对源文件进行编译,在编译过程中将被保护函数翻译成字节码,以实现对源文件中被保护函数的虚拟化处理。其中,预设的编译选项可以为-mllvm–ivmp,在编译器编译时,需要加上必要的预设参数,以方便编译器进一步在LLVM IR层对待虚拟化保护的源代码进行虚拟化处理。可以理解地,本发明中所述预设参数为开发者自定义的,开发者根据需要可自行定义预设参数。
本发明提供的技术方案支持将C++异常代码虚拟化,所述的能够表示异常代码虚拟化的虚拟指令即为虚拟异常指令。可以理解的是:为了支持将异常代码虚拟化,需要向现有虚拟指令集中添加一些新的指令。虚拟化时,编译器在IR层将IR指令翻译成虚拟指令。对于普通的IR指令,可以翻译为一组现有虚拟指令。对于表示异常的IR指令,可以翻译成一条新增指令或一条新增指令加上几条原有指令。为了方便起见,故将所述的支持将异常代码虚拟化的虚拟指令统称为虚拟异常指令,而不论其是本来就有的,还是新增的。
本发明中实现的虚拟化保护的过程是:编译器依次对不同的源文件进行处理,当编译器获取到当前源文件,在源代码转化成IR(LLVM IR即LLVM intermediateRepresentation)之后,将被保护函数的IR指令翻译成虚拟指令,程序运行时由解释器对所述虚拟指令进行解释执行。由于这些虚拟指令是非公开的,不同于以往任何已公开的指令,所以加固后的SO文件具有代码和数据隐藏、反篡改,反Dump等效果,能够大大增加保护的强度。
可以理解的是,本发明中所述的编译器能够编译的源代码并不局限于C++/C函数,且并不局限于只将源代码转化为虚拟字节码。本发明中未被虚拟化标识的源函数在IR层未作修改,其后直接转化成了机器指令,也就是说,通过本发明中的编译器生成的二进制文件中包括机器指令和虚拟指令,凡是像上述中能够执行将源代码转化为二进制文件的方式均为本发明中的编译器的替代形式。
本发明的具体的方案如图1所示:
S100、通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令,并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令。
具体地,通过编译器获取源文件,所述源文件中存储有待虚拟化保护的源函数,所述待虚拟化保护的源函数是开发人员预先设置了虚拟化保护标识的源函数。在编译器中,所述编译器会识别出所述待虚拟化保护的源函数。
已知一个函数是由多条语句组成的,所述多条语句即为函数的代码。在编译时以函数作为单位,一个函数的代码为一个整体。所述待虚拟化保护的源函数对应的源代码,在编译器的IR层,所述所述待虚拟保护函数包含的IR指令,称为第一IR指令;在IR层中,所述编译器将所述第一IR指令翻译成虚拟指令,其中,所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令。可以理解地,本发明中的待虚拟化保护的源函数中存在异常相关的代码,在IR层,所述异常相关的代码由表示异常的IR指令及普通IR指令组成。本发明中将所述表示异常的IR指令翻译成了虚拟异常指令及普通虚拟指令,非表示异常的IR指令翻译成了普通的虚拟指令。
进一步地,所述第一IR指令包括:invoke指令和landingpad指令。其中,invoke指令,能够实现对函数的调用,当调用的函数正常返回时,将控制流转移到normal label所指定的基本块;当调用的函数抛出了其自身不能捕捉的异常时,将控制流转移到unwindlabel所指定的基本块。landingpad指令,被LLVM的异常处理系统用来指明一个基本块是一个着陆点(landing pad),是异常着陆的地方,匹配着C++源代码中try/catch中的catch部分,其中声明了可被捕捉的异常对象类型。
进一步地,步骤S100、生成第一IR指令的同时,还生成了第一IR指令对应的第一IR文件,所述第一IR文件包括:待保护的函数、非保护的函数、包装函数、异常类型表和包装函数表;所述包装函数表中存储有包装函数,所述包装函数用于调用本地函数。
具体地,在IR层中,所述待虚拟化保护的函数包含的IR指令称为第一IR指令,相应地,存在与所述第一IR指令对应的第一IR文件,所述第一IR文件中存储有异常类型表和包装函数表,所述异常类型表与所述第一IR指令中的landingpad指令对应;所述包装函数表与call指令及所述第一IR指令中的invoke指令对应,所述invoke指令能够调用本地函数,本地函数(native function):是由底层环境提供的函数,相对于虚拟字节码来说,c/c++函数即是本地函数。收集所述第一IR文件中的待虚拟化保护的源函数,对每一个源函数,遍历每条第一IR指令。
当收集到第一IR指令中所有的landingpad指令中catch部分出现的异常对象类型(即c++源代码中catch部分声明捕获的异常类型),就会在所述第一IR文件中插入对应的数组,此数组称为异常类型表,所述异常类型表中存储有当前源文件中所有待虚拟化保护的函数中catch部分声明捕获的异常类型(即std::type_info*,std::type_info可在运行时表示一个类型)。
当获取到第一IR指令中的call指令及invoke指令(函数调用指令)时,其调用的本地函数的返回类型及参数类型决定了所述调用函数的签名,根据函数调用指令中被调用函数的签名,创建一个包装函数,将其插入到第一IR文件中。处理完第一IR指令中的所有call指令及invoke指令后,向第一IR文件中插入一个数组,所述数组存储着全部包装函数的地址,此数组称为包装函数表。
进一步地,所述步骤S100中:将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令的同时,所述第一IR文件转化成第二IR文件,所述第二IR文件包括:异常类型表、包装函数表、虚拟异常表的合并表、虚拟异常表的索引表及虚拟字节码表;所述虚拟字节码表中存储有虚拟字节码,所述虚拟字节码包括多条虚拟异常指令;所述虚拟异常表的合并表中存储有多个虚拟异常表,即虚拟异常表合并存放。所述虚拟异常表的索引表存储有各虚拟异常表在虚拟异常表的合并表中的位置及大小。具体地,在此阶段,将所述第一IR文件称为第二IR文件,所述第二IR文件在包含所述第一IR文件的基础上,还存储有虚拟字节码表、虚拟异常表的索引表(ETIA)。
在IR层中,第一IR指令还包括:landingpad,resume,llvm.eh.typeid.for等。LLVMIR通过invoke,landingpad等多个指令表示C++的异常处理系统。在IR层中,所述编译器将所述第一IR指令翻译成虚拟指令,其中,所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令。对于不同的异常IR指令,其翻译成的虚拟指令条数不同,有的仅翻译为一条虚拟异常指令,有的翻译成多条虚拟异常指令。
当将所述第一IR指令翻译成虚拟指令时,相应地,会在所述第二IR文件中插入一个虚拟字节码表,所述虚拟字节码表存储有虚拟字节码(虚拟字节码是所述虚拟指令的统称),虚拟字节码是由虚拟指令组成的代码;同时,还插入一个虚拟字节码索引表,所述虚拟字节码索引表存储有所述待保护函数的字节码在虚拟字节码表中的起始位置及长度。
在所述第二IR文件中插入一个全局数组,记作称为虚拟异常表的索引表,记作ETIA(ExceptionTableIndexArray),如图3所示,ETIA的元素个数大于等于MET的元素个数(m>=n),是因为可能并非所有待虚拟化保护的源函数均有异常表,若待虚拟化保护的源函数无异常代码,则其不会有虚拟异常表,ETIA中的第一个成员来指明某一函数的虚拟异常表在MET中的偏移,结构体中的第二个成员指明虚拟异常表的大小。
当将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令时,具体地,对于包含invoke指令的待虚拟化保护函数,会生成虚拟异常指令及一张与该函数对应的虚拟异常表。将所有的虚拟异常表按顺序合并存放,记作合并表,MET(merged exceptiontable)。具体地,所述源函数中存在异常代码时,即存在虚拟异常指令,所述源函数与虚拟异常表一一对应。
所述ETIA指明各虚拟异常表在MET中的索引和大小。
如图2所示为虚拟异常表的结构图,虚拟异常表包含header,call site table,action table,type index table四部分,所述四部分具体包括:
header,header中的type index base offset是除其自身外,虚拟异常表中其余部分所占用的字节数,用于计算出TIBase,header中的call site table size是紧随其后的call site table所占用的字节数;
call site table,是一个元素类型为call site record的数组,call siterecord是一个拥有4个元素的结构,call site position指明LLVM IR中invoke语句对应的虚拟字节码距离其所在源函数的虚拟字节码开始处的偏移,call site length指明LLVMIR中invoke语句所对应的虚拟字节码数(以字节为单位),landingpad position指明LLVMIR中invoke语句中exception lable指定的基本块所对应的虚拟字节码距其所在源函数虚拟字节码开始处的偏移,此基本块要么是用来处理被抛出的异常,要么是执行清理工作;first action为0表示本call site record所对应的landingpad是用来执行cleanup的,否则first action-1作为action table的搜索起点(此处以字节为单位,action table开始处为第0个字节)。call site position及landingpad postion参考图5。
如图5所示,对于函数A的虚拟字节码,假设offset0是函数A翻译成的虚拟字节码在整个虚拟字节码区域的偏移,offset1指出了A的LLVM IR中invoke指令翻译成的虚拟字节码在整个虚拟字节码区域中的偏移,offset2指出该invoke的exception label指定的基本块翻译成的虚拟字节码在整个虚拟字节码区域的偏移,则A的虚拟异常表中存在一个CallSiteRecord,其中
CallSitePosition=offset1–offset0
LandingpadPosition=offset2–offset0
action table是一个元素类型为action record的数组,action record包含两个元素。
Type filter从1开始的正整数,它是type index table的索引。1是TIBase之前的第一项,2是TIBase之前的第二项,依此类推。解释器用来判断抛出的异常对象类型是否与虚拟异常表对应的源函数的catch部分声明捕获的异常类型相匹配。
Offset to next action record,是有符号数。指明了下一个action record距此字段(即Offset to next action record本身)的偏移,若没有下一个action record,则其为0。即一个try没有更多的catch了。
一个try块的catch对应的action record在action table中是连续存放的,属于不同try的action record在action table中不能交替存放。但对于邻的两组actionrecord,若前一组action record与后一组action record的开始部分完全相同,则两组action record可合并存放,但此时概念上仍是两组action record。
type index table中每一项都是type info table的索引,其中type info table(异常类型表)是元素类型为std::type_info*(异常对象类型)的数组,存储的是当前源文件中catch部分声明捕获的异常类型。type info table存在于可执行二进制文件(如elf文件)的数据段。
std::type_info类描述了一个类型的信息,它有一些成员函数,其中name函数返回了一个表示类的名字的字符串,由于不能直接在虚拟字节码中存储std::type_info类型的数组,因此编译器生成了一个std::type_info*类型的数组type info table,其中存放了当前源文件中所有在catch部分声明捕获的异常类型的指针。
本发明设计虚拟异常表,目的是检查被保护函数(指的是待虚拟化保护的函数,虚拟化完成后其指令都被翻译成了字节码)能否捕获异常,如果能捕获,则解释器可通过虚拟异常表定位到异常处理对应的虚拟字节码,去执行表示异常处理的虚拟字节码。
S200、所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行。具体地,所述第二IR指令为在编译器中生成的一组新的指令,用所述第二IR指令替换所述第一IR指令,将所述待虚拟化保护的源函数转化为解释器入口函数;所述第二IR指令将所述待虚拟化保护的源函数的参数压入虚拟栈;调用解释器解释执行该所述待虚拟化保护的源函数的虚拟字节码(即虚拟指令,包括虚拟异常指令);若所述待虚拟化保护的源函数有返回值,则从虚拟栈中取回解释器的执行结果,并返回该结果。待虚拟化保护的源函数由此转化成解释器入口函数。
所述步骤S200具体包括:
S210、所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述第二IR指令调用解释器执行所述虚拟异常指令,所述解释器调用所述本地函数。
具体地,解释器在执行时,当其获取到EXINVOKE指令(所述第一IR指令中invoke虚拟化后的指令),通过EXINVOKE的操作数(EXINVOKE的操作数是包装函数表的索引),解释器可拿到对应的包装函数的指针,通过所述包装函数的指针实现对包装函数的调用。而包装函数里面实现了对本地函数的调用。解释器解释执行call或invoke语句翻译而成的虚拟字节码时,正是通过包装函数间接实现了对本地函数的地调用。如此解释器实现了对本地函数的调用。
S220、当所述本地函数正常返回时,解释器则执行所述一组虚拟异常指令中的下一条虚拟异常指令,已知的是,所述一组虚拟异常指令中包括多条虚拟异常指令,解释器对多条虚拟异常指令进行逐条解释。
S230、当所述本地函数抛出异常时,解释器捕获所述异常,执行所述异常处理的虚拟字节码。当本地函数抛出异常时(注意,此处指异常未被本地函数自身捕获的情况),正常的控制流程中断,解释器需要处理异常。
具体地,若本地函数抛出了异常,解释器在catch部分捕获该异常。通过被抛出的异常对象及当前正被解释执行的被保护函数(为了对编译完成之后的待虚拟化保护函数进行区分,此处称为被保护函数)的虚拟异常表定位到所述异常处理的虚拟字节码,解释器转而执行所述异常处理的虚拟字节码(此处异常处理的字节码,指的是IR指令invoke中unwind label所指定的基本块翻译而成的字节码)。当前被解释器解释执行的被保护函数不会捕获该异常时,就不会存在该异常的异常处理虚拟字节码。
所述虚拟字节码解释执行的区域举例如下:
所述步骤S230具体包括:
S231、当所述本地函数抛出异常时,解释器捕获所述异常;
S232、通过所述虚拟异常表的索引表查看所述当前被保护函数是否存在虚拟异常表,若不存在虚拟异常表,则解释器重新抛出所述异常;若存在虚拟异常表,则获取当前被保护函数的虚拟异常表。
具体地,搜索ETIA查看是否存在当前被保护函数的虚拟异常表,因为所述ETIA指明各虚拟异常表在MET中的索引和大小,若所述ETIA中表示虚拟异常表大小的值为0,说明不存在当前被保护函数的虚拟异常表,若不存在当前被保护函数的虚拟异常表,则重新抛出异常;若存在虚拟异常表,转入下一个步骤S233及S234。
所述当前被保护函数指的是,解释器捕获异常时,当前正被解释器解释执行的被保护函数。
S233、通过C++ABI(ABI即应用程序二进制接口,它描述了应用程序与操作系统之间的底层接口)获取抛出的异常对象的指针及表示异常对象类型的指针(std::type_info*)。
S234、查看所述异常对应的虚拟异常表,判断当前被保护函数是否能够捕获异常。
进一步地,对所述当前被保护函数的虚拟异常表进行检查,当虚拟程序计数器(记作vpc)位于指定区域时(即vpc位于虚拟异常表列出的某一个调用点指定的范围中),则检查call site record;否则重新抛出异常。
call site table是一个元素类型为call site record的数组,call siterecord是一个拥有4个元素的结构,call site record由call site position、call sitelength、landingpad position及first action。
具体地,检查虚拟异常表中call site table的call site record,当虚拟程序计数器(vpc)位于指定区域时,即vpc>=offset for start of function+call siteposition且vpc<offset for start of function+call site position+call sitelength即说明异常是此调用点调用的函数抛出了或在调用链中位于该调用点下方的函数抛出了异常。
进一步地,检查call site record中landingpad position是否为0,若不为0,则检查call site record中action;否则重新抛出异常。
进一步地,检查call site record中first action是否为0,若first action为0,表示当前函数不捕获异常,只是执行一些清理工作(即调用析构函数析构C++类对象),设置vpc使其执行landingpad position处的虚拟字节码,执行清理工作,然后重新抛出异常;若first action不为0,则action-1(记作ActIndex)指向了action table中首个开始搜索的位置,则检查ActionTable。
进一步地,检查所述被抛出的异常对应的异常类型与所述异常表中对应的异常类型是否匹配,当匹配成功时,表明当前被保护函数能够捕获该异常,则转入S235。
具体地,所述虚拟异常表中存储有所述当前被保护函数能够捕获的异常类型,若所述被抛出的异常的异常类型与所述能够捕获的异常类型匹配,即当前被抛出的异常对象的类型指针与能够捕获的异常类型的指针相匹配,说明所述当前被保护函数能够捕获当前异常;若类型不匹配,则出错,程序应退出。
首先查看action table第ActIndex个字节处,得到type index table的索引,继而得到type table info中的std::type_info*,若其表示的类型与步骤S233中得到的std::type_info*表示的类型匹配,则表明当前被保护的函数可捕获抛出的异常;若类型不匹配,则根据offset to next action record找到下一个action record,继续检查类型匹配,直到offset to next action record值为0,若此时类型仍不匹配,则出错,程序应退出。
type index table中每一项都是type info table的索引,其中type info table是元素为std::type_info*的数组,存储的是当前源文件中catch部分异常类型的指针。
S235、当当前被保护函数能够捕获所述异常时,则设置vpc,控制vpc指向所述异常对应的异常处理字节码,解释器解释执行异常处理字节码。设置vpc,使其执行landingpadposition处的虚拟字节码,处理被抛出的异常。执行完异常处理的必要操作后,异常处理会恢复到正常控制流,设置vpc,使其执行异常处理之后的字节码(即C++try-catch之后的代码对应的字节码。)
进一步地,所述重新抛出所述异常之后,沿着函数调用链向上,该异常可被解释器再次捕获或被其它本地函数捕获。
具体地,当前被保护函数未能处理异常而将所述异常重新抛出后,C++本身的异常处理机制会沿着函数调用链向上继续执行堆栈展开(stack unwinding),直至某一个函数重新捕获了该异常。若是解释器捕获了该异常(即被上层EXINVOKE指令处的catch捕获),则执行所述异常;若是被其它普通本地函数捕获,则由C++本身的异常机制进行处理。若一直到main函数也未能捕获异常,则C++本身的异常机制会使程序退出。
本发明列举函数调用链的形式如下,用于说明异常处理过程:
Function A>interpreter entry function for B>interpreter>wrapperfunction for C>Function C>interpreter entry function for D>interpreter>wrapper function for E>Function E
函数调用链:因函数调用而形成的一个链,假设源代码中存在一条函数调用链A->B->C->D->E,如函数A调用函数B,而函数B又调用函数C,函数C又调用函数D,函数D又调用函数E,其中B、D是被保护函数,A、C、E是非被保护函数。在执行异常时,会进行如下的处理过程:
若函数E中抛出了异常,若E中没有捕获异常,则C++本身的异常机制会延着调用链向上寻找一个可捕获该异常的异常处理;首先遇到了E的包装函数,但包装函数不会捕捉异常;接着遇到了第一个解释器调用(将解释器简化成一个概念上的函数,此处即相当于一个函数调用。),此处解释器调用是解释执行D的虚拟字节码,若解释器捕获了异常,执行步骤S230,执行所述异常处理的虚拟字节码,若解释器未能在被保护函数D的虚拟异常表中找到匹配的异常处理虚拟字节码,则会将异常重新抛出;接着遇到了D的解释器入口函数(即替代函数),同样该函数不会捕获异常;接着遇到了C,若C捕获了异常,则停止寻找,执行C中的异常处理,若C不能捕获异常,则继续寻找;接着遇到了C的包装函数,该函数不会捕获异常;接着遇到了第二个解释调用,此处解释器调用是解释执行B的虚拟字节码,它的处理如同第一个解释器调用;若还要寻找,接着就遇到了B的入口函数,它不会捕获异常;接着遇到了A,若A捕获异常,则程序会执行A中的异常处理,若A不能捕获异常,则继续寻找;如此一直到main,若main也不能捕获异常,则程序退出运行。
解释器再次捕获异常时,vpc,vfp,vsp是解释器函数中的局部变量,均已恢复为与当前栈帧匹配的值,vfp,vsp恢复了,相当于虚拟栈也恢复了。
如此沿着调用链向上一级级的处理,若直到main函数也无法捕获异常,则程序应退出。
300、所述第二IR文件转化成二进制目标文件,调用链接器,将所述二进制目标文件与所述解释器链接,形成二进制可执行文件。
所述解释器是以C++语言编写的,其源代码被编译器编译成了静态库(一组二进制目标文件),编译器将第二IR指令所在的第二IR文件转化成二进制目标文件,最后会调用链接器将所有二进制目标文件及实现解释器功能的二进制目标文件链接成二进制可执行文件。
本发明还提供一种智能终端,如图6所示,其中,包括处理器10,以及与所述处理器10连接的存储器20,所述存储器20存储有保护异常机制的方法的程序,所述保护异常机制的方法的程序被所述处理器执行时能够实现如上所述的保护异常机制的方法;具体如上所述。
本发明还提供一种存储介质,其中,所述存储介质存储有保护异常机制的程序,所述保护异常机制的程序能够被执行以用于实现如上所述的保护异常机制的方法;具体如上所述。
综上所述,本发明公开的一种保护异常机制的方法、智能终端及存储介质,包括:通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令,并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令;所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行。本发明能够通过编译器将待虚拟化保护的源函数中的异常翻译成虚拟异常指令,之后调用解释器对所述虚拟异常指令解释执行,从而了保护了待虚拟化保护的源函数中表示异常的代码,进一步实现了对源函数的保护。
应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
Claims (7)
1.一种保护异常机制的方法,其特征在于,包括:
通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令,并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令;
所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行;
所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行具体包括:
所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述第二IR指令调用解释器对所述一组虚拟异常指令逐条执行;所述一组虚拟异常指令包括多条虚拟异常指令,所述解释器调用本地函数;
当所述本地函数抛出异常时,解释器捕获所述异常,执行所述异常处理的虚拟字节码;
所述当所述本地函数抛出异常时,解释器捕获所述异常,执行所述异常处理的虚拟字节码具体包括:
当所述本地函数抛出异常时,解释器捕获所述异常;
通过所述虚拟异常表的索引表查看当前被保护函数是否存在虚拟异常表,若不存在虚拟异常表,则解释器重新抛出所述异常;若存在虚拟异常表,则获取当前被保护函数的虚拟异常表;
查看当前被保护函数的虚拟异常表,当当前被保护函数不能捕获所述异常时,重新抛出所述异常;
当当前被保护函数能够捕获所述异常时,则设置vpc,控制所述vpc指向捕获所述异常后应执行的异常处理的虚拟字节码,解释器解释执行所述异常处理的虚拟字节码;
所述重新抛出所述异常之后包括:
沿函数调用链向上,解释器继续捕获所述异常。
2.根据权利要求1所述的保护异常机制的方法,其特征在于,所述通过编译器获取到源文件中待虚拟化保护的源函数,生成第一IR指令的同时,还生成了第一IR指令对应的第一IR文件,所述第一IR文件包括:待保护的函数、非保护的函数、包装函数、异常类型表和包装函数表;所述包装函数表中存储有包装函数,所述包装函数用于调用本地函数。
3.根据权利要求2所述的保护异常机制的方法,其特征在于,所述并将所述第一IR指令中表示异常的指令翻译成一组虚拟异常指令的同时,所述第一IR文件转化成第二IR文件,所述第二IR文件包括:异常类型表、包装函数表、虚拟异常表的合并表、虚拟异常表的索引表及虚拟字节码表;所述虚拟字节码表中存储有虚拟字节码,所述虚拟字节码包括多条虚拟异常指令;所述虚拟异常表的合并表中存储有多个虚拟异常表。
4.根据权利要求3所述的保护异常机制的方法,其特征在于,所述编译器生成第二IR指令替换所述第一IR指令,形成解释器入口函数,所述解释器入口函数调用解释器对所述一组虚拟异常指令进行解释执行之后还包括:
所述第二IR文件转化成二进制目标文件,调用链接器,将所述二进制目标文件与所述解释器链接,形成二进制可执行文件。
5.根据权利要求1所述的保护异常机制的方法,其特征在于,所述源函数为C++函数。
6.一种智能终端,其特征在于,包括处理器,以及与所述处理器连接的存储器,所述存储器存储有保护异常机制的程序,所述保护异常机制的程序被所述处理器执行时能够实现如权利要求1-5任一项所述的保护异常机制的方法。
7.一种存储介质,其特征在于,所述存储介质存储有保护异常机制的程序,所述保护异常机制的程序能够被执行以用于实现如权利要求1-5任一项所述的保护异常机制的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910934611.6A CN110673929B (zh) | 2019-09-29 | 2019-09-29 | 一种保护异常机制的方法、智能终端及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910934611.6A CN110673929B (zh) | 2019-09-29 | 2019-09-29 | 一种保护异常机制的方法、智能终端及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110673929A CN110673929A (zh) | 2020-01-10 |
CN110673929B true CN110673929B (zh) | 2022-11-22 |
Family
ID=69080121
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910934611.6A Active CN110673929B (zh) | 2019-09-29 | 2019-09-29 | 一种保护异常机制的方法、智能终端及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110673929B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113626773B (zh) * | 2020-05-06 | 2024-04-02 | 上海蜚语信息科技有限公司 | 一种基于中间语言的代码保护方法 |
CN113836496A (zh) * | 2020-06-08 | 2021-12-24 | 三六零安全科技股份有限公司 | 代码虚拟化保护方法、系统、设备及可读存储介质 |
CN114328168B (zh) * | 2020-10-09 | 2024-07-02 | 腾讯科技(深圳)有限公司 | 异常检测方法、装置、计算机设备和存储介质 |
CN112989290A (zh) * | 2021-03-10 | 2021-06-18 | 四川长虹格润环保科技股份有限公司 | 多兼容性代码加固方法 |
CN113761518A (zh) * | 2021-08-17 | 2021-12-07 | 中国科学院软件研究所 | 基于risc-v与hw-cfi机制的控制流劫持攻击防御方法及装置 |
CN117033064A (zh) * | 2023-10-10 | 2023-11-10 | 北京中电华大电子设计有限责任公司 | 一种代码异常处理的方法及装置 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8719802B2 (en) * | 2010-09-30 | 2014-05-06 | Nec Laboratories America, Inc. | Interprocedural exception method |
US8935686B2 (en) * | 2012-08-28 | 2015-01-13 | Microsoft Corporation | Error-code and exception-based function dispatch tables |
CN106960141A (zh) * | 2016-01-08 | 2017-07-18 | 阿里巴巴集团控股有限公司 | 虚拟机指令的编码、解码方法及装置、虚拟机保护系统 |
CN108932406B (zh) * | 2017-05-18 | 2021-12-17 | 北京梆梆安全科技有限公司 | 虚拟化软件保护方法和装置 |
CN108614960B (zh) * | 2018-05-11 | 2020-06-16 | 西北大学 | 一种基于前端字节码技术的JavaScript虚拟化保护方法 |
CN109684794B (zh) * | 2018-12-07 | 2023-06-23 | 成都盈海益讯科技有限公司 | 一种代码保护虚拟机kvm系统实现方法、装置、计算机设备及存储介质 |
CN109933410B (zh) * | 2019-03-22 | 2021-06-01 | 北京智游网安科技有限公司 | 一种基于虚拟化技术的虚拟指令下发方法及系统 |
CN110032425B (zh) * | 2019-03-22 | 2021-04-06 | 北京智游网安科技有限公司 | 一种动态链接库文件虚拟化方法、系统及存储介质 |
CN109960511B (zh) * | 2019-03-22 | 2022-09-09 | 北京智游网安科技有限公司 | 基于虚拟化技术的动态库下发方法、存储介质及智能终端 |
CN110245467B (zh) * | 2019-05-13 | 2023-02-07 | 西北大学 | 基于Dex2C与LLVM的Android应用程序保护方法 |
-
2019
- 2019-09-29 CN CN201910934611.6A patent/CN110673929B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN110673929A (zh) | 2020-01-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110673929B (zh) | 一种保护异常机制的方法、智能终端及存储介质 | |
US6594783B1 (en) | Code verification by tree reconstruction | |
US6412109B1 (en) | Method for optimizing java bytecodes in the presence of try-catch blocks | |
KR101099212B1 (ko) | 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체 | |
Karaorman et al. | jContractor: A reflective Java library to support design by contract | |
Fokin et al. | SmartDec: approaching C++ decompilation | |
US20080222616A1 (en) | Software translation | |
US8141035B2 (en) | Method for accessing internal states of objects in object oriented programming | |
Pusch | Proving the soundness of a Java bytecode verifier specification in Isabelle/HOL | |
Brachthäuser et al. | Effect handlers for the masses | |
GB2357866A (en) | Garbage collection with live memory list and leakage detection | |
KR101875225B1 (ko) | 가상 머신에 의한 실행을 위한 프로그래밍의 중간 코드의 보안 프로세스, 컴퓨터 프로그램 및 장치 | |
CN103514027B (zh) | 一种增强软件保护易用性的方法 | |
EP2122464A1 (en) | A computer implemented translation method | |
KR102341137B1 (ko) | 중간언어 기반 코드 변환 방법 및 이를 포함하는 전자 장치 | |
US7287244B2 (en) | Efficiently releasing locks when an exception occurs | |
Bockisch | An efficient and flexible implementation of aspect-oriented languages | |
CN117235746B (zh) | 一种基于多维ast融合检测的源代码安全管控平台 | |
CN114707124B (zh) | 基于代码虚拟化的.net平台代码保护方法和系统 | |
Buisson et al. | Recaml: execution state as the cornerstone of reconfigurations | |
d’Andrea et al. | Tecnical Documentation | |
Pusch | Proving the soundness of a Java bytecode verifier in Isabelle/HOL | |
Cui et al. | SmallRace: Static Race Detection for Dynamic Languages-A Case on Smalltalk | |
D'Andrea | Behavioural Analysis of Tracing JIT Compiler Embedded in the Methodical Accelerator Design Software | |
Negrini | A hybrid approach for automatic recognition of C++ objects in optimized binaries |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20220923 Address after: F060, 7 / F, Cuilin building, 10 Kaifeng Road, Maling community, Meilin street, Futian District, Shenzhen, Guangdong 518000 Applicant after: SHENZHEN IJIAMI TECHNOLOGY CO.,LTD. Address before: 207-2, 2 / F, building 10, Zhongguancun Software Park, 8 dongbeiwangxi Road, Haidian District, Beijing (Guoyong RONGTONG building) Applicant before: BEIJING ZHIYOU WANG'AN TECHNOLOGY Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |