基于软件保护装置的软件加壳方法、系统及软件保护方法转让专利

申请号 : CN201210353459.0

文献号 : CN102930204B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙吉平韩勇

申请人 : 北京深思数盾科技股份有限公司

摘要 :

本发明公开了一种基于软件保护装置的软件加壳方法,包括以下步骤:S1:在被保护软件的全部代码段中查找目标代码段;S2:将目标代码段提取到软件保护装置中进行存储;S3:在被保护软件的全部代码段中,将目标代码段替换为包括跳转指令的代码段或者用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,并对被保护软件进行加壳。本发明还公开了一种软件加壳系统及软件保护方法。加壳软件运行时,由于目标代码段存储在软件保护装置内,所以没有将被保护软件的所有代码和数据都暴露在内存中,加大了对软件的保护强度。

权利要求 :

1.一种基于软件保护装置的软件加壳方法,其特征在于,包括以下步骤:S1:在被保护软件的全部代码段中查找与单个函数对应的目标代码段;

S2:将所述目标代码段提取到所述软件保护装置中进行存储;

S3:在所述被保护软件的全部代码段中,将所述目标代码段替换为包括跳转指令的代码段或者用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,所述跳转指令指向用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,并对所述被保护软件进行加壳;

所述目标代码段外的其他代码段中不存在跳转到所述目标代码段内部的指令。

2.根据权利要求1所述的基于软件保护装置的软件加壳方法,其特征在于,所述步骤S2进一步包括:将所述目标代码段发送至所述软件保护装置,并存储在所述软件保护装置的存储区内。

3.根据权利要求1所述的基于软件保护装置的软件加壳方法,其特征在于,所述步骤S3具体为:S301:向所述被保护软件中注入壳代码;

S302:在所述被保护软件的全部代码段中,将所述目标代码段替换为用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;

S303:将所述被保护软件的全部代码段进行加密或压缩。

4.根据权利要求1所述的基于软件保护装置的软件加壳方法,其特征在于,所述步骤S3具体为:S311:在所述被保护软件的全部代码段中,将所述目标代码段替换为用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;

S312:向所述被保护软件中注入壳代码;

S313:将所述被保护软件的全部代码段进行加密或压缩。

5.根据权利要求1所述的基于软件保护装置的软件加壳方法,其特征在于,所述步骤S3具体为:S321:向所述被保护软件中注入壳代码,所述壳代码中包含所述用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;

S322:在所述被保护软件的全部代码段中,将所述目标代码段替换为所述包括跳转指令的代码段;

S323:将所述被保护软件的全部代码段进行加密或压缩。

6.一种基于软件保护装置的软件加壳系统,其特征在于,包括:查找模块,其用于在被保护软件的全部代码段中查找与单个函数对应的目标代码段;

提取模块,其用于将所述目标代码段提取到所述软件保护装置中进行存储;

替换模块,其用于在所述被保护软件的全部代码段中,将所述目标代码段替换为包括跳转指令的代码段或者用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,所述跳转指令指向用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;

加壳模块,其用于对所述被保护软件进行加壳;

所述目标代码段外的其他代码段中不存在跳转到所述目标代码段内部的指令。

7.一种基于软件保护装置的软件保护方法,其特征在于,包括以下步骤:S401:运行壳代码,解密或解压缩被保护软件的全部代码段,跳转到所述被保护软件的全部代码段的原始入口点继续执行;

S402:执行到用于从所述软件保护装置中提取目标代码段并将其还原到原始位置的代码段时访问所述软件保护装置,读取存储在所述软件保护装置中的目标代码段并将其写到所述用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段的位置,所述目标代码段为预先在所述被保护软件的全部代码段中查找到并提取到所述软件保护装置中存储的对应于单个函数的代码段;

S403:所述目标代码段的第一条指令开始执行,所述目标代码段执行完后继续向下执行;

所述目标代码段外的其他代码段中不存在跳转到所述目标代码段内部的指令。

8.一种基于软件保护装置的软件保护方法,其特征在于,包括以下步骤:S501:运行壳代码,解密或解压缩被保护软件的全部代码段,跳转到所述被保护软件的全部代码段的原始入口点继续执行;

S502:执行到包括跳转指令的代码段时跳转到用于从所述软件保护装置中提取目标代码段并将其还原到原始位置的代码段,所述跳转指令指向所述用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;

S503:访问所述软件保护装置,读取存储在所述软件保护装置中的目标代码段并将其写到所述包括跳转指令的代码段的位置,所述目标代码段为预先在所述被保护软件的全部代码段中查找到并提取到所述软件保护装置中存储的对应于单个函数的代码段;

S504:所述目标代码段的第一条指令开始执行,所述目标代码段执行完后继续向下执行;

所述目标代码段外的其他代码段中不存在跳转到所述目标代码段内部的指令。

说明书 :

基于软件保护装置的软件加壳方法、系统及软件保护方法

技术领域

[0001] 本发明涉及计算机软件保护技术领域,特别涉及一种基于软件保护装置的软件加壳方法、系统及软件保护方法。

背景技术

[0002] 现有技术中,对软件进行加壳保护就是在被保护软件中插入一段代码(即壳代码),并将被保护软件的入口点即软件执行的第一条指令指向壳代码,然后把被保护软件的代码和数据通过加密或压缩等方式进行保护。经过加壳处理的软件在运行时首先会进入到壳代码中,在壳代码中把被加密或压缩的原始代码还原回来,然后再跳转到被保护软件的原始的入口点继续执行。
[0003] 现有技术中还提供了一种基于软件保护装置对软件进行加壳保护的方式,即在壳代码中加入对软件保护装置的访问,并在访问软件保护装置之后通过判断某些条件是否成立来确定软件是否可以继续执行,最简单的判断条件就是软件保护装置是否存在,即若找到了软件保护装置,则允许软件执行,若找不到软件保护装置,就不让软件继续运行。
[0004] 然而,现有技术中的软件加壳保护方式都有一个弱点,即加壳的被保护软件运行时,在执行完壳代码跳转到被保护软件的原始入口点之后,被保护软件的所有代码和数据都暴露在内存中了,通过一些工具就可以很容易地将其转储出来,导致被保护软件容易被破解,也就是常说的对软件进行脱壳。

发明内容

[0005] 本发明的一个目的是提供一种基于软件保护装置的软件加壳方法,以解决采用现有技术中的加壳方法处理的被保护软件运行时,在执行完壳代码跳转到被保护软件的原始入口点之后因被保护软件的所有代码和数据都暴露在内存中而导致的被保护软件容易被破解的问题。
[0006] 为了实现上述目的,本发明提供了一种基于软件保护装置的软件加壳方法,包括以下步骤:
[0007] S1:在被保护软件的全部代码段中查找目标代码段;
[0008] S2:将所述目标代码段提取到所述软件保护装置中进行存储;
[0009] S3:在所述被保护软件的全部代码段中,将所述目标代码段替换为包括跳转指令的代码段或者用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,所述跳转指令指向用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,并对所述被保护软件进行加壳。
[0010] 作为优选,所述步骤S1中,所述目标代码段为与单个函数对应的代码段或者与单个函数对应的代码段中的一段。
[0011] 作为优选,所述步骤S2进一步包括:将所述目标代码段发送至所述软件保护装置,并存储在所述软件保护装置的存储区内。
[0012] 作为优选,所述步骤S3具体为:
[0013] S301:向所述被保护软件中注入壳代码;
[0014] S302:在所述被保护软件的全部代码段中,将所述目标代码段替换为用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;
[0015] S303:将所述被保护软件的全部代码段进行加密或压缩。
[0016] 作为优选,所述步骤S3具体为:
[0017] S311:在所述被保护软件的全部代码段中,将所述目标代码段替换为用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;
[0018] S312:向所述被保护软件中注入壳代码;
[0019] S313:将所述被保护软件的全部代码段进行加密或压缩。
[0020] 作为优选,所述步骤S3具体为:
[0021] S321:向所述被保护软件中注入壳代码,所述壳代码中包含所述用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;
[0022] S322:在所述被保护软件的全部代码段中,将所述目标代码段替换为所述包括跳转指令的代码段;
[0023] S323:将所述被保护软件的全部代码段进行加密或压缩。
[0024] 本发明的另一个目的是提供一种基于软件保护装置的软件加壳系统,以解决采用现有技术中的加壳系统处理的被保护软件运行时,在执行完壳代码跳转到被保护软件的原始入口点之后因被保护软件的所有代码和数据都暴露在内存中而导致的被保护软件容易被破解的问题。
[0025] 为了实现上述目的,本发明提供了一种基于软件保护装置的软件加壳系统,包括:
[0026] 查找模块,其用于在被保护软件的全部代码段中查找目标代码段;
[0027] 提取模块,其用于将所述目标代码段提取到所述软件保护装置中进行存储;
[0028] 替换模块,其用于在所述被保护软件的全部代码段中,将所述目标代码段替换为包括跳转指令的代码段或者用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段,所述跳转指令指向用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;
[0029] 加壳模块,其用于对所述被保护软件进行加壳。
[0030] 作为优选,所述查找模块具体用于在被保护软件的全部代码段中查找与单个函数对应的代码段作为目标代码段或者查找与单个函数对应的代码段中的一段作为目标代码段。
[0031] 本发明的又一个目的是提供一种软件保护方法,以解决现有技术中的加壳软件运行时因所有代码和数据都暴露在内存中而导致的被保护软件容易被破解的问题。
[0032] 为了实现上述目的,本发明提供了一种基于软件保护装置的软件保护方法,包括以下步骤:
[0033] S401:运行壳代码,解密或解压缩被保护软件的全部代码段,跳转到所述被保护软件的全部代码段的原始入口点继续执行;
[0034] S402:执行到用于从所述软件保护装置中提取目标代码段并将其还原到原始位置的代码段时访问所述软件保护装置,读取存储在所述软件保护装置中的目标代码段并将其写到所述用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段的位置,所述目标代码段为预先在所述被保护软件的全部代码段中查找到并提取到所述软件保护装置中存储的代码段;
[0035] S403:所述目标代码段的第一条指令开始执行,所述目标代码段执行完后继续向下执行。
[0036] 为了实现上述目的,本发明提供了另一种基于软件保护装置的软件保护方法,包括以下步骤:
[0037] S501:运行壳代码,解密或解压缩被保护软件的全部代码段,跳转到所述被保护软件的全部代码段的原始入口点继续执行;
[0038] S502:执行到包括跳转指令的代码段时跳转到用于从所述软件保护装置中提取目标代码段并将其还原到原始位置的代码段,所述跳转指令指向所述用于从所述软件保护装置中提取所述目标代码段并将其还原到原始位置的代码段;
[0039] S503:访问所述软件保护装置,读取存储在所述软件保护装置中的目标代码段并将其写到所述包括跳转指令的代码段的位置,所述目标代码段为预先在所述被保护软件的全部代码段中查找到并提取到所述软件保护装置中存储的代码段;
[0040] S504:所述目标代码段的第一条指令开始执行,所述目标代码段执行完后继续向下执行。
[0041] 与现有技术相比,本发明具有以下有益效果:
[0042] 1)采用本发明提供的基于软件保护装置的软件加壳方法及系统加壳过的软件运行时,在执行完壳代码并跳转到被保护软件的原始入口点后,由于被保护软件的部分代码段仍然存储在软件保护装置内,所以没有将被保护软件的所有代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度;
[0043] 2)本发明提供的基于软件保护装置的软件保护方法中,由于被保护软件的部分代码段存储在软件保护装置内,加壳软件运行时没有将代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度。

附图说明

[0044] 图1为本发明实施例一的软件加壳方法的流程示意图;
[0045] 图2为采用实施例一的软件加壳方法对软件进行加壳处理的示意图;
[0046] 图3为采用实施例一的软件加壳方法加壳过的软件运行时的流程示意图;
[0047] 图4为本发明实施例二的软件加壳方法的流程示意图;
[0048] 图5为本发明实施例三的软件加壳方法的流程示意图;
[0049] 图6为采用实施例三的软件加壳方法对软件进行加壳处理的示意图;
[0050] 图7为采用实施例三的软件加壳方法加壳过的软件运行时的流程示意图;
[0051] 图8为本发明实施例四的软件加壳系统的结构框图。

具体实施方式

[0052] 下面结合附图对本发明的具体实施例进行详细说明。
[0053] 实施例一:
[0054] 如图1和图2所示,实施例一的基于软件保护装置的软件加壳方法包括以下步骤:
[0055] S1:在被保护软件的全部代码段A中查找目标代码段C;
[0056] 由于在后续步骤中目标代码段C要被替换成一段别的代码,因此目标代码段C要满足以下要求:被保护软件中在目标代码段C之外不能有跳转到目标代码段C内部(即中间某处)的指令;
[0057] 由于目标代码段C要被提取到软件保护装置E内,所以目标代码段C只能从第一条指令开始执行,因而在被保护软件的全部代码段A中,除目标代码段C以外,不能存在其他可以直接跳转到目标代码段C中间的代码。限于此条件,将整个函数作为目标代码段就是选取目标代码段C的一种最简单的形式,但是也可以采用选取一个函数中的某一段作为目标代码段C的方式。因此,在实施例一中,作为一种优选实施方式,查找过程以单个函数为单位,将对应于单个函数的一个代码段或者其中的一段提取到软件保护装置E内作为目标代码段C,这样就保证了除对应于该单个函数的代码段外的其他代码段中不存在跳转到对应于该单个函数的代码段内部的指令。
[0058] S2:将目标代码段C提取到软件保护装置E中进行存储;
[0059] 提取的过程其实就是将目标代码段C作为一段数据直接发送给软件保护装置E,并存储在软件保护装置E的存储区内;由于软件保护装置E可以通过硬件保证存储在其中的数据不会被轻易读取出来,所以可以将目标代码段C以明文数据的形式存储在软件保护装置E内,而不用再对目标代码段C进行加密存储。
[0060] S301:向被保护软件中注入壳代码B;
[0061] 向被保护软件中注入壳代码的技术属于现有技术中软件加壳的常规技术,在此不再赘述。
[0062] S302:在被保护软件的全部代码段A中,将目标代码段C替换为用于从软件保护装置E中提取目标代码段C并将其还原到原始位置的代码段D;
[0063] 代码段D的作用主要是将软件保护装置E中存储的目标代码段C读取出来并还原到代码段D处,即从软件保护装置E中读取目标代码段C,并用读取的目标代码段C替换当前的代码段D。
[0064] S303:将被保护软件的全部代码段A进行加密或压缩;
[0065] 加密和压缩过程也属于现有技术中软件加壳的常规技术,不属于本发明的构思,在此也不再赘述,加密和压缩过程当然也可以采用其他现有技术中的具有类似功能的处理过程进行替换。
[0066] 如图3所示,采用实施例一的软件加壳方法加壳过的软件运行时的步骤为:
[0067] S401:壳代码B首先执行,解密或解压缩代码段A,然后跳转到代码段A的原始入口点继续执行;
[0068] S402:执行到代码段D时,代码段D访问软件保护装置E,从软件保护装置E中读取代码段C并填充到代码段D的位置;
[0069] S403:代码段C的第一条指令开始执行,代码段C执行完后继续向下执行。
[0070] 可以看出,跟没有将目标代码段C提取到软件保护装置E中时相比,软件的执行效果是一样的。
[0071] 采用实施例一的软件加壳方法加壳过的软件运行时,在执行完壳代码B并跳转到被保护软件的原始入口点后,由于被保护软件的部分代码段仍然存储在软件保护装置E内,所以没有将被保护软件的所有代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度。
[0072] 实施例二:
[0073] 如图4所示,实施例二的基于软件保护装置的软件加壳方法包括以下步骤:
[0074] S1:在被保护软件的全部代码段A中查找目标代码段C;
[0075] S2:将目标代码段C提取到软件保护装置E中进行存储;
[0076] S311:在被保护软件的全部代码段A中,将目标代码段C替换为用于从软件保护装置E中提取目标代码段C并将其还原到原始位置的代码段D;
[0077] S312:向被保护软件中注入壳代码B;
[0078] S313:将被保护软件的全部代码段A进行加密或压缩。
[0079] 可以看出,实施例二的软件加壳方法与实施例一的软件加壳方法的区别仅在于对第三和第四个步骤的执行顺序进行了调换。
[0080] 采用实施例二的软件加壳方法加壳过的软件运行时的步骤同样为:
[0081] 壳代码B首先执行,解密或解压缩代码段A,然后跳转到代码段A的原始入口点继续执行;
[0082] 执行到代码段D时,代码段D访问软件保护装置E,从E中读取代码段C并填充到代码段D的位置;
[0083] 代码段C的第一条指令开始执行,代码段C执行完后继续向下执行。
[0084] 实施例三:
[0085] 如图5和图6所示,实施例三的基于软件保护装置的软件加壳方法包括以下步骤:
[0086] S1:在被保护软件的全部代码段A中查找目标代码段C;
[0087] 由于在后续步骤中目标代码段C要被替换成一段别的代码,因此目标代码段C要满足以下要求:被保护软件中在目标代码段C之外不能有跳转到目标代码段C内部(即中间某处)的指令;
[0088] 由于目标代码段C要被提取到软件保护装置E内,所以目标代码段C只能从第一条指令开始执行,因而在被保护软件的全部代码段A中,除目标代码段C以外,不能存在其他可以直接跳转到目标代码段C中间的代码。限于此条件,将整个函数作为目标代码段就是选取目标代码段C的一种最简单的形式,但是也可以采用选取一个函数中的某一段作为目标代码段C的方式。因此,在实施例三中,作为一种优选实施方式,查找过程以单个函数为单位,将对应于单个函数的一个代码段或者其中的一段提取到软件保护装置E内作为目标代码段C,这样就保证了除对应于该单个函数的代码段外的其他代码段中不存在跳转到对应于该单个函数的代码段内部的指令。
[0089] S2:将目标代码段C提取到软件保护装置E中进行存储;
[0090] 提取的过程其实就是将目标代码段C作为一段数据直接发送给软件保护装置E,并存储在软件保护装置E的存储区内;由于软件保护装置E可以通过硬件保证存储在其中的数据不会被轻易读取出来,所以可以将目标代码段C以明文数据的形式存储在软件保护装置E内,而不用再对目标代码段C进行加密存储。
[0091] S321:向被保护软件中注入壳代码B,其中包含用于从软件保护装置E中提取目标代码段C并将其还原到原始位置的代码段D;
[0092] 向被保护软件中注入壳代码的技术属于现有技术中软件加壳的常规技术,在此不再赘述。
[0093] S322:在被保护软件的全部代码段A中,将目标代码段C替换为包括跳转指令的代码段C’,所述跳转指令指向代码段D;
[0094] 代码段D的作用主要是将软件保护装置E中存储的目标代码段C读取出来并还原到包括跳转指令的代码段C’处,即从软件保护装置E中读取目标代码段C,并用读取的目标代码段C替换代码段C’;这里将目标代码段C替换为代码段C’的方式为:将目标代码段C的第一条指令修改为所述跳转指令,跳转目标指定为代码段D,代码段C’处第一条指令之后都以空指令填充。
[0095] S323:将被保护软件的全部代码段A进行加密或压缩;
[0096] 加密和压缩过程也属于现有技术中软件加壳的常规技术,不属于本发明的构思,在此也不再赘述,加密和压缩过程当然也可以采用其他现有技术中的具有类似功能的处理过程进行替换。
[0097] 如图7所示,采用实施例三的软件加壳方法加壳过的软件运行时的步骤为:
[0098] S501:壳代码B首先执行,解密或解压缩代码段A,然后跳转到代码段A的原始入口点继续执行;
[0099] S502:执行到代码段C’时跳转到代码段D;
[0100] 由于代码段C’的第一条指令是跳转到代码段D,所以接下来直接跳转到代码段D进行访问软件保护装置E;
[0101] S503:代码段D访问软件保护装置E,从软件保护装置E中读取代码段C并填充到代码段C’的位置;
[0102] S504:代码段D执行完之后跳转到代码段C的第一条指令开始执行,代码段C执行完后继续向下执行。
[0103] 可以看出,跟没有将目标代码段C提取到软件保护装置E中时相比,软件的执行效果是一样的。
[0104] 采用实施例三的软件加壳方法加壳过的软件运行时,在执行完壳代码B并跳转到被保护软件的原始入口点后,由于被保护软件的部分代码段仍然存储在软件保护装置E内,所以没有将被保护软件的所有代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度。
[0105] 实施例四:
[0106] 如图8所示,实施例四的基于软件保护装置的软件加壳系统包括:
[0107] 查找模块1,其用于在被保护软件的全部代码段中查找目标代码段,所述目标代码段外的其他代码段中不存在跳转到所述目标代码段内部的指令;
[0108] 由于采用实施例四的软件加壳系统对软件进行处理时,目标代码段要被替换成一段别的代码,因此查找的目标代码段要满足以下要求:被保护软件中在目标代码段之外不能有跳转到目标代码段内部(即中间某处)的指令;
[0109] 在实施例四中,作为一种优选实施方式,查找模块1查找目标代码段时以单个函数为单位,将对应于单个函数的一个代码段提取到软件保护装置内,这样就保证了除对应于该单个函数的代码段外的其他代码段中不存在跳转到对应于该单个函数的代码段内部的指令。
[0110] 提取模块2,其用于将所述目标代码段提取到所述软件保护装置中进行存储;
[0111] 提取模块2提取目标代码段的过程其实就是将目标代码段作为一段数据直接发送给软件保护装置,并存储在软件保护装置的存储区内;由于软件保护装置可以通过硬件保证存储在其中的数据不会被轻易读取出来,所以可以将目标代码段以明文数据的形式存储在软件保护装置内,而不用再对目标代码段进行加密存储。
[0112] 替换模块3,其用于在所述被保护软件的全部代码段中,将所述目标代码段替换为包括跳转指令的代码段或者用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段,所述跳转指令指向用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段;
[0113] 当替换模块3用于将所述目标代码段替换为用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段时,用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段的作用主要是将软件保护装置中存储的目标代码段读取出来并还原到用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段处,即从软件保护装置中读取目标代码段,并用读取的目标代码段替换用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段;
[0114] 当替换模块3用于将所述目标代码段替换为包括跳转指令的代码段时,用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段的作用主要是将软件保护装置中存储的目标代码段读取出来并还原到所述包括跳转指令的代码段处,即从软件保护装置中读取目标代码段,并用读取的目标代码段替换所述包括跳转指令的代码段;这里将目标代码段替换为所述包括跳转指令的代码段的方式为:将目标代码段的第一条指令修改为所述跳转指令,跳转目标指定为用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段,所述包括跳转指令的代码段处第一条指令之后都以空指令填充。
[0115] 壳代码注入模块4,其用于向所述被保护软件中注入壳代码。
[0116] 加密模块5,其用于将所述被保护软件的全部代码段进行加密。
[0117] 壳代码注入模块4和加密模块5都属于加壳模块,加壳模块属于现有技术中软件加壳的常规技术,不属于本发明的构思,在此也不再赘述;此处的加密模块5可以用压缩模块代替,所述压缩模块用于将所述被保护软件的全部代码段进行压缩;此外,加密模块5和压缩模块也可以采用其他现有技术中的具有类似功能的处理模块进行替换。
[0118] 采用实施例四的软件加壳系统加壳过的软件运行时,在执行完壳代码并跳转到被保护软件的原始入口点后,由于被保护软件的部分代码段仍然存储在软件保护装置内,所以没有将被保护软件的所有代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度。
[0119] 实施例五:
[0120] 本发明实施例五提供了一种基于软件保护装置的软件保护方法,包括以下步骤:
[0121] S401:运行壳代码,解密或解压缩被保护软件的全部代码段,跳转到所述被保护软件的全部代码段的原始入口点继续执行;
[0122] S402:执行到用于从所述软件保护装置中提取目标代码段并将其还原到原始位置的代码段时访问所述软件保护装置,读取存储在所述软件保护装置中的目标代码段并将其写到所述用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段的位置,所述目标代码段为预先在所述被保护软件的全部代码段中查找到并提取到所述软件保护装置中存储的代码段;
[0123] S403:所述目标代码段的第一条指令开始执行,所述目标代码段执行完后继续向下执行。
[0124] 实施例五的软件保护方法的流程可参考图3所示,这个流程即为采用实施例一的加壳方法加壳过的软件运行时的步骤。
[0125] 由于被保护软件的部分代码段存储在软件保护装置内,加壳软件运行时没有将代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度。
[0126] 实施例六:
[0127] 本发明实施例六提供了一种基于软件保护装置的软件保护方法,包括以下步骤:
[0128] S501:运行壳代码,解密或解压缩被保护软件的全部代码段,跳转到所述被保护软件的全部代码段的原始入口点继续执行;
[0129] S502:执行到包括跳转指令的代码段时跳转到用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段,所述跳转指令指向所述用于从软件保护装置中提取目标代码段并将其还原到原始位置的代码段;
[0130] S503:访问所述软件保护装置,读取存储在所述软件保护装置中的目标代码段并将其写到所述包括跳转指令的代码段的位置,所述目标代码段为预先在所述被保护软件的全部代码段中查找到并提取到所述软件保护装置中存储的代码段;
[0131] S504:所述目标代码段的第一条指令开始执行,所述目标代码段执行完后继续向下执行。
[0132] 实施例六的软件保护方法的流程可参考图7所示,这个流程即为采用实施例三的加壳方法加壳过的软件运行时的步骤。
[0133] 同样,由于被保护软件的部分代码段存储在软件保护装置内,加壳软件运行时没有将代码和数据都暴露在内存中,因此,被保护软件就不会在执行完壳代码之后被轻易地转储出来,加大了对软件的保护强度。
[0134] 以上实施例仅为本发明的示例性实施例,不用于限制本发明,本发明的保护范围由权利要求书限定。本领域技术人员可以在本发明的实质和保护范围内,对本发明做出各种修改或等同替换,这种修改或等同替换也应视为落在本发明的保护范围内。