CN115795414A - 基于llvm ir的程序多维度虚拟化保护方法及装置 - Google Patents
基于llvm ir的程序多维度虚拟化保护方法及装置 Download PDFInfo
- Publication number
- CN115795414A CN115795414A CN202211490515.5A CN202211490515A CN115795414A CN 115795414 A CN115795414 A CN 115795414A CN 202211490515 A CN202211490515 A CN 202211490515A CN 115795414 A CN115795414 A CN 115795414A
- Authority
- CN
- China
- Prior art keywords
- handler
- protected
- virtual machine
- basic block
- instruction
- 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
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本申请涉及基于LLVM IR的程序多维度虚拟化保护方法及装置,方法包括:获取源代码的LLVM IR文件;对LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件;确定一次保护后的文件中的待保护函数;确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块;将源代码中的待保护函数替换为调用虚拟机模块的指令,得到多维度虚拟化保护后的程序。本申请设计基本块级别的虚拟化保护手段,并结合指令级别的虚拟化保护手段,对通过LLVM编译器编译生成的IR字节码文件进行保护处理,能够大幅度提升逆向破解的难度,在中间表示阶段做虚拟化的保护可以减少前端语言和后端架构的多样性对代码的虚拟化保护带来的影响。
Description
技术领域
本申请涉及计算机安全技术领域,具体地,涉及一种基于LLVM IR的程序多维度虚拟化保护方法及装置。
背景技术
现有的程序安全问题出现在程序被恶意逆向攻击方面,逆向攻击者会分析软件的工作原理和内部的实现细节,得到程序的关键信息,定位程序关键位置,即可手动对代码中的关键位置进行篡改或删除等破坏性操作。代码混淆技术是一类抵抗逆向攻击的技术,而在现有的代码混淆技术中,一种动态的混淆方法——虚拟化保护技术具有最高的保护效果。但是,虚拟化保护技术已发展多年,虚拟机的结构已被人熟知,逆向攻击可以根据虚拟机结构特征分析程序破解虚拟机。因此传统的虚拟化保护方法存在被破解的可能,其自保护能力较弱。
虚拟化保护是在目标程序中嵌入一套虚拟机,将原有的指令分解为虚拟机中的虚拟指令,在程序执行的过程中融入大量的虚拟机解释执行的代码逻辑,从而提高恶意攻击者逆向分析程序逻辑的复杂度。因此,在提升保护效果的同时,存在性能和体积开销较大的问题,若叠加使用传统虚拟化保护技术,程序的性能开销就会增长数百倍,丧失了应用价值。
发明内容
为了克服现有技术中的至少一个不足,本申请实施例提供一种基于LLVM IR的程序多维度虚拟化保护方法及装置。
第一方面,提供一种基于LLVM IR的程序多维度虚拟化保护方法,包括:
获取源代码的LLVM IR文件;
对LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件;
确定一次保护后的文件中的待保护函数;
确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块;
将源代码中的待保护函数替换为调用虚拟机模块的指令,得到多维度虚拟化保护后的程序。
在一个实施例中,确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块,包括:
创建与待保护函数的多个基本块数量相等的多个空基本块;
将待保护函数每个基本块的指令复制到对应的空基本块中,配置每个空基本块的前驱和后继,得到多个handler基本块;
为每个handler基本块分配一个虚拟指令码;
将多个handler基本块对应的虚拟指令码按照执行逻辑保存在数组中,形成驱动数据;虚拟机模块在执行程序时,根据驱动数据中的虚拟指令码确定要执行的handler基本块,并执行handler基本块中的指令。
在一个实施例中,基于多个基本块构建虚拟机模块,还包括:
创建虚拟机模块的多个组件,组件包括入口组件、调度器组件、运行状态标识符、尾部组件和退出组件;
虚拟机模块在执行程序时,入口组件用于进行初始化配置;运行状态标识符的值用于记录下一个要执行的handler基本块对应的虚拟指令码在驱动数据中的位置;尾部组件用于在当前handler基本块执行结束后,修改运行状态标识符的值,并跳转到调度器组件;调度器组件用于根据运行状态标识符的值从驱动数据中获取下一个要执行的handler基本块对应的虚拟指令码,以确定下一个要执行的handler基本块;
退出组件用于在执行完所有handler基本块后,退出虚拟机模块。
第二方面,提供一种基于LLVM IR的程序多维度虚拟化保护装置,包括:
LLVM IR文件获取单元,用于获取源代码的LLVM IR文件;
指令级别的虚拟化保护单元,用于对LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件;
待保护函数确定单元,用于确定一次保护后的文件中的待保护函数;
虚拟机构建单元,用于确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块;
程序重构单元,用于将源代码中的待保护函数替换为调用虚拟机模块的指令,得到多维度虚拟化保护后的程序。
在一个实施例中,虚拟机构建单元,还用于:
创建与待保护函数的多个基本块数量相等的多个空基本块;
将待保护函数每个基本块的指令复制到对应的空基本块中,配置每个空基本块的前驱和后继,得到多个handler基本块;
为每个handler基本块分配一个虚拟指令码;
将多个handler基本块对应的虚拟指令码按照执行逻辑保存在数组中,形成驱动数据;虚拟机模块在执行程序时,根据驱动数据中的虚拟指令码确定要执行的handler基本块,并执行handler基本块中的指令。
在一个实施例中,虚拟机构建单元还用于:
创建虚拟机模块的多个组件,组件包括入口组件、调度器组件、运行状态标识符、尾部组件和退出组件;
虚拟机模块在执行程序时,入口组件用于进行初始化配置;运行状态标识符的值用于记录下一个要执行的handler基本块对应的虚拟指令码在驱动数据中的位置;尾部组件用于在当前handler基本块执行结束后,修改运行状态标识符的值,并跳转到调度器组件;调度器组件用于根据运行状态标识符的值从驱动数据中获取下一个要执行的handler基本块对应的虚拟指令码,以确定下一个要执行的handler基本块;退出组件用于在执行完所有handler基本块后,退出虚拟机模块。
相对于现有技术而言,本申请具有以下有益效果:本申请设计基本块级别的虚拟化保护手段,并结合指令级别的虚拟化保护手段,对通过LLVM(Low Level VirtualMachine,底层虚拟机)编译器编译生成的IR(Intermediate Representation,中间表示)字节码文件LLVM IR进行保护处理,能够大幅度提升逆向破解的难度,在中间表示阶段做虚拟化的保护可以减少前端语言和后端架构的多样性对代码的虚拟化保护带来的影响。
附图说明
本申请可以通过参考下文中结合附图所给出的描述而得到更好的理解,附图连同下面的详细说明一起包含在本说明书中并且形成本说明书的一部分。在附图中:
图1示出了根据本申请实施例的基于LLVM IR的程序多维度虚拟化保护方法的流程框图;
图2示出了根据本申请实施例的基于LLVM IR的程序多维度虚拟化保护方法的原理图;
图3示出了根据本申请实施例的基于LLVM IR的程序多维度虚拟化保护装置的结构框图。
具体实施方式
在下文中将结合附图对本申请的示例性实施例进行描述。为了清楚和简明起见,在说明书中并未描述实际实施例的所有特征。然而,应该了解,在开发任何这种实际实施例的过程中可以做出很多特定于实施例的决定,以便实现开发人员的具体目标,并且这些决定可能会随着实施例的不同而有所改变。
在此,还需要说明的一点是,为了避免因不必要的细节而模糊了本申请,在附图中仅仅示出了与根据本申请的方案密切相关的装置结构,而省略了与本申请关系不大的其他细节。
应理解的是,本申请并不会由于如下参照附图的描述而只限于所描述的实施形式。在本文中,在可行的情况下,实施例可以相互组合、不同实施例之间的特征替换或借用、在一个实施例中省略一个或多个特征。
基于代码虚拟化保护的思想,本申请提供一种基于LLVM IR的程序多维度虚拟化保护方法,是一种代码混淆的保护方法。本申请的虚拟化保护的对象是通过LLVM(LowLevel Virtual Machine,底层虚拟机)编译器编译生成的IR(IntermediateRepresentation,中间表示)字节码文件LLVM IR,在经过指令级别的虚拟化保护后,再进行基本块级别的虚拟化保护,在更高的维度上对程序进行混淆保护。
图1示出了根据本申请实施例的基于LLVM IR的程序多维度虚拟化保护方法的流程框图,方法包括:
步骤S110,获取源代码的LLVM IR文件;这里,源代码经过LLVM编译器的前端生成IR字节码文件LLVM IR。
步骤S120,对LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件,用LLVM IR-A表示。
步骤S130,确定一次保护后的文件中的待保护函数;源代码中包括多个函数,对待保护函数设置自定义标签,这里可以根据标签识别函数是否为待保护函数,在定义函数名时加入一段指定字符作为标记;
步骤S140,确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块;基本块是指一条或数条指令的组合,它拥有唯一一个指向块起始位置的入口点和唯一一个指向块结束位置的退出点,因此,一个基本块中最多存在一条跳转指令,且出现在该基本块的末尾;函数的基本块一般不止一个,由于函数中的判断语句,比较语句,循环语句等的实现都需要用到跳转指令,因此一个函数是由一个或多个基本块组成;
步骤S150,将源代码中的待保护函数替换为调用虚拟机模块的指令,得到多维度虚拟化保护后的程序。该步骤中,将源代码中的待保护函数替换为调用虚拟机模块的指令,并且保留待保护函数的必要信息,必要信息可以是函数属性信息,例如函数是公有还是私有,继承的信息,函数是否内联,函数的链接类型等。
本申请实施例,设计基本块级别的虚拟化保护手段,并结合指令级别的虚拟化保护手段,对通过LLVM编译器编译生成的IR字节码文件LLVM IR进行保护处理,能够大幅度提升逆向破解的难度,在中间表示阶段做虚拟化的保护可以减少前端语言和后端架构的多样性对代码的虚拟化保护带来的影响。
在一个实施例中,图2示出了根据本申请实施例的基于LLVM IR的程序多维度虚拟化保护方法的原理图,步骤S130中确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块,可以包括:
步骤S210,创建与待保护函数的多个基本块数量相等的多个空基本块;
步骤S220,将待保护函数每个基本块的指令复制到对应的空基本块中,配置每个空基本块的前驱和后继,得到多个handler基本块;这里,在创建多个空基本块时,并没有为空基本块关联其前驱和后继,因此需要将空基本块关联的前驱和后继配置到空基本块中。
步骤S230,为每个handler基本块分配一个虚拟指令码;
步骤S240,将多个handler基本块对应的虚拟指令码按照执行逻辑保存在数组中,形成驱动数据;虚拟机模块在执行程序时,根据驱动数据中的虚拟指令码确定要执行的handler基本块,并执行handler基本块中的指令。
该实施例中,虚拟机模块中为handler基本块分配的虚拟指令码是随机的,提取函数的handler基本块的过程也是随机的,因此每次进行虚拟化保护后得到的结果都不同,这也会增加逆向工作的难度,逆向攻击人员很难通过研究分析单一文件就能得到一些有利的信息,对于多个文件的分析也有极大的难度,增大了保护的强度。
在一个实施例中,基于多个基本块构建虚拟机模块,还包括:
创建虚拟机模块的多个组件,组件包括入口组件、调度器组件、运行状态标识符、尾部组件和退出组件;
虚拟机模块在执行程序时,这里的程序为步骤S150得到的多维度虚拟化保护后的程序,入口组件用于进行初始化配置;运行状态标识符的值用于记录下一个要执行的handler基本块对应的虚拟指令码在驱动数据中的位置;尾部组件用于在当前handler基本块执行结束后,修改运行状态标识符的值,并跳转到调度器组件;调度器组件用于根据运行状态标识符的值从驱动数据中获取下一个要执行的handler基本块对应的虚拟指令码,以确定下一个要执行的handler基本块;退出组件用于在执行完所有handler基本块后,退出虚拟机模块。
基于与上述基于LLVM IR的程序多维度虚拟化保护方法相同的发明构思,本实施例还提供与之对应的基于LLVM IR的程序多维度虚拟化保护装置,图3示出了根据本申请实施例的基于LLVM IR的程序多维度虚拟化保护装置的结构框图,包括:
LLVM IR文件获取单元310,用于获取源代码的LLVM IR文件;这里,源代码经过LLVM编译器的前端生成IR字节码文件LLVM IR。
指令级别的虚拟化保护单元320,用于对LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件,用LLVM IR-A表示;
待保护函数确定单元330,用于确定一次保护后的文件中的待保护函数;源代码中包括多个函数,对待保护函数设置自定义标签,这里可以根据标签识别函数是否为待保护函数。
虚拟机构建单元340,用于确定构成待保护函数的多个基本块,基于多个基本块构建虚拟机模块;
程序重构单元350,用于将源代码中的待保护函数替换为调用虚拟机模块的指令,得到多维度虚拟化保护后的程序。这里,将源代码中的待保护函数替换为调用虚拟机模块的指令,并且保留待保护函数的必要信息,必要信息可以是函数属性信息,例如函数是公有还是私有,继承的信息,函数是否内联,函数的链接类型等。
本申请实施例,设计基本块级别的虚拟化保护手段,并结合指令级别的虚拟化保护手段,对通过LLVM编译器编译生成的IR字节码文件LLVM IR进行保护处理,能够大幅度提升逆向破解的难度,并对程序性能和体积造成的影响更小。在中间表示阶段做虚拟化的保护可以减少前端语言和后端架构的多样性对代码的虚拟化保护带来的影响。
在一个实施例中,虚拟机构建单元340,还用于:
创建与待保护函数的多个基本块数量相等的多个空基本块;
将待保护函数每个基本块的指令复制到对应的空基本块中,配置每个空基本块的前驱和后继,得到多个handler基本块;这里,在创建多个空基本块时,并没有为空基本块关联其前驱和后继,因此需要将空基本块关联的前驱和后继配置到空基本块中。
为每个handler基本块分配一个虚拟指令码;
将多个handler基本块对应的虚拟指令码按照执行逻辑保存在数组中,形成驱动数据;虚拟机模块在执行程序时,根据驱动数据中的虚拟指令码确定要执行的handler基本块,并执行handler基本块中的指令。
在一个实施例中,虚拟机构建单元340,还用于:
创建虚拟机模块的多个组件,组件包括入口组件、调度器组件、运行状态标识符、尾部组件和退出组件;
虚拟机模块在执行程序时,入口组件用于进行初始化配置;运行状态标识符的值用于记录下一个要执行的handler基本块对应的虚拟指令码在驱动数据中的位置;尾部组件用于在当前handler基本块执行结束后,修改运行状态标识符的值,并跳转到调度器组件;调度器组件用于根据运行状态标识符的值从驱动数据中获取下一个要执行的handler基本块对应的虚拟指令码,以确定下一个要执行的handler基本块;退出组件用于在执行完所有handler基本块后,退出虚拟机模块。
以上所述,仅为本申请的各种实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (6)
1.一种基于LLVM IR的程序多维度虚拟化保护方法,其特征在于,包括:
获取源代码的LLVM IR文件;
对所述LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件;
确定所述一次保护后的文件中的待保护函数;
确定构成所述待保护函数的多个基本块,基于所述多个基本块构建虚拟机模块;
将所述源代码中的所述待保护函数替换为调用所述虚拟机模块的指令,得到多维度虚拟化保护后的程序。
2.如权利要求1所述的方法,其特征在于,所述确定构成所述待保护函数的多个基本块,基于所述多个基本块构建虚拟机模块,包括:
创建与所述待保护函数的多个基本块数量相等的多个空基本块;
将所述待保护函数每个所述基本块的指令复制到对应的空基本块中,配置每个所述空基本块的前驱和后继,得到多个handler基本块;
为每个所述handler基本块分配一个虚拟指令码;
将所述多个handler基本块对应的所述虚拟指令码按照执行逻辑保存在数组中,形成驱动数据;所述虚拟机模块在执行程序时,根据所述驱动数据中的虚拟指令码确定要执行的handler基本块,并执行所述handler基本块中的指令。
3.如权利要求2所述的方法,其特征在于,基于所述多个基本块构建虚拟机模块,还包括:
创建所述虚拟机模块的多个组件,所述组件包括入口组件、调度器组件、运行状态标识符、尾部组件和退出组件;
所述虚拟机模块在执行程序时,所述入口组件用于进行初始化配置;所述运行状态标识符的值用于记录下一个要执行的所述handler基本块对应的虚拟指令码在所述驱动数据中的位置;所述尾部组件用于在当前handler基本块执行结束后,修改所述运行状态标识符的值,并跳转到所述调度器组件;所述调度器组件用于根据所述运行状态标识符的值从所述驱动数据中获取下一个要执行的所述handler基本块对应的虚拟指令码,以确定下一个要执行的handler基本块;
所述退出组件用于在执行完所有handler基本块后,退出所述虚拟机模块。
4.一种基于LLVM IR的程序多维度虚拟化保护装置,其特征在于,包括:
LLVM IR文件获取单元,用于获取源代码的LLVM IR文件;
指令级别的虚拟化保护单元,用于对所述LLVM IR文件进行指令级别的虚拟化保护,得到一次保护后的文件;
待保护函数确定单元,用于确定所述一次保护后的文件中的待保护函数;
虚拟机构建单元,用于确定构成所述待保护函数的多个基本块,基于所述多个基本块构建虚拟机模块;
程序重构单元,用于将所述源代码中的所述待保护函数替换为调用所述虚拟机模块的指令,得到多维度虚拟化保护后的程序。
5.如权利要求4所述的方法,其特征在于,所述虚拟机构建单元,还用于:
创建与所述待保护函数的多个基本块数量相等的多个空基本块;
将所述待保护函数每个所述基本块的指令复制到对应的空基本块中,配置每个所述空基本块的前驱和后继,得到多个handler基本块;
为每个所述handler基本块分配一个虚拟指令码;
将所述多个handler基本块对应的所述虚拟指令码按照执行逻辑保存在数组中,形成驱动数据;所述虚拟机模块在执行程序时,根据所述驱动数据中的虚拟指令码确定要执行的handler基本块,并执行所述handler基本块中的指令。
6.如权利要求5所述的方法,其特征在于,所述虚拟机构建单元还用于:
创建所述虚拟机模块的多个组件,所述组件包括入口组件、调度器组件、运行状态标识符、尾部组件和退出组件;
所述虚拟机模块在执行程序时,所述入口组件用于进行初始化配置;所述运行状态标识符的值用于记录下一个要执行的所述handler基本块对应的虚拟指令码在所述驱动数据中的位置;所述尾部组件用于在当前handler基本块执行结束后,修改所述运行状态标识符的值,并跳转到所述调度器组件;所述调度器组件用于根据所述运行状态标识符的值从所述驱动数据中获取下一个要执行的所述handler基本块对应的虚拟指令码,以确定下一个要执行的handler基本块;所述退出组件用于在执行完所有handler基本块后,退出所述虚拟机模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211490515.5A CN115795414A (zh) | 2022-11-25 | 2022-11-25 | 基于llvm ir的程序多维度虚拟化保护方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211490515.5A CN115795414A (zh) | 2022-11-25 | 2022-11-25 | 基于llvm ir的程序多维度虚拟化保护方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115795414A true CN115795414A (zh) | 2023-03-14 |
Family
ID=85441462
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211490515.5A Pending CN115795414A (zh) | 2022-11-25 | 2022-11-25 | 基于llvm ir的程序多维度虚拟化保护方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115795414A (zh) |
-
2022
- 2022-11-25 CN CN202211490515.5A patent/CN115795414A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106096338B (zh) | 一种具有数据流混淆的虚拟化软件保护方法 | |
CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
CN108733379B (zh) | 基于dex字节码抽离映射混淆的安卓应用加固方法 | |
CN102012987A (zh) | 自动二进制恶意代码行为分析系统 | |
CN111563237B (zh) | 一种智能合约安全增强方法 | |
CN111723345B (zh) | 基于回调函数的控制流混淆方法及系统 | |
CN109635568B (zh) | 一种基于静态分析和模糊测试相结合的并发漏洞检测方法 | |
CN112114933A (zh) | 应用程序保护方法、电子设备和存储介质 | |
CN112115427A (zh) | 代码混淆方法、装置、电子设备及存储介质 | |
CA3150187C (en) | Method and apparatus for protecting web script codes | |
US10599638B2 (en) | System and method for identifying maximal independent sets in parallel | |
US9405652B2 (en) | Regular expression support in instrumentation languages using kernel-mode executable code | |
CN110147653A (zh) | 应用程序安全加固方法及装置 | |
CN103677746B (zh) | 指令重组方法及装置 | |
CN115795414A (zh) | 基于llvm ir的程序多维度虚拟化保护方法及装置 | |
Zhou et al. | Hunting garbage collection related concurrency bugs through critical condition restoration | |
Wu et al. | Binary software randomization method based on llvm | |
Deng et al. | A Pattern‐Based Software Testing Framework for Exploitability Evaluation of Metadata Corruption Vulnerabilities | |
CN105407075B (zh) | 业务逻辑的实现方法和系统 | |
Jin | Generating syntactically and semantically valid test cases for fuzzing JavaScript engines | |
CN110244979A (zh) | 一种文件获取方法及其设备 | |
CN109918872B (zh) | Android应用加固方法 | |
EP3899761B1 (en) | Protected processing of operations | |
Paduraru et al. | RiverConc: An Open-source Concolic Execution Engine for x86 Binaries. | |
Huang et al. | iOLLVM: Enhanced version of OLLVM |
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 |