基于代码虚拟化的.NET平台代码保护方法和系统

allin2022-11-06  168


基于代码虚拟化的.net平台代码保护方法和系统
技术领域
1.本发明涉及软件安全技术领域,更具体地,涉及一种基于代码虚拟化的.net平台代码保护方法和系统。


背景技术:

2.目前许多商业软件经常由于被攻击者通过逆向工程破解,窃取软件中的核心算法和机密信息,导致许多开发者的软件著作权收到侵害。因此,在许多场景下,对于软件代码保护的需求日益增多,例如.net平台、安卓应用和某些物联网设备上的应用都有如何保障应用代码不被逆向破解的安全需求。.net平台下所有语言均基于公共语言运行时(common language runtime和遵循公共语言架构的标准,统一被编译为msil代码,并由公共语言运行时执行编译后的msil代码。msil代码为公开基础架构,攻击者可使用各类反编译器将底层的msil代码转换回对应的.net语言,如c#和vb.net等,从而窃取其中的软件代码信息,侵犯了开发者的权益。
3.现有对于.net平台下的msil代码保护方案大多使用常量保护技术,即对常量进行加密,在运行对常量解密,或使用控制流混淆技术,通过混淆msil代码执行顺序以让静态分析失效。上述方法尽管能增加msil代码的复杂度,难以对msil代码进行静态分析,但是通过动态调试的方式,依然可以了解程序内部执行流程,进一步获取到msil代码信息。


技术实现要素:

4.本发明为解决被保护的.net平台程序代码容易被反向编译为高级语言的缺陷,提供一种基于代码虚拟化的.net平台代码保护方法和系统。
5.为解决上述技术问题,本发明的技术方案如下:
6.第一个方面,本发明提出一种基于代码虚拟化的.net平台代码保护方法,包括以下步骤:
7.s1:构建关于.net平台程序中每个过程的控制流图,并根据所述控制流图构建数据流图;
8.s2:根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,得到msil语法树;
9.s3:将所述msil语法树编译为虚拟中间语言。
10.作为优选方案,s1具体包括以下步骤:
11.s1.1:解析.net平台程序的元数据,获取.net平台程序中需要进行虚拟化的方法体,并提取出所述方法体的msil代码和异常处理子句;
12.s1.2:对所述msil代码的指令进行解码,将msil代码堆栈中的堆栈元素分配到局部变量;
13.s1.3:根据msil代码的跳转指令和异常处理子句,构建控制流图;
14.s1.4:基于所述控制流图和局部变量,对.net平台程序进行数据流分析,构建数据
流图。
15.作为优选方案,s1.2具体包括以下步骤:
16.s1.2.1:从msil代码头部开始,按照偏移顺序向后遍历msil代码的每一条指令,为每一条指令保存其执行前的堆栈信息;
17.s1.2.2:根据所述堆栈信息,将msil代码堆栈中的每一个堆栈元素分配到局部变量,并按堆栈顺序为所述局部变量分配名称。
18.作为优选方案,s1.2.2中,在将msil代码的堆栈中的每一个堆栈元素分配到局部变量时,通过融合程序的入节点的信息,如果入节点存在64位整数类型的局部变量,则将32位整数类型的局部变量转换为64位整数类型的局部变量;如果数据流图的入节点是引用类型,则将局部变量设置为基类object类型。
19.作为优选方案,s1.3中,以msil代码的跳转指令和异常处理子句为边界,划分出控制流图的基本块,并将所述跳转指令的跳转源和跳转目标分别设置为控制流图的前驱节点和后继节点,得到控制流图。
20.作为优选方案,还包括对所述方法体、方法体的msil代码和异常处理子句进行验证操作,具体包括以下步骤:
21.验证方法体内所有操作码的支持状态;
22.验证msil代码的堆栈平衡状态;
23.验证异常处理子句的顺序排列状态。
24.作为优选方案,s1.4中,所述对.net平台程序进行数据流分析包括对局部变量进行分析;
25.若局部变量存在取地址操作,则为所述局部变量生成虚拟的引用类型;若局部变量进行取地址操作后得到的指针被执行了数学运算,则在分配局部变量时抛出错误。
26.作为优选方案,s3中,将所述msil语法树编译为基于虚拟中间语言的语法树,然后将所述基于虚拟中间语言的语法树编译为虚拟中间语言。
27.作为优选方案,所述虚拟化保护方法还包括:将所述msil语法树编译为虚拟中间语言之后,将所述虚拟中间语言转化为可序列化的形式;将可序列化的虚拟中间语言保存为十六进制数组写进文件中。
28.第二个方面,本发明还提出一种.net平台代码虚拟化保护系统,应用于上述任一方案上述的基于代码虚拟化的.net平台代码保护方法,包括:
29.控制流图构建模块,用于构建.net平台程序中每个过程的控制流图;
30.数据流图构建模块,用于根据所述控制流图构建数据流图;
31.反编译模块,用于根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,得到msil语法树;
32.编译模块,用于将所述msil语法树编译为虚拟中间语言。
33.与现有技术相比,本发明技术方案的有益效果是:将.net平台程序中待保护的msil代码转换为具有可自定义性、动态性和可转换性,以及难以被分析的虚拟中间语言,可以有效阻碍各类反编译器将被保护的msil代码转换为高级语言,使得.net平台程序的关键代码不被篡改,能够安全运行。
附图说明
34.图1为实施例1中基于代码虚拟化的.net平台代码保护方法的流程图。
35.图2为实施例3中实现虚拟中间语言的运行时的流程图。
36.图3为实施例4中.net平台代码虚拟化保护系统的架构图。
具体实施方式
37.附图仅用于示例性说明,不能理解为对本专利的限制;
38.下面结合附图和实施例对本发明的技术方案做进一步的说明。
39.实施例1
40.本实施例提出一种基于代码虚拟化的.net平台代码保护方法,如图1所示,图1为本实施例中基于代码虚拟化的.net平台代码保护方法的流程图,包括以下步骤:
41.s1:构建关于.net平台程序中每个过程的控制流图,并根据所述控制流图构建数据流图。
42.s2:根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,得到msil语法树。
43.s3:将所述msil语法树编译为虚拟中间语言。
44.在具体实施过程中,通过对.net平台程序中每个过程进行控制流分析,确定.net平台程序的执行过程,得到控制流图,并在控制流图的基础上进行数据流分析,得到数据流图。根据控制流图和数据流图,将.net平台程序中待保护的基于堆栈的msil代码进行反编译,将msil代码转换到基于局部变量的形式,得到msil语法树。msil语法树具有与misl代码相同的语义,不依赖堆栈,其表达形式类似于高级语言,相较于msil代码,msil语法树具有更便于分析的优点。最后将所述msil语法树编译为基于虚拟中间语言的语法树,然后将所述基于虚拟中间语言的语法树编译为虚拟中间语言,让虚拟中间语言安全运行在虚拟语言运行时上。
45.将.net平台程序中待保护的msil代码转换为具有可自定义性、动态性和可转换性,以及难以被分析的虚拟中间语言,可以有效阻碍各类反编译器将被保护的msil代码转换为高级语言,使得.net平台程序的关键代码不被篡改,能够安全运行在虚拟语言运行时上,适用于对程序关键代码,如验证授权等的代码的保护。
46.实施例2
47.本实施例提出一种基于代码虚拟化的.net平台代码保护方法,包括以下步骤:
48.s1:构建关于.net平台程序中每个过程的控制流图,并根据所述控制流图构建数据流图。具体包括以下步骤:
49.s1.1:解析.net平台程序的元数据,获取.net平台程序中需要进行虚拟化的方法体,并提取出所述方法体的msil代码和异常处理子句。
50.本实施例中,通过用户传入的保护参数,标记获取需要进行虚拟化的方法体。
51.本实施例中,对所述方法体、方法体的msil代码和异常处理子句进行验证操作,具体包括以下步骤:
52.验证方法体内所有操作码的支持状态,确保方法体内所有操作码都是受支持的。如果方法体内存在不支持的操作码,则抛出异常。
53.验证msil代码的堆栈平衡状态,确定msil代码的堆栈是否平衡,防止不正确的msil代码进入后续处理。如果msil代码堆栈不平衡,则抛出异常。
54.验证异常处理子句的顺序排列状态,确定异常处理子句是否按顺序排列,确保语言的正确。如果异常处理子句排列无效,则抛出异常。
55.s1.2:对所述msil代码的指令进行解码,将msil代码堆栈中的堆栈元素分配到局部变量。具体包括以下步骤:
56.s1.2.1:从msil代码头部开始,按照偏移顺序向后遍历msil代码的每一条指令,为每一条指令保存其执行前的堆栈信息;
57.s1.2.2:根据所述堆栈信息,将msil代码的堆栈中的每一个堆栈元素分配到局部变量,并按堆栈顺序为所述局部变量分配名称。将msil代码的堆栈中的堆栈元素转化为局部变量,使得msil代码从基于堆栈的架构转换为基于局部变量的架构,便于后续调试。
58.本实施例中,在将msil代码的堆栈中的每一个堆栈元素分配到局部变量时,需要通过融合所有入节点的信息得出一个兼容的局部变量类型。
59.对于32位整数类型的局部变量,需要将其转换为本机大小的整数类型的局部变量或64位整数类型的局部变量,以满足入节点值的分配。对于引用类型局部变量,统一转换为基类object局部变量,不需要计算公共基类,因为所有引用类型在运行时都是指向gc(garbage collection,垃圾收集)堆的指针,大小等同于本机整数。通过上述转换处理,可以得到基于变量的中间代码形式,在分析时会比原来的基于堆栈的中间代码更加便捷高效。
60.s1.3:根据msil代码的跳转指令和所述异常处理子句,构建控制流图。
61.本实施例中,以msil代码的跳转指令和所述异常处理子句为边界,划分出控制流图的基本块,并将所述跳转指令的跳转源和跳转目标分别设置为控制流图的前驱节点和后继节点,得到控制流图。所述跳转指令为msil代码的分支语句。
62.s1.4:基于所述控制流图和局部变量,对.net平台程序进行数据流分析,构建数据流图。
63.本实施例中,在控制流图的基础上,结合堆栈局部变量信息,进行数据流分析,表示局部变量在何处赋值、取值和取地址。数据流分析是对控制流图中数据流的分析,即确定有关程序中数据的定义和使用的信息的分析。使用数据流分析可以得到变量值的传播过程,数据流分析的结果表示可用于编译和优化的信息,指示了程序执行时数据的流动,这些数据流信息可以被用于将msil代码编译为虚拟中间语言。
64.s2:根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,得到msil语法树;
65.s3:将所述msil语法树编译为虚拟中间语言。
66.本实施例中,将所述msil语法树编译为虚拟中间语言之后,将所述虚拟中间语言转化为可序列化的形式;将可序列化的虚拟中间语言保存为十六进制数组写进文件中,用于虚拟机的执行,实现虚拟中间语言的运行时。
67.本实施例中,在将msil语法树编译为虚拟中间语言的过程中,遇到不支持的msil语法节点时,选择抛出异常阻止,继续编译。由于虚拟中间语言由安全的托管语言编写的虚拟机执行,存在部分不可模拟的操作,如对gc堆引用的操作,而这类操作在msil语言层面与
指针操作是一样的。为避免出现数据损坏,需要进行数据流分析,得出变量在何处被取值和幅值,以及在何处被取地址。
68.若局部变量存在取地址操作,则为所述局部变量生成虚拟的引用类型,虚拟的引用类型抽象所有指针操作,但是不能获取指针的原始地址;若局部变量进行取地址操作后得到的指针被执行了数学运算,由于虚拟的引用类型不能获取指针的原始地址,数学运算将会无效,即这类msil语言不能被编译到虚拟中间语言上,需要在分配变量时抛出错误。
69.实施例3
70.本实施例在实施例2提出的基于代码虚拟化的.net平台代码保护方法的基础上作出改进,包括将虚拟中间语言用于虚拟机的执行,实现虚拟中间语言的运行时,如图2所示,图2为本实施例中实现虚拟中间语言的运行时的流程图,具体包括以下步骤:
71.虚拟运行时在程序入口点执行初始化操作,初始化虚拟运行时需要的变量,加载所有虚拟操作码的执行接口,并虚拟操作码的原始值和执行接口映射到到字典中。
72.解析方法入口存根传入的参数,得到虚拟中间语言的位置,将虚拟中间语言加载到虚拟机内部,创建虚拟执行上下文。
73.为当前虚拟操作码调用对应的执行接口,设置下一条虚拟指令的位置,重复此步骤直到方法运行结束。如果执行中出现异常,模拟栈回溯,判断异常是否可被捕获,若异常可捕获,则执行异常处理子句,否则抛出异常,退出虚拟机。
74.实施例4
75.本实施例提出一种.net平台代码虚拟化保护系统,如图3所示,图3为.net平台代码虚拟化保护系统的架构图,包括控制流图构建模块、数据流图构建模块、反编译模块和编译模块。
76.在具体实施过程中,控制流图构建模块构建关于.net平台程序中每个过程的控制流图,数据流图构建模块根据所述控制流图构建数据流图,具体包括以下步骤:
77.控制流图构建模块解析.net平台程序的元数据,获取.net平台程序中需要进行虚拟化的方法体,并提取出所述方法体的msil代码和异常处理子句。对所述msil代码的指令进行解码,将msil代码的堆栈中的堆栈元素分配到局部变量。根据msil代码的跳转指令和所述异常处理子句,构建控制流图。
78.数据流图构建模块基于所述控制流图和局部变量,对.net平台程序进行数据流分析,构建数据流图。本实施例中,在控制流图的基础上,结合堆栈局部变量信息,进行数据流分析,表示局部变量在何处赋值、取值和取地址。
79.反编译模块根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,将msil代码转换到基于局部变量的形式,得到msil语法树。
80.编译模块将所述msil语法树编译为基于虚拟中间语言的语法树,然后将所述基于虚拟中间语言的语法树编译为虚拟中间语言。
81.将.net平台程序中待保护的msil代码转换为具有可自定义性、动态性和可转换性,以及难以被分析的虚拟中间语言,可以有效阻碍各类反编译器将被保护的msil代码转换为高级语言,使得.net平台程序的关键代码不被篡改,能够安全运行在虚拟语言运行时上,适用于对程序关键代码,如验证授权等的代码的保护。
82.附图中描述位置关系的用语仅用于示例性说明,不能理解为对本专利的限制;
83.显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。

技术特征:
1.基于代码虚拟化的.net平台代码保护方法,其特征在于,包括以下步骤:s1:构建关于.net平台程序中每个过程的控制流图,并根据所述控制流图构建数据流图;s2:根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,转换到基于局部变量的形式,得到msil语法树;s3:将所述msil语法树编译为虚拟中间语言。2.根据权利要求1所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s1具体包括以下步骤:s1.1:解析.net平台程序的元数据,获取.net平台程序中需要进行虚拟化的方法体,并提取出所述方法体的msil代码和异常处理子句;s1.2:对所述msil代码的指令进行解码,将msil代码堆栈中的堆栈元素分配到局部变量;s1.3:根据msil代码的跳转指令和异常处理子句,构建控制流图;s1.4:基于所述控制流图和局部变量,对.net平台程序进行数据流分析,构建数据流图。3.根据权利要求2所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s1.2具体包括以下步骤:s1.2.1:从msil代码头部开始,按照偏移顺序向后遍历msil代码的每一条指令,为每一条指令保存其执行前的堆栈信息;s1.2.2:根据所述堆栈信息,将msil代码堆栈中的每一个堆栈元素分配到局部变量,并按堆栈顺序为所述局部变量分配名称。4.根据根据权利要求3所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s1.2.2中,在将msil代码的堆栈中的每一个堆栈元素分配到局部变量时,通过融合程序的入节点的信息,如果入节点存在64位整数类型的局部变量,则将32位整数类型的局部变量转换为64位整数类型的局部变量;如果数据流图的入节点是引用类型,则将局部变量设置为基类object类型。5.根据权利要求2所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s1.3中,以msil代码的跳转指令和异常处理子句为边界,划分出控制流图的基本块,并将所述跳转指令的跳转源和跳转目标分别设置为控制流图的前驱节点和后继节点,得到控制流图。6.根据权利要求2所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s1.1中,还包括对所述方法体、方法体的msil代码和异常处理子句进行验证操作,具体包括以下步骤:验证方法体内所有操作码的支持状态;验证msil代码的堆栈平衡状态;验证异常处理子句的顺序排列状态。7.根据根据权利要求2所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s1.4中,所述对.net平台程序进行数据流分析包括对局部变量进行分析;若局部变量存在取地址操作,则为所述局部变量生成虚拟的引用类型;若局部变量进行取地址操作后得到的指针被执行了数学运算,则在分配局部变量时抛出错误。
8.根据权利要求1所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,s3中,将所述msil语法树编译为基于虚拟中间语言的语法树,然后将所述基于虚拟中间语言的语法树编译为虚拟中间语言。9.根据根据权利要求1所述的基于代码虚拟化的.net平台代码保护方法,其特征在于,所述方法还包括:将所述msil语法树编译为虚拟中间语言之后,将所述虚拟中间语言转化为可序列化的形式;将可序列化的虚拟中间语言保存为十六进制数组写进文件中。10.net平台代码虚拟化保护系统,其特征在于,包括:控制流图构建模块,用于构建.net平台程序中每个过程的控制流图;数据流图构建模块,用于根据所述控制流图构建数据流图;反编译模块,用于根据所述控制流图和数据流图,将.net平台程序中待保护的msil代码进行反编译,得到msil语法树;编译模块,用于将所述msil语法树编译为虚拟中间语言。

技术总结
本发明提出一种基于代码虚拟化的.NET平台代码保护方法,包括构建关于.NET平台程序中每个过程的控制流图,并根据所述控制流图构建数据流图;根据所述控制流图和数据流图,将.NET平台程序中待保护的MSIL代码进行反编译,得到MSIL语法树;将所述MSIL语法树编译为虚拟中间语言。将.NET平台程序中待保护的MSIL代码转换为具有可自定义性、动态性和可转换性,以及难以被分析的虚拟中间语言,可以有效阻碍各类反编译器将被保护的MSIL代码转换为高级语言,使得.NET平台程序的关键代码不被篡改,能够安全运行。够安全运行。够安全运行。


技术研发人员:刘兰 伍文煌
受保护的技术使用者:广东技术师范大学
技术研发日:2022.03.22
技术公布日:2022/7/5
转载请注明原文地址: https://www.8miu.com/read-4192.html

最新回复(0)