CN103955635A - 一种对.net可执行程序进行保护的方法和系统 - Google Patents

一种对.net可执行程序进行保护的方法和系统 Download PDF

Info

Publication number
CN103955635A
CN103955635A CN201410135281.1A CN201410135281A CN103955635A CN 103955635 A CN103955635 A CN 103955635A CN 201410135281 A CN201410135281 A CN 201410135281A CN 103955635 A CN103955635 A CN 103955635A
Authority
CN
China
Prior art keywords
protection
instruction
information
program
class
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
Application number
CN201410135281.1A
Other languages
English (en)
Other versions
CN103955635B (zh
Inventor
孙吉平
韩勇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Senseshield Technology Co Ltd
Original Assignee
Beijing Senseshield Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Senseshield Technology Co Ltd filed Critical Beijing Senseshield Technology Co Ltd
Priority to CN201410135281.1A priority Critical patent/CN103955635B/zh
Publication of CN103955635A publication Critical patent/CN103955635A/zh
Application granted granted Critical
Publication of CN103955635B publication Critical patent/CN103955635B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本发明公开了一种对.NET程序进行保护的方法及系统。该方法首先采用元数据API来分析.NET程序的结构,分析出程序中引用程序集、程序集、类和类中的方法,以及类中的方法的参数、返回值、IL指令等信息。其次由用户选择需要保护的方法,保护系统生成需要保护的方法的代理类,保护系统对需要保护的方法的IL指令进行加密。再次,保护系统创建保护后的方法,将加密后的IL指令以局部变量的形式存储在保护后的方法中,保护后的方法主要功能是创建动态方法、解密IL指令、设置动态方法的IL指令、创建动态方法的代理类、通过代理类调用动态方法,最后,将引用程序集、程序集、代理类及保护后的方法等信息注入到保护后的程序中。

Description

一种对.NET可执行程序进行保护的方法和系统
技术领域
本发明涉及信息安全技术领域,特别涉及一种对.NET可执行程序进行保护的方法和系统。 
背景技术
.NET是微软公司用来实现XML、Web Services、SOA(面向服务的体系结构service-oriented architecture)和敏捷性的技术。技术人员一般将微软看成一个平台厂商。微软搭建技术平台,而技术人员在这个技术平台之上创建应用系统。从这个角度,.NET也可以如下来定义:.NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的、联通的、适应变化的、稳定的和高性能的。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序。更精确的说,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时Common Language Runtime之上的应用程序。如果一个应用程序跟.NET Framework无关,它就不能叫做.NET程序。比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAP SDK调用一个Web Service也不是.NET应用。.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式。 
在信息安全领域中,软件作为一种宝贵的财富,软件的安全性越来越受到单位、企业和个人的关注。.NET是作为微软的新一代技术平台,.NET统一了编程语言,无论程序使用C#,还是C++、VB编写,程序最终都会编译为.NET中间语言MSIL(Microsoft Intermediate Language)。MSIL是将.NET代码转化为机器语言的一个中间过程,它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成Microsoft 中间语言 (MSIL),它是一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段MSIL代码可以被不同的编译器实时编译并运行在不同的结构上。从理论上来说,MSIL将消除多年以来业界中不同语言之间的纷争。在.NET的世界中可能出现下面的情况,一部分代码可以用EFFIL实现,另一部分代码使用C#或VB.NET完成,但是最后这些代码都将被转换为中间语言。这给程序员提供了极大的灵活性,程序员可以选择自己熟悉的语言,并且再也不用为学习不断推出的新语言而烦恼了。 
编译为托管代码时,编译器将源代码翻译为 Microsoft 中间语言 (MSIL),这是一组可以有效地转换为本机代码且独立于 CPU 的指令。MSIL 包括用于加载、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接内存访问、异常处理和其他操作的指令。要使代码可运行,必须先将 MSIL 转换为特定于 CPU 的代码,这通常是通过实时 (JIT) 编译器来完成的。由于公共语言运行库为它支持的每种计算机结构都提供了一种或多种 JIT 编译器,因此同一组 MSIL 可以在所支持的任何结构 JIT上 编译和运行。编译后的.NET运行时,由虚拟机执行引擎把中间语言代码转换为机器代码。 
虽然.NET提供了便利,但.NET编译后的程序集非常容易被反编译,比如利用Reflector工具几乎可以生成.NET程序的源代码。Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL(Intermediate Language,中间语言)转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。 
目前对于.NET程序集的保护主要是基于纯软件的保护技术,常见的.NET保护软件有.NET Reactor、Dotfuscator等。基于纯软件的保护方法抗分析性较差。.Net自带工具Dotfuscator是领先的 .NET 模糊处理程序、压缩程序和水印处理程序,它有助于保护程序,使之免遭反向工程处理,同时使程序更小巧且更高效。Dotfuscator Professional Edition 4.9旨在阻止各种反编译器生成有用的输出,即便是那些最好的反编译器也不例外。它提供了全面、高效的 .NET 代码开发和部署过程。 
元数据API是微软提供的一套非托管API,它的功能是可以读写程序集中的元数据,可操作的对象囊括了元数据的各个方面,比如可以是逻辑结构上的程序集、类、方法等。利用元数据API可以很方便的对.NET程序集进行分析和修改。元数据用于描述公共语言运行库 (CLR) 在 JIT 编译 Microsoft 中间语言 (MSIL)、加载类、执行代码以及与 COM 传统型或本机领域进行交互时使用的运行库类型(类、接口和值类型)、字段、方法以及内部实现和布局信息。元数据包括在每个 CLR 组件中,并可供运行库、工具和服务使用。对元数据的所有操作都通过元数据 API 执行,这些 API 将客户端(工具和服务)与基础数据结构隔离,实现了一种可插入的持久性格式体系结构,这种体系结构允许运行库的二进制表示形式、COM 传统型类型库和其他格式以透明方式出入内存。元数据 API 包括发出(即生成)和导入元数据的接口。客户端可通过下列方式发出或导入元数据:编译器和工具通过调用“发出”API 发出元数据。元数据在编译和链接过程中发出。在生成组件或应用程序的过程中,RAD(Rapid Application Develop,快速应用开发)工具将发出元数据。API 向内存中数据结构写入数据并从中读取数据。在保存时,这些内存中结构将被压缩并以二进制格式保存到目标编译单元(.obj 文件)、可执行文件(.exe 文件)或独立元数据二进制文件中。在通过链接多个编译单元来形成 EXE 或 DLL 文件时,“发出”API 将提供相应的方法,用于将每个编译单元中的元数据合并为一个集成的元数据二进制文件。在导入元数据时,加载程序及其他运行库工具和服务将调用“导入”API 来获取有关组件的信息,以便可以完成加载和激活等任务。 
基于硬件的.NET保护方法,主要是从.NET程序文件中提取部分代码到软件保护装置(下文也称为“保护装置”)中,这样一部分代码在计算机中执行,另外一部分在保护装置中模拟执行。基于硬件的保护方法可以移植的代码指令有限,受限于硬件的保护装置的空间限制,移植的代码的数量也有限。而软件保护装置是一种通过计算机接口(包括但不限于并口或者USB接口)连接到计算机主机上的硬件设备。该设备内部具有非易失性存储空间可供读写,通常还具有单片机或者微处理控制芯片等计算处理单元。软件开发者可以通过接口函数和软件保护装置进行数据交换(即对软件保护装置进行读写),来检查软件保护装置是否插在接口上;或者直接用软件保护装置附带的工具进行加密。这样,软件开发者可以在软件中设置多处软件锁,利用软件保护装置作为钥匙来打开这些锁;如果没插软件保护装置或软件保护装置不对应,软件将不能正常执行。 
此外,软件保护装置内部包含特定的功能,例如一部分存储空间、一些密码算法或者一些用户自定义的算法或者功能。在软件发行之前,软件开发者修改自己的软件代码,使得软件在运行过程中需要使用到软件保护装置内部的一些功能,这样软件离开软件保护装置之后就会无法运行,而软件保护装置作为一种硬件设备复制的难度较大,从而起到防止盗版软件非法传播的作用。 
当前市场上主要的软件保护装置包括:美国SafeNet公司的Sentinel Superpro、以色列Aladdin公司的Hasp HL、中国北京深思洛克软件股份有限公司的精锐系列、德国Wi-Bu公司的WIBU-Key等。所有这些软件保护装置都提供了内置的存储空间、私有或公开的密码算法,在软件运行过程中可以调用这些功能来检验是否属于正版。这些软件保护装置采用了智能卡芯片作为硬件的基础,而且支持用户将自己定义的功能写入到软件保护装置内部,甚至可以直接将软件的部分功能移植到软件保护装置内部完成,从而大大提高了软件被盗版的难度,通常称这种将自己定义的功能或者软件的部分功能移植到软件保护装置内部的技术为代码移植。本发明人现在对应网站为http://www.sense.com.cn/,其中详细公开了本发明人开发的软件保护装置的具体参数性能和工作原理。  
发明内容
有鉴于此,本发明对.NET程序实现了方法级的保护,只有插上合法的保护装置保护后的程序才能运行,保护后的程序运行时,保护后的方法动态生成保护前的方法并进行调用,动态生成的方法很难进行调试,可以对程序中的所有方法进行保护,从而达到了保护方法的目的。 
本发明提供了一种.NET程序的保护方法及系统,以解决.NET程序的安全问题。 
一种对.NET程序进行保护的方法,该方法具体步骤包括: 
分析.NET程序中引用程序集信息、程序集信息、类及类中的方法,分析类中的方法中的返回值、参数、IL指令等信息;
用户选择需要保护的方法;
根据需要保护的方法的参数、返回值,生成保护后方法的代理类;
根据需要保护的方法的IL指令,对IL指令采用保护装置进行加密;
对需要保护的方法进行保护,具体包括:根据方法的参数、返回值创建一个动态方法对象,将加密后的IL指令作为一个数组存储在保护后的方法中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,通过代理类调用动态方法。
将程序中的引用程序集信息、程序集信息、类信息、保护后方法的代理类、保护后的方法等信息注入到保护后的.NET程序中。 
本发明还提供了一种对.NET程序进行保护的系统,所述系统包括:保护装置、分析模块、保护模块、注入模块。保护装置可以是加密锁,分析模块、保护模块、注入模块可在计算机主机中。 
所述保护装置为具有智能卡芯片的信息安全设备,提供软件、数据保护功能。根据一个具体实施方式,所述保护装置包括但不限于加密锁。 
所述分析模块,利用微软提供的元数据接口中的GetAssemblyRefProps函数分析.NET程序中的引用程序集信息,利用元数据接口中的GetAssemblyProps函数分析.NET程序中的程序集信息,利用元数据接口中的GetTypeDefProps函数分析.NET程序中的类,利用元数据接口的函数EnumMethods函数分析类中的方法,利用元数据接口中的GetMethodProps函数分析类中的方法的签名信息及IL指令所在的地址,得到方法的签名信息后,根据微软的方法签名的格式分析方法的参数、返回值,方法的签名的格式为调用约定、参数个数、返回值类型、参数信息;根据方法的IL指令所在的地址得到IL指令的详细信息。 
所述保护模块,对需要保护的方法的IL指令利用保护装置进行加密,加密算法可以采用对称算法或者非对称算法,加密的密钥由保护装置生成;生成保护后方法的签名信息,根据保护前方法的签名信息(调用约定、参数、返回值等),设置保护后的方法的签名信息,使保护前后方法的签名信息保持一致;设置保护后方法的局部变量信息,局部变量主要有保护前的方法的参数类型数组变量、返回值类型变量、动态方法对象变量、方法的代理类变量、存储加密后的IL 指令的数组变量等变量;设置保护后方法的IL指令,保护后方法的IL指令主要功能为:获取保护前的方法的参数的类型信息,并保存到参数类型数组中,获取保护前方法的返回值类型信息,并保存到返回值类型信息方法中,根据保护前方法的参数类型信息、返回值类型信息创建一个动态方法对象,将创建的动态方法对象保存到动态方法对象变量中,将加密后的IL指令依次存储到加密后的IL指令数组变量中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,并将代理类信息保存到代理类变量中,通过代理类调用动态方法,达到执行原方法逻辑的目的。 
所述注入模块,利用分析模块中分析的引用程序集信息、程序集信息、类信息、类中没有保护的方法以及保护模块生成的代理类信息、保护后的方法,将它们都注入到保护后的.NET程序中。所谓注入指构建保护后.NET程序的过程,保护后的.NET程序保留了保护前.NET程序的大部分信息,比如引用程序集信息、程序集信息,类信息,保护后的.NET程序只是修改了需要保护的方法,增加了保护后方法需要使用的代理类。注入过程使用的具体方法为利用IMeataDataAssemblyEmit接口中的DefineAssemblyRef定义引用程序集信息,DefineAssembly方法定义程序集信息,利用IMetaDataEmit接口中的DefineTypeDef函数定义类型信息,利用DefineMethod定义方法。最后可以利用ICeeFileGen接口中的函数GenerateCeeFile创建一个.NET可执行程序。 
附图说明
图1为按照本发明的一优选实施例的对.NET程序保护过程的流程示意图。 
图2为按照本发明的一优选实施例中的.NET程序保护系统的示意图。 
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。 
根据本发明的一个实施方式,提供.NET程序的保护方法,具体包括: 
1.      分析.NET程序中引用程序集信息、程序集信息、类及类中的方法,类中方法中的返回值、参数、IL指令等信息;
2.      用户选择需要保护的方法;
3.      根据需要保护的方法的参数、返回值,生成保护后方法的代理类;
4.      分析需要保护的方法的IL指令,对IL指令采用保护装置进行加密;
5.      对需要保护的方法进行保护,具体包括,根据需要保护的方法的参数、返回值创建一个动态方法对象,将加密后的IL指令作为一个数组存储在保护后的方法中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,通过代理类调用动态方法;
6.      将程序中的引用程序集信息、程序集信息、类信息、方法的代理类、保护后的方法等信息注入到保护后的.NET程序中。
根据本发明的一个实施方式,本发明还提供了一种对.NET程序进行保护的系统,所述系统包括: 
保护装置、分析模块、保护模块、注入模块。
所述保护装置为具有智能卡芯片的信息安全设备,提供软件、数据保护功能。根据一个具体实施方式,所述保护装置包括但不限于加密锁。 
所述分析模块,利用微软提供的元数据接口中的GetAssemblyRefProps函数分析.NET程序中的引用程序集信息,利用元数据接口中的GetAssemblyProps函数分析.NET程序中的程序集信息,利用元数据接口中的GetTypeDefProps函数分析.NET程序中的类,利用元数据接口的函数EnumMethods函数分析类中的方法,利用元数据接口分析中的GetMethodProps函数分析类中的方法的签名信息及IL指令所在的地址,得到方法的签名信息后,根据微软的方法签名的格式分析方法的参数、返回值,方法的签名的格式为调用约定、参数个数、返回值类型、参数信息;根据方法的IL指令所在的地址得到IL指令的详细信息。 
所述保护模块,对需要保护的方法的IL指令利用保护装置进行加密,加密算法可以采用对称算法或者非对称算法,加密的密钥由保护装置生成;生成保护后方法的签名信息,根据保护前方法的签名信息(调用约定、参数、返回值等),设置保护后的方法的签名信息,使保护前后方法的签名信息保持一致;设置保护后方法的局部变量信息,局部变量主要有保护前的方法的参数类型数组变量、返回值类型变量、动态方法对象变量、方法的代理类变量、存储加密后的IL 指令的数组变量等变量;设置保护后方法的IL指令,保护后方法的IL指令主要功能为获取保护前的方法的参数的类型信息,并保存到参数类型数组中,获取保护前方法的返回值类型信息,并保存到返回值类型信息方法中,根据保护前方法的参数类型信息、返回值类型信息创建一个动态方法对象,将创建的动态方法对象保存到动态方法对象变量中,将加密后的IL指令依次存储到加密后的IL指令数组变量中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,并将代理类信息保存到代理类变量中,通过代理类调用动态方法,达到执行原方法逻辑的目的。 
所述注入模块,利用分析模块中分析的引用程序集信息、程序集信息、类信息、类中没有保护的方法以及保护模块生成的代理类信息、保护后的方法,将它们都注入到保护后的.NET程序中。所谓注入指构建保护后.NET程序的过程,保护后的.NET程序保留了保护前.NET程序的大部分信息,比如引用程序集信息、程序集信息,类信息,保护后的.NET程序只是修改了需要保护的方法,增加了保护后方法需要使用的代理类。注入过程使用的具体方法为利用IMeataDataAssemblyEmit接口中的DefineAssemblyRef定义引用程序集信息,DefineAssembly方法定义程序集信息,利用IMetaDataEmit接口中的DefineTypeDef函数定义类型信息,利用DefineMethod定义方法。最后可以利用ICeeFileGen接口中的函数GenerateCeeFile创建一个.NET可执行程序。 
根据本发明的一个实施方式,下面给出一个实施例来说明本发明。 
实施例1
该实施例以保护安装有微软Windows XP 32位操作系统的系统环境为例,描述根据本发明一个具体实施例实现.NET程序保护的具体过程。
为了方便说明,本实施例给出了一个具体的.NET程序,具体如下: 
using System;
class  Program               //声明一个Program的类
{  
  /*
   声明一个成员方法test,test方法有三个整型参数a、b、c,该方法完成的功能为对前两个参数a和b进行相加,将相加的结果和c相乘,最后将相乘的结果返回
*/
   static int  test(int a, int b, int c) 
   {
         return (a+b)*c;
   }
/*
   Main方法为程序的入口方法,该方法中声明了一个变量整型变量d, d的值为函数test传入参数1,2,3的执行后的结果。
调用Console.WriteLine将d的值输出在屏幕上。 
*/ 
   public static void Main()
   {
      int d = test(1,2,3);    
      Console.WriteLine("d = {0}",d); 
   }
}
将上述C#代码保存在Class1.cs文件中,并采用C#编译器进行编译,生成的可执行文件为class1.exe.
保护装置为加密锁,为IL代码提供加密方法。
如图1所示,对.NET程序进行保护的详细步骤为: 
1.    插入保护装置,保护装置例如选用精锐IV加密锁;
2.    分析.NET可执行程序中引用程序集信息、程序集信息、类及类中的方法,类中的方法中的返回值、参数、IL指令;
   对于本例来说,可执行程序中的程序集为Class1,引用程序集为mscorlib,
对于本例来说,可执行程序中包含Program类,Program中包含.ctor、Main和test三个方法。.ctor方法为类Program的构造方法,该方法的作用是构造类的实例的实例化对象;test方法有三个整型参数a、b、c,该方法完成的功能为对前两个参数a和b进行相加,将相加的结果和c相乘,将结果返回;Main方法为程序的入口方法,该方法中声明了一个变量整型变量d, d的值为函数test传入参数1,2,3的执行后的结果。其中.ctor方法和Main方法中的返回值为void类型,两者参数个数为0,test方法包含3个int类型的参数,返回值也为int类型。分析的IL指令此处只列举test方法的IL指令,指令如下。
   .maxstack  2
  .locals init (int32 V_0)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  add
  IL_0004:  ldarg.2
  IL_0005:  mul
  IL_0006:  stloc.0
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.0
  IL_000a:  ret
IL指令对应的C#源码为:return (a+b)*c; 
3.    用户选择需要保护的方法;此处选择保护Program类中的test方法;
4.    分析需要保护的方法的IL指令,对IL指令采用保护装置进行加密;
对于本例来说对test方法的IL指令进行加密,加密调用保护装置内使用的算法来实现,此处保护装置内使用的算法为AES算法,当然也可以使用其它算法。
5.     根据分析需要保护的方法的参数、返回值,生成保护后方法的代理类;生成的代理类有4个方法 
此处生成的代理类为public delegate int testdelegate(int a, int b, int c) ;
代理类的四个方法为.ctor方法,BeginInvoke方法, EndInvoke方法,Invoke方法。
.ctor方法的IL语句的声明如下: 
/*
  .ctor为代理类的构造函数,用来构造实例化对象
*/
.method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed{}
BeginInvoke方法的IL语句的声明如下:
/*
   BeginInvoke方法实现了对回调方法的异步回调。
*/ 
.method public hidebysig newslot virtual instance class [mscorlib]System.IAsyncResult BeginInvoke(int32 a, int32 b, int32 c, class [mscorlib]System.AsyncCallback callback, object 'object') runtime managed{}
EndInvoke方法的IL语句的声明如下:
/*
  EndInvoke方法返回委托的签名返回的任何类型数据
*/
.method public hidebysig newslot virtual instance int32 EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed{}
Invoke方法的IL语句的声明如下:
/*
Invoke方法用来实现对代理的调用。 */
.method public hidebysig newslot virtual instance int32 Invoke(int32 a, int32 b, int32 c) runtime managed{}
6.    对需要保护的方法进行保护,具体包括,根据方法的参数、返回值创建一个动态方法对象,将加密后的IL指令作为一个数组存储在加密后的方法中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,通过代理类调用动态方法;
对于本例来说,test方法的参数为3个int 类型,返回值为1个int类型,创建动态方法的IL语句的声明如下:
/*
获取三个参数的类型,并将获取的类型保存到typearray2数组中
*/
L_0011: ldloc.s typeArray2
L_0013: ldc.i4.0 
L_0014: ldtoken int32
L_0019: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_001e: stelem.ref 
L_001f: ldloc.s typeArray2
L_0021: ldc.i4.1 
L_0022: ldtoken int32
 L_0027: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_002c: stelem.ref 
L_002d: ldloc.s typeArray2
L_002f: ldc.i4.2 
L_0030: ldtoken int32
L_0035: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_003a: stelem.ref 
L_003b: ldloc.s typeArray2
L_003d: stloc.0 
L_003e: br L_0052
/*
   获取返回值的类型,并将返回值的类型保存
*/
L_0043: ldtoken int32
L_0048: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_004d: br L_0057
L_0052: br L_0043
L_0057: stloc.1 
L_0058: br L_006c
L_005d: ldtoken Program
L_0062: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_0067: br L_0071
L_006c: br L_005d
L_0071: stloc.2 
L_0072: br L_008a
/*
创建动态方法对象,并将结果进行保存。
*/ 
L_0077: ldstr "test"
L_007c: ldloc.1 
L_007d: ldloc.0 
L_007e: ldloc.2 
L_007f: ldc.i4.1 
L_0080: newobj instance void [mscorlib]System.Reflection.Emit.DynamicMethod::.ctor(string, class [mscorlib]System.Type, class [mscorlib]System.Type[], class [mscorlib]System.Type, bool)
L_0085: br L_008f
L_008a: br L_0077
L_008f: stloc.3         
对加密后的IL指令解密的IL语句的声明如下:
/*
装载加密后的字节码,并调用Decrypt函数进行解密
*/
L_0189: ldloc.s buffer
L_018b: ldc.i4 15
L_0190: ldc.i4 0x4b
L_0195: stelem.i1 
L_0196: ldloc.s buffer
L_0198: ldc.i4 11
L_019d: ldc.i4 -1
L_01a2: call uint8[] IYMmTQNjfyEMs::Decrypt(uint8[], int32, uint32)
L_01a7: stloc.s buffer
设置动态方法的IL语句的声明如下:
/*
设置动态方法的IL指令
*/
L_01b7: ldc.i4 2
L_01bc: callvirt instance void [mscorlib]System.Reflection.Emit.DynamicILInfo::SetCode(uint8[], int32)
创建动态方法的代理类,通过代理类调用动态方法的IL语句的声明如下
/*
    创建动态方法的代理类
/
L_01d0: ldloc.3 
L_01d1: ldtoken Program/testdelegate
L_01d6: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
L_01db: callvirt instance class [mscorlib]System.Delegate [mscorlib]System.Reflection.Emit.DynamicMethod::CreateDelegate(class [mscorlib]System.Type)
L_01e0: castclass Program/OGI6FsTPRmugvSym2O2zHkbkybbcoIAB
L_01e5: stloc.s oiab
L_01e7: call void LQAUtYG6ewIyMaY80iVY93QbxkuPdVlm::a2()
L_01ec: call void LQAUtYG6ewIyMaY80iVY93QbxkuPdVlm::a4()
/*
调用代理类的Invoke方法,达到调用保护前方法的目的。
*/ 
L_01f1: ldloc.s oiab
L_01f3: ldarg.0 
L_01f4: ldarg.1 
L_01f5: ldarg.2 
L_01f6: callvirt instance int32 Program/testdelegate::Invoke(int32, int32, int32)
7.    将程序中的引用程序集信息、程序集信息、类信息、类中没有保护的方法以及保护模块生成的代理类信息、保护后的方法,将它们都注入到保护后的.NET程序中;
注入的方式采用微软提供的元数据API来实现,注入过程使用的方法为利用IMeataDataAssemblyEmit接口中的DefineAssemblyRef定义引用程序集信息,DefineAssembly方法定义程序集信息,利用IMetaDataEmit接口中的DefineTypeDef函数定义类型信息,利用DefineMethod定义方法。最后可以利用ICeeFileGen接口中的函数GenerateCeeFile创建一个.NET可执行程序。
  
根据本发明的另一个实施例,.NET程序的保护系统包括保护装置、分析模块、保护模块、注入模块,如图2所示: 
保护装置为具有智能卡芯片的信息安全设备,提供软件、数据保护功能。根据一个具体实施方式,所述保护装置包括但不限于加密锁。此处的保护装置使用精锐IV加密锁。
所述分析模块,利用微软提供的元数据接口中的GetAssemblyRefProps函数分析.NET程序中的引用程序集信息,利用元数据接口中的GetAssemblyProps函数分析.NET程序中的程序集信息,利用元数据接口中的GetTypeDefProps函数分析.NET程序中的类,利用元数据接口的函数EnumMethods函数分析类中的方法,利用元数据接口中的GetMethodProps函数分析类中的方法的签名信息及IL指令所在的地址,得到方法的签名信息后,根据微软的方法签名的格式分析方法的参数、返回值;根据方法的IL指令所在的地址得到IL指令的详细信息。 
所述保护模块,对需要保护的方法的IL指令利用保护装置进行加密,加密算法可以采用对称算法或者非对称算法,加密的密钥由保护装置生成;生成保护后方法的签名信息,根据保护前方法的签名信息(调用约定、参数、返回值等),设置保护后的方法的签名信息,使保护前后方法的签名信息保持一致;设置保护后方法的局部变量信息,局部变量主要有保护前的方法的参数类型数组变量、返回值类型变量、动态方法对象变量、方法的代理类变量、存储加密后的IL 指令的数组变量等变量;设置保护后方法的IL指令,保护后IL指令主要功能为获取保护前的方法的参数的类型信息,并保存到参数类型数组中,获取保护前方法的返回值类型信息,并保存到返回值类型信息方法中,根据保护前方法的参数类型信息、返回值类型信息创建一个动态方法对象,将创建的动态方法对象保存到动态方法对象变量中,将加密后的IL指令依次存储到加密后的IL指令数组变量中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,并将代理类信息保存到代理类变量中,通过代理类调用动态方法,达到执行原方法逻辑的目的。 
所述注入模块,利用分析模块中分析的引用程序集信息、程序集信息、类信息、类中没有保护的方法以及保护模块生成的代理类信息、保护后的方法,将它们都注入到保护后的.NET程序中。所谓注入指构建保护后.NET程序的过程,保护后的.NET程序保留了保护前.NET程序的大部分信息,比如引用程序集信息、程序集信息,类信息,保护后的.NET程序只是修改了需要保护的方法,增加了保护后方法需要使用的代理类。注入过程使用的具体方法为利用IMeataDataAssemblyEmit接口中的DefineAssemblyRef定义引用程序集信息,DefineAssembly方法定义程序集信息,利用IMetaDataEmit接口中的DefineTypeDef函数定义类型信息,利用DefineMethod定义方法。最后可以利用ICeeFileGen接口中的函数GenerateCeeFile创建一个.NET可执行程序。 
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。 

Claims (15)

1.一种对.NET程序进行保护的方法,该方法的步骤包括:
分析.NET程序中引用程序集信息、程序集信息、类及类中的方法,分析类中的方法中的返回值、参数、IL指令等信息;
用户选择需要保护的方法;
根据需要保护的方法的参数、返回值,生成保护后方法的代理类;
根据需要保护的方法的IL指令,对IL指令采用保护装置进行加密;
对需要保护的方法进行保护;
将程序中的引用程序集信息、程序集信息、方法的代理类、保护后的方法等信息注入到保护后的.NET程序中。
2.如权利要求1所述的方法,其中,对需要保护的方法进行保护具体包括:根据方法的参数、返回值创建一个动态方法对象,将加密后的IL指令作为一个数组存储在保护后的方法中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,通过代理类调用动态方法。
3.一种对.NET程序进行保护的系统,所述系统包括:保护装置、分析模块、保护模块、注入模块;其中:
保护装置,提供软件、数据保护功能;
分析模块,对.NET程序进行分析;
保护模块,对需要保护的方法的IL指令利用保护装置进行加密,生成保护后方法的签名信息,设置保护后方法的局部变量信息和保护后方法的IL指令;
注入模块,将分析模块和保护模块得到的内容注入到保护后的.NET程序中。
4.如权利要求3所述的系统,其中所述保护装置为具有智能卡芯片的信息安全设备,提供软件、数据保护功能。
5.如权利要求3或4所述的系统,其中所述保护装置为加密锁。
6.如权利要求3-5之一所述的系统,其中分析模块、保护模块、注入模块设置在计算机主机中。
7.如权利要求3-6之一所述的系统,其中所述分析模块,利用微软提供的元数据接口中的GetAssemblyRefProps函数分析.NET程序中的引用程序集信息,利用元数据接口中的GetAssemblyProps函数分析.NET程序中的程序集信息,利用元数据接口中的GetTypeDefProps函数分析.NET程序中的类,利用元数据接口的函数EnumMethods函数分析类中的方法,利用元数据接口中的GetMethodProps函数分析类中的方法的签名信息及IL指令所在的地址,得到方法的签名信息后,根据微软的方法签名的格式分析方法的参数、返回值;根据方法的IL指令所在的地址得到IL指令的详细信息。
8.如权利要求7所述的系统,其中方法的签名的格式为:调用约定、参数个数、返回值类型、参数信息。
9.如权利要求3-8之一所述的系统,其中所述保护模块,对需要保护的方法的IL指令利用保护装置进行加密;生成保护后方法的签名信息,根据保护前方法的签名信息,设置保护后的方法的签名信息,使保护前后方法的签名信息保持一致;设置保护后方法的局部变量信息;设置保护后方法的IL指令,保护后方法的IL指令主要功能为:获取保护前的方法的参数的类型信息,并保存到参数类型数组中,获取保护前方法的返回值类型信息,并保存到返回值类型信息方法中,根据保护前方法的参数类型信息、返回值类型信息创建一个动态方法对象,将创建的动态方法对象保存到动态方法对象变量中,将加密后的IL指令依次存储到加密后的IL指令数组变量中,调用保护装置对加密后的IL指令进行解密,设置动态方法的IL指令,创建动态方法的代理类,并将代理类信息保存到代理变量中,通过代理类调用动态方法,达到执行原方法逻辑的目的。
10.如权利要求9所述的系统,其中对需要保护的方法的IL指令进行加密时,加密算法采用对称算法或者非对称算法,加密的密钥由保护装置生成。
11.如权利要求9或10所述的系统,其中保护前方法的签名信息包括调用约定、参数、返回值等。
12.如权利要求9-11之一所述的系统,其中局部变量主要有保护前的方法的参数类型数组变量、返回值类型变量、动态方法对象变量、方法的代理类变量、存储加密后的IL 指令的数组变量等变量。
13.如权利要求9-12之一所述的系统,其中所述注入模块,利用分析模块中分析的引用程序集信息、程序集信息、类信息、类中没有保护的方法以及保护模块生成的代理类信息、保护后的方法,将它们都注入到保护后的.NET程序中。
14.如权利要求13所述的系统,其中注入的方式采用微软提供的元数据API来实现。
15.如权利要求13或14所述的系统,其中注入过程使用的方法为利用IMeataDataAssemblyEmit接口中的DefineAssemblyRef定义引用程序集信息,DefineAssembly方法定义程序集信息,利用IMetaDataEmit接口中的DefineTypeDef函数定义类型信息,利用DefineMethod定义方法;最后可以利用ICeeFileGen接口中的函数GenerateCeeFile创建一个.NET可执行程序。
CN201410135281.1A 2014-04-04 2014-04-04 一种对.net可执行程序进行保护的方法和系统 Active CN103955635B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410135281.1A CN103955635B (zh) 2014-04-04 2014-04-04 一种对.net可执行程序进行保护的方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410135281.1A CN103955635B (zh) 2014-04-04 2014-04-04 一种对.net可执行程序进行保护的方法和系统

Publications (2)

Publication Number Publication Date
CN103955635A true CN103955635A (zh) 2014-07-30
CN103955635B CN103955635B (zh) 2017-02-15

Family

ID=51332910

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410135281.1A Active CN103955635B (zh) 2014-04-04 2014-04-04 一种对.net可执行程序进行保护的方法和系统

Country Status (1)

Country Link
CN (1) CN103955635B (zh)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106548049A (zh) * 2016-12-09 2017-03-29 武汉斗鱼网络科技有限公司 一种代码处理方法和装置
CN107220528A (zh) * 2017-07-21 2017-09-29 北京深思数盾科技股份有限公司 Java程序的保护与运行方法、装置和终端
CN107341373A (zh) * 2017-06-30 2017-11-10 北京深思数盾科技股份有限公司 一种可执行程序的保护方法及装置
CN107423586A (zh) * 2017-07-31 2017-12-01 北京深思数盾科技股份有限公司 软件保护方法和软件保护装置
CN107526625A (zh) * 2017-07-18 2017-12-29 杭州趣链科技有限公司 一种基于字节码检查的Java智能合约安全检测方法
CN108089978A (zh) * 2017-11-28 2018-05-29 华北电力大学(保定) 一种分析asp.net应用软件性能及故障的诊断方法
CN109213491A (zh) * 2018-09-19 2019-01-15 东信和平科技股份有限公司 NB-IoT通信模组的二次开发方法、装置及存储介质
CN109558745A (zh) * 2017-09-25 2019-04-02 赖育承 对电子档进行保护的方法及其电脑程序产品
CN111104668A (zh) * 2019-12-23 2020-05-05 江苏恒宝智能系统技术有限公司 一种安全认证函数返回值的实现方法及应用
CN112527677A (zh) * 2020-12-23 2021-03-19 北京深思数盾科技股份有限公司 应用程序的保护方法及电子设备
CN113051088A (zh) * 2021-03-31 2021-06-29 广州锦行网络科技有限公司 程序加载方法、装置、设备及计算机可读介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101256612A (zh) * 2008-04-01 2008-09-03 北京飞天诚信科技有限公司 基于.Net卡的程序保护方法和系统
US20100146304A1 (en) * 2005-07-22 2010-06-10 Kazufumi Miyatake Execution device
CN103198240A (zh) * 2012-09-29 2013-07-10 网易(杭州)网络有限公司 一种用于保护代码安全的方法和装置
CN103413069A (zh) * 2013-07-08 2013-11-27 北京深思数盾科技有限公司 一种保护面向对象语言编写的软件的方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20100146304A1 (en) * 2005-07-22 2010-06-10 Kazufumi Miyatake Execution device
CN101256612A (zh) * 2008-04-01 2008-09-03 北京飞天诚信科技有限公司 基于.Net卡的程序保护方法和系统
CN103198240A (zh) * 2012-09-29 2013-07-10 网易(杭州)网络有限公司 一种用于保护代码安全的方法和装置
CN103413069A (zh) * 2013-07-08 2013-11-27 北京深思数盾科技有限公司 一种保护面向对象语言编写的软件的方法

Cited By (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106548049A (zh) * 2016-12-09 2017-03-29 武汉斗鱼网络科技有限公司 一种代码处理方法和装置
CN107341373B (zh) * 2017-06-30 2018-12-18 北京深思数盾科技股份有限公司 一种可执行程序的保护方法及装置
CN107341373A (zh) * 2017-06-30 2017-11-10 北京深思数盾科技股份有限公司 一种可执行程序的保护方法及装置
CN107526625A (zh) * 2017-07-18 2017-12-29 杭州趣链科技有限公司 一种基于字节码检查的Java智能合约安全检测方法
CN107220528A (zh) * 2017-07-21 2017-09-29 北京深思数盾科技股份有限公司 Java程序的保护与运行方法、装置和终端
CN107423586A (zh) * 2017-07-31 2017-12-01 北京深思数盾科技股份有限公司 软件保护方法和软件保护装置
CN109558745A (zh) * 2017-09-25 2019-04-02 赖育承 对电子档进行保护的方法及其电脑程序产品
CN108089978A (zh) * 2017-11-28 2018-05-29 华北电力大学(保定) 一种分析asp.net应用软件性能及故障的诊断方法
CN108089978B (zh) * 2017-11-28 2021-04-06 华北电力大学(保定) 一种分析asp.net应用软件性能及故障的诊断方法
CN109213491A (zh) * 2018-09-19 2019-01-15 东信和平科技股份有限公司 NB-IoT通信模组的二次开发方法、装置及存储介质
CN111104668A (zh) * 2019-12-23 2020-05-05 江苏恒宝智能系统技术有限公司 一种安全认证函数返回值的实现方法及应用
CN111104668B (zh) * 2019-12-23 2022-03-01 恒宝股份有限公司 一种安全认证函数返回值的实现方法及应用
CN112527677A (zh) * 2020-12-23 2021-03-19 北京深思数盾科技股份有限公司 应用程序的保护方法及电子设备
CN112527677B (zh) * 2020-12-23 2021-09-24 北京深思数盾科技股份有限公司 应用程序的保护方法及电子设备
CN113051088A (zh) * 2021-03-31 2021-06-29 广州锦行网络科技有限公司 程序加载方法、装置、设备及计算机可读介质

Also Published As

Publication number Publication date
CN103955635B (zh) 2017-02-15

Similar Documents

Publication Publication Date Title
CN103955635B (zh) 一种对.net可执行程序进行保护的方法和系统
Wang et al. Towards memory safe enclave programming with rust-sgx
Balachandran et al. Control flow obfuscation for android applications
Eilam Reversing: secrets of reverse engineering
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
Rubinov et al. Automated partitioning of android applications for trusted execution environments
Borrello et al. Constantine: Automatic side-channel resistance using efficient control and data flow linearization
US8645930B2 (en) System and method for obfuscation by common function and common function prototype
Low Java control flow obfuscation
Rosenmüller et al. Flexible feature binding in software product lines
US8429637B2 (en) System and method for conditional expansion obfuscation
US20100058301A1 (en) System and method for branch extraction obfuscation
Hou et al. Three control flow obfuscation methods for Java software
JP2008542927A (ja) 外部プログラム環境からの遅延束縛関数の呼び出し
Van Ginkel et al. Automatically generating secure wrappers for SGX enclaves from separation logic specifications
US9317682B1 (en) Library-based method for information flow integrity enforcement and robust information flow policy development
Cimato et al. Overcoming the obfuscation of Java programs by identifier renaming
Drape Obfuscation of Abstract Data− Types
CN103425911B (zh) 一种增强软件保护易用性的方法
Lin et al. Solsee: a source-level symbolic execution engine for solidity
Krüger et al. Cognicrypt gen: generating code for the secure usage of crypto apis
Ortin et al. The DSAW aspect-oriented software development platform
Aronsson et al. Hardware software co-design in Haskell
Cipresso et al. Software reverse engineering
Liem et al. A compiler-based infrastructure for software-protection

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information

Address after: 100872 room 1706, building 59, Zhongguancun street, Haidian District, Beijing

Applicant after: BEIJING SENSESHIELD TECHNOLOGY Co.,Ltd.

Address before: 100872 room 1706, building 59, Zhongguancun street, Haidian District, Beijing

Applicant before: BEIJING SHENSI SHUDUN TECHNOLOGY Co.,Ltd.

COR Change of bibliographic data
CB02 Change of applicant information

Address after: 100193 Beijing, Haidian District, East West Road, No. 10, East Hospital, building No. 5, floor 5, layer 510

Applicant after: BEIJING SENSESHIELD TECHNOLOGY Co.,Ltd.

Address before: 100872 room 1706, building 59, Zhongguancun street, Haidian District, Beijing

Applicant before: BEIJING SENSESHIELD TECHNOLOGY Co.,Ltd.

COR Change of bibliographic data
C14 Grant of patent or utility model
GR01 Patent grant
CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: 100193 5th floor 510, No. 5 Building, East Yard, No. 10 Wangdong Road, Northwest Haidian District, Beijing

Patentee after: Beijing Shendun Technology Co.,Ltd.

Address before: 100193 5th floor 510, No. 5 Building, East Yard, No. 10 Wangdong Road, Northwest Haidian District, Beijing

Patentee before: BEIJING SENSESHIELD TECHNOLOGY Co.,Ltd.