一种保护可执行文件的方法及系统转让专利

申请号 : CN201210384792.8

文献号 : CN102890758B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙吉平韩勇

申请人 : 北京深思洛克软件技术股份有限公司

摘要 :

本申请公开了一种保护可执行文件的方法,将待保护的原始文件的输入表、入口点函数和资源数据等关键数据加密后存入文件保护装置,而清除原始文件中的相应数据;保护后的文件运行时,从文件保护装置中取出加密的数据进行解密后运行。本申请技术方案增加了对可执行文件进行反编译和分析的难度,大大提高了软件的安全性。本申请还公开了一种保护可执行文件的系统。

权利要求 :

1.一种保护可执行文件的方法,其特征在于,包括:

A、获取原始文件的输入表、入口点函数和资源数据,通过加密算法对输入表、入口点函数和资源数据进行加密后存入软件保护装置,清除原始文件中的输入表、入口点函数和资源数据,并构建新的输入表;新构建的输入表只包含装载动态链接库的函数和获取函数地址的函数;

B、将新构建的输入表、文件运行模块、数据存取模块、中转模块和解密模块注入到所述原始文件中,构建成为镜像文件;

C、镜像文件运行时,文件运行模块将镜像文件中的输入表中的输入地址表替换为中转模块的地址;

D、文件运行模块通过数据存取模块从文件保护装置中取出加密后的入口点函数;

E、解密模块对入口点函数进行解密并执行解密后的入口点函数,执行完毕后跳转到镜像文件继续执行。

2.根据权利要求1所述的方法,其特征在于,该方法进一步包括:

文件运行模块对原始文件中的资源相关函数进行挂钩,将资源相关函数转向到自定义的资源处理函数;

镜像文件调用资源相关函数时,挂钩后的自定义资源处理函数从文件保护装置内取出加密后的资源数据,解密后,返回解密后的资源数据。

3.根据权利要求1所述的方法,其特征在于,步骤E之后进一步包括:如果要调用应用程序接口,中转模块通过数据存取模块从文件保护装置内取出该应用程序接口对应的函数名称和所在动态链接库,中转模块通过解密模块解密函数所在的动态链接库名称及函数名称,根据解密后的动态链接库名称及函数名称获取函数地址,然后跳转到所述函数地址继续执行。

4.根据权利要求1所述的方法,其特征在于,所述加密算法为对称加密算法或者非对称算法。

5.根据权利要求1所述的方法,其特征在于,步骤A所述清除原始文件中的入口点函数进一步包括:将入口点函数用无效字符填充。

6.一种保护可执行文件的系统,其特征在于,包括输入表分析模块、入口点分析模块、资源分析模块、加密模块、数据存取模块、解密模块、文件运行模块、文件链接模块、中转模块和软件保护装置;

软件保护装置用于存储密钥,以及存储来自数据存取模块的加密后的数据;

所述输入表分析模块,用于分析需要被保护的原始文件的输入表,将原始文件的输入表输出至加密模块,清空原始文件中输入表的内容;

所述入口点分析模块,用于分析原始文件的入口点函数,将入口点函数的二进制代码输出至加密模块,将原始文件中的入口点函数清空;

所述资源分析模块,用于分析原始文件的资源数据,将文件的资源数据输出至加密模块,将原始文件的资源数据清空;

所述加密模块,用于对原始文件的数据进行加密,通过加密算法对输入表、入口点函数、资源数据进行加密,加密用的密钥通过与软件保护装置协商获得;

所述数据存取模块,用于将加密后的数据存入软件保护装置或者从软件保护装置中取出已保存的加密后的数据;

所述解密模块,负责对从软件保护装置内取出的加密后的数据进行解密;

所述文件运行模块,用于在镜像文件运行时,将镜像文件中的输入表中的输入地址表地址替换为中转模块地址;

所述文件链接模块,用于构建新的输入表,新构建的输入表只包含装载动态链接库的函数和获取函数地址的函数;以及用于将新构建的输入表、数据存取模块、解密模块、中转模块及文件运行模块注入到原始文件,构建成为镜像文件;

所述中转模块,用于在被调用时通过数据存取模块将加密后的输入表从软件保护装置中取出,通过解密模块对输入表解密,中转模块执行解密后的输入表中的函数。

7.根据权利要求6所述的系统,其特征在于,文件运行模块进一步用于对原始文件中的资源相关函数进行挂钩,将资源相关函数转向到自定义的资源处理函数;镜像文件调用资源相关函数时,挂钩后的自定义资源处理函数从文件保护装置内取出加密后的资源数据送入解密模块进行解密;解密后,返回解密后的资源数据。

8.根据权利要求6所述的系统,其特征在于,所述中转模块进一步用于调用数据存取模块从文件保护装置内取出函数所在的动态链接库名称和函数名称,通过解密模块对函数所在的动态链接库名称和函数进行解密,获取函数地址,跳转到获取函数地址处继续执行。

9.根据权利要求6所述的系统,其特征在于,所述加密算法为对称加密算法或者非对称算法。

10.根据权利要求6所述的系统,其特征在于,所述入口点分析模块进一步用于将原始文件中的入口点函数用无效字符填充。

说明书 :

一种保护可执行文件的方法及系统

技术领域

[0001] 本申请涉及计算机软件保护领域,特别涉及一种保护可执行文件的方法及系统。

背景技术

[0002] 计算机软件作为一种特殊的产品,由于其数字化的特征,从问世起就一直遭受盗版的困扰。盗版的存在不仅给软件开发者造成了巨大的损失,也极大地阻碍了整个软件行业的发展。可执行文件的输入表、入口点函数、资源数据作为盗版者分析的可执行文件的重要资料,历来是保护的重点对象,目前对这些数据的纯软件保护方式的抗分析性较差,很容易被反编译和分析出来,造成数据的泄露及破坏。

发明内容

[0003] 有鉴于此,本申请提供了一种可执行文件的保护装置及方法,将可执行文件的重要数据信息加密后存入保护装置内,只有当这些代码和数据被调用时才从保护装置内取出,增加了反编译和分析的难度,极大提高了软件的安全性。
[0004] 本申请实施例提供的一种保护可执行文件的方法,包括:
[0005] A、获取原始文件的输入表、入口点函数和资源数据,通过加密算法对输入表、入口点函数和资源数据进行加密后存入软件保护装置,清除原始文件中的输入表、入口点函数和资源数据,并构建新的输入表;新构建的输入表只包含装载动态链接库的函数和获取函数地址的函数;
[0006] B、将新构建的输入表、文件运行模块、数据存取模块、中转模块和解密模块注入到所述原始文件中,构建成为镜像文件;
[0007] C、镜像文件运行时,文件运行模块将镜像文件中的输入表中的输入地址表替换为中转模块的地址;
[0008] D、文件运行模块通过数据存取模块从文件保护装置中取出加密后的入口点函数;
[0009] E、解密模块对入口点函数进行解密并执行解密后的入口点函数,执行完毕后跳转到镜像文件继续执行。
[0010] 较佳地,该方法进一步包括:
[0011] 文件运行模块对原始文件中的资源相关函数进行挂钩,将资源相关函数转向到自定义的资源处理函数;
[0012] 镜像文件调用资源相关函数时,挂钩后的自定义资源处理函数从文件保护装置内取出加密后的资源数据,解密后,返回解密后的资源数据。
[0013] 较佳地,步骤E之后进一步包括:如果要调用应用程序接口,中转模块通过数据存取模块从文件保护装置内取出该应用程序接口对应的函数名称和所在动态链接库,中转模块通过解密模块解密函数所在的动态链接库名称及函数名称,根据解密后的动态链接库名称及函数名称获取函数地址,然后跳转到所述函数地址继续执行。
[0014] 较佳地,所述加密算法为对称加密算法或者非对称算法。
[0015] 较佳地,步骤A所述清除原始文件中的入口点函数进一步包括:将入口点函数用无效字符填充。
[0016] 本申请实施例还提供一种保护可执行文件的系统,包括输入表分析模块、入口点分析模块、资源分析模块、加密模块、数据存取模块、解密模块、文件运行模块、文件链接模块、中转模块和软件保护装置;
[0017] 软件保护装置用于存储密钥,以及存储来自数据存取模块的加密后的数据;
[0018] 所述输入表分析模块,用于分析需要被保护的原始文件的输入表,将原始文件的输入表输出至加密模块,清空原始文件中输入表的内容;
[0019] 所述入口点分析模块,用于分析原始文件的入口点函数,将入口点函数的二进制代码输出至加密模块,将原始文件中的入口点函数清空;
[0020] 所述资源分析模块,用于分析原始文件的资源数据,将文件的资源数据输出至加密模块,将原始文件的资源数据清空;
[0021] 所述加密模块,用于对原始文件的数据进行加密,通过加密算法对输入表、入口点函数、资源数据进行加密,加密用的密钥通过与软件保护装置协商获得;
[0022] 所述数据存取模块,用于将加密后的数据存入软件保护装置或者从软件保护装置中取出已保存的加密后的数据;
[0023] 所述解密模块,负责对从软件保护装置内取出的加密后的数据进行解密;
[0024] 所述文件运行模块,用于在镜像文件运行时,将镜像文件中的输入表中的输入地址表地址替换为中转模块地址;
[0025] 所述文件链接模块,用于构建新的输入表,新构建的输入表只包含装载动态链接库的函数和获取函数地址的函数;以及用于将新构建的输入表、数据存取模块、解密模块、中转模块及文件运行模块注入到原始文件,构建成为镜像文件;
[0026] 所述中转模块,用于在被调用时通过数据存取模块将加密后的输入表从软件保护装置中取出,通过解密模块对输入表解密,中转模块执行解密后的输入表中的函数;
[0027] 较佳地,文件运行模块进一步用于对原始文件中的资源相关函数进行挂钩,将资源相关函数转向到自定义的资源处理函数;镜像文件调用资源相关函数时,挂钩后的自定义资源处理函数从文件保护装置内取出加密后的资源数据送入解密模块进行解密;解密后,返回解密后的资源数据。
[0028] 较佳地,所述中转模块进一步用于调用数据存取模块从文件保护装置内取出函数所在的动态链接库名称和函数名称,通过解密模块对函数所在的动态链接库名称和函数进行解密,获取函数地址,跳转到获取函数地址处继续执行。
[0029] 较佳地,所述加密算法为对称加密算法或者非对称算法。
[0030] 较佳地,所述入口点分析模块进一步用于将原始文件中的入口点函数用无效字符填充。
[0031] 从以上技术方案可以看出,将待保护的原始文件的输入表、入口点函数和资源数据等关键数据加密后存入文件保护装置,而清除原始文件中的相应数据;保护后的文件运行时,从文件保护装置中取出加密的数据进行解密后运行。本申请技术方案增加了对可执行文件进行反编译和分析的难度,大大提高了软件的安全性。

附图说明

[0032] 图1为本申请实施例提供的基于软件保护装置100的可执行文件保护系统框图;
[0033] 图2为本申请实施例提供的可执行文件保护方法的第一阶段流程图;
[0034] 图3为本申请实施例提供的可执行文件保护方法的第二阶段流程图;
[0035] 图4为PE文件的结构示意图。

具体实施方式

[0036] 为使本申请技术方案的技术原理、特点以及技术效果更加清楚,以下结合具体实施例对本申请技术方案进行详细阐述。
[0037] 本申请的一个优选实施例提供了一种软件保护装置100。所述软件保护装置100,可以是独立物理形式的加密锁或其他硬件加密设备,用于在软件运行过程中为其提供安全保护和版权保护功能。
[0038] 本申请实施例提供的基于软件保护装置100的可执行文件保护系统如图1所示,包括输入表分析模块101、入口点分析模块102、资源分析模块103、加密模块104、数据存取模块105、解密模块106、文件运行模块107、文件链接模块108、中转模块109和软件保护装置100。除软件保护装置100之外,其他各个模块均为运行被保护的可执行文件的计算机设备中的逻辑模块。软件保护装置100通过USB接口或其他类型的接口与该计算机设备连接。
[0039] 软件保护装置100用于存储密钥,以及存储来自数据存取模块105的加密后的数据。
[0040] 所述输入表分析模块101,用于分析需要被保护的原始文件的输入表,将原始文件的输入表输出至加密模块104,清空原始文件中输入表的内容。
[0041] 所述入口点分析模块102,用于分析原始文件的入口点函数,将入口点函数的二进制代码输出至加密模块104,将原始文件中的入口点函数清空。较佳地,将入口点函数用无效字符填充。
[0042] 所述资源分析模块103,用于分析原始文件的资源数据,将文件的资源数据输出至加密模块104,将原始文件的资源数据清空。
[0043] 所述加密模块104,用于对原始文件的数据进行加密,通过加密算法对输入表、入口点函数、资源数据进行加密,加密用的密钥通过与软件保护装置协商获得,协商过程为:加密模块104向软件保护装置100发送获取密钥命令,软件保护装置100向加密模块104返回软件保护装置100内置的密钥。
[0044] 所述数据存取模块105,用于将数据存入软件保护装置100或者从软件保护装置100中取出已保存的数据。
[0045] 所述解密模块106,负责对从软件保护装置100内取出的数据进行解密。
[0046] 所述文件运行模块107,用于在镜像文件运行时,将输入表中的IAT地址替换为中转模块地址。所述文件链接模块108,用于构建新的输入表,新构建的输入表只包含装载动态链接库的函数和获取函数地址的函数;以及用于将新构建的输入表、数据存取模块105、解密模块106、中转模块109及文件运行模块107注入到原始文件构建成为新的文件,该新的文件可称为镜像文件。
[0047] 中转模块109,用于在被调用时通过数据存取模块105将加密后的输入表从软件保护装置100中取出,通过解密模块106对输入表解密,中转模块109执行解密后的输入表中的函数。中转模块109进一步用于调用数据存取模块从文件保护装置内取出函数所在的DLL名称和函数名称,通过解密模块对函数所在的DLL名称和函数进行解密,获取函数地址,跳转到获取函数地址继续执行。
[0048] 根据本发明的一个方面,所述加密模块104采用的加密算法,包括但不限于对称加密算法(如AES、DES、TDES)或者非对称算法(如RSA、ECC)。
[0049] 根据本发明的一个方面,文件运行模块107通过数据存取模块105将加密后的入口点函数取出,通过解密模块106将入口点函数解密,文件运行模块107执行入口点函数,将入口点函数的执行结果返回镜像文件继续运行。
[0050] 根据本发明的一个方面,文件运行模块107对资源相关函数进行挂钩,文件运行时需要资源数据时,挂钩后的函数将资源从保护装置内取出,通过解密模块解密,将解密后的数据返回给镜像文件,使文件顺利运行。
[0051] 根据本发明的一个方面,文件运行模块107对资源相关函数进行挂钩,具体为把资源相关函数的第一条指令修改为跳转到自定义的资源处理函数,名称为MyFixRes,,函数参数有两个,一个为资源数据的地址,一个为资源数据的大小,该函数通过存取模块从软件保护装置内取出加密后的数据,通过解密模块对资源数据解密,将解密后的资源放置到资源数据的地址处,跳转到资源相关函数继续执行。
[0052] 本申请实施例提供的可执行文件保护方法包括两个独立的阶段,第一阶段是将原始文件转换为镜像文件,第二阶段是运行镜像文件。
[0053] 第一阶段的处理流程如图2所示,包括如下步骤:
[0054] 步骤201:输入表分析模块分析出输入表中的函数名称和函数所在的动态链接库(DLL,Dynamic Link Library)名称。
[0055] 步骤202:加密模块对输入表相关数据进行加密。
[0056] 步骤203:存取模块将加密后的数据存入软件保护装置。
[0057] 步骤204:入口点分析模块分析入口点函数的数据。
[0058] 步骤205:加密模块对入口点函数数据进行加密。
[0059] 步骤206:存取模块将加密后的入口点函数存入软件保护装置。
[0060] 步骤207:资源分析模块分析资源数据。
[0061] 步骤208:加密模块对资源数据进行加密。
[0062] 步骤209:存取模块将加密后的资源数据存入保护装置。
[0063] 步骤210:清除原始文件中的数据。
[0064] 步骤211:文件链接模块将新构建的输入表、文件运行模块、数据存取模块及解密模块,注入到被保护的原始文件中,构建成为镜像文件。
[0065] 第二阶段的处理流程如图3所示,包括如下步骤:
[0066] 步骤301:文件运行模块修复输入表中的输入地址表(IAT,Import Address Table),将IAT修复为中转模块的地址。
[0067] 步骤302:文件运行模块对资源相关函数进行挂钩。
[0068] 步骤303:数据存取模块从文件保护装置中取出加密后的入口点函数。
[0069] 步骤304:解密模块从文件保护装置中取出解密密钥,入口点函数相关的数据。
[0070] 步骤305:执行解密后的入口点函数,跳转到原程序继续执行。
[0071] 步骤306:执行到某个应用程序接口(API)调用时,中转模块调用数据存取模块从文件保护装置内取出函数名称和所在DLL,解密后获取函数地址,跳转到真实函数的地址。
[0072] 步骤307:调用资源相关函数时,挂钩后的资源函数从文件保护装置内取出加密后的资源数据,解密后,返回解密后的资源数据。
[0073] 以下以微软Windows系统下32位的PE文件为例,来描述申请实施例提供的软件保护装置实现可执行文件保护的具体过程。PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE、DLL、OCX、SYS、COM都是PE文件。
[0074] PE文件结构如图4所示,主要包括区段(Section)、区段表(Section Table)、PE头部(PE Header)和DOS头部(DOS Header)。PE文件各个部分的详细定义可参阅微软windows系统的联机帮助,在此不做过多介绍。
[0075] 输入表分析模块101,根据PE文件的IMAGE_DOS_HEADER中的e_lfanew找到IMAGE_NT_HEADERS数据结构,根据IMAGE_NT_HEADERS中的数据结构IMAGE_OPTIONAL_HEADER32中的DataDirectory找到数据目录,其中第2个数据目录为文件的输入表。通过分析文件的输入表,将原始文件的输入表的函数名称及该函数所在的DLL名称数据保存,将原始文件的输入表内容清除,构建新的输入表,新的输入表中只包含kernel32.dll的LoadLibraryA和GetProcAddress函数。
[0076] 入口点分析模块102,根据文件的IMAGE_DOS_HEADER中的e_lfanew找到IMAGE_NT_HEADERS数据结构,根据IMAGE_NT_HEADERS中的数据结构IMAGE_OPTIONAL_HEADER32中的AddressOfEntryPoint字段找到入口点函数的地址,分析文件的入口点函数,将入口点处的函数的二进制代码保存,将入口点函数用无效字符0xCC填充。
[0077] 资源分析模块103,根据文件的IMAGE_DOS_HEADER的e_lfanew找到IMAGE_NT_HEADERS数据结构,根据IMAGE_NT_HEADERS中的数据结构IMAGE_OPTIONAL_HEADER32中的DataDirectory找到数据目录,其中第3个数据目录为文件资源的地址,分析文件的资源,对于资源中的目录保持不变,对于资源目录后面的资源数据进行保存,将原始文件的资源数据清空。
[0078] 加密模块104对原始文件的数据进行加密,加密用的密钥通过保护装置协商的来,加密算法采用AES加密算法。所述原始文件的数据包括但不限于原始输入表的数据、入口点函数的数据及资源数据。
[0079] 数据存取模块105,负责将数据存入软件保护装置100或者从软件保护装置100中取出已保存的数据。
[0080] 解密模块106,首先从软件保护装置100内取出AES解密密钥,对从软件保护装置100内取出的数据进行解密。
[0081] 文件运行模块107,被保护后的文件运行时,将输入表中的IAT地址替换为中转模块地址,中转模块被调用时通过存取模块将加密后的函数名称和该函数所在的DLL名称从存储模块中取出,通过解密模块对取出的函数名称和该函数所在的DLL名称进行解密。中转模块获取函数的地址并跳转到函数地址执行;文件运行模块107通过数据存取模块105将加密后的入口点处的函数取出,通过解密模块106将密钥从软件保护装置中取出并对函数解密。在文件运行模块107执行入口点处的函数,运行完成后返回文件继续运行,文件运行模块107对资源相关函数(FindResourceExW、FindResourceExA、FindResourceW、FindResourceA、SizeofResource、LoadResource)进行挂钩,文件运行时若需要资源数据,挂钩后的函数将通过数据存取模块105将资源从文件保护装置100内取出,通过解密模块106将密钥从文件保护装置100中取出并对资源数据解密,将解密后的数据返回给资源相关的函数,使文件顺利运行。
[0082] 文件链接模块108,负责将新构建的输入表、数据存取模块、解密模块及文件运行模块注入到原始文件,构建成为镜像文件。
[0083] 通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的硬件平台的方式来实现,当然也可以全部通过硬件来实施,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案对背景技术做出贡献的全部或者部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
[0084] 以上所述仅为本申请的较佳实施例而已,并不用以限制本申请的保护范围,凡在本申请技术方案的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。