函数级的软件保护方法

文档序号:6534764阅读:175来源:国知局
函数级的软件保护方法
【专利摘要】本发明公开了一种函数级的软件保护方法,包括以下步骤:S1:调用第一编译器编译源代码文件得到第一目标文件,第一编译器为能够将源代码编译为本地代码的编译器;S2:调用第二编译器编译所述源代码文件得到第二目标文件,第二编译器为能够将源代码编译为受保护代码的编译器;S3:从第一目标文件和第二目标文件中提取函数信息和变量信息,函数信息包括函数名、函数体、重定位,变量信息包括变量名、初始化数据;S4:获取需要保护的函数的列表;S5:将第一目标文件的部分内容和第二目标文件中的部分内容合并并构造得到第三目标文件。本发明的函数级的软件保护方法,实现函数级别保护,同时避免提高编译器复杂性。
【专利说明】函数级的软件保护方法
【技术领域】
[0001]本发明涉及软件保护领域,尤其涉及一种函数级的软件保护方法。
【背景技术】
[0002]函数/类成员函数是用户组织代码的基本单位,一个函数往往代表一项基本功能。以函数为单位对软件代码进行保护能较好的体现用户意图,实现对特定功能的保护。基于可执行文件的保护可以通过解析map文件(软件编译后产生的用到程序、数据等的一种映射文件)或解析用户预设标志获取函数位置进而加以保护。在基于源代码的保护方法(直接将源代码编译为保护好的目标文件)中,用同样方法实现函数级的保护要复杂很多,需解决两个问题:定位函数和对函数进行用特殊的方法进行编译。一般一个源代码文件包含多个函数,编译器需要识别哪个函数需要保护。由于map文件是对可执行文件(即保护结果)的描述,因此不能使用map文件定位函数,只能通过解析用户预设标志定位函数,增加编译器的复杂性。非保护函数与保护函数混合在一起,编译器需要对两类函数分别编译,进一步增加了编译器的复杂性。

【发明内容】

[0003]本发明所要解决的技术问题是,提供一种函数级的软件保护方法,实现函数级别保护,同时避免提高编译器复杂性。
[0004]为了解决上述技术问题,本发明提供了一种函数级的软件保护方法,包括以下步骤:
[0005]S1:调用第一编译器编译源代码文件得到第一目标文件,所述第一编译器为能够将源代码编译为本地代码的编译器;
[0006]S2:调用第二编译器编译所述源代码文件得到第二目标文件,所述第二编译器为能够将源代码编译为受保护代码的编译器;
[0007]S3:从所述第一目标文件和第二目标文件中提取函数信息和变量信息,所述函数信息包括函数名、函数体、重定位,所述变量信息包括变量名、初始化数据;
[0008]S4:获取需要保护的函数的列表;
[0009]S5:将所述第一目标文件的部分内容和所述第二目标文件中的部分内容合并并构造得到第三目标文件,所述部分内容为符号及其指向的数据,其中,
[0010]所述第一目标文件中的所述部分内容为包括所述第一目标文件中的与所述第二目标文件中的所述部分内容不同的所有内容。
[0011]作为优选,所述第二目标文件中的所述部分内容为步骤S4中所述列表中的各函数的所述函数信息,并且,如果所述第二目标文件中的所述部分内容需要依赖所述第二目标文件中的其他内容,则将所述其他内容也并入所述第三目标文件。
[0012]作为优选,所述第一目标文件中的所述部分内容包括所述第一目标文件中的非代码段和代码段中的与所述第二目标文件中的所述部分内容不同的函数、相关的符号和重定位信息。
[0013]作为优选,所述步骤S3具体为:
[0014]S31:将符号表中的符号按其指向数据在代码段中出现的先后顺序进行排序;
[0015]S32:对每一个本地定义的符号提取其函数或变量;
[0016]S33:根据符号性质判断所述符号的绑定类型、函数或者变量、内存属性,所述函数或变量的内容为所述符号指向的数据;
[0017]S34:更新符号表,将当前符号之后的指向范围在所提取的函数或变量范围之内的符号作为该函数或变量的内部符号添加到相应的类成员;
[0018]S35:将所述指向范围添加为该函数或变量的重定位,将重定位的位置调整为相对该函数或变量的相对位置,符号名为重定位指向的符号名。
[0019]作为优选,步骤S5具体包括:
[0020]步骤S51:判断所述第二目标文件需要并入所述第三目标文件的要素,所述要素为所述第三目标文件格式中定义的数据,包括段、函数、变量,判断条件为:
[0021]条件Al:要保护函数列表中包含的函数为需要并入所述第三目标文件的要素;
[0022]条件A2:如果该要素的函数体或变量初始化数据中包含需要重定位的部分,并且如果对于重定位所指向符号的符号名在所述第一目标文件中不存在,则该符号对应的要素为需要并入所述第三目标文件的要素,以及,
[0023]条件A3:对于所述条件Al和条件A2中引入的要素,如果涉及重定位且符合所述条件A2,则重定位所指向的符号为需要并入所述第三目标文件的要素,即对需要并入所述第三目标文件的要素进行迭代判断;
[0024]步骤S52:判断所述第一目标文件需要并入所述第三目标文件的要素,判断条件为:
[0025]条件B1:所述第一目标文件中的代码之外的段为需要并入所述第三目标文件的
要素;
[0026]条件B2:所述第一目标文件中与所述第二目标文件的需要并入所述第三目标文件的要素所不同的函数为需要并入所述第三目标文件的要素;
[0027]步骤S53:构造所述第三目标文件,包括以下步骤:
[0028]S531:将所有的需要并入所述第三目标文件的要素添加到文件,并构造符号;
[0029]S532:添加重定位;
[0030]S533:输出到所述第三目标文件。
[0031]作为优选,所述第二编译器具体配置为将C/C++源代码编译为自定义CPU指令的代码。
[0032]作为优选,所述第二编译器的编译过程通过虚拟机执行。
[0033]作为优选,所述第二编译器的编译过程具体为对C语言文件经过编译和加密步骤,生成适用于Visual Studio或Delphi的所述第二目标文件。
[0034]作为优选,所述第二编译器还具有多态混淆、反调试和/或私有数据保护的软件保护功能。
[0035]与现有技术相比,本发明的函数级的软件保护方法的有益效果在于:对被保护函数所在的文件调用非保护编译器进行编译,获取非保护代码;对文件进行保护性编译,获取保护代码,从保护代码和非保护代码中提取信息,构造新的目标文件。本发明的方法能够实现函数级别保护,同时避免提高编译器复杂性。
【专利附图】

【附图说明】
[0036]图1为本发明的实施例的函数级的软件保护方法的流程示意图。
【具体实施方式】
[0037]下面结合附图和具体实施例对本发明的实施例的函数级的软件保护方法作进一步详细描述,但不作为对本发明的限定。
[0038]图1为本发明的实施例的函数级的软件保护方法的流程示意图。如图1所示,本发明的实施例的函数级的软件保护方法,包括以下步骤:
[0039]S1:调用第一编译器编译源代码文件得到第一目标文件,第一编译器为能够将源代码编译为本地代码的编译器;
[0040]S2:调用第二编译器编译源代码文件得到第二目标文件,第二编译器为能够将源代码编译为受保护代码的编译器;
[0041]S3:从第一目标文件和第二目标文件中提取函数信息和变量信息,函数信息包括函数名、函数体、重定位,变量信息包括变量名、初始化数据;
[0042]S4:获取需要保护的函数的列表;
[0043]S5:将第一目标文件的部分内容和第二目标文件中的部分内容合并并构造得到第三目标文件,部分内容为符号及其指向的数据,其中:
[0044]第一目标文件中的部分内容为包括第一目标文件中的与第二目标文件中的部分内容不同的所有内容。
[0045]第一编译器可利用现有的的编译器如Microsoft Visual Studio自带的C/C++编译器,第二编译器可以应用软加密方法,具体配置为将C/C++源代码编译为自定义CPU指令的代码,可通过虚拟机执行编译过程。对C语言代码进行保护,应用于Visual Studio和Delphi之中。具体为,对C语言文件经过一系列的编译和加密步骤,生成适用于VisualStudio或Delphi的.0bj文件(目标文件)。配置好第二编译器应用环境之后,只需在VisualStudio进行简单设置,将默认编译器改为该第二编译器即可方便的应用。除了最基本的保护之外,第二编译器可以优选地配置为提供了增强保护,包括多态混淆、反调试和私有数据保护功能,这三种功能可以随意组合使用。
[0046]相应的目标文件格式为COFF格式,其中包含的一些概念可用C++代码表示,例如类与Windows SDK或Microsoft Visual Studio提供的Winnt.h头文件中定义的段、符号、重定位是一致的,可参考微软公司发布的PE/C0FF文件格式文档。COFF目标文件的载入和输出并非本发明关注的重点,此处不再赘述。
[0047]作为一种改进,第二目标文件中的部分内容为步骤S4中列表中的各函数的函数信息,并且,如果第二目标文件中的部分内容需要依赖第二目标文件中的其他内容,则将其他内容也并入第三目标文件。
[0048]作为更进一步的改进,第一目标文件中的部分内容包括第一目标文件中的非代码段和代码段中的与第二目标文件中的部分内容不同的函数、相关的符号和重定位信息。可以采用以符号名为判断准则进行判断。
[0049]作为进一步的改进,步骤S3具体为:
[0050]S31:将符号表中的符号按其指向数据在代码段中出现的先后顺序进行排序;
[0051]S32:对每一个本地定义的符号提取其函数或变量;
[0052]S33:根据符号性质判断符号的绑定类型、函数或者变量、内存属性,函数或变量的内容为符号指向的数据;
[0053]S34:更新符号表,将当前符号之后的指向范围在所提取的函数或变量范围之内的符号作为该函数或变量的内部符号添加到相应的类成员;
[0054]S35:将指向范围添加为该函数或变量的重定位,将重定位的位置调整为相对该函数或变量的相对位置,符号名为重定位指向的符号名。
[0055]目标文件中,用符号来标识数据(如函数、变量、常量、段等),符号名是区别数据的唯一标识。目标文件调用其它目标文件中定义的数据以符号名为准,即调用者记录要调用的数据的符号名(声明一个外部定义的符号),被调用者用符号名(类型为本地定义)标识被调用的数据,链接器根据符号名识别数据,处理调用关系。链接时,各目标文件中的本地定义的数据之间符号名不能相同,除非是弱符号(意味着各目标文件中定义的同名弱符号数据具有相同的地位,可任选其一链接到可执行文件)。符号有位置属性,用以标识其数据所在的位置。每个目标文件都有符号表,用以标识数据的类型、位置等信息。本实施例中的符号表为编译过程中的中间数据,可以认为是目标文件符号表的超集。
[0056]作为更进一步的优选实施方案,步骤S5具体包括:
[0057]步骤S51:判断第二目标文件需要并入第三目标文件的要素,要素为第三目标文件格式中定义的数据,包括段、函数、变量,判断条件为:
[0058]条件Al:要保护函数列表中包含的函数为需要并入第三目标文件的要素;
[0059]条件A2:如果该要素的函数体或变量初始化数据中包含需要重定位的部分,并且如果对于重定位所指向符号的符号名在第一目标文件中不存在,则该符号对应的要素为需要并入第三目标文件的要素,以及,
[0060]条件A3:对于条件Al和条件A2中引入的要素,如果涉及重定位且符合条件A2,则重定位所指向的符号为需要并入第三目标文件的要素,即对需要并入第三目标文件的要素进行迭代判断;
[0061]步骤S52:判断第一目标文件需要并入第三目标文件的要素,判断条件为:
[0062]条件B1:第一目标文件中的代码之外的段为需要并入第三目标文件的要素;
[0063]条件B2:第一目标文件中与第二目标文件的需要并入第三目标文件的要素所不同的函数为需要并入第三目标文件的要素;
[0064]步骤S53:构造第三目标文件,包括以下步骤:
[0065]S531:将所有的需要并入第三目标文件的要素添加到文件,并构造符号;
[0066]S532:添加重定位;
[0067]S533:输出到第三目标文件。
[0068]为使更加清楚地说明本发明的函数级的软件保护方法的技术方案及有益效果,以下通过具体实例方式对本发明进一步详细说明。
[0069]1.调用第一编译器编译源代码文件,得到第一目标文件。源代码如下:[0070]Il参数:FileName-要编译的源文件
【权利要求】
1.一种函数级的软件保护方法,其特征在于,包括以下步骤: S1:调用第一编译器编译源代码文件得到第一目标文件,所述第一编译器为能够将源代码编译为本地代码的编译器; 52:调用第二编译器编译所述源代码文件得到第二目标文件,所述第二编译器为能够将源代码编译为受保护代码的编译器; 53:从所述第一目标文件和第二目标文件中提取函数信息和变量信息,所述函数信息包括函数名、函数体、重定位,所述变量信息包括变量名、初始化数据; 54:获取需要保护的函数的列表; 55:将所述第一目标文件的部分内容和所述第二目标文件中的部分内容合并并构造得到第三目标文件,所述部分内容为符号及其指向的数据,其中, 所述第一目标文件中的所述部分内容包括所述第一目标文件中的与所述第二目标文件中的所述部分内容不同的所有内容。
2.根据权利要 求1所述的函数级的软件保护方法,其特征在于,所述第二目标文件中的所述部分内容为步骤S4中所述列表中的各函数的所述函数信息,并且,如果所述第二目标文件中的所述部分内容需要依赖所述第二目标文件中的其他内容,则将所述其他内容也并入所述第三目标文件。
3.根据权利要求1所述的函数级的软件保护方法,其特征在于,所述第一目标文件中的所述部分内容包括所述第一目标文件中的非代码段和代码段中的与所述第二目标文件中的所述部分内容不同的函数、相关的符号和重定位信息。
4.根据权利要求1所述的函数级的软件保护方法,其特征在于,所述步骤S3具体为: 531:将符号表中的符号按其指向数据在代码段中出现的先后顺序进行排序; 532:对每一个本地定义的符号提取其函数或变量; 533:根据符号性质判断所述符号的绑定类型、函数或者变量、内存属性,所述函数或变量的内容为所述符号指向的数据; S34:更新符号表,将当前符号之后的指向范围在所提取的函数或变量范围之内的符号作为该函数或变量的内部符号添加到相应的类成员; S35:将所述指向范围添加为该函数或变量的重定位,将重定位的位置调整为相对该函数或变量的相对位置,符号名为重定位指向的符号名。
5.根据权利要求1所述的函数级的软件保护方法,其特征在于,步骤S5具体包括: 步骤S51:判断所述第二目标文件需要并入所述第三目标文件的要素,所述要素为所述第三目标文件格式中定义的数据,包括段、函数、变量,判断条件为: 条件Al:要保护函数列表中包含的函数为需要并入所述第三目标文件的要素; 条件A2:如果该要素的函数体或变量初始化数据中包含需要重定位的部分,并且如果对于重定位所指向符号的符号名在所述第一目标文件中不存在,则该符号对应的要素为需要并入所述第三目标文件的要素,以及, 条件A3:对于所述条件Al和条件A2中引入的要素,如果涉及重定位且符合所述条件A2,则重定位所指向的符号为需要并入所述第三目标文件的要素,即对需要并入所述第三目标文件的要素进行迭代判断; 步骤S52:判断所述第一目标文件需要并入所述第三目标文件的要素,判断条件为:条件B1:所述第一目标文件中的代码之外的段为需要并入所述第三目标文件的要素; 条件B2:所述第一目标文件中与所述第二目标文件的需要并入所述第三目标文件的要素所不同的函数为需要并入所述第三目标文件的要素; 步骤S53:构造所述第三目标文件,包括以下步骤: 5531:将所有的需要并入所述第三目标文件的要素添加到文件,并构造符号; 5532:添加重定位; 5533:输出到所述第三目标文件。
6.根据权利要求1所述的函数级的软件保护方法,其特征在于,所述第二编译器具体配置为将C/C++源代码编译为自定义CPU指令的代码。
7.根据权利要求6所述的函数级的软件保护方法,其特征在于,所述第二编译器的编译过程通过虚拟机执行。
8.根据权利要求7所述的函数级的软件保护方法,其特征在于,所述第二编译器的编译过程具体为对C语言文件经过编译和加密步骤,生成适用于Visual Studio或Delphi的所述第二目标文件。
9.根据权利要求8所述的函数级的软件保护方法,其特征在于,所述第二编译器还具有多态混淆、反调试和/或私有数据保护的软件保护功能。
【文档编号】G06F21/12GK103729579SQ201410001492
【公开日】2014年4月16日 申请日期:2014年1月2日 优先权日:2014年1月2日
【发明者】孙吉平, 韩勇 申请人:北京深思数盾科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1