编译方法以及编译器的制作方法

文档序号:6484287阅读:178来源:国知局
专利名称:编译方法以及编译器的制作方法
技术领域
本发明涉及计算机技术领域,尤其涉及一种编译方法以及编译器。
技术背景智能密钥设备是一种带有处理器和存储器的小型硬件装置,它通过计算机 的数据通讯接口与主才几连接。它具有密钥生成、安全存^f渚密钥、预置加密算法 等功能。智能密钥设备与密钥相关的运算完全在装置内部运行,并且具有抗攻 击的特性,安全性极高。智能密钥设备生产商、软件系统开发商或者最终用户 可以将一些重要信息存储到智能密钥设备中,用以保证信息安全性或者防止遗忘o目前,较高端的智能密钥设备是可编程的,即可以在智能密钥设备中运行 预先存入其中的程序代码。智能密钥设备将预先存入其中的程序代码进行编译, 编译后在计算机上执行编译后的程序代码得到处理结果。其中,编译过程是指 将高级语言编写的源程序翻译成目标程序的过程。该目标程序是由计算机可执行的指令构成,并且功能与源程序的功能相同。编译过程分为5个阶段词法 分析、语法分析、语义检查与中间代码的生成、代码优化和目标代码生成。在实现上述编译过程中,发明人发现现有技术中至少存在如下问题从源 程序编译出目标程序后,任何一个具有机器语言处理能力的计算机都能够执行该目标程序,使得编译后的目标程序不能得到较好的版权保护;并且现有的版 权保护方法也特别复杂,需要用户手动地将验证智能密钥设备的代码加到源程 序中,并且还需要用户学习如何使用智能密钥设备。发明内容本发明的实施例提供一种编译方法以及编译器,用来简化、降低现有技术 中版权保护的复杂度与难度。为达到上述目的,本发明的实施例釆用如下技术方案一种编译方法,包括对源程序代码进行预处理;并对预处理后的源程序代码进行词法分析和语法分析;该方法还包括按照预先设定的规则确定验证代码在源程序代码中的插入点; 将所述验证代码插入到所述插入点在源程序代码中的对应位置; 将包含插入了验证代码的源程序代码转换成目标程序代码。 一种编译器,包括编译模块,用于对源程序代码进行预处理,并对预处理后的源程序代码进行词法分析和语法分析;该编译模块还包括确定单元,用于按照预先设定的规则确定验证代码在源程序代码中的插入占 /"、 9插入单元,用于将所述验证代码插入到所述插入点在源程序代码中的对应 位置;转换单元,用于将包含插入了验证代码的源程序代码转换成目标程序代码。 本发明提供的编译方法及编译器,先在源程序代码中确定出验证代码的插 入点,将验证代码插入到所述插入点在源程序代码中的对应位置,并将包含插 入了验证代码的源程序代码转换成目标程序代码。如此一来,在执行目标程序 代码的过程中如果执行到其中的验证代码处,则要进行智能密钥设备的验证, 这样就能够防止目标程序被任何一台计算机执行,达到了目标程序代码版权保 护的目的。并且,由于本发明中目标程序执行过程中是对智能密钥设备进行验 证,而智能密钥设备是硬件形式存在的,相对于现有技术中通过软件形式设置密码而言,本发明在编译阶段自动加入了访问智能密钥设备的代码,使目标程 序代码自动受到智能密钥设备的保护,简化、降低了版权保护的复杂度与难免。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施 例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述 中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付 出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例1中编译方法的流程图; 图2为本发明实施例1中编译器的框图; 图3为本发明实施例2中编译方法的流程图; 图4为本发明实施例2中编译器的框图。
具体实施方式
本发明实施例中的验证代码能够对智能密钥设备进行验证,为了便于理解 本发明中保护目标程序代码版权时所采用的验证代码,下面详细的介绍一下智 能密钥设备。一般智能密钥设备中会内置安全芯片来实现安全功能。该安全芯片除了具 有通用嵌入式微控制器的各种特性外,还具有较可靠的安全性能。在设计智能 密钥设备时会针对安全性能方面在安全芯片的结构上做一些特殊处理,比如釆 用特定的安全内核作为安全芯片的内核,该安全内核能够支持多个拥有不同权 限的状态,从而实现对硬件资源访问权限的管理。智能密钥设备还可以带有MMU单元(Memory Management Unit,存储器管理 单元),用于实现地址映射、逻辑地址的隔离、以及物理地址的隔离,该,U单 元从体系结构上支持多应用和安全性能的设计,与安全芯片的内核所支持的不同权限一起组成一个硬件安全防火墙。上面详细介绍了智能密钥设备的功能,下面将结合本发明实施例中的附 图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实 施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施 例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施 例,都属于本发明保护的范围。实施例1为了简化、降低了版权保护的复杂度与难度,本发明实施例提供一种编译方法,如图l所示,该方法包括101、 对源程序代码进行预处理,并对预处理后的源程序代码进行词法分析和语法分析;按照预先设定的规则确定验证代码在源程序代码中的插入点。其中,所述验证代码可以是一段验证智能密钥设备的代码,所述验证代码 还可以是一个函数调用,所述函数完成验证所述智能密钥设备的功能,函数可 以实现在一个编译好的库中,或者,所述函数以源代码的形式放在源程序代码 中;所迷确定验证代码在源程序代码中的插入点的方法为根据对预处理后的源 程序代码进行词法分析和语法分析的结果,来确定-睑证代码在源程序代码中的 插入点;所述预先设定的规则为确定源程序代码中函数的开始位置为验证代码在 源程序代码中的插入点;或者确定源程序代码中函数的结束位置为验证代码在 源程序代码中的插入点;或者确定源程序代码中函数调用之前的位置为验证代 码在源程序代码中的插入点;或者确定源程序代码中函数调用之后的位置为验 证代码在源程序代码中的插入点。102、 当确定了上述验证代码在源程序代码中的插入点后,将所述验证代码插入到所述插入点在源程序代码中的对应位置,以便在执行目标程序代码的时 候能够执行到上述验^L代码。103、当将所述验证代码插入到所述确定的插入点在源程序代码中的对应位 置后,将包含验证代码的源程序代码转换成目标程序代码,以便计算机可以执 行所述程序,得到所述源程序代码的运行结果;执行本实施例中的验证代码能 够对以硬件形式存在的安全设备进行验证。为了进一步简化、降低了版权保护的复杂度与难度,本发明实施例还提供 一种编译器,如图2所述,该编译器包括编译模块,用于对源程序代码进行预 处理,并对预处理后的源程序代码进行词法分析和语法分析;为了保护目标程 序版权,本实施例中的编译模块还包括确定单元21、插入单元22和转换单元 23。确定单元21用于按照预先设定的规则确定—睑证代码在源程序代码中的插入 点;插入单元22用于将所述验证代码插入到所述插入点在源程序代码中的对应 位置;转换单元23用于将包含插入了验证代码的源程序代码转换成目标程序代 码。在执行釆用本实施例提供的编译方法和编译器得到的目标程序时,如果执 行到目标程序代码中的验证代码,就需要进行智能密钥设备的验证,这样就能 够防止目标程序被任何一台计算机执行,达到了目标程序代码版权保护的目的。 并且,由于本发明中目标程序执行过程中是对智能密钥设备进行验证,而智能 密钥设备是硬件形式存在的,相对于现有技术中通过软件形式设置密码而言, 本发明在编译阶段自动加入了访问智能密钥设备的代码,使目标程序代码自动 受到智能密钥设备的保护,简化、降低了版权保护的复杂度与难度。实施例2为了更清楚地介绍本发明所采用的技术方案,下面结合采用USB Key作为 智能密钥设备的情况下的编译过程,进一步对本发明进行详细说明,但是,本 发明还可以包括其他智能密钥设备的实施例,本实施例不作为对本发明的限定。在本实施例中,将验证代码插入到所述插入点在源程序代码中的对应位置, 来达到使编译后得到的目标程序代码受USB Key保护的目的,如图3所示,具 体实现包括如下301、 在编译的过程中,首先需要对源程序代码进行预处理,所述预处理的后的源程序代码。该源程序代码可以是C语言、0++语言等高级语言编写的源程 序代码。本实施例以C语言编写的源程序代码进行编译来说明,所述C语言的源程 序代码如下#include <stdio.h> void test 0 {printf("i'm in test\n";int main() {printf ("hello world\n"; test 0 ; return 0;302、 对源程序代码进行预处理后,进一步对源程序代码进4于词法分析和语 法分析,在分析的过程中根据高级语言的语法规则检测源程序代码中是否有语ii法错误,若源程序代码中有语法错误,则执行步骤303;若源程序代码中没有语 法错误,则执行步骤304。303、 提示出错信息并终止分析预处理后的源程序代码。304、 继续对预处理后的源程序代码进行词法分析和语法分析,直到将所述 源程序代码分析完毕。本实施例步骤303和304过程共同实现了分析预处理后的源程序代码在出 现语法错误时的处理方法,本实施例中采用的是在遇到语法错误时直接提示出 错信息并终止分析预处理后的源程序代码,即在执行步骤303后不需要执行 步骤304;在具体实现时,还可以采用不同于本实施例的方案,如在遇到语法错误 时仅仅是将错误提示出来,并继续对预处理后的源程序代码进行分析;这种情 况下,步骤303的具体执行内容是提示语法错误的信息,并且执行步骤303之 后还需要执行步骤304。305、 当源程序代码的词法分析和语法分析结束后,根据所述词法分析和语 法分析的结果确定验证代码在源程序代码中的插入点。其中,所述验证代码可以是一段验证USB Key的代码,所述验证代码还可 以是一个函数调用,所述函数完成验证所述智能密钥设备的功能,所述函数可 以实现在一个编译好的库中,或者,所述函数以源代码的形式放在源程序代码 中;所述词法分析和语法分析的结果包括源程序代码中函数的个数、函数的 位置以及函数相互之间的调用情况。本发明实施例中对步骤301中的C语言源程序代码进行词法和语法的分析 得到本实施例的源程序代码中共定义了 test函数和main函数,其中main函数是源程序代码的入口点,并且main函数中包含有test函数,即test函数被 main函数调用了一次。本发明实施例以test函凄W皮main函凄t调用的入口处为 USB Key的验证代码在源程序代码中的插入点为例,来具体说明验证代码插入源 程序代码中的过程。306、 USB Key编译器将验证代码插入到test函数被main函数调用的入口处。本实施例具体以将所述验证USB Key的代码直接插入到所述插入点在源程 序代码中的对应位置为例来说明; 插入的代码具体为 并include <stdio. h> void test 0 { int ret=—lj int num=0; int fd=-l;int cmd=105; 〃某个命令char data-in[2] = {0x11, 0x22}; 〃命令需要的输入数据 char data-out [2]; 〃命令执行后的usbkey的输出凄t据 int in_len=2; 〃输入数据长度 int out_len=0; 〃输出数据长度char data —expire [2] = {0x18, 0x88}; 〃期望的llr出凄史才居 num=usbkey_f ind (); 〃返回找到的usbkey个数 if(num<=0) exi t (-1); 〃没找到USB key fd=usbkey_open ();if(fd〈0) exit(-1);〃打开失败ret=usbkey_cmd(fd, data—in, in—len, data—out, &out —len); if (ret !=0 II memcmp (data—out, data—expire, 2) !=0) {usbkey—close (fd) 5exit(-1);//执行命令失败usbkey—close (fd); printf("i'm in test\n");int main() {int ret=-int num=0; int fd=-l.,int couK05;〃某个命令char data—in[2] = {0x11, 0x22}; 〃命令需要的输入数据 char data—out [2]; 〃命令4丸4亍后的usbkey的东俞出凄t据 int in-len=2; 〃输入数据长度 int out_len=0; 〃输出凄t据长度char data—expire [2] = {0xl8, 0x88}; 〃期望的输出数据num=usbkey_f ind (); 〃返回找到的usbkey个数if (num<=0) exit (-1); //没找到USB keyf d=usbkey—open ();if(f(KO) exit(-l);〃打开失败ret=usbkey_cmd (fd, data_in, in_len, data—out, &out_len)5 if (ret !=0 || memcmp (data—out, data—expire, 2) !=0) {
usbkey—close (fd)5
exit (-1); 〃执行命令失败
usbkey—close (fd)5 printf ("hello world\n"); test (); return 0j
307、 当将所述验证代码插入到源程序代码中后,USB Key编译器将插入了 验证代码后的源程序代码转换成中间程序代码。
308、 当将源程序代码转化为中间程序代码后,所述USB Key编译器将上述 中间程序代码转换成汇编代码,再将汇编代码转换成二进制代码。
309、 将二进制代码与编译二进制代码要用到的USB Key库以及其他库进行 链接,得到最后的可执行文件,该过程中提到的库主要包括libC库、
check—usbkey函数所在的库。
其中,步骤306中,USBKey的编译器将验证代码插入到源程序代码中,当 上述验证代码是一个函数调用,且函数实现在一个编译好的库中时,则插入的 所述验证代码具体如下 并include <stdio.h〉
〃此处将函数check-usbkey的实现在一个编译好的库中 int check_usbkey (int a, int b , int c) {int ret--l; int num=0; int fd--lj
int cmd-105;〃某个命令
char data一in [2] = {0x11, 0x22}; 〃命令需要的输入数据 char data-out [2]; 〃命令执行后的usbkey的输出数据 int in—len=2; 〃丰餘入凄史据长度 int out — len=0; 〃输出数据长度
char data-expire [2] = {0x18, 0x88}; 〃期望的输出ft据 num=usbkey—f ind (); 〃返回找到的usbkey个数 if(num<=0) return -1; 〃没找到锁 fd=usbkey_open (); if(fd<0) return -1;//打开失败
ret=usbkey-cmd (fd, data—in, in—1 en, data—out, &out —len); if (ret !=0 I I memcmp (data—out, data—expire, 2) !=0) {
usbkey—close (fd)5
return -1; //执行命令失败
usbkey—close (fd) , return 0; //成功
void test 0 {
if (check-usbkey() !=0) exit(-l);
16printf("i'm in test\n");
int main() {
if (check-usbkey () !=0) exit(-l); printf ("hello worldW'); test (); return 0;
进一步地,USB Key编译器将验证代码插入到源程序代码中,当上述验证 代码是一个函数调用,且函数以源代码的形式放入源程序代码中时,则插入的 所述验证代码具体如下
#include <stdio.h>
〃此处将函数check-usbkey的实现以源代码的形式方文入源程序代码中, int check—usbkey (int a, int b , int c) {
int ret=-lj
int num=0;
int fd=-l;
int cmd=105; 〃某个命令
char data — in[2] = {0xll, 0x22}; 〃命令需要的输入数据 char data—out [2]; 〃命令执4亍后的usbkey的專叙出凄t才居 int i n — 1 en=2; 〃输入数据长度 int out —len-0;Z/输出数据长度
char data — expire [2〗={0x18, 0x88};//期望的丰lr出凄^居num-usbkey—find (); 〃返回找到的usbkey个数
if(num<=0) return -1; 〃没找到锁
f d=usbkey_open ();
if(fd<0) return -1; 〃打开失败
ret=usbkey_cmd (fd, data —in, in—len, data—out, &out_len); if (ret !=0 II memcmp (data—out, data—expire, 2) !=0) {
usbkey—close (fd) 5
return -1; 〃执行命令失败
usbkey—close (fd)5 return 0; //成功
void test 0 {
if (check-usbkey () !=0) exit(-l); printf (" i'm in test\n");
int main() {
if (check_usbkey () !=0) exit(-l); printf ("hello world\n"); test (h return 0j
在本实施例中,验证代码的插入点为函数的入口处,在实际运用时,验证代码的插入点可以是函数开始处、函数结尾处、函数调用前后等;只需要在上 述插入点中插入了验证代码,在运行目标程序代码时就一定会执行到验证代 码,在不能通过验证代码的情况下,目标程序代码将退出而不能正常工作,这 样就可以保护本实施例中目标程序代码的版权。
在运行可执行文件的过程中,执行到验证代码的具体执行过程包括当调 用usbkey-find ()函数后,检测计算机是否与USB Key连接,若没有USB Key 和执行目标程序代码的计算机相连接,则结束目标程序代码的执行;若检测到 有USB Key和所迷执行目标程序代码的计算机相连,则需要打开所述USB Key, 若所述USB Key无法打开,则结束目标程序代码的运行;若USB Key顺利的打 开,还要进一步判断USB Key返回的数据是否与预先设定的数据相同,若不相 同,则结束目标程序代码的运行;只有所述目标程序代码通过了所述USB Key 的验证,才能使所述目标程序代码在计算机上运行,得到运行结果;若USB Key 验证过程中的任一条件不满足,即便可以运行所述目标程序代码的计算机也得 不到正确的源程序代码运行结果。
在运行可执行文件的过程中,执行到 -险证代码的具体执4亍过程还可以为 在USB Key设备和计算机相连接的基础上,直接将所述USB Key设备打开进行 该设备的验证。若所述USBKey无法打开,则结束目标程序代码的运行;若USB Key顺利的打开,还要进一步判断USB Key返回的数据是否与预先设定的数据相 同,若不相同,则结束目标程序代码的运行;只有所述目标程序代码通过了所 述USBKey的验证,才能使所述目标程序代码在计算机上运行,得到运行结果; 若USB Key验证过程中的任一条件不满足,即便可以运行所迷目标程序代码的 计算机也得不到正确的源程序代码运行结果。
具体地,USB Key接收到的操作命令可以为一种数据操作命令,则USB Key对数据操作命令中包含的数据进行运算,并将得到的运算结果返回。其中,运 算可以是加密运算、解密运算和其他相关的运算。
为了进一步加强对目标程序代码版权的保护,上述验证代码中还可以包含
将种子码作为参数的USB Key调用函数,该种子码是获取的USB Key的用户号, 当调用usbkey_cmd (fd, data —in, in—len, data—out, &out — len)时,USB Key利 用自身的种子码算法对的USB Key的用户号进行运算得到新的种子码。相应的, 因此每次USB Key在运行check_usbkey ()函数时,需要获得该USB Key的用户 号,并以得到的用户号为种子生成一个种子码,再比较生成的种子码与作为参 数传递给check-usbkey()函数种子码是否相同,若生成的种子码与作为参数传 递给check-usbkey()函数种子码相同,则继续运行可执行文件,若生成的种子 码与作为参数传递给check-usbkey()函数种子码不相同,则返回错误信息,并 退出可执行文件的运行。
上述实施例中采用用户号来进行种子码的运算,在具体实施时,还可以采 用USB Key的其他特征信息来进行种子码的运算,例如USB Key的硬件序列号 等。
为了能够保证编译出的目标程序代码的版权得到较好的保护,本发明实施 例还提供一种编译器,如图4所示,该编译器包括编译模块41和链接模块42。 其中编译模块41用于将源程序代码编译为目标程序代码,链接模块42用于将 经过转换处理得到的目标程序代码链接到相应的库,得到最后的可纟丸行文件。
为了使得编译后的目标程序代码能够得到较好的版权保护,本实施例中的编 译模块41包括预处理单元411、分析单元412、检测单元413、控制单元414、 确定单元415、插入单元416和转换单元417。
其中,预处理单元411用于对源程序代码进行预处理;分析单元412用于对
20经过预处理单元411预处理后的源程序代码进行词法分析、语法分析和语义分 析;检测单元413用于检测源程序代码中是否有语法错误;控制单元用于 在检测单元413检查到源程序代码有语法错误时提示出错信息并终止分析源程 序代码;确定单元415用于根据分析单元412的结果确定源程序代码的结构, 并且根据源程序代码的结构确定验证代码的插入点;插入单元416用于将所述 验证代码插入到所述确定单元415在源程序代码中确定的插入点,其中,所述 验证代码可以是一段-睑证USB Key的代码,所述-睑证代码还可以是一个函数调 用,所述函数完成验证所述智能密钥设备的功能,函数可以实现在一个编译好 的库中,或者,所述函数以源程序代码的形式放在源程序代码中;转换单元417 用于将插入了验证代码的源程序代码转换成中间代码,并且将中间代码转换成 汇编代码以及将汇编代码转换成二进制代码。
其中,在链接模块42得到可执行文件以后,运行可执行文件时可以通过上 述验证代码进行目标程序代码的版权保护。
在执行采用本实施例提供的编译方法和编译器得到目标程序代码时,如果 执行到目标程序代码中的验证代码,就需要进行USB Key的验证,这样就能够 防止目标程序代码被任何一台计算机执行,达到了目标程序代码版权保护的目 的。并且,由于本发明中目标程序代码执行过程中是对USB Key进行验证,而 USBKey是硬件形式存在的,相对于现有技术中通过软件形式设置密码而言,本 发明在编译阶段自动加入了访问智能密钥设备的代码,使目标程序代码自动受 到智能密钥设备的保护,简化、降低了版权保护的复杂度与难度。
在本发明实施例1中主要以插入点为源程序代码的函数入口处的情况进行 说明,在实际运用时,上述实施例中的插入点还可以是源程序代码的函数结束 处和函数调用的前后,在形成目标程序代码后,目标程序代码的基本情况和实施例l中相似,只是验证代码所在的位置不同,此处不再重复形成目标程序代 码。
本发明实施例主要用在计算机的编程中,特別是用在各种高级语言的编译中。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发
明可借助软件加必需的通用硬件的方式来实现,当然也可以通过硬件,但很多
情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或
者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软
件产品存储在可读取的存储介质中,如计算机的软盘,硬盘或光盘等,包括若
干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备
等)执行本发明各个实施例所述的方法。
以上所述,仅为本发明的具体实施方式
,但本发明的保护范围并不局限于 此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到 变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应 以所述权利要求的保护范围为准。
权利要求
1、一种编译方法,包括对源程序代码进行预处理;并对预处理后的源程序代码进行词法分析和语法分析;其特征在于,该方法还包括按照预先设定的规则确定验证代码在源程序代码中的插入点;将所述验证代码插入到所述插入点在源程序代码中的对应位置;将包含插入了验证代码的源程序代码转换成目标程序代码。
2、 根据权利要求1所述的编译方法,其特征在于,所述验证代码是一段-验 证智能密钥设备的代码;或者,所述验证代码还是一个函数调用,所述函数完 成验证所述智能密钥设备的功能,所述函数实现在一个编译好的库中,或者, 所述函数以源代码的形式放在源程序代码中。
3、 根据权利要求1所述的编译方法,其特征在于,所述确定验证代码在源法分析的结果,来确定-瞼证代码在源程序代码中的插入点。
4、 根据权利要求l所述的编译方法,其特征在于,所述验证代码为高级语 言形式的代码。
5、 根据权利要求1所述的编译方法,其特征在于,所述预先设定的规则为 确定源程序代码中函数的开始位置为验证代码在源程序代码中的插入点;或者确定源程序代码中函数的结束位置为验证代码在源程序代码中的插入点; 或者确定源程序代码中函数调用之前的位置为验证代码在源程序代码中的插入 点;或者确定源程序代码中函数调用之后的位置为验证代码在源程序代码中的 插入点。
6、 根据权利要求2所述的编译方法,其特征在于,所述验证代码中包括智 能密钥设备调用函数,所述智能密钥设备调用函数执行时包括打开所述智能密钥设备;若打开所述智能密钥设备失败,则退出执行所述目标程序代码; 若打开所述智能密钥设备成功,则向所述智能密钥设备发送操作命令,并 接收智能密钥设备执行所述操作命令所返回的数据。
7、 根据权利要求6所述的编译方法,其特征在于,在打开所述智能密钥设 备之前还包括判断是否查找到智能密钥设备;若没有查找到所述智能密钥设备,则退出执行所述目标程序代码; 所述打开所述智能密钥设备为在查找到所述智能密钥设备时打开所述智 能密钥设备。
8、 根据权利要求6所述的编译方法,其特征在于,在接收到智能密钥设备 执行所述操作命令所返回的数据后还包括判断接收到的数据是否与预期数据相同;若接收到的数据与预期数据不相同,则退出执行所述目标程序代码; 若接收到的数据与预期数据相同,则继续执行目标程序代码。
9、 根据权利要求6所述的编译方法,其特征在于,向所述智能密钥设备发 送的操作命令是一种数据操作命令,则所述智能密钥设备对数据操作命令中传 递的的数据进行运算,并将运算后得到的数据返回。
10、 根据权利要求2所迷的编译方法,其特征在于,所述验证代码中包括 将种子码作为参数传递给智能密钥设备调用函数的参数的指令;所述智能密钥设备调用函数执行时还包括 获取智能密钥设备的特征信息; 利用所述特征信息计算种子码;判断计算出的种子码与所述参数传递指令传递过来的种子码是否相同;若计算出的种子码与所述参数传递指令传递过来的种子码不相同,则退出 执行所述目标程序代码。
11、 根据权利要求10所述的编译方法,其特征在于,所述特征信息为智能密钥设备的用户号或者硬件序列。
12、 权利要求1所述的编译方法,其特征在于,将包含插入了验证代码的 源程序代码转换成目标程序代码之后还包括将经过转化处理后的目标程序代 码与编译目标程序代码要用到的智能密钥设备库以及其他库进行链接,得到可 执行文件。
13、 一种编译器,包括编译模块,用于对源程序代码进行预处理,并对预 处理后的源程序代码进行词法分析和语法分析;其特征在于,该编译模块还包 括确定单元,用于按照预先设定的规则确定验证代码在源程序代码中的插入点;插入单元,用于将所述验证代码插入到所述插入点在源程序代码中的对应 位置;转换单元,用于将包含插入了验证代码的源程序代码转换成目标程序代码。
14、 根据权利要求13所述的编译器,其特征在于,所述验证代码是一段验 证智能密钥设备的代码;或者,所述验证代码还是一个函数调用,所述函数完 成验证所述智能密钥设备的功能,所述函数实现在一个编译好的库中,或者, 所述函数以源代码的形式放在源程序代码中。
15、 根据权利要求13所述的编译器,其特征在于,所述确定验证代码在源 程序代码中的插入点的方法为根据对预 法分析的结果,来确定验证代码在源程序代码中的插入点,
16、 根据权利要求13所述的编译器,其特征在于,所述预先设定的规则为 确定源程序代码中函数的开始位置为验证代码在源程序代码中的插入点;或者确定源程序代码中函数的结束位置为验证代码在源程序代码中的插入点; 或者确定源程序代码中函数调用之前的位置为验证代码在源程序代码中的插入 点;或者确定源程序代码中函数调用之后的位置为验证代码在源程序代码中的 插入点。
17、 根据权利要求13所述的编译方法,其特征在于,所述验证代码为高级 语言形式的代码。
18、 根据权利要求13所述的编译器,其特征在于,所述编译^t块还包括 检测单元,用于检测所述源程序代码中是否有语法错误;控制单元,用于在所述检测单元检测到所述源程序代码有语法错误时,提 示出错信息并终止分析所述预处理后的源程序代码;或者提示出错信息并继续 分析预处理后的源程序代码。
19、 根据权利要求13所述的编译器,其特征在于,所述编译模块还包括 预处理单元,用于对所述源程序代码进行预处理;
20、 根据权利要求13所述的编译器,其特征在于,该编译器还包括链接模 块,用于将经过二进制转化处理后的目标程序代码链接到相应的库。
全文摘要
本发明公开了一种编译方法及编译器,涉及计算机技术领域,解决了现有技术中编译出的目标程序版权得不到较安全保护的问题。本发明编译方法包括按照预先设定的规则确定验证代码在源程序代码中的插入点;将所述验证代码插入到所述插入点在源程序代码中的对应位置;将包含插入了智能密钥设备验证代码的源程序代码转换成目标程序代码。本发明实施例主要用在计算机的编程中,特别是用在各种高级语言的编译中。
文档编号G06F21/22GK101533454SQ20091008232
公开日2009年9月16日 申请日期2009年4月14日 优先权日2009年4月14日
发明者于华章, 舟 陆 申请人:北京飞天诚信科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1