软件保护方法和装置与流程

文档序号:12035020阅读:388来源:国知局
软件保护方法和装置与流程

本发明涉及计算机应用技术,特别是涉及一种软件保护方法和装置。



背景技术:

.net代码即il代码,由.net运行时进行解释执行,由.net编译器将源代码编译为il代码。通过现有工具可自动反编译il代码并还原为源代码形式。基于上述原因,破解者通常能够还原软件的核心算法,或通过修改代码等达到破解软件的目的。

目前,对.net软件进行保护的方法有以下几种:

第一种是通过对.net符号名称进行混淆,到达反编译后难以阅读的目的。由于这种方法不能对代码逻辑进行处理,因此,可以通过对算法的分析来破解软件。

第二种是对代码逻辑进行混淆。由于目前混淆的程度还比较低,算法逻辑依然可以阅读,无法抵御破解者攻击。

第三种是对.net软件进行压缩、加密,软件执行前将其解压、解密再执行.net代码。在这种保护方式下,可以通过转存得到原始.net代码。

由此可见,上述现有的.net软件保护方法,无法有效确保软件的安全性。



技术实现要素:

有鉴于此,本发明的主要目的在于提供一种软件保护方法和装置,可以提高软件的安全性。

为了达到上述目的,本发明提出的技术方案为:

一种软件保护方法,包括:

a、根据.net代码,生成相应的.net数据结构,从所述.net数据结构中抽取待保护方法代码;

b、将所述待保护的方法代码转换为虚拟化代码;

c、在抽取所述待保护方法代码的位置处添加用于调用x86/x64虚拟机的指令代码,所述x86/x64虚拟机用于执行所述虚拟化代码。

一种软件保护装置,包括:

抽取单元,用于根据.net代码,生成相应的.net数据结构,从所述.net数据结构中抽取待保护方法代码;

转换单元,用于将所述待保护的方法代码转换为虚拟化代码;

替换单元,用于在抽取所述待保护方法代码的位置处添加用于调用x86/x64虚拟机的指令代码,所述x86/x64虚拟机用于执行所述虚拟化代码。

综上所述,本发明提出的软件保护方法和装置,通过对.net代码中需要保护方法的代码进行处理,将需要保护方法的.net代码转换为虚拟化代码,然后将需要保护方法的.net代码替换为调用x86/x64虚拟机的指令代码。这样,经过上述处理的.net代码运行后,当执行到要保护方法时,就会在x86/x64虚拟机中执行相应的虚拟化代码,在此期间被保护的方法代码将无法被反编译和调试,因此可以提高.net程序的安全性,防止恶意篡改,对软件版权起到了保护作用。

附图说明

图1为本发明实施例的方法流程示意图;

图2为经过本发明实施例处理后的软件程序运行过程示意图;

图3为本发明实施例的装置结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。

本发明的核心思想是:将x86/x64本地代码的虚拟机保护技术移植到.net保护,即通过将.net代码转换为x86/x64虚拟机能够执行的代码,且.net运行时调用x86/x64虚拟机执行算法逻辑,以达到无法有效还原.net代码的目的,从而可以提高软件的安全性。

图1为本发明实施例的方法流程示意图,如图1所示,该实施例实现的软件保护方法主要包括:

步骤101、根据.net代码,生成相应的.net数据结构,从所述.net数据结构中抽取待保护方法代码。

较佳地,所述根据所述.net代码,生成相应的.net数据结构包括:

获取所述.net代码的.net元数据;

解析所述.net元数据,根据所包含的方法函数体,生成相应的.net数据结构。

较佳地,所述生成相应的.net数据结构之后还包括:

将所述x86/x64虚拟机添加至所述.net数据结构的全局数组中;

将内存加载方法增加到所述.net数据结构中,所述内存加载方法用于获取虚拟机入口地址并加载所述x86/x64虚拟机;

如果所述.net数据结构中不存在.cctor方法,则将.cctor方法添加至所述.net数据结构中,其中,所述.cctor方法中包括第二call代码和marshal库;

所述第二call代码用于调用所述内存加载方法;

所述marshal库用于将虚拟机入口地址作为参数生成调用虚拟机的方法,并将虚拟机方法保存到全局变量中。

上述.cctor方法用于对x86/x64虚拟机进行初始化,是.net的全局构造方法,该方法是.net程序运行时第一个运行的方法。如已存在.cctor方法则不需要添加,否则添加至所述.net数据结构中。

步骤102、将所述待保护的方法代码转换为虚拟化代码。

这里,所述虚拟化代码指的是x86/x64虚拟机能够执行的代码。

较佳地,本步骤具体包括:

步骤1021、根据分块标准,将所述待保护的方法代码分成若干子代码块。

本步骤,用于对待保护的方法代码进行分块,以便在后续步骤中,针对每块代码分别执行虚拟化操作。

较佳地,所述分块标准包括:

将跳转指令的目标地址作为块首,或者,将call指令的下一条指令作为块首。

步骤1022、将每个所述子代码块转换为虚拟化代码。

较佳地,可以采用下述方法将每个所述子代码块转换为虚拟化代码:

步骤x1、将所述子代码块转换成ir指令;

步骤x2、将所述ir指令转换为虚拟化代码,其中,所述虚拟化代码被封装成数组并且保存在全局变量中。

步骤103、在抽取所述待保护方法代码的位置处添加用于调用x86/x64虚拟机的指令代码,所述x86/x64虚拟机用于执行所述虚拟化代码。

较佳地,所述调用x86/x64虚拟机的指令代码包括虚拟化代码参数、装箱代码、用于调用虚拟机方法的第一call代码和拆箱代码。

这里,虚拟化代码参数是所述x86/x64虚拟机执行所书虚拟化代码过程中所需的参数。

所述装箱代码指用于封装虚拟化代码参数、变量的box指令代码,形成参数表;

所述第一call代码是指调用虚拟机方法,以便利用x86/x64虚拟机执行虚拟化代码。

所述拆箱代码与所述装箱代码对应,用于将虚拟化代码执行后保存到参数表中的结果通过unbox指令进行拆箱,还原参数、变量,以便于继续执行其它il代码。

较佳地,步骤103之后还包括,重新编译所述.net数据结构,利用编译后的.net数据结构生成.net元数据,作为所述.net代码新的.net元数据。

通过上述实施例可以看出,本发明中通过将需要保护的方法的.net代码转换为x86/x64虚拟机能够执行的代码,使得当.net代码执行到需要保护的方法时将通过x86/x64虚拟机执行相应的虚拟化代码,这样,由于在此期间被保护的方法代码将无法被反编译和调试,因此可以有效提高.net程序的安全性,防止对待保护方法代码的恶意篡改。

下面通过本发明的一具体实现过程对上述方案的具体实现做进一步的阐述:

1、分析需要保护软件的pe文件格式,获取.net元数据等信息。

2、利用.net解析器,进一步解析.net元数据,生成方法等.net数据结构。

3、利用.net编译器,基于上述.net数据结构执行下述操作:

a)添加.cctor方法,如存在原始.cctor方法则不需要添加。

b)将x86、x64虚拟机代码放到全局数组中。

c)合并il内存加载方法到上述.net数据结构中。

d)在.cctor方法中添加call代码,该call代码用于调用步骤c中的内存加载方法。

e)在.cctor方法中添加用于生成调用虚拟机方法的marshal库,marshal库将虚拟机入口地址作为参数,生成调用虚拟机对的方法,,并保存于全局变量中。

f)遍历每个需要保护的方法,对每个需要保护的方法实施下述步骤:

i.将需要保护的方法代码进行分块,分块标准为:

1)将跳转指令的目标地址作为块首;或者,

2)将call指令的下一条指令作为块首。

ii.针对每个代码块实施虚拟化操作,其中,所述虚拟化操作包括:

1)将所述子代码块转换成ir指令。

如:il指令ldc.i4.1转换到ir指令为ir_push1。

2)将所述ir指令转换为虚拟化代码。

如:ir指令ir_push1转换到vm_code为vm_push_imm8参数为1。

3)将虚拟化代码封装成数组保存到全局变量中。

4)移除被虚拟化的子代码块。

5)添加参数、变量装箱代码。

6)添加call代码,该call代码用于调用虚拟机方法。

7)添加参数、变量拆箱代码。

4、利用.net连接器,基于经过编译后的上述.net数据结构,重新生成.net元数据,作为新的.net元数据。

图2为经过上述实施例处理后所得到的软件程序运行过程示意图。从图2中可以看出,利用本发明生成的.net元数据构建.net运行环境后,在执行上述经过处理的.net代码时,当执行到需要保护的方法时,即执行到用于调用x86/x64虚拟机的指令代码时,会根据该指令代码所包括的虚拟化代码参数、装箱代码、用于调用虚拟机方法的第一call代码和拆箱代码,在x86/x64虚拟机中执行相应的虚拟化代码,完成后再退出x86/x64虚拟机,继续执行后续的.net代码,由于在x86/x64虚拟机中执行虚拟化代码期间,被保护的方法代码无法被反编译和调试,因此可以提高.net程序的安全性,防止恶意篡改,对软件版权起到了保护作用。

图3为与上述方法对应的一种软件保护装置结构示意图,如图3所示,该装置包括:

抽取单元301,用于根据.net代码,生成相应的.net数据结构,从所述.net数据结构中抽取待保护方法代码;

转换单元302,用于将所述待保护的方法代码转换为虚拟化代码;

替换单元303,用于在抽取所述待保护方法代码的位置处添加用于调用x86/x64虚拟机的指令代码,所述x86/x64虚拟机用于执行所述虚拟化代码。

较佳地,所述调用x86/x64虚拟机的指令代码包括虚拟化代码参数、装箱代码、用于调用虚拟机方法的第一call代码和拆箱代码。

较佳地,所述抽取单元301,进一步用于在所述生成相应的.net数据结构之后,将所述x86/x64虚拟机添加至所述.net数据结构的全局数组中;将内存加载方法增加到所述.net数据结构中,所述内存加载方法用于获取虚拟机入口地址并加载所述x86/x64虚拟机;如果所述.net数据结构中不存在.cctor方法,则将.cctor方法添加至所述.net数据结构中,其中,所述.cctor方法中包括第二call代码和marshal库;所述第二call代码用于调用所述内存加载方法;所述marshal库用于将虚拟机入口地址作为参数生成调用虚拟机的方法,并将虚拟机方法保存到全局变量中。

较佳地,所述抽取单元301,用于获取所述.net代码的.net元数据;解析所述.net元数据,根据所包含的方法函数体,生成相应的.net数据结构。

较佳地,所述转换单元302,用于根据分块标准,将所述待保护的方法代码分成若干子代码块;将每个所述子代码块转换为虚拟化代码。

较佳地,所述分块标准包括:跳转指令的目标地址作为块首,call指令的下一条指令作为块首。

较佳地,所述转换单元302,用于将所述子代码块转换成ir指令;将所述ir指令转换为虚拟化代码,其中,所述虚拟化代码被封装成数组并且保存在全局变量中。

较佳地,所述替换单元303,进一步用于在所述添加用于调用x86/x64虚拟机的指令代码之后,重新编译所述.net数据结构,利用编译后的.net数据结构生成.net元数据,作为所述.net代码新的.net元数据。

综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1