1.一种基于动态方法的.Net平台代码保护方法,其特征在于,包括:步骤1:从第一.NET程序的元数据中提取第一方法体;
步骤2:对所述第一方法体依次进行混淆和加密处理,得到第二方法体;
步骤3:将所述第二方法体存储至一个预设的自定义堆流中,并向该自定义堆流注入用于创建动态方法的保护系统运行时代码,得到第二.NET程序。
2.根据权利要求1所述的基于动态方法的.Net平台代码保护方法,其特征在于,从第一.NET程序的元数据中提取第一方法体,具体包括:解析第一.NET程序的元数据,得到包含方法表的元数据表流;
从所述元数据表流中解析出第一方法体。
3.根据权利要求1所述的基于动态方法的.Net平台代码保护方法,其特征在于,在对所述第一方法体依次进行混淆处理之前,所述方法还包括:对所述第一方法体进行解码操作,得到对应的第一MSIL代码;
对第一MSIL代码数量大于或等于阈值的第一方法体进行混淆处理。
4.根据权利要求3所述的基于动态方法的.Net平台代码保护方法,其特征在于,采用包括控制流混淆、常量加密、代理调用或资源保护中的至少一种处理方法对所述第一方法体进行混淆处理。
5.根据权利要求3所述的基于动态方法的.Net平台代码保护方法,其特征在于,对经过混淆处理的第一方法体进行加密处理,具体包括:从第一.NET程序的元数据中提取异常处理子句;
构建一个从常量数字到操作码的映射关系;
根据所述映射关系,输出经过混淆处理的第一方法体对应的第一MSIL代码的操作码,利用所述操作码构建字节数组;
对所述字节数组追加各个操作码的操作数以及异常处理子句,得到经过序列化的方法体;
对经过序列化的方法体进行加密,得到第二方法体。
6.根据权利要求5所述的基于动态方法的.Net平台代码保护方法,其特征在于,使用AES加密算法对序列化的方法体进行加密,得到第二方法体。
7.根据权利要求5所述的基于动态方法的.Net平台代码保护方法,其特征在于,在对所述字节数组追加异常处理子句之前,所述方法还包括:解析第一.NET程序的元数据,得到用户字符串堆、字符串堆和Blob堆;
根据用户字符串堆、字符串堆和Blob堆,分别将第一MSIL代码的操作数的Token解码到对应的成员、字符串和成员签名中;
根据所述映射关系,从成员、字符串和成员签名中获取各个操作码的操作数,并将获取的操作数追加至所述字节数组中。
8.一种基于动态方法的.Net平台代码运行方法,用于运行如权利要求1~7任一项所述的基于动态方法的.Net平台代码保护方法生成的第二.NET程序,其特征在于,包括:S1:在第二.NET程序启动时,初始化保护系统运行时的内部字段,并获取自定义堆流的地址;
S2:解析自定义堆流,得到第二方法体;
S3:将第二方法体保存到保护系统运行时内部;
S4:当第二.NET程序运行至桩方法时,从缓存中获取已编译的动态方法,若获取成功,则进入S7,若获取失败,则进入S5;
S5:获取当前桩方法的Token,并根据该Token在保护系统运行时内部查询第二MSIL代码的方法体;
S6:根据第二MSIL代码的方法体,创建并编译动态方法,并将该动态方法保存到缓存中;
S7:执行反调试检测,若第二.NET程序处于被调试状态,则报错并不执行已编译的动态方法,若第二.NET程序不处于被调试状态,则执行已编译的动态方法。
9.根据权利要求8所述的基于动态方法的.Net平台代码运行方法,其特征在于,在S1之后,S2之前,所述方法还包括:执行反调试检测,若检测存在调试器,则退出第二.NET程序的运行。
10.根据权利权利要求8所述的基于动态方法的.Net平台代码运行方法,其特征在于,根据第二MSIL代码的方法体,使用System.Reflection.Emit命名空间中API创建并编译动态方法。