防止软件逆向工程、未经授权修改以及运行时数据截取的方法

文档序号:6568510阅读:363来源:国知局

专利名称::防止软件逆向工程、未经授权修改以及运行时数据截取的方法防止软件逆向工程、未经授权修改以及运行时数据截取的方法发明领域本发明涉及计算机软件保护领域。更为具体地,本发明涉及保护计算机软件免遭逆向工程、未经授权的修改以及运行时数据截取。
背景技术
:近年来已经作出了许多努力来保护原始计算机软件不被复制和大量散布。现今所用的方法之一涉及要求在安装或运行时期间由用户手动输入许可证或密钥序列。防止软件的重复使用的另一个流行的方法涉及安装后对软件的激活。激活过程要求软件读取计算机中的硬件元件的ID序列号,例如处理器的序列号或图形卡的序列号。一旦硬件ID序列号被读取,它们就可与软件ID号一起通过因特网发送给厂商。厂商存储ID号,并通过因特网将许可证代码发送给程序。可以把软件编程为没有来自厂商的经验证的许可证代码就停止正常的功能。在此情况下,如果软件被非法地复制并安装到一不同计算机上,由于软件许可证已经与首次安装的硬件相关联,且许可证代码仅可被发送到具有与厂商所存储的相同硬件配置文件的计算机,因此,软件不能被激活。然而,这些方法不能防止未经授权的一方对软件代码进行逆向工程,修改软件代码来除去这些软件保护工具,以及大量散布修改后的软件。现今有许多工具用于软件逆向工程,像hexadecimaldumper,它以十六进制格式打印或显示软件代码的二进制数。通过了解代表这些指令的位模式以及指令长度,想要对软件进行逆向工程的人就能够识别代码的某些部分来看它们如何工作,然后对它们进行修改。用于逆向工程和代码修改的另一种常用工具是反汇编程序。反汇编程序读取二进制代码,然后以文本格式显示每个可执行指令。同样,由于反汇编程序不能告知可执行指令和代码所使用的数据之间的差异,可使用调试器。调试器允许反汇编程序避免对代码的数据部分进行反汇编。例如,如果反汇编程序读取到命令"ADD—INT8",表示"加接下去的8位所代表的数",调试器将该接下去的8位作为命令"ADD—INT8"的数据部分来处理,下一组位被按照新的命令来处理。然而,这些工具依赖于以下公知常识指令代码是如何被构建的、信息位于存储器中的何处、哪些寄存器被使用、如何使用堆栈(用于存储需要被处理的请求的数据缓冲器,采用下推表的形式)。当涉及基于解释器的编程语言时,与基于编译器的编程语言行程对比,逆向工程以及由未经授权用户进行的修改的问题更为明显。基于编译器的编程语言的描述可见图1,图1一般地示出了诸如C或Pascal之类的基于编译器的编程语言的现有技术软件处理。当编程者使用编辑器等以高级语言编写程序时,他的代码指令IO或源代码不能被计算机硬件直接读取。因此,源代码10必须经过称为编译器11进行的编译的翻译处理。编译器11将源代码10编译成计算机硬件能够读取并执行的专门的机器代码(MC)12。由于MC12被专门编译到特定平台,因此,它不能从一个平台转移到另一个平台。在基于编译器的编程语言中,对每个平台独立地编译源代码10,为每个平台产生不同的专门MC12。不同平台的例子可以是具有WindowsXP和MacOSX的基于Intel的PC。基于解释器的编程语言的描述可见图2a,图2a是流程图,一般地描述了对诸如JAVA之类的基于解释器的编程语言的现有技术软件处理。类似于基于编译器的编程语言,基于解释器的语言是使用编辑器等以高级语言编写的,下文中称为源语句20。然而,根据该方法,编译器21将高级源语句20翻译成字节代码(BC)22,它是不限于特定平台的一般化的MC。然而,为了执行BC22,需要专门的解释器23来将BC22翻译成专门的MC24。专门的解释器23通常与操作系统一起被安装。该方法的一个主要优点是可以对不同平台分发BC22。一旦在特定平台上执行BC22,专门的解释器23—次仅翻译一条BC22指令,为计算机硬件产生专门的MC24指令来执行。然而,由于解释器的处理方法是公知的,因此,相当容易读取、理解和修改作为解释器23的指令集的BC22。黑客可能购买到以BC编写的代码的合法版本,破译其指令并擦除或修改BC的某些原始指令。一旦BC被修改,它就可能被大量复制和转售。黑客使用的另一种方法在本领域中称为"运行时数据截取"。通过在解释5器对合法程序的执行期间截取并读取数据,黑客能够在执行非法程序时模拟该过程。防止容易地理解和破译代码行为的一种方法使用代码加密,如US2004/0015710中所述。根据该方法,加密的代码与用于解密该代码的解密密钥一起销售。代码中的每条指令首先被解密并由解释器解释供处理器执行。然而,一旦代码被解密,黑客就可能读取解密的代码来对原始代码进行逆向工程。此外,解密过程可由用户监视来形成解密密钥。此外,一旦代码被解密,它就被无保护地加载到计算机的存储器中,并也可从中被复制。防止对软件代码的修改的另一种方法是将代码分割成两部分包括代码保护的敏感部分和较不敏感部分。代码的较不敏感部分卖给用户,如以前那样准备被解释,而代码的敏感部分存储在诸如智能卡之类的硬件产品上。对代码的敏感部分的解释是在诸如智能卡读取器之类的硬件中进行的,在那里该部分不能被监视或读取。然而,在某些情况下,该额外的硬件可能是昂贵的,并且由供应商生成的代码更新的再分发是复杂的。用于防止对软件代码的修改的一种方法描述于EnriquilloValdez和MotiYung的"DISSECT:DistributionforSECurityTool"(G丄Davida和Y.rankel(Eds.):ISC2001,LNCS2200,第125-143页,2001.Springer陽VerlagBerlinHeidelberg2001)中。该方法建议将代码分割成两部分敏感部分和较不敏感部分。代码的较不敏感部分被卖给用户,如以前那样准备好被解释,而代码的敏感部分存储在安全服务器上。代码的敏感部分的解释是在安全服务器上进行的,在那里该部分不能被监视或读取。然而,该方法要求维持对指定服务器的直接联系来执行代码。因此,本发明的一个目的是提供一种用于防止软件逆向工程、未经授权的修改以及运行时数据截取的廉价方法。本发明的另一个目的是提供一种无需额外的硬件就能防止对软件的未经授权的修改的方法。本发明的又一个目的是提供一种方法,一方面它防止未经授权的用户进行的任何修改,另一方面它允许厂商进行修改和更新。本发明的其它目的和优点将随着说明的继续而变得明显。发明概述本发明针对一种用于防止对软件的未经授权的修改和对运行时数据的未经授权的修改的方法。提供了一种能够使用造成数据损失的转换处理将软件转换成不能被逆向工程的一般化的机器代码的转换器、以及可由CLR编译的解释器。解释器的处理方法的知识保持受限制。一般的机器代码由解释器解释到专门的机器中。软件可以是诸如基于解释器的语言等高级语言(如JAVA、VisualJ#、J#、C弁或VB.NET,或基于编译器的语言,如0++、VB或Pascal),并可被划分使得仅软件的一部分被转换器转换并被解释器解释。转换期间的数据损失可以是代码结构元数据的去除,或是到相应操作数是在运行时确定的其它指令的指令转换。附图简述附图中图1是一般地例示出对基于编译器的编程语言的现有技术软件处理的流程图2a是一般地例示出对基于解释器的编程语言的现有技术软件处理的流程图2b是一般地例示出对基于编译器的编程语言的现有技术软件处理的流程图,主要为JAVA;图3是一般地例示出对诸如VisualJ弁之类的.NET编程语言的现有技术软件处理的流程图4是一般地例示出根据一个实施例的本发明的实现方式的流程图;图5是例示出本发明的一个实施例的框图6是一般地例示出根据本发明的另一个实施例的本发明的实现方式的流程图7是一般地例示出根据一个实施例的对于基于编译器的编程语言的本发明的实现方式的流程图。较佳实施例的详细描述出于简要的目的,明确定义下列术语平台是计算机操作系统,它构建在计算机处理器的指令集上,计算机处理器是执行逻辑运算并管理计算机中的数据移动的硬件。机器代码(MC)是可由计算机处理器直接读取和执行的代码。专门机器代码是仅可由专门的平台或若干指定的平台读取和执行的代码。一般化的机器代码是不限于专门平台的代码。编译器将一组指令转换成机器代码。公知过程的描述图2b是一般地例示出对诸如JAVA之类的基于解释器的编程语言的现有技术软件处理的流程图。类似于基于编译器的编程语言,基于解释器的语言是使用编辑器等以高级语言编写的,下文中称为源语句200。根据该方法,编译器210将高级源语句200翻译成字节代码(BC)220,BC220是不限于特定平台的一般化的MC。然而,为了执行BC220,需要专门的解释器230将BC20翻译成专门的MC240。专门的解释器230通常与操作系统一起被安装。该方法的主要优点是可对不同平台分发BC220。一旦在特定平台上执行BC220,专门的解释器230—次仅翻译一条BC命令,由此为计算机硬件产生专门的MC命令来执行。当涉及SunMicrosystemsJava时,BC220被称为Java字节代码,解释器230被称为虚拟机(VM)。在某些情况下,VM与即时(Just-in-time)编译器250集合在一起,并可被任选地使用。即时编译器250将JavaBC220编译成专门的MC260,就好像该程序一开始就己经为该特定程序编译过一样。在VM230和即时编译器250这两种情况下,计算机硬件读取其预期的专门MC。然而,由于解释器230在执行期间一次仅翻译一条BC220命令,它在计算机上可能运行较慢。充当JavaBC和专门MC之间的解释器的JavaVM对于每个平台来说都是独立的。一旦JavaVM被提供给平台,任何经编译的JavaBC就可运行在该平台上。因此,当用户在其计算机上安装了JavaVM时,他可获得JavaBC形式的任何程序,并在其计算机上执行。当编程者以Java编程并将程序编译成JavaBC时,他可将JavaBC广泛地分发给任何用户,因为JavaBC对于所有流行的平台来说都是兼容的。JavaVM负责分配存储器、设置寄存器、堆栈、"无用信息(garbage)"堆、以及方法区域(JavaVM的方法区域是存储关于加载类型的所有信息的存储器的逻辑区域)供程序执行。图3是一般地例示出诸如Visual^之类的被设计成运行在Microsoft.NET上的编程语言的现有技术软件处理的流程图。一般来说,.NET环境允许对各种服务使用Web资源而不是计算机资源。VisualW或W允许编程者以"类Java"语言编程,并在.NET上运行程序。以VisualM高级语言编写的源语句300由编译器310编译成微软中间语言(MSIL)320,它是不限于专门平台的一般MC。MSIL320在其功能上相当于JavaBC220,JavaBC220甚至可以容易地被转换成MSIL320。类似于上述的过程,使用相当于JAVAVM230的功能的公共语言运行库(CLR)330将MSIL320转换成专门的MC340。如所理解的那样,诸如C存和VB.NET之类的其它.NET编程语言经过从源语句300到MSIL320到MC340的类似过程。应理解,上述VM和CLR进行的存储器分配被黑客广为所知,例如设置寄存器、堆栈、"无用信息"堆、以及程序的方法区域。使用该信息,黑客能够理解JavaBC或MSIL的哪些命令涉及许可证要求,并修改这些命令。微软.NET框架中的.NET元数据描述了.NETCIL(公共中间语言)代码。.NET语言编译器将生成所述元数据,并将此存储在包含CIL的程序集(assembly)中。元数据描述了该程序集中定义的全部类和类成员,以及当前的程序集将从另一程序集调用的类和类成员。方法的元数据包含对该方法的完整描述,包括类(以及包含该类的程序集)、返回类型以及全部方法参数。当CLR执行CIL时,它验证被调用的方法的元数据是否与存储在作出调用的方法中的元数据相同。这确保了仅能用完全正确数量的参数和完全正确的参数类型来调用方法。因此,在像.NET和Java之类的环境中,很容易对代码进行逆向工程,因为代码和元数据是作为可再分发的程序包的一部分而被一起提供的。元数据对于代码对目标平台的即时编译来说是必需的。然而,在诸如0++之类的基于编译器的语言中,在编译和链接阶段期间,元数据被丢弃并不被再分发给终端用户。本发明的总体描述本发明的实质在于解释器,其操作和存储器分配方法是未公开的。该新的未揭露的解释器或"秘密VM"在下文中被称为SVM。每个SVM与一相关的转换器配对,或者换言之,每个SVM仅可解释由相关的转换器产生的代码。因此,要求软件保护的原始软件的每个供应商可购买专用的一对相关的转换器和SVM。诸如指令编码或存储器分配之类的操作方法在不同的SVM之间可改变。图4例示出根据一个实施例的本发明的实现方式,其中源语句400是以.NET的高级编程语言编写的。编译器410将源语句400编译成MSIL420,如现有技术中所述。这里,转换器421用于将MSIL420转换成秘密虚拟机语言(SVML)422。SVML422是不限于特定平台的一般的MC。然而,SVML422的命令不同于诸如JavaBC或MSIL420命令之类的己知的一般的MC命令。因此,破解SVML422是格外复杂的,因为对SVML422不存在已知的反汇编程序或调试器。SVML422可与相应的SVM423—起分发。使用本地CLR430在指定计算机上编译SVM423,用于添加关于指定计算机的专门平台的数据。由于SVM423作为解释器来执行,因此它不仅包括用于解释SVML422的新数据,还包括来自CLR430的关于平台概况的数据。从而,当在指定计算机上执行SVML422时,SVM423向硬件解释每条命令供执行。由于SVM423处理方法是未知的,因此黑客将发现很难理解并修改代码或试图在运行时期间截取数据。推荐的转换器属性的总体描述转换器的指定属性之一涉及对相同的MSIL输入产生不同的SVML程序(另外称为"代码变形")。代码变形依赖于SVML指令集中的冗余性,例如SUB指令可由NEG和ADD指令来替代。该属性对于防止将MSIL指令集与等价的SVML指令集比较的尝试来说极其有效。该属性依赖于SVML指令集中的冗余性,例如SUB指令可由NEG和ADD指令来替代。I.转换器的另一设计的属性是对指令的动态编码的可能性,意味着改变某一指令的相应位模式或代码。与预期相同指令被类似地编码的MSIL形成对比,在SVML中,同一指令可能以不同的代码出现。例如,下面的指令可用其地址来编码,如下表所示<table>tableseeoriginaldocumentpage11</column></row><table>因此,即使黑客可能试图在SVML代码中找到重复的模式来推导出公共的指令,他会发现比想像中要复杂得多。II.转换器的主要设计属性是在转换期间造成数据损失,使得转换过程实际上不可逆。数据损失的一个例子是诸如方法声明之类的代码结构元数据的去除,因为在.NET中当一方法仅由其它经转换的方法调用时并不需要它。数据损失的另一例子如下一广为所知的指令集包括下面的指令ADD—INT8、ADD—INT16以及ADD一INT32。这些指令指示处理器相应地加8位、16位和32位的数。在转换处理期间,使用独特的转换器,所有这些指令都被转换成开放指令"ADD"。应当被加的操作数的类型和位数(8、16或32)是在运行时期间被确定的。因此,不知道在"ADD"指令中相加的数的话,逆向编译是不可能的。由于转换处理是不可逆的,因此代码不能被转换回标准的MSIL/JavaBC格式,因此就不能使用标准工具进行反编译、反汇编、调试或修改。SVM架构和相应SVML指令集的示例图5是例示出根据一个实施例的SVM架构的示例的框图。算术逻辑单元500对操作数寄存器510和520执行逻辑运算,并在寄存器530中存储结果。数据转移寄存器560用于在寄存器和存储体540和550之间转移数据。存储体540和550用于存储局部变量和方法参数。存储体选择器寄存器570存储被使用的存储体的数量。SVML的指令的一个子集的例子以及它们的含义:<table>tableseeoriginaldocumentpage12</column></row><table>一般的MC代码和SVML代码之间的比较为了简洁起见,下面示出一非限制性的示例,将现有技术的一般的MC的汇编程序代码与SVML的进行比较。在这两种情况中,给定所需处理的任务是公式4+3-1。一般的MC程序代码处理公式4+3-1:LDC4LDC3ADDLDC1SUBSVML程序代码处理公式4+3-1:SETMBANK1选择存储器体lMEM2TRANSFER23加载"4",即存储在存储器地址23处的常数TRANSFER20P1将值"4"移到操作数l寄存器MEM2TRANSFER45加载"3",即存储在存储器地址45处的常数TRANSFER20P2ADDRESUUT2TRANSFERTRANSFER20P1MEM2TRANSFER12TRANSFEROP2SUBRESULT2TRANSFERTRANSFER2MEM1将值"3"移到操作数2寄存器将操作数1和2寄存器的内容相加将结果"7"移到转移寄存器将值"7"移到操作数l寄存器加载"1",即存储在存储器地址12处的常数将值"1"移到操作数2寄存器从操作数1减去操作数2的内容将结果移到转移寄存器在存储器地址1处存储结果如上面的程序代码所示,被处理的操作数(4、3和1)在指令中从不被明确地表示。试图对该程序进行逆向工程的黑客不能从当前指令集中推导出公式的操作数的值是什么,因为每个值都是在运行时期间从存储器读出的。本发明的其它实施例在一个实施例中,每个厂商配备有其自己的一对转换器和SVM。因此,知道一个SVM的处理的方法不会揭露其它SVM的处理的方法。本发明所推荐的方法可与任何基于解释器的语言一起使用。例如,对于.NET的#来说,SVM是由CLR编译的;对于JAVA来说,SVM是由VM编译的;依此类推。所推荐的发明可用于任何软件,不管是诸如0#或VB.NET之类的高级语言、软件代码、源代码还是机器代码。图6例示出本发明的另一实施例的示例,其中源语句500是以诸如VisualJ弁之类的高级语言编写的。编译器410将源语句400编译成MSIL420,如上所述。然而,在转换之前,MSIL420指令被划分成两组可包括许可证要求的敏感指令、以及不敏感指令。敏感指令由转换器421转换成SVML422,而不敏感指令不被转换。由一部分MSIL和一部分SVML组成的一般的MC425或程序可与相应的SVM423—起被分发给任何流行的平台。为了执行程序,SVM423由指定平台上的CLR430编译。在执行期间,每条指令被检查与MSIL420或SVML422的兼容性。MSIL420指令由CLR430直接解释,而SVML422指令由SVM423解释。图7例示出根据一个实施例的对于基于编译器的编程语言的本发明的实现方式。如背景部分所述,源代码700由编译器710编译成专门的MC720。使用指定的转换器721将该专门的MC720转换成SVML722,而SVML722是依赖于平台的,或换言之,它是专门的MC。SVML722与为SVML722的专门平台设计的SVM723—起被分发。由于被分发的SVM723已经是专门用于指定平台的,它就不需要在指定的计算机上编译。因此,SVM72能够将SVML722翻译成专门的MC740,用于指定的计算机的硬件。在对于基于编译器的编程语言的另一个实施例中,仅敏感指令被转换器721转换成SVML722。SVML722与SVM723以及专门的MC720的其余指令一起被分发。在执行期间,SVM723执行SVML722的指令。虽然以例示的方式描述了本发明的一些实施例,但是显然本发明可用许多修改、变型和改编来实践,并利用落在本领域技术人员的知晓范围内众多等价或替代方案来实践,这不背离本发明的要旨或超出权利要求的范围。权利要求1.一种用于防止对软件的未经授权的修改或对运行时数据的未经授权的修改的方法,包括以下步骤a.提供一转换器,所述转换器能够通过使用造成数据损失的转换处理将所述软件转换成不能被逆向工程的一般化的机器代码;b.提供一解释器,所述解释器的处理方法的知识保持受限制;c.由所述解释器将所述一般化的机器代码解释成专门的机器代码,同时在所述解释过程中重新构造所损失的数据。2.如权利要求l所述的方法,其特征在于,所述解释器是由CLR编译的。3.如权利要求1或2所述的方法,其特征在于,所述软件被划分,使得仅所述软件的一部分所述转换器转换并被所述解释器解释。4.如权利要求l所述的方法,其特征在于,所述软件是高级语言。5.如权利要求4所述的方法,其特征在于,所述高级语言是基于解释器的语6.如权利要求5所述的方法,其特征在于,所述高级语言可以是Java、VisualJ#、J#、C存或VB.NET中的任一种。7.如权利要求4所述的方法,其特征在于,所述高级语言是基于编译器的语8.如权利要求7所述的方法,其特征在于,所述高级语言可以是C++、VB或Pascal中的任一种。9.如权利要求l所述的方法,其特征在于,转换期间的所述数据损失是代码结构数据的去除。10.如权利要求1所述的方法,其特征在于,转换期间的所述数据损失是到相应操作数是在运行时期间确定的其它指令的指令转换。全文摘要一种用于防止对软件的未经授权的修改或对运行时数据的未经授权的修改的方法。根据该方法,提供能够将软件转换成一般化的机器代码的转换器。该转换器被设计成通过使用造成数据损失的转换处理使得它不能被逆向工程。还提供一种解释器,其处理方法的知识保持受限制。该解释器将一般化的机器代码解释成专门的机器代码,同时在解释过程中重新构造所损失的数据。文档编号G06F21/22GK101300584SQ200680029302公开日2008年11月5日申请日期2006年3月30日优先权日2005年8月6日发明者B·艾斯波夫,K·艾斯波夫申请人:安全尺度有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1