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语法树编译为虚拟中间语言。