CN114327789A - 一种基于llvm的虚拟机保护方法及系统 - Google Patents
一种基于llvm的虚拟机保护方法及系统 Download PDFInfo
- Publication number
- CN114327789A CN114327789A CN202210017306.2A CN202210017306A CN114327789A CN 114327789 A CN114327789 A CN 114327789A CN 202210017306 A CN202210017306 A CN 202210017306A CN 114327789 A CN114327789 A CN 114327789A
- Authority
- CN
- China
- Prior art keywords
- instruction
- basic
- interpreter
- basic block
- program
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 42
- 230000001419 dependent effect Effects 0.000 claims description 11
- 238000005215 recombination Methods 0.000 claims description 10
- 230000006798 recombination Effects 0.000 claims description 10
- 230000009191 jumping Effects 0.000 claims description 9
- 238000000605 extraction Methods 0.000 claims description 6
- 238000004806 packaging method and process Methods 0.000 claims description 4
- 239000004744 fabric Substances 0.000 claims description 2
- 238000010276 construction Methods 0.000 claims 2
- 101000911390 Homo sapiens Coagulation factor VIII Proteins 0.000 claims 1
- 230000009977 dual effect Effects 0.000 claims 1
- 102000057593 human F8 Human genes 0.000 claims 1
- 229940047431 recombinate Drugs 0.000 claims 1
- 230000003068 static effect Effects 0.000 abstract description 6
- 230000008521 reorganization Effects 0.000 description 5
- 230000007547 defect Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000003245 working effect Effects 0.000 description 1
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于LLVM的虚拟机保护方法及系统,通过实现自定义指令集与程序解释器,在LLVM中间代码层面实现虚拟机保护。本发明通过将源代码转化为LLVM中间表示,遍历整个IR程序获得程序所有的函数和基本块作为基本单位,为所有基本单位进行依赖分析并根据依赖分析结果对基本单位进行切分得到基本指令,将基本指令进行重组得到新基本块,并绑定操作码,根据新基本块创建操作码数组和解释器,通过解释器完成整个程序的控制逻辑从而达到虚拟机保护的目的。相比传统静态混淆技术,本发明具有更高的反混淆能力;相比传统的虚拟机保护技术,本发明在保证高混淆强度的情况下,极大地降低了混淆所需要的时间、空间开销。
Description
技术领域
本发明涉及计算机安全技术领域,尤其涉及一种基于LLVM的虚拟机保护方法及系统。
背景技术
在软件安全形势愈发严峻的情况下,保护软件不被篡改和恶意逆向是一项十分艰巨的任务。代码混淆是软件安全保护的一项重要技术。它通过在指令或函数级别进行修改来隐藏程序的原始逻辑,来增加逆向工程的难度。现有的代码混淆技术主要分为静态混淆技术和动态混淆技术。静态混淆技术主要包括控制流扁平化、虚假控制流等方式。但是传统的静态混淆技术具有抗反混淆能力较弱,无法抵抗动态调试等缺点。
动态混淆技术在实现上主要包括自修改代码技术和虚拟机保护技术,自修改代码技术可以在一定程度上阻碍逆向工具获取程序所有的明文代码,从而抵抗动态分析。虚拟机保护与传统自修改代码技术的最主要区别是虚拟机增加了一层自定义的指令集,而且其难以逆向,破解者想要获得程序源码,首先必须弄懂虚拟机的指令集,这极大增加了逆向的开销。但是传统的虚拟机保护具有时间、空间开销过大的缺点。
发明内容
为了克服上述现有技术的不足,本发明提供一种基于LLVM的虚拟机保护方法及系统,通过实现自定义指令集与程序解释器,在LLVM中间代码层面实现虚拟机保护。相比传统静态混淆技术,本发明具有更高的反混淆能力;相比传统的虚拟机保护技术,本发明在保证高混淆强度的情况下,极大地降低了混淆所需要的时间,空间开销。
本发明提供的基于LLVM的虚拟机保护方法通过将源代码编译为LLVM中间表示(以下简称LLVM IR),遍历整个LLVM IR程序获得程序所有的函数和基本块作为基本单位,为所有基本单位进行依赖分析并根据依赖分析结果对基本单位进行切分得到基本指令,将基本指令进行重组得到新基本块并绑定操作码,根据新基本块创建操作码数组和解释器,通过解释器完成整个程序的控制逻辑,从而达到虚拟机保护的目的,主要包括:提取程序基本单位阶段、基本单位依赖分析阶段、指令重组阶段、构建操作码数组与解释器阶段。
提取程序基本单位阶段执行如下步骤:
步骤1,将源代码转化成LLVM中间表示,即使用编译器将源代码编译成LLVM可分析的.bc文件,并在编译的过程中避免信息丢失;
步骤2,根据步骤1得到的源代码的.bc文件,获取源程序中的函数和基本块,即在整个程序层面和程序中的所有函数层面进行遍历,获取到程序中的所有函数,以及函数中的所有基本块,并将这些信息作为基本单位进行保存。
基本单位依赖分析阶段具体执行如下步骤:
步骤3,根据步骤2中得到的基本单位信息,对基本单位的每一条指令进行遍历,每条指令有一个标志位来标识是否经过了依赖分析;
步骤4,对于没有经过依赖分析的指令,需要从该条指令开始,分析得到该指令的所有依赖指令,并将所有依赖指令放进同一个分组,该分组代表一个最小的、不可分割的单位。
指令重组阶段具体执行如下步骤:
步骤5,该步骤需要对步骤4得到的分组进行指令重组,将分组中的指令包装成为一个新的基本块。首先要得到要包装的分组,为该分组创建一个新基本块,然后将分组中的指令全部复制到新基本块中;
步骤6,为新基本块生成一个操作码,该操作码与新基本块是唯一对应关系。删除原基本单位中已经被加入新基本块的所有指令,防止指令重复。
构建操作码数组与解释器阶段具体执行如下步骤:
步骤7,该步骤需要收集步骤6中生成的所有操作码,组成一个操作码集合,将该集合的名称随机化之后,将该集合作为程序的一部分加入到源代码中,生成操作码数组;
步骤8,该步骤需要对每一个基本单位(基本块或函数)设计一个解释器,用来控制该基本单位的运行;解释器的主要工作是,根据当前的操作码索引,找到当前需要执行操作码,利用操作码跳转到步骤6中该操作码唯一对应的新基本块中去执行。执行结束之后会重新跳回解释器,直到程序结束。
利用上述基于LLVM的虚拟机保护方法,本发明实现了相应的基于LLVM的虚拟机保护系统,包括:程序基本单位提取子系统、基本单位依赖分析子系统、指令重组子系统,操作码数组与解释器构建子系统。
所述程序基本单位提取子系统包括程序基本单位提取模块。程序基本单位提取模块用于提取LLVM IR中所有的基本块与函数等基本单位信息。
所述基本单位依赖分析子系统包括基本块级别依赖分析模块和函数级别依赖分析模块。基本块级别依赖分析模块通过在基本块内部,对每一条指令进行依赖分析从而得到该指令的所有依赖指令。函数级别依赖分析模块是在基本块级别依赖分析的基础上,加入了跨基本块的依赖分析,从而实现多个基本块间的指令依赖分析。
所述指令重组子系统包括指令重组模块。指令重组模块利用基本单位依赖分析子系统的分析结果,将分析得到的所有分组进行包装重组,得到一个全新的基本块供解释器调用,具体实现步骤如下:1、得到基本单位依赖分析子系统分析得到的所有分组;2、为该分组创建一个新块;3、将该分组中的所有指令加入此新块;4、将分组中的所有指令从原始基本块中移除;5、为该新的基本块分配一个唯一的操作码并绑定。完成上述步骤之后,解释器可以通过操作码找到对应的基本块,然后跳转至该块,从而执行这条指令。
所述操作码数组与解释器构建子系统包括操作码数组构建模块和解释器构建模块。其中,操作码数组构建模块主要是收集指令重组子系统中生成的所有操作码,组成一个操作码集合,将该集合的名称随机化之后,将该集合作为程序的一部分加入到源代码中,生成操作码数组。解释器构建模块的主要工作是为每一个基本单位设计一个解释器,用来控制该基本单位的运行。解释器的主要工作是根据当前的操作码索引找到当前需要执行的操作码,利用操作码跳转到对应的基本块去执行;执行结束之后会重新跳回解释器,直到程序结束。解释器的设计有两个级别,分别是基本块级别和函数级别,由于基本块级别和函数级别的基本单位大小不同,因此在设计上有细微差别,即基本块级别的设计不会破坏原有程序的控制结构,所有的运行都在一个基本块内,块内执行必然保持严格的顺序,因此操作码索引的增长是顺序增长。而函数级别的设计会破坏原有程序的控制结构,因为涉及到基本块间的跳转关系,函数内执行并没有一个严格的顺序,操作码的索引增长不是顺序增长,因此需要引入PHI指令来记录回到解释器的基本块索引,然后重新计算下一个需要执行的基本块的操作码索引。
本发明的有益效果是:
本发明提供了一种基于LLVM的虚拟机保护方法及系统,通过实现自定义指令集与程序解释器,在LLVM中间代码层面实现虚拟机保护。本发明通过将源代码转化为LLVM中间表示,遍历整个LLVM IR程序获得程序所有的函数和基本块作为基本单位,为所有基本单位进行依赖分析并根据依赖分析结果对基本单位进行切分得到基本指令,将基本指令进行重组得到新基本块,并绑定操作码,根据新基本块创建操作码数组和解释器,通过解释器完成整个程序的控制逻辑,从而达到虚拟机保护的目的。相比传统静态混淆技术,本发明具有更高的反混淆能力;相比传统的虚拟机保护技术,本发明在保证高混淆强度的情况下,极大地降低了混淆所需要的时间和空间开销。
附图说明
图1为本发明基于LLVM的虚拟机保护方法的流程框图。
图2为本发明实施例提供的基于LLVM的虚拟机保护系统的结构框图。
具体实施方式
下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。
本发明提供了一种基于LLVM的虚拟机保护方法及装置,通过将源代码转化为LLVM中间表示(LLVM IR),遍历整个LLVM IR程序获得程序所有的函数和基本块作为基本单位,为所有基本单位进行依赖分析,并根据依赖分析结果对基本单位进行切分得到基本指令,将基本指令进行重组得到新基本块,并绑定操作码,根据新基本块创建操作码数组和解释器,通过解释器完成整个程序的控制逻辑,从而达到虚拟机保护的目的,对于保护程序不受逆向工程攻击着显著效果。
图1为本发明基于LLVM的虚拟机保护方法的流程框图。该方法的具体实施包括四个阶段:
阶段一、提取程序基本单位;
阶段二、基本单位依赖分析;
阶段三、指令重组;
阶段四、构建操作码数组与解释器。
阶段一包括如下步骤:
步骤1,将源代码转化成LLVM中间表示,即使用编译器将源代码编译成LLVM可分析的.bc文件,并在编译的过程中避免信息丢失;
进一步的,详细的编译方式为:
(1)使用clang++将源代码编译链接成单个.bc文件;
(2)具体的编译命令为:clang++-c-emit-llvm input.cpp-o input.bc。
步骤2,根据步骤1得到的源代码的.bc文件,获取源程序中的函数和基本块,即在整个程序层面和程序中的所有函数层面进行遍历,获取到程序中的所有函数,以及函数中的所有基本块。将这些信息作为基本单位进行保存。
阶段二包括如下步骤:
步骤3,根据步骤2中得到的基本单位信息,该步骤需要对基本单位的每一条指令进行遍历,每条指令有一个标志位来标识是否经过了依赖分析;该步骤中涉及到了需要进行依赖分析的指令信息和判断指令是否已经经过依赖分析的标志信息。指令信息存储在一个向量中,表示为:vector<Instruction>。标志信息存储在一个map中,表示为:map<Instruction,bool>,map的key值代表了一条指令,value值代表该指令是否经过了依赖分析。需要对指令信息进行倒序遍历,拿到一个没有经过依赖分析的指令进行依赖分析。具体依赖分析步骤如步骤4。
步骤4,依赖分析结果存放在双重的堆栈stack<stack<Instruction>>中,其中内层堆栈stack<Instruction>存放的是一条指令的分析结果,所有的分析结果都有一个自己的stack,外部再用一个stack存储所有指令的分析结果。经过步骤3的遍历,可以拿到当前vector中没有经过依赖分析的一条指令,然后对其进行依赖分析。由于该指令的依赖指令也可能存在自己的依赖,因此搜索的过程采用广度优先搜索的方式,该过程需要一个队列来辅助搜索,表示为:queue<Instruction>。首先需要为该指令创建自己的stack,然后创建自己的queue。然后将该指令入栈,入队。将队首指令弹出,然后开始向上寻找该指令的依赖,将寻找到的依赖指令入栈,入队,并且将该条指令的标志信息,即是否经过了依赖分析置为true。继续弹出队首寻找依赖,直到队列为空,代表该指令的所有依赖已经全部寻找完毕。将得到的依赖指令堆栈即内层堆栈stack加入到分析结果堆栈即外层堆栈。接着需要在vector中遍历找到下一个标志信息为false的指令继续进行依赖分析,直到所有指令均完成了依赖分析。由于我们是从指令的最后一条开始分析,即后向分析,因此堆栈中弹出的顺序就是程序执行的正常顺序。
步骤3,步骤4代码如下方所示:
阶段三包括如下步骤:
步骤5,该步骤需要对步骤4得到的分组进行指令重组,将分组中的指令包装成为一个新的基本块。首先要得到要包装的分组,然后为该分组创建一个新基本块,然后将分组中的指令全部复制到新基本块中。在步骤4中我们已经得到了依赖分析结果stack<stack<Instruction>>instBlock,其中instBlock.size()就是最终要创建新基本块的数量,也是操作码的数量。我们需要遍历instBlock,拿出每一组指令依赖分析结果curInsts,然后为curInsts新建一个基本块instBasicBlock,接着将curInsts中的每一条指令弹出放入到instBasicBlock中。
步骤6,步骤5的新基本块instBasicBlock生成之后,为instBasicBlock分配一个唯一的操作码并绑定。然后将该instBasicBlock中的所有指令从原基本块中移除。
步骤5,步骤6代码如下方所示:
阶段四包括如下步骤:
步骤7,该步骤需要收集步骤6中生成的所有操作码,组成一个操作码集合,将该集合的名称随机化之后,将该集合作为程序的一部分加入到源代码中,最后返回的opcodeVector就是生成的操作码数组,该操作码数组会用在解释器中,用来控制整个程序的运行。
步骤8,该步骤需要对每一个基本单位设计一个解释器,用来控制该基本单位的运行。解释器的主要工作是:根据当前的操作码索引,然后找到当前需要执行操作码,利用操作码跳转到对应的基本块去执行,执行结束之后会重新跳回解释器,直到程序结束。解释器的设计有两个级别,分别是基本块级别和函数级别,由于基本块级别和函数级别的基本单位大小不同,因此在设计上有细微差别。
对于基本单位是基本块的情况,每一个基本块都拥有一个自己的解释器,用来控制该块的运行。解释器的主要工作是,根据当前的操作码索引,然后找到当前需要执行的操作码,然后计算下一次要执行的指令操作码的索引。因此解释器需要具体完成以下工作:1、获取到LLVM IR中属于该块的全局操作码数组。2、初始化索引值为0,即代表将从第一条指令开始执行。3、通过索引值和操作码数组找到对应的操作码,然后利用操作码和switch指令跳转到相应的基本块。4、如果基本块不是最后一条指令,会重新跳回解释器。5、再次回到解释器之后,索引会通过自增计算到下一条指令操作码的索引,如此反复。6、如果执行的是基本块的最后一条指令,那么这个基本块会结束,接下来会退出程序或者进入下一个基本块的解释器。
对于基本单位是函数的情况,整个函数只拥有一个解释器,也就是说整个函数的指令,都是由这个唯一的解释器来解释执行的。解释器完成解释执行的核心就在于通过当前指令操作码的索引得到下一次即将执行的指令对应的操作码,然后跳转到下一条指令所在基本块去执行。具体来说,解释器需要知道当前是从哪个指令所在的基本块跳转到解释器的,然后才能控制程序跳转到下一条指令所在基本块去执行。因此需要使用phi指令完成这项工作,解释器将通过phi指令得到当前跳转到解释器的指令所在基本块的操作码索引。然后将操作码的索引加一,再通过一个全局的操作码数组就能得到下一条指令所在基本块的操作码。接下来利用该操作码和基本块的对应关系,使用switch指令跳转到相应的基本块。如果该基本块自身不是函数最后一个基本块的最后一条指令,会在指令所在基本块后再加入一条br指令,使它重新跳回解释器。再重复上述过程,直到整个函数结束。
通过上述四个阶段的操作,实现基于LLVM的虚拟机保护。
利用上述基于LLVM的虚拟机保护方法,本发明实现了相应的基于LLVM的虚拟机保护系统,图2为本实施例提供的系统结构框图,该基于LLVM的虚拟机保护系统包括如下子系统:
子系统一、程序基本单位提取子系统;
子系统二、基本单位依赖分析子系统;
子系统三、指令重组子系统;
子系统四、操作码数组与解释器构建子系统。
子系统一包括如下模块:
模块一、程序基本单位提取子系统包括程序基本单位提取模块,程序基本单位提取模块用于提取LLVM IR中所有的基本块与函数等基本单位信息。
子系统二包括如下模块:
模块二、基本块级别依赖分析模块,基本块级别依赖分析模块通过在基本块内部,对每一条指令进行依赖分析从而得到该指令的所有依赖指令;
模块三、函数级别依赖分析模块,函数级别依赖分析模块是在基本块级别依赖分析的基础上,加入了跨基本块的依赖分析,从而实现多个基本块间的指令依赖分析。
子系统三包括如下模块:
模块四、指令重组模块,指令重组模块利用基本单位依赖分析子系统的分析结果,将分析得到的所有分组进行包装重组,得到一个全新的基本块供解释器调用。具体实现步骤如下:1、得到基本单位依赖分析子系统分析得到的所有分组;2、为该分组创建一个新块;3、将该分组中的所有指令加入此新块;4、将分组中的所有指令从原始基本块中移除;5、将该新的基本块与一个操作码绑定。完成上述步骤之后,解释器可以通过操作码找到对应的基本块,然后跳转至该块,从而执行这条指令。
子系统四包括如下模块:
模块五、操作码数组构建模块,操作码数组构建模块主要是收集指令重组子系统中生成的所有操作码,组成一个操作码集合,将该集合的名称随机化之后,将该集合作为程序的一部分加入到源代码中,生成操作码数组。
模块六、解释器构建模块,解释器构建模块的主要工作是为每一个基本单位设计一个解释器,用来控制该基本单位的运行。解释器的主要工作是,根据当前的操作码索引,然后找到当前需要执行的操作码,利用操作码跳转到对应的基本块去执行。如果程序尚未结束,会重新回到解释器计算下一次要执行的指令操作码的索引。如果程序结束,则无需跳回解释器。
需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
Claims (9)
1.一种基于LLVM的虚拟机保护方法,通过将源代码编译为LLVM中间表示,遍历整个LLVM中间表示程序获得程序所有的函数和基本块作为基本单位,为所有基本单位进行依赖分析并根据依赖分析结果对基本单位进行切分得到基本指令,将基本指令进行重组得到新基本块并绑定操作码,根据新基本块创建操作码数组和解释器,通过解释器完成整个程序的控制逻辑,从而达到虚拟机保护的目的;具体包括如下步骤:
1)将源代码转化成LLVM中间表示,即使用编译器将源代码编译成LLVM可分析的.bc文件;
2)根据步骤1)得到的源代码的.bc文件,获取源程序中的函数和基本块,即在整个程序层面和程序中的所有函数层面进行遍历,获取到程序中的所有函数,以及函数中的所有基本块,并将这些信息作为基本单位进行保存;
3)根据步骤2)中得到的基本单位信息,对基本单位的每一条指令进行遍历,每条指令有一个标志位来标识是否经过了依赖分析;
4)对于没有经过依赖分析的指令,从该条指令开始,分析得到该指令的所有依赖指令,并将所有依赖指令放进同一个分组,该分组代表一个最小的不可分割的单位;
5)对步骤4)得到的分组进行指令重组,将分组中的指令包装成为一个新基本块;
6)为新基本块生成一个操作码,该操作码与新基本块是唯一对应关系;删除原基本单位中已经被加入新基本块的所有指令,防止指令重复;
7)收集步骤6)中生成的所有操作码,组成一个操作码集合,将该集合的名称随机化之后,将该集合作为程序的一部分加入到源代码中,生成操作码数组;
8)对每一个基本单位设计一个解释器用来控制该基本单位的运行,解释器根据当前的操作码索引,找到当前需要执行操作码,利用操作码跳转到步骤6)中该操作码唯一对应的新基本块中去执行,执行结束之后会重新跳回解释器,直到程序结束。
2.如权利要求1所述的虚拟机保护方法,其特征在于,步骤1)使用clang++将源代码编译链接成单个.bc文件,具体的编译命令为:clang++-c-emit-llvm input.cpp-oinput.bc。
3.如权利要求1所述的虚拟机保护方法,其特征在于,步骤3)涉及需要进行依赖分析的指令信息和判断指令是否已经经过依赖分析的标志信息,其中指令信息存储在一个向量中,表示为:vector<Instruction>;标志信息存储在一个map中,表示为:map<Instruction,bool>,map的key值代表一条指令,value值代表该指令是否经过了依赖分析;在步骤3)对指令信息进行倒序遍历,拿到一个没有经过依赖分析的指令进行步骤4)的依赖分析。
4.如权利要求3所述的虚拟机保护方法,其特征在于,步骤4)的依赖分析结果存放在双重的堆栈stack<stack<Instruction>>中,其中内层堆栈stack<Instruction>存放的是一条指令的分析结果,所有的分析结果都有一个自己的堆栈,外部再用一个堆栈存储所有指令的分析结果;具体的依赖分析过程是:对于步骤3)拿到的当前vector中没有经过依赖分析的一条指令,首先为该指令创建自己的堆栈和队列;然后将该指令入栈,入队;将队首指令弹出,然后开始向上寻找该指令的依赖,将寻找到的依赖指令入栈,入队,并且将该条指令的标志信息即是否经过了依赖分析置为true;继续弹出队首寻找依赖,直到队列为空,代表该指令的所有依赖已经全部寻找完毕;将得到的依赖指令堆栈即内层堆栈加入到分析结果堆栈即外层堆栈;接着在vector中遍历找到下一个标志信息为false的指令继续进行依赖分析,直到所有指令均完成了依赖分析。
5.如权利要求4所述的虚拟机保护方法,其特征在于,对于步骤4)得到的依赖分析结果stack<stack<Instruction>>instBlock,instBlock.size()就是要创建的新基本块的数量,也是操作码的数量;在步骤5)需要遍历instBlock,拿出每一组指令依赖分析结果curInsts,然后为curInsts新建一个基本块instBasicBlock,接着将curInsts中的每一条指令弹出放入到instBasicBlock中;在步骤6)为instBasicBlock分配一个唯一的操作码并绑定,然后将该instBasicBlock中的所有指令从原基本块中移除。
6.如权利要求1所述的虚拟机保护方法,其特征在于,步骤8)中所述解释器的设计有两个级别,即基本块级别和函数级别;对于基本单位是基本块的情况,每一个基本块都拥有一个自己的解释器,用来控制该块的运行;对于基本单位是函数的情况,整个函数只拥有一个解释器,即整个函数的指令都是由这一个解释器来解释执行的。
7.如权利要求6所述的虚拟机保护方法,其特征在于,在步骤8)中,对于基本单位是基本块的情况,解释器完成以下工作:①获取到LLVM IR中属于该块的全局操作码数组;②初始化索引值为0,即代表将从第一条指令开始执行;③通过索引值和操作码数组找到对应的操作码,然后利用操作码和switch指令跳转到相应的基本块;④如果基本块不是最后一条指令,会重新跳回解释器;⑤再次回到解释器之后,索引会通过自增计算到下一条指令操作码的索引,如此反复;⑥如果执行的是基本块的最后一条指令,那么这个基本块会结束,接下来会退出程序或者进入下一个基本块的解释器。
8.如权利要求6所述的虚拟机保护方法,其特征在于,在步骤8)中,对于基本单位是函数的情况,解释器通过phi指令得到当前跳转到解释器的指令所在基本块的操作码索引,然后将操作码的索引加一,再通过一个全局的操作码数组得到下一条指令所在基本块的操作码;接下来利用该操作码和基本块的对应关系,使用switch指令跳转到相应的基本块;如果该基本块自身不是函数最后一个基本块的最后一条指令,会在指令所在基本块后再加入一条br指令,使它重新跳回解释器;重复上述过程,直到整个函数结束。
9.一种基于LLVM的虚拟机保护系统,包括程序基本单位提取模块、基本块级别依赖分析模块、函数级别依赖分析模块、指令重组模块、操作码数组构建模块和解释器构建模块,其中:程序基本单位提取模块用于提取LLVM IR中所有的基本单位信息,所述基本单位包括基本块与函数;基本块级别依赖分析模块通过在基本块内部对每一条指令进行依赖分析,从而得到该指令的所有依赖指令;函数级别依赖分析模块是在基本块级别依赖分析的基础上,加入了跨基本块的依赖分析,从而实现多个基本块间的指令依赖分析;指令重组模块利用基本块级别依赖分析模块和函数级别依赖分析模块的分析结果,将分析得到的所有分组进行包装重组,得到一个新的基本块供解释器调用,并为该新的基本块分配一个唯一的操作码;操作码数组构建模块收集指令重组模块中生成的所有操作码,组成一个操作码集合,将该集合的名称随机化之后,将该集合作为程序的一部分加入到源代码中,生成操作码数组;解释器构建模块为每一个基本单位设计一个解释器,用来控制该基本单位的运行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210017306.2A CN114327789B (zh) | 2022-01-07 | 2022-01-07 | 一种基于llvm的虚拟机保护方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210017306.2A CN114327789B (zh) | 2022-01-07 | 2022-01-07 | 一种基于llvm的虚拟机保护方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114327789A true CN114327789A (zh) | 2022-04-12 |
CN114327789B CN114327789B (zh) | 2024-05-17 |
Family
ID=81023945
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210017306.2A Active CN114327789B (zh) | 2022-01-07 | 2022-01-07 | 一种基于llvm的虚拟机保护方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114327789B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7124407B1 (en) * | 2000-08-16 | 2006-10-17 | Sun Microsystems, Inc. | Method and apparatus for caching native code in a virtual machine interpreter |
US20140109068A1 (en) * | 2010-12-06 | 2014-04-17 | Flexycore | Method for compiling an intermediate code of an application |
CN105183650A (zh) * | 2015-09-11 | 2015-12-23 | 哈尔滨工业大学 | 基于llvm的科学计算程序自动性能预测方法 |
CN105224452A (zh) * | 2015-09-11 | 2016-01-06 | 哈尔滨工业大学 | 一种针对科学计算程序静态分析性能的预测代价优化方法 |
CN109145534A (zh) * | 2018-07-24 | 2019-01-04 | 上海交通大学 | 针对软件虚拟机保护的反混淆系统及方法 |
CN109344612A (zh) * | 2018-09-25 | 2019-02-15 | 郑州昂视信息科技有限公司 | 针对程序代码静态分析逆向攻击的主动防御方法及系统 |
CN109543368A (zh) * | 2018-11-23 | 2019-03-29 | 杭州哲信信息技术有限公司 | 一种基于中间语言解释器的跨平台源码虚拟化保护方法 |
CN109918903A (zh) * | 2019-03-06 | 2019-06-21 | 西安电子科技大学 | 一种基于llvm编译器的程序非控制数据攻击防护方法 |
-
2022
- 2022-01-07 CN CN202210017306.2A patent/CN114327789B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7124407B1 (en) * | 2000-08-16 | 2006-10-17 | Sun Microsystems, Inc. | Method and apparatus for caching native code in a virtual machine interpreter |
US20140109068A1 (en) * | 2010-12-06 | 2014-04-17 | Flexycore | Method for compiling an intermediate code of an application |
CN105183650A (zh) * | 2015-09-11 | 2015-12-23 | 哈尔滨工业大学 | 基于llvm的科学计算程序自动性能预测方法 |
CN105224452A (zh) * | 2015-09-11 | 2016-01-06 | 哈尔滨工业大学 | 一种针对科学计算程序静态分析性能的预测代价优化方法 |
CN109145534A (zh) * | 2018-07-24 | 2019-01-04 | 上海交通大学 | 针对软件虚拟机保护的反混淆系统及方法 |
CN109344612A (zh) * | 2018-09-25 | 2019-02-15 | 郑州昂视信息科技有限公司 | 针对程序代码静态分析逆向攻击的主动防御方法及系统 |
CN109543368A (zh) * | 2018-11-23 | 2019-03-29 | 杭州哲信信息技术有限公司 | 一种基于中间语言解释器的跨平台源码虚拟化保护方法 |
CN109918903A (zh) * | 2019-03-06 | 2019-06-21 | 西安电子科技大学 | 一种基于llvm编译器的程序非控制数据攻击防护方法 |
Also Published As
Publication number | Publication date |
---|---|
CN114327789B (zh) | 2024-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106096338B (zh) | 一种具有数据流混淆的虚拟化软件保护方法 | |
CN106227668B (zh) | 数据处理方法和装置 | |
JP2002517817A5 (zh) | ||
US7774581B2 (en) | Apparatus for compressing instruction word for parallel processing VLIW computer and method for the same | |
CN106547520B (zh) | 一种代码路径分析方法及装置 | |
US7549146B2 (en) | Apparatus, systems, and methods for execution-driven loop splitting and load-safe code hosting | |
CN104573427B (zh) | 一种可执行应用的混淆方法和装置 | |
EP3264274B1 (en) | Input discovery for unknown program binaries | |
CA3150187C (en) | Method and apparatus for protecting web script codes | |
CN114385185A (zh) | 一种智能合约的控制流图生成方法及装置 | |
JP6728874B2 (ja) | 未知のバイナリプログラムに対する有効な入力の決定 | |
CN114327789A (zh) | 一种基于llvm的虚拟机保护方法及系统 | |
Delande et al. | A neutral approach to proof and refutation in MALL | |
WO2010095004A1 (en) | Priority search trees | |
Case et al. | Automated extraction of inductive invariants to aid model checking | |
CN107292131A (zh) | 软件保护方法和装置 | |
US12026290B2 (en) | Steganography of hardware intellectual property | |
WO2024093687A1 (zh) | 一种函数保护方法及装置 | |
KR102544801B1 (ko) | 데이터 재사용 공격에 대한 방어 방법 및 시스템 | |
TW201443778A (zh) | 程式碼縮減方法與裝置 | |
Gu et al. | Efficient Oblivious Sorting and Shuffling for Hardware Enclaves | |
CN115795414A (zh) | 基于llvm ir的程序多维度虚拟化保护方法及装置 | |
KR20160090919A (ko) | 코드 커버리지 향상을 위한 베이직 블록 크기 감응 실행 경로 탐색 방법 및 시스템 | |
CN117971424A (zh) | 一种依赖关系感知的软件仓库编译调度方法、系统和介质 | |
Hallawi et al. | Complexity of combinatorial ordering genetic algorithms COFFGA and CONFGA |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |