一种增强软件保护易用性的方法

文档序号:6505515阅读:150来源:国知局
一种增强软件保护易用性的方法【专利摘要】本发明公开了一种提高虚拟机软件保护方式的易用性的方法,包括:A.利用与虚拟机匹配的编译器将源代码编译为虚拟指令文件;B.构造目标文件;C.添加对虚拟机和虚拟指令的引用。本方法对源代码进行转换,生成软件开发工具在链接时可直接利用的文件,虚拟机用户可以按照函数或类的定义直接调用被保护代码,即用户调用一个被保护的函数或类时和调用未被保护的函数或类方法相同,无需额外编写代码,能增强虚拟机保护方法的易用性,减少调用被保护代码的繁琐工作。【专利说明】一种增强软件保护易用性的方法【
技术领域
】[0001]本发明涉及软件版权保护技术,特别涉及一种增强软件保护易用性的方法。【
背景技术
】[0002]虚拟机(VirtualMachine,简称VM),指通过软件模拟硬件系统功能,VMWare就是一种虚拟机。许多解释性语言,如Java、LUA也是虚拟机。一个虚拟机引擎由编译器、解释器和VPUContext(虚拟CPU环境)组成,再配上一个或多个指令系统。使用虚拟机是实现软件版权保护的一种有效方法。该方法将要保护的软件代码转换成一种特定形式或架构的虚拟指令,虚拟指令在目标计算机上不能直接执行,而必须由虚拟机解释执行。由于虚拟机解释执行的速度较慢,大型软件为保证效率不能将全部代码转换为虚拟指令,而是一部分关键代码转换为虚拟指令,需要时再通过虚拟机执行虚拟指令。[0003]现有的直接对源代码进行转换的虚拟机使用较为繁琐。一般是由程序员针对被保护代码专门编制一段程序,一般包括三个步骤:输入参数处理、调用虚拟机和输出参数处理。例如LUA是一种脚本语言,利用解释器执行程序,LUA提供了C代码与LUA进行交互的函数集一“CAPI”。当利用C语言调用一个LUA的函数时,需要利用“CAPI”将所有函数参数按顺序放入堆栈中,然后调用解释器执行程序,最后按顺序从堆栈中取出计算结果。该方法对不同的代码需要编制不同的程序,不具备通用性;要求严格得对参数进行处理,且不能发挥编译器对参数的检查功能,因而易出错,难调试。[0004]此外,COFF(CommonObjectFileFormat,通用对象文件格式)是一种很流行的对象文件格式。比如,VisualStudio编译器所产生的目标文件(*.0bj)就是这种格式。其它的编译器,如GCC(GNUCompilerCollection)、ICL(IntelC/C++Compiler)、VectorC,也使用这种格式的目标文件。不仅仅是C/C++,很多其它语言也使用这种格式的对象文件。[0005]COFF文件的整体结构如下:FileHeaderOptionalHeaderSectionHeaderISectionHeadernSectionDataRelocationDirectivesLineNumbersSymbolTableStringTable因此,COFF文件一共有8种数据,自上而下分别为:1.文件头(FileHeader)2.可选头(OptionalHeader)3.段落头(SectionHeader)4.段落数据(SectionData)5.重定位表(RelocationDirectives)6.行号表(LineNumbers)7.符号表(SymbolTable)8.字符串表(StringTable)其中,除了段落头可以有多个节(因为可以有多个段落)以外,其它的所有类型的节最多只能有一个。[0006]文件头:C0FF文件的头,它用来保存COFF文件的基本信息,如文件标识,各个表的位置等等。[0007]可选头:在目标文件中,基本上都没有这个头;但在其它的文件中(如:可执行文件)这个段用来保存在文件头中没有描述到的信息。[0008]段落头:用来描述段落信息,每个段落都有一个段落头来描述。段落的数目在文件头中会指出。[0009]段落数据:通常是COFF文件中最大的数据段,每个段落真正的数据就保存在这个位置。[0010]重定位表:通常只存在于目标文件中,用来描述COFF文件中符号的重定位信息。[0011]符号表:用来保存COFF文件中所用到的所有符号的信息,连接多个COFF文件时,这个表帮助我们重定位符号。调试程序时也要用到它。[0012]字符串表:用来保存字符串的。符号表是以记录的形式来描述符号信息的,但它只为符号名称留置了8个字符的空间,在现在的程序中,一个符号名动不动就数十个字符,8个字符空间的不够,因此需将这些名称存在字符串表中。而符号表中只记录这些字符串的位置。【
发明内容】[0013]一般的软件开发工具对源代码的处理如图1所示,先由编译器将各源代码文件编译并生成目标文件,再由将各目标文件和库文件链接生成可执行程序。[0014]【
背景技术
】所述的一般方法相当于将要保护的源代码替换成程序员编制的调用虚拟机的代码,而本发明提供的一种提高虚拟机软件保护方式的易用性的方法如图2所示(假设源代码为要保护的代码)。本发明方法先调用与虚拟机匹配的编译器将源代码编译为虚拟指令文件,再根据虚拟指令文件生成目标文件,该目标文件中包含源代码中的变量和函数,包含符号表、重定位表等链接器需要的信息,包含对虚拟机的引用、对虚拟指令的引用。[0015]本发明所述方法可自动,具有通用性,无需程序员针对被保护代码编制专门的程序,从而提高虚拟机保护方式的易用性。本发明提供一种通过虚拟机增强软件保护易用性的方法,其特征在于,所述方法包括如下步骤:步骤1:利用与虚拟机匹配的编译器将源代码编译为虚拟指令文件;步骤2:根据虚拟指令文件构造目标文件;步骤3:在目标文件中添加对虚拟机和虚拟指令的引用。[0016]根据本发明的一个方面,在步骤2中,进一步包括:构造本地函数、变量;按目标文件格式要求构造源代码中涉及的函数、变量的符号,并使本地定义的各符号分别指向其实体;构造函数、变量的重定位信息。[0017]根据本发明的一个方面,在步骤2中,进一步包括:所述构造本地函数,包括构造跳转到虚拟机入口函数的跳转指令,以及构造虚拟机所需参数;所述构造变量,包括将变量的初始数据添加到文件中。[0018]根据本发明的一个方面,在步骤3中,进一步包括:设定虚拟机入口函数符号使符号指向虚拟机入口函数,以及设定虚拟指令符号,并使所述虚拟指令符号指向对应的虚拟指令。[0019]根据本发明的一个方面,在对面向对象编程语言程序进行保护时,在步骤3之后,还包括:构造全局变量构造与析构函数。[0020]根据本发明的一个方面,在对允许将全局变量初始化为变量的程序进行保护时,还包括:构造初始化函数列表。[0021]根据本发明的一个方面,还包括:设置目标文件格式需要的其他信息。[0022]根据本发明的一个方面,还包括:输出目标文件。[0023]与现有技术相比,本发明具有以下有益效果:本方法生成软件开发工具在链接时可直接利用的文件,虚拟机用户可以用使用函数或类的方法直接调用被保护代码,即用户调用一个被保护的函数或类时和调用未被保护的函数或类方法相同,无需做额外处理,增强虚拟机保护方法的易用性。【专利附图】【附图说明】[0024]图1为软件开发工具生成可执行程序的示意图。[0025]图2为应用本发明方法时生成可执行程序的示意图。[0026]图3为本发明方法的实施例一的示意图。[0027]图4为本发明方法的实施例二的示意图。【具体实施方式】[0028]下面结合附图对本发明的实施例进行详细说明。[0029]根据本发明的一个方面,本发明的方法包括:A.调用与虚拟机匹配的编译器将源代码编译为虚拟指令文件。其中,由于虚拟机应有与之匹配的编译器,否则不能应用,而且本发明并非针对编译器,加之本领域的技术人员能够实现与虚拟机匹配的编译器,因此本文不再对编译器进行详细描述。[0030]B.根据虚拟指令文件构造目标文件;C.在目标文件中添加对虚拟机和虚拟指令的引用;其中,B步骤中还可进一步包括以下内容:B1.构造本地函数、变量的实体。对函数而言,需要构造跳转到虚拟机入口函数的跳转指令,构造虚拟机需要的参数。对变量而言,需要将变量的初始数据添加到文件中。[0031]B2.按目标文件格式要求构造源代码中涉及的函数、变量的符号,并使本地定义的各符号分别指向其实体。[0032]B3.构造函数、变量的重定位信息。[0033]B4.在对面向对象编程语言程序进行保护时,还包括:构造全局变量构造与析构函数;一般面向对象编程语言如C语言没有构造与析构函数,对用类似语言的程序进行保护时,可不包括本步骤。[0034]B5.在对允许将全局变量初始化为变量的程序进行保护时,还包括:构造初始化函数列表;一般面向对象编程语言如C语言不支持将全局变量初始化为变量,对用类似语言的程序进行保护时,可不包括本步骤。[0035]其中,C步骤还可进一步包括以下内容:Cl.设定虚拟机入口函数符号使符号指向虚拟机入口函数。[0036]C2.设定虚拟指令符号,并使该符号指向对应的虚拟指令。[0037]以下提供具体实施例,以便更明确地理解和适用本发明:实施例一:以C语言编写的example,c文件中包含以下代码:staticintnumber;externintGetParameterO;intGetSum(inta){returnGetParameter()+number+a;}软件运行环境为32位x86平台,操作系统为32位windowsxp。[0038]上述example,c文件编译为虚拟指令后其目标文件为ELF格式的example.0,虚拟机的入口函数为EnterVm,要求的参数为虚拟指令地址、重定位表。[0039]本实施例的目标是构造一个COFF格式的目标文件——example,obj,其中包含GetSum函数及COFF格式要求的信息。[0040]在软件开发工具(如VisualStudio6.0)加入该目标文件(example,obj),用户在编程时就可以直接调用GetSum函数。[0041]其中,ELF格式简介如下:ELF=ExecutableandLinkableFormat,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(ApplicationBinaryInterface,ABI)而开发和发布的。[0042]ELF头位于文件的开始,描述了该文件的组织情况。sections保存着object文件的信息,较为常见的section包括指令,数据,符号表,字符串表,重定位信息等等。section头表(sectionheadertable)包含了描述文件sections的信息。每个section在这个表中有一个入口;每个入口给出了该section的名字,大小,等等信息。各部分分布如下表所示:ElfheaderProgramheadertablesectionlsectionn【权利要求】1.一种通过虚拟机增强软件保护易用性的方法,其特征在于,所述方法包括如下步骤:步骤1:利用与虚拟机匹配的编译器将源代码编译为虚拟指令文件;步骤2:根据虚拟指令文件构造目标文件;步骤3:在目标文件中添加对虚拟机和虚拟指令的引用。2.根据权利要求1所述的方法,其特征在于,在步骤2中,进一步包括:构造本地函数、变量;按目标文件格式要求构造源代码中涉及的函数、变量的符号,并使本地定义的各符号分别指向其实体;构造函数、变量的重定位信息。3.根据权利要求2所述的方法,其特征在于,在步骤2中,进一步包括:所述构造本地函数,包括构造跳转到虚拟机入口函数的跳转指令,以及构造虚拟机所需参数;所述构造变量,包括将变量的初始数据添加到文件中。4.根据权利要求1所述的方法,其特征在于,在步骤3中,进一步包括:设定虚拟机入口函数符号使符号指向虚拟机入口函数,以及设定虚拟指令符号,并使所述虚拟指令符号指向对应的虚拟指令。5.根据权利要求1所述的方法,其特征在于,在对面向对象编程语言程序进行保护时,在步骤3之后,还包括:构造全局变量构造与析构函数。6.根据权利要求5所述的方法,其特征在于,在对允许将全局变量初始化为变量的程序进行保护时,还包括:构造初始化函数列表。7.根据权利要求1或6所述的方法,其特征在于,还包括:设置目标文件格式需要的其他信息。8.根据权利要求7所述的方法,其特征在于,还包括:输出目标文件。【文档编号】G06F21/12GK103514027SQ201310284247【公开日】2014年1月15日申请日期:2013年11月12日优先权日:2013年11月12日【发明者】不公告发明人申请人:北京深思数盾科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1