程序可执行映像加密的制作方法

文档序号:6569239阅读:146来源:国知局

专利名称::程序可执行映像加密的制作方法
技术领域
:本发明涉及一种用于对可执行映像进行加密和执行的方法和系统。更具体地,本发明涉及一种用于对可执行映像内容进行加密和加载的方法和系统。
背景技术
:软件开发需要在时间和资金双方面的相当大的投入,并且诸如未授权的拷贝或共享之类的未授权的软件使用最终导致了软件开发者的收入损失。未授权软件的示例可以包括由第三方在没有获得必需的授权的情况下制造的拷贝,或者通过对等网络对未授权拷贝的共享。这种软件还可以包括也需要防止被拷贝的可执行的图像或声音文件。为了实现这种保护,公知的是使用加密措施来防止软件的未授权拷贝被执行。这种措施典型地包括对软件的一个或更多个可执行部分进行加密,这可以防止完整地运行该软件,或者禁用该软件的一个或更多个独立的功能特征,以使得该软件非最优地运行。作为示例,公知的是在运行之前对可执行程序内容进行加密,以保护其中所包含的算法的实现。这种可执行内容的示例可以包括在程序文件中包含的编解码器,例如典型地用于压縮图像和声音文件的JPEG、MP3和WMA格式。编解码器可以将数据变换为编码的形式(通常用于传输、存储或加密)以及对该数据进行提取或解码以便以更适于特定操作的格式来观看或处理。编解码器通常用于视频会议和流媒体解决方案中。作为示例,US-A-2004/0125954公开了一种数据加密/解密系统,该系统以加密形式保存软件程序所需要的数据单元。软件生产商可以选择并加密被称为可执行程序中的关键数据单元的一个或更多个程序数据节区和/或文本节区。为了执行该软件,用户必须获得许可密钥,以对该程序所使用的关键数据单元进行解密。通过提供不同的许可密钥,可以提供不同的许可选项,该许可选项允许软件生产商或供应商根据所提供的许可密钥启用的功能来实行对程序的功能等级的控制。然而,由于在执行程序映像之前对该可执行映像进行解密消耗了宝贵的处理器周期,从而导致了反应较不灵敏的系统,因此US-A-2004/0125954中所提供的解决方案导致了较低的处理速度。此外,在US-A-2004/0125954中所提到的关键数据节区应用于程序代码自身(例如程序数据节区和文本节区),而不应用于包含诸如修正表之类的必要信息的程序头,这使得程序加载器能够将程序重定位到期望的存储区中。公知的是将这种加密技术用于通称为嵌入式系统的专用计算机系统中。嵌入式系统可以包括被布置用于执行预定任务的微处理器或微控制器。在诸如用于消费电子和汽车的那些嵌入式系统之类的嵌入式系统中,典型地需要其组件较小和较便宜。具有片上存储器管理单元(MMU)的微处理器倾向于较为复杂和昂贵,因此典型地不用于不需要这种复杂性的嵌入式系统。在该处理器内,MMU负责保护系统资源使之免于不需要的访问,并且还提供了处理虚拟存储器的能力。为了减少嵌入式系统中的这种组件成本,公知的是使用所谓的"无MMU(MMU-less)"处理器,其示例是PhilipsTriMedia媒体处理器。然而,在将可执行文件加载到无MMU处理器时,必须在可以执行该可执行文件之前,将该可执行文件重定位到期望的存储单元。可以通过使用重定位修正表将映像重定位至存储器中的新地址,来实现对可执行映像的重定位。修正表(也通称为补丁表)允许修改可执行映像,以使得该映像可以在期望的存储单元处运行。该过程典型地包括以下独立步骤对修正数据进行加密,对加密的修正数据进行重定位,以及对修正数据进行解密,以产生最终修正的可执行映像。然而,该修正或修补过程可能消耗宝贵的处理器周期,从而导致较慢的处理器操作。作为分离的和不同的操作,对可执行代码的解密和重定位可以验证相对耗时的过程。因此,通过减少操作次数来以较少的时间完成这些操作,可用于产生较快的加载和反应较灵敏的系统。
发明内容本发明设法提供一种用于快速且有效地对可执行映像进行加密和执行的方法和系统,其与已知的这种方法和系统相比具有优点。根据本发明的一方面,提供了一种对可执行映像进行加密的方法,该方法包括以下步骤使用源文件中的命令来将可执行映像的节区标记为要被加密,并编译所述可执行映像以生成目标文件,使用链接器来链接所述可执行映像中的一个或更多个,以产生最终的可执行映像,以及修正处理,该方法进一步包括以下步骤将所述链接的可执行映像传递至链接器之后的加密引擎,以对重定位修正补丁表以及被标记为加密的可执行映像的节区进行加密,以使得可以在加载时间对该可执行映像进行解密、重定位和执行。具体地,本发明设法以克服一个或更多个上述缺点的方式来防止对可执行文件的非法使用,具体地是防止对可执行文件的非法拷贝。有利地,这允许仅将需要保护的代码标记为加密,而可以不对较不重要的代码进行加密。通过仅选择需要保护的代码,可以更快地加载可执行内容,同时也提供了节约成本且实现简单的反应更灵敏的系统。优选地,对修正表进行解密的步骤包括组合解密和修正处理的步骤。有利地,这种步骤组合提供了对存储空间的有效使用,同时还提供了更快响应的系统。优选地,将节区标记为要被加密的步骤包括,使用编译器或链接器命令,并在源代码级(sourcelevel)阶段命名所述节区,以使得链接器能够在链接或链接之后的阶段对该节区进行加密。此外,通过使用节区重命名机制,可以将目标代码的节区标记为指示该节区是否要被加密。有利地,这还用于提供对存储空间的有效使用,同时还提供了更快响应的系统。根据本发明的另一方面,提供了一种用于对可执行映像进行加密的系统,该系统包括编译器,被布置用于将可执行映像的节区标记为要被加密,并对所述可执行映像进行编译,以生成目标文件,链接器,被布置用于链接所述目标文件中的一个或更多个,以产生最终的可执行映像,还被布置用于通过将所述链接的可执行映像传递至链接器之后的加密引擎来处理修正表,其中链接器之后的加密引擎被布置用于对重定位修正补丁表和被标记为加密的可执行映像的节区进行加密,以便在加载时间对该可执行映像进行解密、重定位和执行。具体地,本发明设法以克服一个或更多个上述缺点的方式来防止对可执行文件的非法使用,具体地是防止对可执行文件的非法拷贝。有利地,这允许仅将需要保护的代码标记为加密,而可以不对较不重要的代码进行加密。通过仅选择需要保护的代码,可以更快地加载系统,同时也提供了节约成本且实现简单的反应更灵敏的系统。优选地,解密装置被布置用于在处理修正表的同时对该修正表进行解密。有利地,这提供了对存储空间的有效使用,同时也提供了更快响应的系统。优选地,编译器或链接器命令(directive)被布置用于将节区标记为要被加密,并且还被布置用于在源代码级阶段命名所述节区,以使得该链接器能够在链接阶段或链接之后的阶段对所标记的节区进行加密。此外,通过使用节区重命名机制,可以将目标代码节区标记为指示该节区是否要被加密。有利地,这允许仅将需要保护的代码标记为加密,而可以不对较不重要的代码进行加密。通过仅选择需要保护的代码,可以更快地加载系统,同时也提供了节约成本且实现简单的反应更灵敏的系统。在下文中仅以示例方式参照附图进一步描述本发明,在附图中图1是包含可由编译器进行编译的源代码部分、文本和数据部分的单个源文件的框图2是由链接器链接到一起以产生最终的可执行映像的目标文件的框图;图3是最终的可执行映像的框图,其中头部包含可执行的格式信息;图4是被传递至链接器之后的加密引擎的可执行映像的框图;图5以方框形式示出了在加载时间对可执行映像的解密、重定位和执行;以及图6是根据本发明的组合的加载器和解密引擎的框图。具体实施例方式程序的可执行映像包含节区信息,并且可执行映像传统上具有多个组件或节区,例如形成可执行程序代码的文本组件、包括针对已初始化的或未初始化的程序静态数据的空间的数据组件、以及包括由加载器分配的区域的块存储段(BSS)组件,该区域包含被初始化为零的静态数据。BSS是存储器映射组件,包含在执行时间被分配为二进制映像而分配的数据。系统中的组件越多,该系统的粒度越大并且越灵活。粒度表示系统包含分离组件的程度。例如,PhilipsTriMedia编译器允许在编译时间之后以及在将所生成的目标文件链接到最终的可执行映像中之前,对所生成的目标文件中的节区或组件进行重命名。诸如GNUGCCC编译器之类的编译器允许在编译时间使用专用的C扩展名、或者在链接时间使用链接器文件来对节区进行标注。利用GNUGCC编译器,可以通过在编译时间的专用命令向节区提供除了标准文本、数据和随TriMediaC编译器一起使用的BSS标题之外的标题,例如利用指定节区名称将指定了遵从编译器命令的代码的内联汇编程序命令节区放置在目标代码中。这是使用由链接器施加到目标文件的专用链接器重命名标记来执行的,该目标文件是根据来自GNUGCC编译器的已编译的C源代码而生成的。利用节区重命名机制,可以通过专用命名惯例来标记目标代码的节区,以指示该节区是否将被加密。因此,针对较大的应用程序,仅需要将重要代码(例如受专利或著作权保护的代码)或者包含机密信息的代码标记为加密,而可以不对较不重要的代码(例如C库)进行加密。由编译器产生的目标代码通常被放置在标记的节区中。如下面更详细地讨论地,针对CUNIX或Linux系统,这些节区传统地被加上文本、数据和bss的标题。然而,一旦目标代码被命名,则无法对其进行重命名以将其标记为加密。总而言之,本发明提供了一种用于对可执行映像进行加密和执行的方法和系统,其中可使用诸如修正表之类的设备来将程序的可执行映像重定位到用于处理的存储单元。修正表包含针对包含相对地址的地址的指针列表。当文件被加载到存储器中时,编译器访问具有指针的每个地址,并将程序的起始指令的绝对地址与程序中的相对地址相加。这允许加载器对可执行映像进行修补或重定位,以便修补可执行映像中对地址的引用,以与重定位的可执行映像的期望地址相匹配。使用加密机制来在链接时间或链接时间之后对部分可执行程序进行加密。其中链接时间是将从不同的源模块编译的文件链接到单个程序中的时间。链接器所作出的判决受到所编译的代码的约束,并最终受限于源代码中包含的信息。然后对修正表进行加密,以防止该映像在没有首先对修正表进行解密的情况下被重定位。将所要保护的可执行代码的节区放入加密的专用文本(和数据)节区中。不对所有其他代码和数据进行加密。使用解密机制来在映像可以运行之前的加载时间处对加密的修正表和专门加密的文本(和数据)节区进行解密。在操作中,在编译时间,编译器将程序源代码编译到目标代码中。使用源代码中的专用的编译器派生(derivative)或命令,或者通过在编译源代码之后修改目标代码,来标记需要被保护的程序源代码的节区。在编译时间作出的判决受到被编码在源文件中的信息的数量和种类的约束。编译器命令是被添加到程序中的专用注释,其允许编译器执行特定的操作,并且可以包括开启或关闭编译器特征的切换命令、指定影响编译的参数的参数命令、以及控制部分源文本的有条件的编译的条件命令。编译器命令是不可执行的声明,其不能被直接翻译为可执行代码。修正表可以包含需要被修补或重定位的数据在可执行映像中的位置。需要被修补的数据是l.指示程序中的位置的程序指令,该位置需要被修改以与新的重定位地址相匹配。例如,跳转地址、指示指令中的程序地址的加载/存储指令。需要修改指令代码中的操作数,例如,jmp—mainloadsome—table->reg0。2.诸如指针之类的、指示程序中的特定位置的数据。这些指针需要被修改以与新的重定位地址相匹配。例如,针对数据结构的指针、或者需要被改变以与可执行映像的新的重定位地址相匹配的函数。假设可执行映像已被编译为起始于存储器中的位置0处。将该可执行映像重定位到新的固定的存储单元N处。因此,必须将偏移量N与该可执行映像中的每个地址基准相加,以将该可执行映像軍定位到起始地址N处。首先,将解密的程序拷贝到起始于地址N处的新的存储器地址空间。然后对修正表进行解密,并逐个条目地对该修正表进行处理。每个条目都包含需要偏移N的可执行映像中的指令或指令操作数的位置L以及数据(例如指针)。然后,如下地变换在地址L+N处的程序代码或数据。将位置L+N处的内容读入变量X,以便通过重定位偏移量N来改变X,也就是说,X=X+N,并且将X写回到位置L+N中。针对修正表中的所有条目重复上述。然后处理修正表,一旦完成了修正,由于不再被需要,因此将该修正表返回至空闲的存储分配器。例如,PhilipsTriMediaC编译器允许重命名编译的目标代码,同时GNUGCCC编译器的使用允许用于对源代码自身中的节区进行重命名的命令。例如,使用已知的命名惯例,给节区加上诸如"一encrypt—"之类的字符串前缀可以允许最终的链接阶段确定链接器所产生的最终可执行映像中的哪些节区需要加密。本领域的技术人员将理解,可以使用任意适当的编译器来实现本发明,并且本发明可以使用任意适当的过程来将源代码编译为目标代码。图1示出了包含源代码部分A、B、C和文本或数据部分D、E的单个源文件,该源文件的各个部分是由C编译器CC编译的。通过源代码中的编译器命令来将源代码B和数据D标记为要被加密。编译器所生成的作为结果的目标代码包含被标记为要被加密的文本和数据节区B,和D,、以及正常的文本和数据节区A'、C,和E'。然后通过链接器将一个或更多个目标文件链接到一起,以产生如图2所示的最终可执行映像。该可执行映像包含文本、数据和BSS段,如上文所讨论的,通过编译器命令将其中一些节区标记为加密。该标记节区的方法取决于实施方式,并且基于编译器和/或链接器的特性。图3示出了最终可执行映像的示例,其中头部301包含可执行格式信息,例如工业标准ELF(可执行链接格式)、COFF(常用目标文件格式)或"a.out"可执行映像格式。重定位修正补丁表302包含用于允许加载器重定位和修补可执行映像的信息,以使得可执行映像中对地址的引用被修补成指向新的重定位的可执行地址。每个ELF文件可以由一个ELF头部以及随后的零个或更多个段和零个或更多个节区组成。段包含对于文件的运行时间执行而言必需的信息。然而,由于COFF格式允许目标文件中的多个命名的节区,因此COFF格式是优选的。文本部分303包含正常的可执行程序代码,同时将要被加密的文本节区304包含将要通过加密保护的可执行代码。数据节区305包含正常的程序数据,同时将要被加密的数据节区306包含将要通过加密保护的程序数据。BSS节区307包含将在程序启动时被归零的数据。如图4所示,当形成了可执行映像401时,将该可执行映像401传递至链接器之后的加密引擎。然后加密引擎402读取该可执行映像,并对重定位修正补丁表以及任何被标记为加密的文本或数据节区进行加密。当图像应被加载时,在加载时间,如图5所示地对可执行映像进行解密、修补/重定位、以及执行。由解密引擎G对可执行映像的加密节区进行解密,以产生可执行映像,加载器J可重定位该可执行映像,以产生最终的运行时间映像L。本领域的技术人员将理解,可以通过任意适当的装置来实现上述的加密和解密步骤。然而,为了实现本发明,加密装置必需能够理解最终输出的可执行目标格式,以使得加密装置能够处理该可执行目标代码,并确定需要加密的节区。实际上,可以组合链接和产生最终可执行映像的步骤,从而消除对用于理解执行链接之后的处理和加密的链接之后的可执行目标代码的装置的需要。在如图6所示的本发明的另一实施例中,可以将加载器优化为包括解密引擎,该解密引擎使得加载器能够以一个组合的操作来读取、解密和处理解密的修正补丁表,从而消除对在将解密的修正传递至加载器之前存储该解密的修正的需要。由第一解密引擎601来对可执行映像的数据和文本部分进行解密。加载器内部的第二解密引擎602仅对修正补丁表进行解密。如图6所示,将对修正表的解密与一个不同步骤中的修正处理相组合。对修正表的解密将采用加密的修正表信息,并将该信息解密到解密的修正表条目中。一旦可以从解密引擎获取解密的修正表条目,则可以使用该修正表条目来修补可执行代码。与必须将解密的修正条目存储回修正表中、然后将该数据传递至读取回该数据的修正处理的分离的解密和修正处理阶段相比,这是一种节省。因此,对于每个修正条目,可能省去将解密的修正数据写回到存储器以及从存储器读取回解密的修正数据。由于存储器的读/写过程与处理器速度相比较慢,因此如果修正表较大,则这将导致相当大的节省,因此节省了大量的存储器带宽并防止数据高速缓存停滞。此外,如果将解密引擎与修正处理代码足够紧密地结合,则可以使得解密和修正处理适合处理器指令高速缓存,并且由于保持指令高速缓存停滞的次数较少,因此减少了处理时间。利用这种方式存储器带宽节省和减少处理时间,使得在利用诸如TriMedia之类的具有较小指令和数据高速缓存的处理器时加速操作。因此,可以看到,本发明提供了一种节约成本且实现简单的较快加载、反应较灵敏的系统,该系统防止对可执行文件的非法使用。权利要求1.一种用于对可执行映像进行加密的方法,包括以下步骤使用源文件中的命令来把可执行映像的节区标记为要被加密并对所述可执行映像进行编译,以生成目标文件;使用链接器来链接所述可执行映像中的一个或更多个,以产生最终的可执行映像;修正处理,进一步包括以下步骤将所述链接的可执行映像传递至链接器之后的加密引擎,以对重定位修正补丁表以及为加密而标记的可执行映像的节区进行加密,从而在加载时间对所述可执行映像进行解密、重定位和执行。2.根据权利要求1所述的方法,其中,将所述对修正表进行解密的步骤与所述修正处理步骤进行组合。3.根据权利要求1所述的方法,其中,将节区标记为要被加密的步骤包括使用编译器或链接器命令,并在源代码级阶段命名所述节区,以使得所述链接器能够在链接阶段或链接之后的阶段对所述标记节区进行加密。4.根据权利要求1所述的方法,其中,标记节区的步骤包括标记程序可执行映像的头部节区的步骤。5.根据权利要求4所述的方法,其中,所述头部节区包含针对程序可执行映像的修正表。6.根据权利要求1所述的方法,其中,对所述重定位修正表进行加密,以防止在未对所述修正表进行解密的情况下重定位所述可执行映像。7.根据权利要求1所述的方法,其中,加密引擎使用包含在源文件中的命令来对所述程序可执行映像的标记节区进行加密。8.根据权利要求l-7所述的方法,其中,所述标记源代码的节区的步骤包括,对可执行代码节区、数据节区和/或块存储段节区中的一个或更多个进行标记。9.根据权利要求1-8所述的方法,其中,所述标记步骤是使用包含在源代码中的命令或者通过在链接阶段使用链接器标记来执行的。10.根据权利要求1所述的方法,其中,通过解密引擎来对可执行映像的加密节区进行解密来产生可执行映像,以形成运行时间映像。11.根据权利要求1所述的方法,其中,所述解密引擎使用解密机制来在加载时间对加密的修正表和可执行代码节区进行解密。12.根据权利要求10和11所述的方法,其中,加载器产生可执行映像,以在运行时间处产生最终映像。13.—种计算机可执行程序,包括用于使微处理器执行根据权利要求1-12中任一项所述的方法的指令。14.根据权利要求13所述的计算机可执行程序,存储在计算机可读介质上。15.—种用于对可执行映像进行加密的系统,包括编译器,被布置用于将可执行映像的节区标记要被加密并对所述可执行映像进行编译,以生成目标文件;链接器,被布置用于链接所述目标文件中的一个或更多个,以产生最终的可执行映像,还被布置用于通过将所述链接的可执行映像传递至链接器之后的加密引擎来处理修正表,其中,所述链接器之后的加密引擎被布置用于对重定位修正补丁表和为加密而标记的可执行映像的节区进行加密,以便在加载时间对所述可执行映像进行解密、重定位和执行。16.根据权利要求15所述的系统,其中,所述解密装置被布置用于,在处理修正表的同时对所述修正表进行解密。17.根据权利要求15所述的系统,其中,编译器或链接器命令被布置用于将节区标记要被加密,并且还被布置用于在源代码级阶段命名所述节区,以使得链接器能够在链接阶段或链接之后的阶段对所述标记节区进行加密。18.根据权利要求15所述的系统,其中,所述标记节区包括程序可执行映像中的标记的头部节区。19.根据权利要求18所述的系统,其中,所述头部节区包含用于程序可执行映像的修正表。20.根据权利要求15所述的系统,其中,加密引擎被布置用于,使用包含在源文件中的命令或者在链接阶段使用链接器标记来对对可执行映像的标记节区进行加密。21.根据权利要求15-20所述的系统,其中,所述标记的源代码的节区包括可执行代码节区、数据节区和/或块存储段节区中的一个或更多个。22.根据权利要求15-21所述的系统,其中,包含在源代码中的命令被布置用于标记所述节区。23.根据权利要求15所述的系统,其中,可执行映像的加密节区被布置用于由解密引擎进行解密,以产生可执行映像,从而形成运行时间映像。24.根据权利要求13所述的系统,其中,所述解密引擎被布置用于,使用解密机制在加载时间对加密的修正表以及可执行代码节区进行解密。25.根据权利要求23和24所述的系统,其中,所述加载器被布置用于产生可执行映像,以在运行时间产生最终映像。26.根据权利要求15和17-22所述的系统,其中,所述节区包括可执行程序代码节区、数据节区和块存储段节区。27.根据权利要求15所述的系统,其中,所述加密引擎被布置用于对重定位修正表进行加密,以防止在未对所述修正表进行解密的情况下重定位所述可执行映像。28.根据权利要求15所述的系统,其中,所述加密引擎是链接器之后的加密引擎。29.—种微处理器,包含根据权利要求15-28所述的系统。全文摘要本发明提供了一种对可执行映像进行加密和执行的方法,包括通过使用源文件中的命令来将可执行映像的节区标记为要被加密,并编译所述可执行映像以生成目标文件,使用链接器来链接所述可执行映像中的一个或更多个,以产生最终的可执行映像,将所述链接的可执行映像传递至链接器之后的加密引擎,以对重定位修正补丁表以及被标记为加密的可执行映像的节区进行加密,并在加载时间对该可执行映像进行解密、重定位和执行。文档编号G06F21/12GK101288083SQ200680038390公开日2008年10月15日申请日期2006年10月10日优先权日2005年10月17日发明者科林·金申请人:Nxp股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1