CN101650664B - 链接方法和链接器 - Google Patents

链接方法和链接器 Download PDF

Info

Publication number
CN101650664B
CN101650664B CN2009100880354A CN200910088035A CN101650664B CN 101650664 B CN101650664 B CN 101650664B CN 2009100880354 A CN2009100880354 A CN 2009100880354A CN 200910088035 A CN200910088035 A CN 200910088035A CN 101650664 B CN101650664 B CN 101650664B
Authority
CN
China
Prior art keywords
program codes
symbol
function
validation code
file
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.)
Active
Application number
CN2009100880354A
Other languages
English (en)
Other versions
CN101650664A (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.)
Feitian Technologies Co Ltd
Original Assignee
Feitian Technologies 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 Feitian Technologies Co Ltd filed Critical Feitian Technologies Co Ltd
Priority to CN2009100880354A priority Critical patent/CN101650664B/zh
Publication of CN101650664A publication Critical patent/CN101650664A/zh
Application granted granted Critical
Publication of CN101650664B publication Critical patent/CN101650664B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Storage Device Security (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种链接方法和链接器,属于软件安全领域。该方法包括:扫描编译器编译后生成的待保护软件的目标程序代码;确定智能密钥设备的验证代码的插入点,将验证代码插入到目标程序代码中;根据扫描信息创建段表和符号表,在符号表中添加验证代码所属函数对应的符号和退出函数对应的符号,验证代码所属函数用于运行软件时验证智能密钥设备,若成功则允许软件运行,若失败则调用退出函数结束运行;对目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、段表和符号表写入输出文件,得到可执行文件。该链接器包括:扫描模块、插入模块、创建模块和重定位模块。本发明可以实现软件保护,简化和降低了软件保护的复杂度与难度。

Description

链接方法和链接器
技术领域
本发明涉及软件安全领域,特别涉及一种链接方法和链接器。 
背景技术
为了提高软件使用的安全性,对软件进行版权保护,通常会对软件的使用者进行身份验证,如果使用者为合法用户,则允许其运行该软件的可执行文件来使用该软件。软件的可执行文件是由编译器对程序源代码进行编译,以及由链接器进行链接后得到的。编译器编译后生成的文件称为目标文件,包括:程序指令和程序数据,分别以具有一定长度的段(segments)的形式进行存储,程序指令存放在代码段中,程序数据存放在数据段中。另外,目标文件中还有符号表、重定位表和文件头。符号表包含在当前文件中定义的可以被其它文件调用的导出符号,以及在当前文件中引用的由其它文件定义的导入符号。重定位表告诉链接器在哪些位置要进行重定位操作。文件头位于文件的开始处,描绘了整个文件的组织结构。 
链接器对编译生成的目标文件进行链接后,即可得到最终的可执行文件。链接的过程具体如下:首先对目标文件进行扫描,得到各个段的大小,并收集对所有符号的定义和引用,确定各个段在输出地址空间中的大小和位置,以及目标文件中的每一部分在输出文件中的布局;然后将符号引用替换为数字地址,对目标程序代码进行重定位,并创建一个包含目标文件中定义的所有段的段表,以及包含所有导出符号和导入符号的符号表,将重定位后的代码、生成的段表和符号表按照已确定的布局写入到输出文件中,再添加文件头信息,最终得到可执行文件。 
目前存在一种使用智能密钥设备对软件进行保护的方法。智能密钥设备是一种带有处理器和存储器的小型硬件装置,它通过计算机的数据通讯接口与主机连接。它具有密钥生成、安全存储密钥、预置加密算法等功能。智能密钥设备与密钥相关的运算完全在装置内部运行,且智能密钥设备具有抗攻击的特性,安全性极高。智能密钥设备一般通过USB接口与计算机相连。当使用智能密钥设备对软件进行保护时,先由用户手动在程序源代码文件中添加对智能密钥设备进行验证的代码,然后由现有的编译器和链接器对其进行编译和链接,得到可执行文件,运行该可执行文件过程中对智能密钥设备进行验证,如果非法,则用户无法使用该 可执行文件,从而达到了软件保护的目的。但是,这种方法需要用户手动添加代码到程序源代码中,对用户的要求较高,过程复杂,不易实现。 
发明内容
为了克服现有技术的缺陷,本发明提供了一种链接方法和链接器。所述技术方案如下: 
一方面,一种链接方法,所述方法包括: 
对编译器编译后生成的待保护软件的目标程序代码进行扫描; 
确定智能密钥设备的验证代码在所述目标程序代码中的插入点,按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中; 
根据扫描得到的信息创建段表和符号表,在所述符号表中添加所述验证代码所属函数对应的符号和退出函数对应的符号,所述验证代码所属函数用于当运行所述待保护软件时对所述智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用所述退出函数结束运行; 
对所述目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。 
其中,对编译器编译后生成的待保护软件的目标程序代码进行扫描,具体包括: 
对编译器编译后生成的待保护软件的目标程序代码进行分析,得到所述目标程序代码中每个段的大小和偏移,并记录所述目标程序代码中对所有符号的定义和引用。 
其中,确定智能密钥设备的验证代码在所述目标程序代码中的插入点,具体包括:
在所述目标程序代码中找到指定函数,,所述指定函数为所述目标程序代码中的任一函数,将所述指定函数的指定位置作为智能密钥设备的验证代码的插入点,所述指定位置为所述指定函数的任一位置,其中,所述指定函数和指定位置预先根据需要进行设置。 
其中,按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中,具体包括: 
按照所述指定函数对应的符号,在所述目标程序代码的符号表中查找到定义所述指定函数的目标文件,以及所述指定函数在所述目标文件中的偏移; 
对所述偏移、指定位置与堆栈操作指令的长度求和,按照求和结果对应的位置,将所述验证代码插入到所述目标程序代码中。 
其中,根据扫描得到的信息创建段表和符号表,具体包括: 
根据扫描得到的所述目标程序代码中定义的所有段,生成包含所述所有段的段表; 
根据扫描得到的所述目标程序代码中的所有导出符号和导入符号,生成包含所述所有导出符号和导入符号的符号表。 
其中,对所述目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件,具体包括: 
为所述目标程序代码中的符号引用替换为数字地址; 
由所述目标程序代码的内存地址计算得到重定位地址,根据所述重定位地址对所述目标程序代码进行重定位; 
确定所述目标程序代码中的每个段在输出地址空间中的大小和位置,并按照预设的布局将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。 
另一方面,一种链接器,所述链接器包括: 
扫描模块,用于对编译器编译后生成的待保护软件的目标程序代码进行扫描; 
插入模块,用于确定智能密钥设备的验证代码在所述目标程序代码中的插入点,按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中; 
创建模块,用于根据所述扫描模块得到的信息创建段表和符号表,在所述符号表中添加所述验证代码所属函数对应的符号和退出函数对应的符号,所述验证代码所属函数用于当运行所述待保护软件时对所述智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用所述退出函数结束运行; 
重定位模块,用于对所述目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。 
其中,所述扫描模块具体包括: 
扫描单元,用于对编译器编译后生成的待保护软件的目标程序代码进行分析,得到所述目标程序代码中每个段的大小和偏移,并记录所述目标程序代码中对所有符号的定义和引用。 
其中,所述插入模块具体包括: 
确定单元,用于在所述目标程序代码中找到指定函数,将所述指定函数的指定位置作为智能密钥设备的验证代码的插入点,所述指定位置为所述指定函数的任一位置; 
插入单元,用于按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中。 
其中,所述插入单元具体包括: 
查找子单元,用于按照所述指定函数对应的符号,在所述目标程序代码的符号表中查找 定义所述指定函数的目标文件,以及所述指定函数在所述目标文件中的偏移; 
插入子单元,用于对所述偏移、指定位置与堆栈操作指令的长度求和,按照求和结果对应的位置,将所述验证代码插入到所述目标程序代码中。 
其中,所述创建模块具体包括: 
段表创建单元,用于根据所述扫描模块得到的所述目标程序代码中定义的所有段,生成包含所述所有段的段表; 
符号表创建单元,用于根据所述扫描模块得到的所述目标程序代码中的所有导出符号和导入符号,生成包含所述所有导出符号和导入符号的符号表,在所述符号表中添加所述验证代码所属函数对应的符号和退出函数对应的符号,所述验证代码所属函数用于当运行所述待保护软件时对所述智能密钥设备进行验证,在验证成功时允许所述待保护软件运行,在验证失败时调用所述退出函数结束运行。 
其中,所述重定位模块具体包括: 
替换单元,用于为所述目标程序代码中的符号引用替换为数字地址; 
重定位单元,用于由所述目标程序代码的内存地址计算得到重定位地址,根据所述重定位地址对所述目标程序代码进行重定位; 
输出单元,用于确定所述目标程序代码中的每个段在输出地址空间中的大小和位置,并按照预设的布局将所述文件头部信息、所述重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。 
本发明提供的技术方案,通过链接时在待保护软件的目标程序代码中插入智能密钥设备的验证代码,可以生成包含该验证代码的可执行文件,使得该可执行文件在运行时会对智能密钥设备进行验证,如果合法,则允许用户使用该软件,如果非法,则结束软件运行,从而防止该软件被非法计算机执行,达到了软件版权保护的目的。与现有技术相比,无需用户手动修改程序源代码,而是在链接过程自动插入智能密钥设备的验证代码,即可实现对智能密钥设备的验证,简化和降低了软件保护的复杂度与难度,简单方便,容易实现,具有较强的实用性。 
附图说明
图1是本发明实施例1提供的链接方法的流程图; 
图2是本发明实施例2提供的链接器的结构图。 
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。 
本发明实施例提供了一种链接方法,包括:对编译器编译后生成的待保护软件的目标程序代码进行扫描;确定智能密钥设备的验证代码在目标程序代码中的插入点,按照插入点对应的位置,将验证代码插入到目标程序代码中;根据扫描得到的信息创建段表和符号表,在符号表中添加验证代码所属函数对应的符号和退出函数对应的符号,该验证代码所属函数用于当运行待保护软件时对智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用退出函数结束运行;对目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、段表和符号表写入输出文件,得到可执行文件。 
本发明实施例中涉及的智能密钥设备内置有安全芯片,从而实现安全功能。该安全芯片除了具有通用嵌入式微控制器的各种特性外,还具有较可靠的安全性能。在设计智能密钥设备时会针对安全性能方面在安全芯片的结构上做一些特殊处理,比如采用特定的安全内核作为安全芯片的内核,该安全内核能够支持多个拥有不同权限的状态,从而实现对硬件资源访问权限的管理。另外,所述智能密钥设备还可以带有MMU(Memory Management Unit,存储器管理单元),用于实现地址映射、逻辑地址的隔离、以及物理地址的隔离,该MMU单元从体系结构上支持多应用和安全性能的设计,与安全芯片的内核所支持的不同权限一起组成一个硬件安全防火墙。所述智能密钥设备可以为USB Key。 
实施例1 
参见图1,本实施例提供了一种链接方法,具体包括: 
步骤101:获取待保护软件的目标程序代码,该目标程序代码是由编译器对待保护软件的程序源代码进行编译后生成的; 
其中,程序源代码可以由多种高级语言编写,如由C语言、C++语言等高级语言编写。编译器可以有多种,如gcc(GNU C Compiler)编译器。 
程序源代码通常以源文件的形式存储,如果有多个源文件,则编译器将每一个源文件编译成一个对应的目标程序代码,即目标文件,从而可以得到多个目标文件。 
步骤102:对获取的目标程序代码进行扫描和分析,得到目标程序代码中每个段的大小和偏移,并记录目标程序代码中对所有符号的定义和引用; 
如果目标程序代码为多个,则可以逐一进行扫描和分析,分别得到每个目标程序代码中每个段的大小和偏移,以及分别记录每个目标程序代码中对所有符号的定义和引用。 
通常,目标程序代码是二进制格式的,因此,本步骤中是根据二进制文件格式中的定义规则对目标程序代码进行扫描和分析操作的。 
步骤103:在目标程序代码中找到指定函数,将指定函数的指定位置作为智能密钥设备的验证代码的插入点; 
其中,指定函数和指定位置可以预先根据需要进行设置,该指定函数可以为目标程序代码中的任一函数,该指定位置可以为指定函数的任一位置,如任一行,优选地,指定位置为指定函数的开始处、结尾处或其内函数调用的前后等等,以方便查找该指定位置。通常,指定位置以偏移量来表示,如位于指定函数的第1行或第5行等等。 
步骤104:按照指定函数对应的符号,在目标程序代码的符号表中查找到定义指定函数的目标文件,以及指定函数在目标文件中的偏移,对偏移、指定位置与堆栈操作指令的长度求和,按照求和结果对应的位置,将智能密钥设备的验证代码插入到目标程序代码中; 
通常,函数对应的符号为该函数的函数名,同时函数对应的符号还可以为该函数的全局变量,该符号会存储在符号表中,并且符号表中还会存储有定义该函数的目标文件的名称,以及该函数在该目标文件中的偏移。 
例如,目标程序代码中有三个函数func1、func2和func3,将func1设为指定函数,在目标程序代码的符号表中查找到func1是在目标文件filea.o中被定义,以及在func1在filea.o中的偏移为0x32。 
所述智能密钥设备的的验证代码为二进制格式的代码,由二进制语言编写而成。该验证代码的功能是对智能密钥设备进行验证,具体地,在验证智能密钥设备合法时,允许该软件运行,在智能密钥设备不合法时,禁止该软件运行。 
所述堆栈操作指令是函数执行时必须执行的指令,该堆栈操作指令包含若干条指令,并且包含的指令的数目是固定的,链接器在进行扫描时可以获知该数目。 
步骤105:根据扫描得到的目标程序代码中定义的所有段,生成包含该所有段的段表,并且根据扫描得到的目标程序代码中的所有导出符号和导入符号,生成包含该所有导出符号和导入符号的符号表; 
所述段表描述了文件中各个段在文件中的偏移位置及段的属性等,从段表里面可以得到每个段的所有信息。 
步骤106:在生成的符号表中添加上述智能密钥设备的验证代码所属函数对应的符号和退出函数对应的符号; 
其中,所述验证代码所属函数对应的符号即该函数的函数名,如check_usbkey,退出函 数对应的符号即退出函数的函数名exit,将它们添加到符号表中,以方便后续运行时进行调用。所述验证代码所属函数用于当运行待保护软件时对智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用退出函数结束运行。具体地,当运行到指定函数的指定位置时调用该验证代码所属的函数,运行该验证代码所属的函数过程中,对智能密钥设备进行验证,如果验证成功,则该验证代码所属的函数返回一个正确的值,从而可以继续运行该软件,如果验证失败,则该验证代码所属的函数返回一个错误的值,相应地,调用退出函数,从而结束软件运行。 
步骤107:为目标程序代码中的符号引用替换数字地址,由目标程序代码的内存地址计算得到重定位地址,根据重定位地址对目标程序代码进行重定位; 
步骤108:确定目标程序代码中的每个段在输出地址空间中的大小和位置,并按照预设的布局将文件头部信息、重定位后的目标程序代码、段表和符号表写入输出文件,得到可执行文件。 
通常,一个链接器固定时,链接后生成的可执行文件中各个组成部分的布局就是固定的。链接器在链接时会按照该布局生成可执行文件。 
所述文件头部信息,描述了整个文件的文件属性,包括文件是否可执行、是静态链接还是动态链接及入口地址(如果是可执行文件)、目标硬件、目标操作系统等信息。通常,文件头部信息后面就是各个段的内容。 
下面具体举例说明上述验证代码的插入过程。例如,有两个程序源代码分别为C语言编写的文件:main.c和func.c,具体如下: 
Figure GSB00000752058200071
Figure GSB00000752058200081
其中,上述源代码调用了C库和访问智能密钥设备的库。使用gcc编译器对上述main.c和func.c分别进行编译后得到目标程序代码main.o和func.o。链接器获取到这两个目标程序代码后,逐一进行扫描和分析,得到目标程序代码main.o中每个段的大小和偏移,并记录其中对所有符号的定义和引用,以及得到目标程序代码func.o中每个段的大小和偏移,并记录其中对所有符号的定义和引用。将main.o中的main函数设为指定函数,指定位置在main函数的开始处,将该处作为插入点。链接器查找main函数所在的目标程序代码main.o中的符号表,找到main符号对应的main函数在main.o中被定义,并且偏移为0x45。 
其中,CPU识别的main函数如下(反汇编形式): 
00000000<main>: 
0:8d 4c 24 04           lea        0x4(%esp),%ecx 
4:83 e4 f0              and        $0xfffffff0,%esp 
7:ff 71 fc              pushl      0xfffffffc(%ecx) 
a:55                    push       %ebp 
b:89 e5                 mov        %esp,%ebp 
d:51                    push       %ecx 
e:83 ec 24              sub        $0x24,%esp 
11:c7 04 24 12 00 00 00 movl       $0x12,(%esp) 
18:e8 fc ff ff ff       call       19<main+0x19> 
1d:89 45 f8             mov        %eax,0xfffffff8(%ebp) 
20:8b 45 f8             mov        0xfffffff8(%ebp),%eax 
23:89 44 24 04          mov        %eax,0x4(%esp) 
27:c7 04 24 00 00 00 00 movl       $0x0,(%esp) 
2e:e8 fc ff ff ff       call       2f<main+0x2f> 
33:b8 00 00 00 00       mov        $0x0,%eax 
38:83 c4 24             add        $0x24,%esp 
3b:59                   pop        %ecx 
3c:5d                   pop        %ebp 
3d:8d 61 fc             lea        0xfffffffc(%ecx),%esp 
40:c3                   ret 
其中,前面5条是堆栈操作指令,长度为0x0e,因此智能密钥设备的验证代码的插入点为:main函数偏移+0x0e=0x45+0x0e=0x54。 
在该插入点位置插入的验证代码如下: 
e8 fc ff ff ff              call     19<main+0x19> 
85 c0                       test     %eax,%eax 
740c                        je       2d<main+0x2d> 
c7 04 24 ff ff ff ff        movl     $0xffffffff,(%esp) 
e8 fc ff ff ff              call     29<main+0x29> 
以上代码为反汇编形式,相当于以下C语言代码: 
if(check_usbkey()!=0)exit(-1); 
将上述验证代码插入main函数后,结果如下: 
00000000<main>: 
0:8d 4c 24 04              lea      0x4(%esp),%ecx 
4:83 e4 f0                 and      $0xfffffff0,%esp 
7:ff 71 fc                 pushl    0xfffffffc(%ecx) 
a:55                       push     %ebp 
b:89 e5                    mov      %esp,%ebp 
d:51                       push     %ecx 
e:83 ec 24                 sub      $0x24,%esp 
11:e8 fc ff ff ff          call     12<main+0x12> 
16:85 c0                   test     %eax,%eax 
18:74 0c                   je       26<main+0x26> 
1a:c7 04 24 ff ff ff ff    movl     $0xffffffff,(%esp) 
21:e8 fc ff ff ff          call     22<main+0x22> 
26:c7 04 24 12 00 00 00    movl     $0x12,(%esp) 
2d:e8 fc ff ff ff          call     2e<main+0x2e> 
32:89 45 f8                mov      %eax,0xfffffff8(%ebp) 
35:8b 45 f8                mov      0xfffffff8(%ebp),%eax 
38:89 44 24 04             mov      %eax,0x4(%esp) 
3c:c7 04 24 00 00 00 00    movl     $0x0,(%esp) 
43:e8 fc ff ff ff    call      44<main+0x44> 
48:b8 00 00 00 00    mov       $0x0,%eax 
4d:83 c4 24          add       $0x24,%esp 
50:59                pop       %ecx 
51:5d                pop       %ebp 
52:8d 61 fc          lea       0xfffffffc(%ecx),%esp 
55:c3                ret 
相当于C源程序: 
Figure GSB00000752058200101
至此,完成了在main函数中插入上述验证代码的过程。 
在本实施例中,上述链接器可以是新开发的链接器,也可以是根据约定的开发接口生成的链接器插件,并能够支持现有的链接器。 
实施例2 
参见图2,本实施例提供了一种链接器,具体包括: 
扫描模块21,用于对编译器编译后生成的待保护软件的目标程序代码进行扫描; 
插入模块22,用于确定智能密钥设备的验证代码在目标程序代码中的插入点,按照插入点对应的位置,将验证代码插入到目标程序代码中; 
创建模块23,用于根据扫描模块21得到的信息创建段表和符号表,在符号表中添加验证代码所属函数对应的符号和退出函数对应的符号,验证代码所属函数用于当运行待保护软件时对智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用退出函数结束运行; 
重定位模块24,用于对目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、段表和符号表写入输出文件,得到可执行文件。 
本实施例中,扫描模块21具体包括: 
扫描单元211,用于对编译器编译后生成的待保护软件的目标程序代码进行分析,得到目标程序代码中每个段的大小和偏移,并记录目标程序代码中对所有符号的定义和引用。 
本实施例中,插入模块22具体包括: 
确定单元221,用于在目标程序代码中找到指定函数,将指定函数的指定位置作为智能密钥设备的验证代码的插入点,所述指定函数可以为目标程序代码中的任一函数,所述指定函数为所述目标程序代码中的任一函数,所述指定位置可以为指定函数的任一位置;其中,所述指定函数和指定位置预先根据需要进行设置; 
插入单元222,用于按照确定单元221确定的插入点对应的位置,将验证代码插入到目标程序代码中。 
其中,插入单元222具体包括: 
查找子单元,用于按照指定函数对应的符号,在目标程序代码的符号表中查找定义指定函数的目标文件,以及指定函数在目标文件中的偏移; 
插入子单元,用于对上述偏移、指定位置与堆栈操作指令的长度求和,按照求和结果对应的位置,将验证代码插入到目标程序代码中。 
本实施例中,创建模块23具体包括: 
段表创建单元231,用于根据扫描模块21得到的目标程序代码中定义的所有段,生成包含所有段的段表; 
符号表创建单元232,用于根据扫描模块21得到的目标程序代码中的所有导出符号和导入符号,生成包含所有导出符号和导入符号的符号表,在符号表中添加验证代码所属函数对应的符号check_usbkey和退出函数对应的符号exit,验证代码所属函数用于当运行待保护软件时对智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用退出函数结束运行。 
本实施例中,重定位模块24具体包括: 
替换单元241,用于为目标程序代码中的符号引用替换数字地址; 
重定位单元242,用于由目标程序代码的内存地址计算得到重定位地址,根据重定位地址对目标程序代码进行重定位; 
输出单元243,用于确定目标程序代码中的每个段在输出地址空间中的大小和位置,并按照预设的布局将文件头部信息、重定位后的目标程序代码、段表和符号表写入输出文件,得到可执行文件。 
本发明实施例提供的上述链接方法和链接器,通过链接时在待保护软件的目标程序代码 中插入智能密钥设备的验证代码,可以生成包含该验证代码的可执行文件,使得该可执行文件在运行时会对智能密钥设备进行验证,如果合法,则允许用户使用该软件,如果非法,则结束软件运行,从而防止该软件被非法计算机执行,达到了软件版权保护的目的。与现有技术相比,无需用户手动修改程序源代码,而是在链接过程自动插入智能密钥设备的验证代码,即可实现对智能密钥设备的验证,简化和降低了软件保护的复杂度与难度,简单方便,容易实现,具有较强的实用性。 
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。 
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。 

Claims (12)

1.一种链接方法,其特征在于,所述方法包括:
对编译器编译后生成的待保护软件的目标程序代码进行扫描;
确定智能密钥设备的验证代码在所述目标程序代码中的插入点,按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中;
根据扫描得到的信息创建段表和符号表,在所述符号表中添加所述验证代码所属函数对应的符号和退出函数对应的符号,所述验证代码所属函数用于当运行所述待保护软件时对所述智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用所述退出函数结束运行;
对所述目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。
2.根据权利要求1所述的链接方法,其特征在于,对编译器编译后生成的待保护软件的目标程序代码进行扫描,具体包括:
对编译器编译后生成的待保护软件的目标程序代码进行分析,得到所述目标程序代码中每个段的大小和偏移,并记录所述目标程序代码中对所有符号的定义和引用。
3.根据权利要求1所述的链接方法,其特征在于,确定智能密钥设备的验证代码在所述目标程序代码中的插入点,具体包括:
在所述目标程序代码中找到指定函数,所述指定函数为所述目标程序代码中的任一函数,将所述指定函数的指定位置作为智能密钥设备的验证代码的插入点,所述指定位置为所述指定函数的任一位置,其中,所述指定函数和指定位置预先根据需要进行设置。
4.根据权利要求3所述的链接方法,其特征在于,按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中,具体包括:
按照所述指定函数对应的符号,在所述目标程序代码的符号表中查找到定义所述指定函数的目标文件,以及所述指定函数在所述目标文件中的偏移;
对所述偏移、指定位置与堆栈操作指令的长度求和,按照求和结果对应的位置,将所述验证代码插入到所述目标程序代码中。
5.根据权利要求1所述的链接方法,其特征在于,根据扫描得到的信息创建段表和符号表,具体包括:
根据扫描得到的所述目标程序代码中定义的所有段,生成包含所述所有段的段表;
根据扫描得到的所述目标程序代码中的所有导出符号和导入符号,生成包含所述所有导出符号和导入符号的符号表。
6.根据权利要求1所述的链接方法,其特征在于,对所述目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件,具体包括:
为所述目标程序代码中的符号引用替换为数字地址;
由所述目标程序代码的内存地址计算得到重定位地址,根据所述重定位地址对所述目标程序代码进行重定位;
确定所述目标程序代码中的每个段在输出地址空间中的大小和位置,并按照预设的布局将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。
7.一种链接器,其特征在于,所述链接器包括:
扫描模块,用于对编译器编译后生成的待保护软件的目标程序代码进行扫描;
插入模块,用于确定智能密钥设备的验证代码在所述目标程序代码中的插入点,按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中;
创建模块,用于根据所述扫描模块得到的信息创建段表和符号表,在所述符号表中添加所述验证代码所属函数对应的符号和退出函数对应的符号,所述验证代码所属函数用于当运行所述待保护软件时对所述智能密钥设备进行验证,在验证成功时允许该待保护软件运行,在验证失败时调用所述退出函数结束运行;
重定位模块,用于对所述目标程序代码进行重定位,将文件头部信息、重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。
8.根据权利要求7所述的链接器,其特征在于,所述扫描模块具体包括:
扫描单元,用于对所述编译器编译后生成的待保护软件的目标程序代码进行分析,得到所述目标程序代码中每个段的大小和偏移,并记录所述目标程序代码中对所有符号的定义和引用。
9.根据权利要求7所述的链接器,其特征在于,所述插入模块具体包括:
确定单元,用于在所述目标程序代码中找到指定函数,将所述指定函数的指定位置作为智能密钥设备的验证代码的插入点,所述指定位置为所述指定函数的任一位置;
插入单元,用于按照所述插入点对应的位置,将所述验证代码插入到所述目标程序代码中。
10.根据权利要求9所述的链接器,其特征在于,所述插入单元具体包括:
查找子单元,用于按照所述指定函数对应的符号,在所述目标程序代码的符号表中查找定义所述指定函数的目标文件,以及所述指定函数在所述目标文件中的偏移;
插入子单元,用于对所述偏移、指定位置与堆栈操作指令的长度求和,按照求和结果对应的位置,将所述验证代码插入到所述目标程序代码中。
11.根据权利要求7所述的链接器,其特征在于,所述创建模块具体包括:
段表创建单元,用于根据所述扫描模块得到的所述目标程序代码中定义的所有段,生成包含所述所有段的段表;
符号表创建单元,用于根据所述扫描模块得到的所述目标程序代码中的所有导出符号和导入符号,生成包含所述所有导出符号和导入符号的符号表,在所述符号表中添加所述验证代码所属函数对应的符号和退出函数对应的符号,所述验证代码所属函数用于当运行所述待保护软件时对所述智能密钥设备进行验证,在验证成功时允许所述待保护软件运行,在验证失败时调用所述退出函数结束运行。
12.根据权利要求7所述的链接器,其特征在于,所述重定位模块具体包括:
替换单元,用于为所述目标程序代码中的符号引用替换为数字地址;
重定位单元,用于由所述目标程序代码的内存地址计算得到重定位地址,根据所述重定位地址对所述目标程序代码进行重定位;
输出单元,用于确定所述目标程序代码中的每个段在输出地址空间中的大小和位置,并按照预设的布局将所述文件头部信息、所述重定位后的目标程序代码、所述段表和符号表写入输出文件,得到可执行文件。
CN2009100880354A 2009-06-30 2009-06-30 链接方法和链接器 Active CN101650664B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009100880354A CN101650664B (zh) 2009-06-30 2009-06-30 链接方法和链接器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009100880354A CN101650664B (zh) 2009-06-30 2009-06-30 链接方法和链接器

Publications (2)

Publication Number Publication Date
CN101650664A CN101650664A (zh) 2010-02-17
CN101650664B true CN101650664B (zh) 2012-06-27

Family

ID=41672905

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009100880354A Active CN101650664B (zh) 2009-06-30 2009-06-30 链接方法和链接器

Country Status (1)

Country Link
CN (1) CN101650664B (zh)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101853357A (zh) * 2010-04-28 2010-10-06 北京飞天诚信科技有限公司 软件保护方法
CN102880461B (zh) * 2012-08-29 2015-11-25 华为技术有限公司 一种编译链接方法及装置
US9342285B2 (en) 2012-11-30 2016-05-17 Huawei Technologies Co., Ltd. Method and apparatus for detecting code change
JP5996777B2 (ja) 2013-03-19 2016-09-21 株式会社東芝 コード処理装置およびプログラム
CN106708593B (zh) * 2015-07-16 2020-12-08 中兴通讯股份有限公司 一种程序链接的编译方法及装置
US10503931B2 (en) * 2016-05-09 2019-12-10 Arris Enterprises Llc Method and apparatus for dynamic executable verification
CN108121285B (zh) * 2017-12-20 2020-08-25 中国铁道科学研究院 基于连续功能图的应用软件协同编译方法及装置
CN108197456B (zh) * 2018-01-16 2020-05-19 飞天诚信科技股份有限公司 一种设备数据的缓存方法及装置
JP6954256B2 (ja) * 2018-11-02 2021-10-27 横河電機株式会社 エンジニアリング装置、エンジニアリング装置の制御方法及びプログラム
CN109672526B (zh) * 2018-12-17 2021-11-09 福建联迪商用设备有限公司 一种管控可执行程序的方法及系统
CN111506491B (zh) * 2019-01-31 2023-05-02 阿里巴巴集团控股有限公司 信息处理方法及装置、存储介质和处理器
CN110147238B (zh) * 2019-05-29 2022-11-11 中国人民解放军战略支援部队信息工程大学 一种程序编译方法、装置及系统
CN112580066B (zh) * 2019-09-30 2024-09-20 北京国双科技有限公司 一种数据保护方法及装置
CN114327497A (zh) * 2020-09-30 2022-04-12 华为技术有限公司 一种代码处理方法、装置及设备
CN112363780A (zh) * 2020-11-29 2021-02-12 王志平 一种软件动态链接的实现方法
CN113760236A (zh) * 2021-09-28 2021-12-07 龙芯中科技术股份有限公司 重定位方法、装置、链接器及编译系统
CN117435257B (zh) * 2023-12-18 2024-02-27 美智纵横科技有限责任公司 系统加载方法及装置、存储介质、计算机程序产品和芯片

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1971519A (zh) * 2005-11-24 2007-05-30 富士施乐株式会社 用于生成受保护可执行程序的设备、存储介质和方法
CN101211396A (zh) * 2006-12-31 2008-07-02 青岛海信电器股份有限公司 软件系统的防盗版保护方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1971519A (zh) * 2005-11-24 2007-05-30 富士施乐株式会社 用于生成受保护可执行程序的设备、存储介质和方法
CN101211396A (zh) * 2006-12-31 2008-07-02 青岛海信电器股份有限公司 软件系统的防盗版保护方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JP特开2009-80772A 2009.04.16

Also Published As

Publication number Publication date
CN101650664A (zh) 2010-02-17

Similar Documents

Publication Publication Date Title
CN101650664B (zh) 链接方法和链接器
Wang et al. In-memory fuzzing for binary code similarity analysis
Zhang et al. Precise and accurate patch presence test for binaries
David et al. Neural reverse engineering of stripped binaries using augmented control flow graphs
US11868745B2 (en) System and method for compiling high-level language code into a script executable on a blockchain platform
Andriesse et al. Compiler-agnostic function detection in binaries
Di Federico et al. rev. ng: a unified binary analysis framework to recover CFGs and function boundaries
Feist et al. Statically detecting use after free on binary code
CN106326737B (zh) 用于检测可在虚拟堆栈机上执行的有害文件的系统和方法
CN105354449A (zh) 一种面向Lua语言的加扰混淆方法和解密方法
WO2011119940A1 (en) Detection of global metamorphic malware variants using control and data flow analysis
Zhang et al. BDA: practical dependence analysis for binary executables by unbiased whole-program path sampling and per-path abstract interpretation
Kim et al. Automated generation of test cases for smart contract security analyzers
Katz et al. Statistical reconstruction of class hierarchies in binaries
CN105701405B (zh) 对软件程序集的本机图像进行防病毒检查的系统和方法
Li et al. Detecting standard violation errors in smart contracts
Pagani et al. Autoprofile: Towards automated profile generation for memory analysis
Rodler et al. EF↯ CF: High Performance Smart Contract Fuzzing for Exploit Generation
Cheng et al. Loongchecker: Practical summary-based semi-simulation to detect vulnerability in binary code
Fang et al. Beyond “Protected” and “Private”: An Empirical Security Analysis of Custom Function Modifiers in Smart Contracts
CN106909841A (zh) 一种判断病毒代码的方法及装置
Minh An approach to detecting duplicate bug reports using n-gram features and cluster chrinkage technique
CN112966258B (zh) 控制流完整性保护方法、系统、装置及可读存储介质
Shahkar On matching binary to source code
Alrabaee et al. Compiler provenance attribution

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CP03 Change of name, title or address

Address after: 17th floor, building B, Huizhi building, No.9, Xueqing Road, Haidian District, Beijing 100085

Patentee after: Feitian Technologies Co.,Ltd.

Country or region after: China

Address before: 100085 17th floor, block B, Huizhi building, No.9 Xueqing Road, Haidian District, Beijing

Patentee before: Feitian Technologies Co.,Ltd.

Country or region before: China

CP03 Change of name, title or address