首页> 中国专利> 用于保护计算机程序免受影响的方法和计算机系统

用于保护计算机程序免受影响的方法和计算机系统

摘要

用于保护计算机程序免受由入侵程序或由用于操纵计算机系统上的计算机程序的操纵软件造成的影响的方法,所述计算机系统具有处理器、主存储器和存储介质。所述方法基于柯克霍夫原则,使得受保护的计算机程序是能够自由地访问的并且能够由入侵程序或操纵软件读出。受保护的计算机程序的部分基于计算机程序的专业性多次存在于受保护的计算机程序的程序代码中。计算机程序的部分被加密,以便阻止在不通过处理器来实施计算机程序的情况下对计算机程序的静态的分析,其中用于对计算机程序的被加密的部分解密所必需的密钥被存放在受保护的密钥存储器中,所述密钥存储器与所述计算机通信。

著录项

  • 公开/公告号CN106462676A

    专利类型发明专利

  • 公开/公告日2017-02-22

    原文格式PDF

  • 申请/专利权人 威步系统股份公司;

    申请/专利号CN201580010808.0

  • 发明设计人 P.维克曼;O.温岑里德;R.屈格勒;

    申请日2015-02-24

  • 分类号G06F21/12;G06F21/14;

  • 代理机构中国专利代理(香港)有限公司;

  • 代理人卢江

  • 地址 德国卡尔斯鲁厄

  • 入库时间 2023-06-19 01:44:06

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-09-20

    授权

    授权

  • 2017-03-22

    实质审查的生效 IPC(主分类):G06F21/12 申请日:20150224

    实质审查的生效

  • 2017-02-22

    公开

    公开

说明书

技术领域

本发明涉及用于保护计算机程序免受由入侵程序或由用于操纵计算机系统上的计算机程序的操纵软件造成的影响的方法。该计算机系统一般来说具有一个或多个处理器、用于处理程序的主存储器和存储介质。

背景技术

软件保护机制的目标是阻止知识产权的不允许的拷贝和分析(逆向工程)。在此,根据软件的类型和价值使用软件狗(Dongle)、计算机绑定的许可证或许可证服务器上的许可证。许可证服务器可以由用户或者由软件制造商在云端中运行并且在其侧又使用软件狗或计算机绑定的许可证。

攻击者(黑客)尝试绕过软件保护,以便自己利用软件或者由此知识产权或者将所述软件在其侧作为盗版向未被授权的应用者出售。所述未被授权的应用者常常不知道其已买到盗版。

在攻击者(黑客)的方法中在动态的和静态的分析之间进行区分。在动态的分析的情况下黑客在调试器中实施软件并且观察以及改变所述软件;或者所述黑客在用于软件保护的接口处窃听并且存储通信用于重放侵入(Playback-Hack)。在静态的分析的情况下,黑客借助于反汇编器将软件转换回可读的代码并且人工地对被加密的部分解密。尤其在现代编程语言、如.NET和Java的情况下转换回高级语言(C#、Java、VB)常常可以是没有问题的。在本机Windows编程、Linux编程或者OS-X编程的情况下代码被转换为汇编指令。软件保护方法、如API调用或通过名称的变化来迷惑可以被黑客简单地绕过。现代软件保护方法使用密码学并且将所述密码学用于对能够实施的代码和数据加密以及用于挑战-响应-询问。为此所使用的秘密密钥被存储在软件狗中。

当假设:黑客不拥有具有相应的密钥的软件狗时,通过使用加密可以实现根据现有技术安全的保护。

在实践中该假设是不恰当的。软件狗虽然不能被黑客仿真或者复制(黑箱),但是软件与软件狗一起被出售。与消息加密不同,用户拥有密钥,但是没有兴趣将该密钥保持为秘密的。密钥被软件自动地使用。在当前的软件保护方法中由对密钥在软件中的使用的了解自动地转换回不受保护的代码理论上是可能的。这尤其在保护系统对于黑客来说在最初的详细的分析之后是已知的时适用。一般来说,黑客甚至本身具有保护系统的一个版本(白箱)。

发明内容

本发明的任务是提出一种方法,所述方法即使在了解保护方法的情况下也提供免受对要保护的计算机程序的影响和分析的足够的保护。

当前的任务利用具有权利要求1的特征的方法以及利用具有权利要求2的特征的方法并且通过根据权利要求17所述的计算机系统来解决。

在本发明的范围中认识到了:通过保密来持久地保护计算机程序和方法本身是不可能的。一般来说所使用的用于保护计算机程序的方法是对计算机程序的部分加密并且在运行时解密、调试器识别以及在渐进方法、诸如公司WIBU-SYSTEMS AG的方法中附加地锁定软件狗。

进一步认识到了:过去的方法与克尔克霍夫准则矛盾以及如果方法本身是已知的并且存在密钥以便实现计算机程序的被授权的实施时,恰好基于克尔克霍夫准则的方法则也提供非常良好的以及可靠的保护。为根据本发明的方法的基础的柯克霍夫原则的意思是:方法或者计算机程序的安全性与其保密本身不相关,而是与一个或多个所使用的密钥的保密相关。因此考虑如下情形:攻击者迟早将获得系统、即受保护的程序并且可以深入地分析该系统。即使存在用于对计算机程序解密的密钥,也不允许对该系统区别对待,因为安全性仅取决于所使用的密钥而不取决于系统或者计算机程序的保密。因此,可怀疑地已自己创建所述系统或者计算机程序的内部攻击者也不具有比外部攻击者更好的攻击前景,所述外部攻击者应用入侵程序或者用于操纵受保护的计算机程序的操纵软件。

这也意味着:即使在如例如开发者所具有的对用于保护计算机程序的保护方法的了解的情况下,也不形成值得一提的优点。即使存在“用于破坏软件的说明”,这对于攻击者来说也不具有优点。所述攻击者也必须继续将巨大的花费投入到计算机程序的每个单独的实例的或者计算机程序的每个单独的模块的破坏中。

根据本发明,对计算机程序的至少部分加密,以便阻止在不通过处理器实施程序的情况下对计算机程序的静态的分析。用于对计算机程序的被加密的部分解密所必需的密钥被存放在安全的、即受保护的或被加密的密钥存储器中,所述密钥存储器与计算机通信。也可以使用多个密钥。与所使用的密钥被隐藏在程序中的现有技术不同,在当前的方法中进行程序和密钥的分离。

根据本发明,用于保护计算机程序的方法基于柯克霍夫原则。因此,受保护的计算机程序和受保护的计算机程序的所有部分、还有被加密的部分是能够自由地以及公开地访问的并且因此被公开。程序部分和程序结构不被保密。操纵软件或者入侵程序可以读出受保护的程序。

受保护的计算机程序的结构相对于不受保护的计算机程序被改变,使得计算机程序的部分多次存在。程序的哪些部分在受保护的计算机程序中多次被实现的选择基于程序的专业性、即对要保护的计算机程序的程序运行和目的和使用的了解来进行。因此,程序的多次、至少双重地存在的部分根据程序运行中的结果以及根据所处理的输入值来选择。

该行动对于攻击者或者黑客来说是一种困难。认识到了:攻击者非常准确地知道软件如何被“破解”。在此,由攻击者在受保护的计算机程序中移除询问,改变返回值、找到被加密的代码并且解密(只要可能)。执行存储器转储并且给程序代码打补丁。

然而,攻击者不知道计算机程序如何被使用。所述攻击者不具有关于使用和结果的知识。所述攻击者不能检查以及评价:结果或者输出值是正确的还是错误的。所述攻击者也不能判定:程序之内的输入值和处理值是否是有意义的或者哪些输入值在程序中的确定的位置处是有意义的。所述攻击者不能作出涉及计算机程序的所谓的专业性的判定。但是,根据本发明的方法恰好以这一点为前提。

因此,在本发明的范围中认识到了:用于保护计算机程序的方法必须建立在攻击者和入侵程序或操纵软件的缺少的专业知识的基础上。因此取决于专业性。保护方法基于用于保护的方法和计算机程序的复杂性并且利用该复杂性。以这种方式,用于保护计算机程序的方法的作用原理以及通过所述方法受保护的计算机程序的作用原理以这种方式是不再能够分离的并且只能困难地理解。这也在受保护的计算机程序是能够自由地访问以及已知的时适用。

在一种优选的实施方式中,访问受限制的、被加密的或受保护的以及因此安全的密钥存储器是软件狗、即外部的独立的设备、比如令牌、USB棒或存储卡,其通过接口被连接到计算机系统上,受保护的计算机程序在所述计算机系统上被实施。替代地,软件狗不仅可以是专门针对保护目的所设置的硬件,而且可以是标准令牌,所述标准令牌例如通过PKCS#11来寻址(angesprochen)。这种令牌虽然仅具有受限制的功能性,然而同样可以被用作安全的密钥存储器。替代地,该安全的(受保护的、例如被加密的)密钥存储器可以是计算机的存储介质,所述计算机程序在所述计算机上运行;其尤其可以是计算机的存储介质的受保护的区域。

根据本发明的、也被称为模糊箱(Blurry-Box)方法的用于保护计算机程序的方法根据本发明包括以下步骤:

首先将要保护的计算机程序划分为各个模块。在一种优选的实施方式中这些模块可以包括一个或多个功能块。在此,计算机程序的功能单元被理解为功能块,所述功能单元提供(一定的)所预定义的、独立自给的功能性。这例如可以是在应用中提供用于进程的控制的特性曲线的块、或者为了图像处理进行服务、比如对比度增强的滤波器。因此,功能块是计算机程序之内的提供确定的功能的逻辑单元。模块可以包括一个或多个功能块,然而也可以包括其它软件代码。

根据所述方法,计算机程序的至少一部分以及计算机程序的模块中的至少一个被加密。在最简单的情况下功能块因此被加密。至少一个用于计算机程序及其部分的解密所需的密钥被存放在受保护的密钥存储器中。这种密钥存储器可以是硬件软件狗或者例如在计算机系统的存储介质中被实现为软件。

在另一步骤中,对于计算机程序来说特定的状态值被产生,或者只要所述状态值已经被产生了,就被识别。在本申请的意义上的状态值表征在计算机系统中运行的进程。所述状态值描述进程或者其(瞬间的)状态,其中术语进程被理解为被加载到主存储器中的并且处于处理中的计算机程序。状态值是程序内部的逻辑值或者程序的状态并且基于程序的专业性、即基于程序内容。状态值不是计算机或计算机的主存储器中的物理表示并且因此不是在程序之外所使用的值、诸如主存储器中的浮点数。更确切地说,状态值是对于程序运行来说特定的内部的值,例如所述值可以表示地面的硬度并且于是可以采用如下值、如花岗岩、粘土、木料、地毯等等或者所述状态值可以是发动机中的燃烧压力并且例如表示0和200 巴之间、200和500 巴之间、500和1200 巴之间或者大于1200 巴的压力。

但是,状态值也可以包括功能或功能块的参数、全局变量、调用顺序或计算机程序之内的功能的调用层级。状态值在计算机系统的存储器的堆栈或其它部分中是可见的并且一般来说是能够读出的。该状态值在通过处理器实施计算机程序时在计算机系统的主存储器中在被加载到主存储器中的模块中被处理,其中所述计算机程序被加载在所述主存储器中。因此,所述状态值作为输入参数被递交给模块并且对于所述模块的实施来说是必需的。

在另一步骤中,根据本发明的自动化的方法检验:所处理的状态值是否对于所述模块来说是有效的。在此,可以检查:状态值是否具有所预给定的以及所预期的值,位于预先确定的值范围中、是所预期的变量或者是否在这种情况下涉及另外的、特殊的、对于所调用的模块来说特定的调用参数。如果无效的状态值被确定,则进行计算机程序的程序运行的变化。这可能导致程序中止或者导致警告的输出。程序中止可以立即或者延迟地进行,使得攻击者不知道哪个模块调用或者哪个模块已触发中止。延迟可以是时间上的,随机地或者根据另外的调用、例如模块调用的确定的次数、例如3、5、10次调用。程序运行的变化也可以是无声警告,所述无声警告例如作为消息被发送给外部服务器计算机或者所期望的网址或者电子邮件地址。

在所述方法的一种优选的实施方式中,要保护的计算机程序首先被划分为模块。模块中的至少一个A被复制,使得形成两个相同的模块A1和A2。两个模块优选地在另一步骤中被修改。在这种情况下针对每个模块A1、A2进行各一个值范围α1、α2的规定。该值范围适用于至少一个对于模块的实施来说所需的输入参数a1、a2。

在下一步骤中模块A1、A2优选地被加密。按照根据本发明的保护方法的所述优选的实施方式,利用至少一个参数a1、a2的模块的调用现在被转向密钥存储器。优选地是软件狗的密钥存储器获得输入参数a1、a2,所述输入参数通过模块调用被递交给了所述密钥存储器。在密钥存储器中输入参数a1、a2相对针对所调用的模块A1、A2所规定的值范围α1、α2被检验。在密钥存储器中于是判定:是否存在被授权的模块调用。因此验证:是否存在用于模块调用的合适的输入参数以及模块调用是否是有效的。如果这种授权被确定,则将选择参数i返还给进行调用的程序部分。选择参数i用于第i个模块Ai的选择。

攻击者的目标是在不使用密钥存储器的情况下选择正确的模块或者正确的模块变体(A1、A2)。这只能通过试验来进行。为了阻止攻击者的多次试验或者减少用于确定用于相应的模块的有效的输入参数的尝试的次数,可以在错误输入的情况下改变程序运行,使得输出警告或者进行程序的锁定。这可以立即或者时间延迟地进行。替代地可以锁定密钥存储器。

如果模块或功能块被加密,则对于攻击者来说障碍再次被增加,因为所述攻击者仅看到被加密的程序部分并且不能推断出其内容。但是,在程序以及大量模块的高复杂性的情况下不对有关的模块加密的变体也提供足够的保护。

如果模块被加密,则在将选择参数i返还给受保护的程序中的被调用的程序部分之后将输入参数a1、a2与对所选择的模块Ai解密的指令一起递交给软件狗。如果模块和输入参数相配,则密钥存储器、例如软件狗将解密以及实施所述模块。模块的结果值被返还,该结果值可以进一步被处理。

已表明:利用根据本发明的用于保护计算机程序的方法实现免受通过操纵软件的不仅静态的而且动态的攻击的稳健的保护。一般地,在软件保护中在静态的和动态的攻击者之间进行区分。在两种类型中攻击目标是计算机程序的重建,使得所述计算机程序即使在没有由计算机程序制造商所提供的一个或多个密码密钥形式的授权或相应的许可证的情况下也是有运行能力的,所述许可证例如可以被存放在密钥存储器中。

根据本发明的用于保护的方法甚至在以下假设下也提供保护:

- 攻击者拥有软件的至少一个许可证。所述攻击者能够弄到另外的许可证,所述攻击者例如可以购得所述许可证。所有许可证的数量通过参数k来限制,所述参数可以最后由计算机程序的制造商来定义。

- 攻击者可以访问所供应的代码。所述攻击者了解计算机程序并且所述攻击者了解被用于保护所述计算机程序的方法。所述攻击者尤其知道所述计算机程序被细分为模块或功能块。

- 只要攻击者的许可证是有效的,其就可以访问由密钥存储器所提供的接口。一般来说,密钥存储器是软件狗、即硬件或者如下设备,所述设备被连接到计算机系统的接口上。

- 出发点是:被存放在密钥存储器中的密钥不能被提取。在软件狗的情况下虽然能够使用被存放在软件狗上的密钥,然而所述密钥不能与软件狗分离以及例如被拷贝。

- 然而针对用于保护计算机程序的方法的保护假定:不存在关于计算机程序的实际的作用原理的专业知识。

在以静态的方式所实施的攻击场景中攻击者遵循与计算机程序无关的攻击策略。所述攻击者了解所述计算机程序到如下程度,即所述攻击者看到各个块。所述攻击者可以访问计算机程序的程序代码以及被加密的部分。所述攻击者可以向密钥存储器提出针对各个功能块的解密询问。相对该攻击者可以保证非常高的保护,因为所述攻击者只能以与上面所提到的参数k相关的非常小的概率猜到功能块的正确的次序。攻击者因此将失败。能够通过所谓的归约证明(Reduktionsbeweis)表明:攻击者通过解密询问以及对被加密的被细分为块的计算机程序的了解除此之外什么也不能获悉。归约证明涉及所使用的用于保护计算机程序的加密方法的安全性。

在动态的攻击场景中出发点是:程序被实施。这里假设:不能阻止确定的微不足道的攻击。这种攻击能够分成两种类别:

类别1:记录计算机程序的输入和输出

如果攻击者实施所述程序,则所述攻击者由其输入获悉由计算机程序所产生的输出。所述攻击者例如可以将确定的参数发送给所述程序并且识别由相应的部分的实施所引起的输出。

类别2:记录被解密的功能块或者模块

在计算机程序的运行期间攻击者可以记录以及组合以明文存在于工作存储器中的功能块或者模块。攻击者由此获悉属于输入的功能块。攻击者也获悉属于潜在地另外的输入的功能块。类别2的攻击因此比类别1的攻击更强。

两种类别的这些动态的攻击可以由攻击者足够频繁地以不同的输入来重复。因此,最后对于攻击者来说重建完整的程序是可能的。在理论的观点下不能阻止两种类别的攻击。但是,所述攻击对于现实大小的计算机程序来说是花费非常大的并且一般来说很少不辜负所述花费。

在正式地观察用于保护计算机程序的方法的安全性时因此观察如下攻击,所述攻击超越这些微不足道的攻击。

因此在用于保护计算机程序的方法的一种特别的实施方式中,至少一个功能块或模块被多个变体代替。特别优选地,变体可以在要保护的计算机程序的编译之后被产生。在此,优选地,功能块或者模块被拷贝、即被复制。可以存在多个相同的变体,然而所述变体也可以被修改。优选地,各个变体主管不同的输入参数或状态值的处理并且仅就这些输入参数或状态值来说是有效的并且导致实施中的正确的结果。在程序运行中使用哪个变体的选择优选地与输入参数或者状态值相关。变体利用错误的参数的实施可能导致程序运行的中止或者导致计算机程序的各个部分的或者密钥的删除。

因此,优选地,模块或者功能块的变体的产生通过复制、优选地利用修改来进行。替代地以及同样优选地,变体的创建因此可以通过计算机程序的结构分析或者根据关于计算机程序的元信息来进行,所述元信息必须对于用于保护计算机程序的方法来说是已知的。元信息基于计算机程序的专业性并且与程序的类型和使用相关。各个功能块的变体可以作为整体与原始功能块在功能上是相同的或者仅针对可能的输入的子范围在功能上是相同的。当在功能块中存放并且实施特性曲线时,例如可能的是,这些特性曲线被细分为不同的值范围并且功能块的变体覆盖特性曲线的确定的范围。在此,变体可以被设计,使得所述变体应当被应用于的相应的值范围与原始功能块相同,然而特性曲线在特定的值范围之外是不同的,使得在特定的值范围之外功能块的变体的调用导致错误的返回结果。例如将是可能的是,在发动机控制中例如针对冷态运转阶段、发动机的正常运行、运动运行、紧急运行以及节能运行在各个变体中存放不同的特性曲线。在功能块是用于图像处理的滤波器的情况下,用于彩色图像以及用于黑白图像的对比度增强可能包括用于对比度增强的不同的算法,使得每个变体与输入参数(调用参数、状态值)相关地导致不同的结果。

在一种优选的实施方式中,功能块或者模块的变体根据状态值来选择以及实施。如果状态值例如是发动机的运行方式,则可以如上面所解释的那样针对状态值、即发动机的运行状态来选择分别正确的变体。

优选地可以借助于密钥存储器来控制状态值是否与被调用的变体相对应。在本发明的意义上的状态值在此不仅被理解为调用参数或计算机程序的程序运行中的参数,而且例如可以是全局变量。此外,状态值也可以包括各个功能块、变体或者模块的调用顺序或者调用层级。密钥存储器因此优选地控制:调用变体所利用的调用参数或输入参数(状态值)是否与所述变体相配以及由所述变体所预期。因此检验:对于相应的变体来说有效的调用参数或输入参数是否被使用。

在一种优选的实施方式中,变体可以被修改,使得在一个变体中确定的值范围或者子范围针对所述状态值被规定并且所述状态值在调用所述变体时必须位于所规定的值范围之内,以便识别有效的调用并且进行实施。例如将可能的是,在1至10的值范围中的调用参数(状态值)的情况下选择变体1,而在11至20的范围中的值的情况下调用变体2并且在大于20的值范围中的值的情况下调用变体3。检查可以要么在处理器中在计算机程序的运行中、即在进程的实施中进行,要么例如借助于密钥存储器来进行。也可能的是,为此使用单独的密钥存储器或者计算机系统的存储介质的受保护的部分。

在用于保护计算机程序的方法的一种优选的实施方式中,根据预定义的值来进行变体的调用的选择。这些值优选地被存放在例如密钥存储器中的或者计算机系统的存储介质的受保护的区域中的表中。然而,所述值也可以以算法的方式被确定,其中所述值特别优选地在进程运行期间被计算或者从进程的另外的状态值来确定。例如这里能够组合:哪些变体或功能块或模块事先被调用了或者确定的运行状态关于发动机控制、例如发动机运行是否占优势。也可能的是,借助于密钥存储器来确定用于选择变体的调用的预定义的值。

因此,用于保护计算机程序的方法针对变体选择使用不同的可能性。这导致:一个功能块的表面上相同的变体根据其是否在所设置的值范围以及有效性范围中被使用而可能情况不同。

变体的使用也提供存放确定的程序结构的可能性。例如可以在具有级联的条件(If语句或者所谓的Case(条件)语句或者Switch(开关)语句)的确定的程序结构的情况下将不同的变体用于各个询问或者例如If语句。

在一种优选的实施方式中,变体中的至少一个被加密。用于解密所必需的密钥可以被存储在安全的密钥存储器中。优选地,处理器于是可以为了解密与安全的密钥存储器通信。在此可能的是,针对功能块的不同的变体在密钥存储器中存放不同的密钥。但是也能够对确定的变体分组,使得对于其解密来说仅仅需要一个密钥,所述密钥同样被存储在密钥存储器中。

根据本发明的该原则基于如下认识:应用代码、即计算机程序的部分到密钥存储器中的转移遇到大的实现问题。而认识到了:相对简单地可能的是,在密钥存储器中计算要使用的变体的选择。因此,利用用于攻击受保护的计算机程序的静态的分析在不直接实施代码的情况下不再能够确定在特殊情况下必须调用哪个变体。即使在动态的分析中攻击者也遇到困难,因为所述攻击者根据变体的调用在解密之后可能得到不同的结果,因为所述攻击者已将错误的变体用于相应的值范围。

优选地,密钥存储器是一种设备、例如软件狗。当所述设备进行变体的选择或者另外的检查时,所述设备优选地包括处理器。可选地可以存在存储器、例如数据存储器。处理器实施选择算法,以便借助输入参数来作出模块选择。索引或者参数可以作为结果被返还。

在一种优选的实施方式中,所有的变体被加密,其中必需的密钥被存放在密钥存储器中,使得仅仅密钥存储器可以对功能块的变体解密。

在一种同样优选的实施方式中,根据所述方法将另外的功能块生成为变体,所述变体在程序的具体的实施中不被调用。如果密钥存储器得到对这种被用作陷阱的功能块解密的指令,则入侵程序或者操纵软件的侵入尝试被识别。

根据所述方法的一种优选的实施方式,所述计算机程序也包括从不被(按规定的)进程实施的模块、功能块或变体。其调用或者其实施导致进程中止、密钥存储器的锁定和/或密钥存储器的删除。因此也阻止对要保护的程序的动态的分析。在动态的分析中入侵程序在实施期间观察要实施的以及要保护的计算机程序。为此通常使用所谓的调试器。因为要保护的计算机程序被实施,所以所述计算机程序也可以与环境以及尤其也与攻击者以及有害软件或者操纵软件互相作用。如果通过所述方法识别出对计算机程序的影响或者操纵,则可以引入对策,例如上面提到的对策、如密钥存储器的锁定或删除。

在一种优选的实施方式中,借助于所述方法来识别侵入尝试或者由操纵软件进行的操纵。这例如可以通过如下方式来进行:在动态的分析中触发陷阱,即调用如下功能块,所述功能块从不被计算机程序调用或者仅仅在其它时间点或者从其它地址出发被调用。在识别出侵入尝试的情况下可以例如通过向远程计算机发出警告通知来触发警告。替代地,密钥存储器可以被操纵并且进程可以被中止。

在一种优选的实施方式中,在由处理器实施计算机程序时在主存储器中在模块中被处理的状态值是关于计算机程序的进程状态的值。在这种情况下检查:状态值是否位于有效的、预定义的有效性范围中。优选地,有效性范围优选地以被加密的形式被存放在变体中。

例如可以在各个功能块或者变体中存放计算机程序中的功能块的调用层级或者调用顺序的部分。替代地可能的是,该调用顺序或者调用层级、即功能块的调用的正确的次序被存放在密钥存储器中。模块、功能块或者变体的调用基于状态值来进行,所述状态值表示来自调用层级或者调用顺序的值。优选地,状态值提供关于哪个模块、哪个功能块或哪个变体作为下一个被调用的信息。同样优选地,状态值替代地可以提供关于哪个模块、哪个功能块或哪个变体作为最后一个被调用了的信息。

如果密钥存储器被指示对基于程序运行而未轮到的功能块解密,则密钥存储器可以被锁定。用于实施计算机程序的许可证由此变得无效。无效的调用例如可以通过如下方式被识别:在解密时可以一起说明可能的紧接着的解密的列表。替代地,可以在解密时一起说明哪些解密可以或者必须已在该解密之前进行了,即哪个功能块可能在该功能块的调用之前被执行以及被调用。

作为另外的可能性也可以指定解密,使得所述解密可以与其前任不相关地进行。允许的前任或继任者的列表优选地以密码方式受保护地被传输给密钥存储器,以便使由攻击者或者操纵软件进行的修改变得不可能。由此同样确保:可能的功能块前任或继任者的列表不能以明文被攻击者或者有害软件查看。因此,对于操纵软件来说不可能的是,自由地并且与程序逻辑以及在计算机程序中所规定的进程运行不相关地选择功能块的实施顺序。

在一种优选的实施方式中,状态值根据所述方法在安全的密钥存储器中被处理或者被存放在计算机的存储位置处,所述存储位置可以是存储介质或者也可以是密钥存储器或者软件狗。因为密钥存储器仅仅管理以及实施功能块的解密,以及因为可以假定在功能块的解密之后也进行其实施,所以可以通过监视对密钥存储器的解密询问来监视在动态的分析中被执行的程序运行。

附图说明

随后根据在图中所示出的特别的实施方式进一步解释本发明。在那里所示出的特点可以单独地或者以组合的方式被使用,以便提供本发明的优选的设计方案。所描述的实施方案不是对通过权利要求在其一般性方面所限定的本发明的限制。

图1示出根据本发明的用于保护计算机程序的方法的结构图;

图2示出各个模块的调用结构的一个示例;

图3示出具有变体的计算机程序的调用结构的一个示例;

图4a-4f示出用于产生模块变体的方法流程的一个示例;以及

图5示出在主存储器中所加载的计算机程序的原理图。

具体实施方式

图1示出根据柯克霍夫原则的用于保护计算机程序的方法的一般结构。由根据本发明的程序所使用的不同的措施作为结构树被示出。

首先应提到变体构成(Variants(变体))的措施。在这种情况下得出多个要求和可能性。在产生(Generation)的范围中存在已经在上面在文中所提到的如下可能性:复制功能块或模块、基于结构分析来创建功能块或模块的变体。例如,功能块或模块之内的不同的判定树可以通过变体来表示。可能的使用场景在这种情况下是所谓的单独的或者级联的条件、如IF语句。用于变体产生的另一可能性基于元信息的使用。这是关于要保护的计算机程序的附加的信息。例如可能在处理程序时存在不同的有效性范围,例如在发动机控制中,不同的运行方式、如应急运行、冷态运转阶段或运动运行。

当各个范围被说明时,各个变体的选择优选地要么基于元信息进行。另一可能性是表控制的选择。用于保护计算机程序的方法可以在表中任意地规定:哪些输入值必须被用于哪些变体。优选地,这种表被加密。特别优选地,所述表已经被存放在计算机程序本身中。

用于选择变体的另一可能性在于通过算法来计算各个变体。这可以在密钥存储器中进行。静态的分析于是不再是可能的,在所述静态的分析中程序仅仅被分析而不实施实际的代码。在静态的分析中程序不运行,而是仅仅被观察。所述计算机程序于是虽然原则上不具有主动的防御措施。然而,通过这种变体构成以及不同的变体的在进程(程序运行)期间才进行的选择可靠地阻止静态的分析。这些防御措施以及主动的防御措施要求程序被实施并且因此至少暂时地在计算机系统的控制下。

在变体的使用中,变体优选地被加密。因此,变体不能容易地被分析,尤其不能通过静态的分析被分析。

另一可能性是构成变体,所述变体被用作陷阱(Trap)。这些变体在按规定的实施时从不被计算机程序调用或者寻址。如果这种陷阱由操纵软件调用,则可以进行对许可证的访问,所述许可证优选地被存放在密钥存储器或者软件狗中。因此阻止:操纵软件或者入侵程序可以进一步在程序中向前推进,因为缺少必需的许可证。因此不再给予攻击者或者操纵软件在错误尝试之后简单地重新开始的可能性。

除了通过所谓的不可能的代码(Fake-Code(伪码))来使用陷阱的可能性之外也存在在调用变体时执行针对状态值的范围检查的可能性。当变体仅针对确定的值范围被允许、但是仍然存在也针对其它值范围调用这些变体的可能性时,在这一点上也可以设法实现陷阱。

不仅在变体的使用中而且在程序及其功能块的运行中典型地通过所谓的调用(Calls)来进行各个功能块或变体的调用。在功能块的实施之后的返回通过所谓的返回(Returns)来进行。根据本发明的方法的另一优选的保护措施是返回的控制以及监视。该返回仅仅可以在许可证存在并且被实施时进行。例如可以由确定的参数计算:是否存在有效的许可证以及是否可以进行有效的返回。也可以规定返回向哪儿进行。

优选地,在借助于参数的计算的实施中检查:参数所位于的值范围是否被改变(被打补丁)了。如果情况如此,则计算机程序应当停止实施。

在用于保护计算机程序的方法的一种优选的实施方式中,对于各个变体或者功能块的调用来说必需的调用中的至少一个被加密。优选地,这些调用中的至少一些在计算机程序中通过被加密的“蹦床跳(Trampolinsprünge)”得到保障。在这种情况下,调用的目标是不以明文存在于计算机程序中。更确切地说,地址被加密。因此,实施在有效的许可证(密钥)存在的情况下才是可能的,使得静态的分析被阻止。因此,在没有有效的许可证的情况下也不能预测以及分析计算机程序的运行以及调用层级。

在所述方法的一种优选的实施方案中以及尤其在蹦床跳的另一表现形式中,跳到不同的目标以程序控制的方式通过相同的“蹦床”来执行。这导致:从程序中的大量不同的位置而不是从不同的目标过程跳向仅仅所述一个蹦床。蹦床现在通过附加的参数判定:哪个是实际的目标例程并且跳向该目标例程。作为其后果,在静态的分析中不能看出,从哪儿跳向哪些例程。静态的分析因此不提供过程的层级,而是提供平面结构,在所述平面结构中每个过程仅引用所述蹦床并且所述蹦床引用大量或者所有目标过程(例如功能块、模块)。由此针对静态的分析掩盖运行结构。优选地,哪个目标过程或者哪个模块作为下一个被跳向以及被调用的选择在受保护的密钥存储器中被作出。为此蹦床功能调用密钥存储器,递交输入参数并且最后取回选择值,使得所期望的以及“正确的”目标过程被调用。

该设计方案仅仅以要保护的计算机程序的复杂的结构为前提,而不是以蹦床功能或者模块或者功能块的加密为前提。所要求的复杂性在实践中在所有应当被保护的计算机程序中被给定。

因为攻击者想要在没有密钥存储器的情况下运行程序,密钥存储器所产生的信息、即这里要调用的模块的选择对于所述攻击者来说不可用。因此,所述攻击者必须通过“试验和错误(Trial and error)”来找出所述信息。使用蹦床功能的变体和模块的数量越大,这变得花费越大。

根据柯克霍夫原则的另一可能性是监视密钥存储器中的状态存储器。在这种情况下优选地将软件狗用作状态存储器。软件狗或者密钥存储器识别功能块和/或变体的正确的次序。如果进行未被设置的调用或者用于未被设置或允许的功能块或者模块的解密的询问,则程序以及程序运行可以被锁定或者被改变并且必要时警告被输出。

另一同样优选的措施是控制以及监视运行顺序和调用层级。在这种情况下假定:程序运行以及到各个功能块和/或变体的分支以预定义的顺序进行。该顺序在运行期间被检查以及控制。

图2借助具有多个功能块的示例示出调用层级的原则上的运行,而图3示出具有变体的运行控制。

根据图2可以识别:主例程(Main(主))可以调用多个功能块A至D。功能块B和C调用功能块E。功能块D调用功能块F。所有的功能块可以调用用于错误处理的错误(Error)功能块。

通过根据本发明的用于保护计算机程序的自动的方法可以确保:计算机程序的程序代码总是以有效的预定义的顺序被调用。优选地,顺序的运行通过将所述顺序存放在安全的密钥存储器中、例如在软件狗中来确保。实施于是可以仅利用所连接的软件狗或者存在的许可证来进行。但是,因为密钥存储器或者软件狗本身不能观察哪个代码被实施,所以密钥存储器必须优选地涉及实施、即进程的能够观察的部分。尤其加密调用和对密钥存储器的询问优选地是能够观察的。

因此,密钥存储器或者软件狗优选地记录功能块的解密。从功能块在解密之后被实施出发。如果被调用的功能块(例如E)稍后回转到进行调用的功能块(调用方,例如B),则进行调用的功能块(例如B)必须告知密钥存储器所述回转。这可以要么向密钥存储器的针对要进行调用的功能块(例如B)的重新的解密调用来进行,要么通过单独的指令告知密钥存储器调用层级已降低来进行。在根据功能2的示例中调用次序可能情况如下:

主程序调用功能块A。该功能块回转到主程序。紧接着,功能块C被调用,所述功能块在下一步骤中调用功能块E。从功能块E进行到功能块C的返回。接着进行错误例程Error的调用。另一调用于是可以从主程序向功能块D进行,所述功能块又调用功能块F。从这里进行到功能块D以及进一步到主程序的返回。

然而,如果以未被授权的方式例如直接在主功能块的调用之后调用功能块E,则存在无效的调用顺序。密钥存储器于是可以锁定以及阻断许可证的进一步使用。

在所述方法的一种优选的实施方式中,静态的程序分析被阻止。通常在计算机程序的代码中记下哪些功能块被调用。这通过程序代码中的所谓的调用指令来进行。直接在程序代码中包含有要进行调用的功能块的地址。因此,当可以确认哪些功能块可以被哪些功能块调用时,静态的程序分析是可能的。因此,操纵软件可以确定不同的功能块相互之间的相关性和程序结构。为了阻止这一点,优选地调用的地址被加密。因此,哪些功能块从哪些功能块出发被调用甚至对于操纵软件来说也保持不清楚。调用层级仅仅还能够动态地、即在实施时间被分析。

图3示出具有不同的变体的运行结构。功能块A、B、D和F被划分成不同变体。例如,变体A1的调用可以针对状态值的0至10的值进行,而变体A2可以针对11至100的值被选择。

在图3中所示出的示例中功能块F1被变体D1和D2调用;功能块F2被变体D2和D3调用。功能块E可以被变体B1、B2和C调用。除了变体D2和D3之外,所有的功能块和变体可以调用错误处理功能块(Error)。

在根据图3的结构中清楚的是,功能块B的变体B3不能调用功能块E或者变体F1、F2中的任何一个。如果仍然从变体B2进行对F1的调用,则错误被识别并且进程被中止。在一种优选的实施方式中可以在B2中检验:对F1的调用是否是允许的。替代地,可以在F1中检验:来自变体B2的调用是否也是允许的。

图4a至4f示出根据本发明的用于计算机程序的保护方法的一部分的方法流程。在优选的这里所示出的流程中,模块变体被产生,所述模块变体首先通过复制来形成。所述示例涉及模块,然而所述示例可以被应用于计算机程序的代码的任何部分,同样可以被应用于功能块或者其它在功能上关联的模块。

首选从模块A出发,关于该模块通过复制形成多个相同的模块变体。这里所示出的模块被布置在第j级中的程序的调用结构中。给所述模块供应输入参数p。这种模块的在示例中所示出的命名为Aj(p)。

通过模块Aj(p)的多次复制产生所述模块的n个变体,所述变体被称为Aj1(p),Aj2(p),…Ajn(p)。

在下一步骤中,所复制的模块变体Aji(p)被修改,使得各个变体仅仅还处理确定的值范围αi并且仅仅对于这些值范围之内的参数来说是有效的。在图4b中这些模块变体被称为Aj1(p1),Aj2(p2)…Ajn(pn)。

优选地进行所修改的模块变体的加密,如能够在图4c中识别的那样。被加密的块以灰背景被示出。

在一种优选的实施方式中,如在图4d中所示出的那样,在被加密的各个模块变体或模块块之间插入所谓的陷阱。这是如下程序代码,该程序代码同样被加密,但是在原来的程序运行中从不被调用以及实施并且因此也从不被加密。这些“代码陷阱”同样具有模块的名称,使得总模块数量n被提高了代码陷阱的总数m。在这种情况下应注意的是,代码陷阱可以被布置在模块变体之间的任意的位置处。其索引也可以被更改。

图4示出模块变体借助于受保护的密钥存储器的选择,所述密钥存储器这里被实施为受保护的以及安全的软件狗。哪些模块变体被调用的选择在调用通过软件狗变向(Umleitung)之后仅与输入参数pi相关。因此在软件狗中根据输入参数p执行相应的模块变体i的选择。在此,软件狗检查输入参数并且根据参数与各个模块的预给定的值范围的比较来确定模块选择。描述所述模块的索引i被返还给进行调用的功能。软件狗(密钥存储器)为此优选地包括选择算法,所述选择算法优选地在软件狗的处理器中被实施。

所述方法的一种优选的变体在图4f中被描述,在所述变体中另一算法(状态算法)附加地在密钥存储器中运行,使得密钥存储器作为状态机来工作。在这种情况下,不仅将参数p递交给密钥存储器,而且将层级值j递交给密钥存储器。密钥存储器于是如上面所描述的那样根据输入参数p选择第i个模块变体。附加地检查所述模块或者模块变体的结构层级是否一致。一方面可以建立输入参数和层级值j之间的关系。但是也可以检查调用从哪个在先模块或代码部分进行和/或被调用的代码部分被布置在哪个结构层级中。由此可以进行第二检查,所述第二检查进一步使想要完全放弃密钥存储器的攻击者变得难以操纵以及改变受保护的计算机程序。

图5示出所谓的防护页面应用。示出了计算机系统的主存储器(Memory(存储器)),在所述主存储器中加载有计算机程序(Program(程序))。在这种情况下,主存储器物理上被划分为可以被加密的各个区域、所谓的页面或瓦片(Kacheln)。

该划分由计算机的物理构造决定。页面的典型的大小是4KB(4096字节)。计算机仅可以基于这些页面修改存储器的保护特性。根据本发明的方法利用这一点。

页面可以具有以下状态之一:

- 不能访问

- 仅读访问

- 读和写访问

- 读访问和用于代码实施的授权

- 读、写访问和用于代码实施的授权。

如果通过根据本发明的方法受保护的计算机程序在实施时间请求不被这些权限覆盖的访问,则保护故障被触发。对此常用的示例是“空指针异常(Null PointerException)”。如果这种保护故障被触发,则程序获得通过以下方式自己处理该异常的可能性:调用用于存储器错误的处理例程(Error Handling Routine(错误处理例程)),所述程序事先已向操作系统注册所述处理例程。

在本发明的范围中认识到以及实现了:该机制能够被用作保护机制,以便保护程序免于在运行时通过存储器转储(Dump(转储))被攻击。为此,各个页面被加密并且紧接着这些页面的访问授权被设定为“不能访问”。如果通过根据本发明的方法受保护的计算机程序在实施的范围中访问该页面,则保护故障被触发。

在处理例程的范围中该页面现在自动地被解密并且访问权限被重置为原始值。程序现在可以继续运转。为了程序的所有的页面不在时间过程中以被解密的方式存在,所述程序可以以时间控制的方式又对所述页面加密并且将访问保护又设置为“不能访问”。

用于保护计算机程序的自动的方法因此确保:攻击者或者现在由外部进程从存储器中读出的入侵程序不能以明文读取存储器。如果入侵程序改变存储保护,则所述入侵程序虽然可以读取存储器,但是仅获得被加密的数据。

在受保护的计算机程序的情况下入侵程序的标准攻击途径是实施所述程序并且在实施期间制造存储器的转储(Dump),该转储(存储器转储)包含主存储器的部分,所述程序被加载到了所述主存储器中。在另一步骤中,入侵程序或者攻击者尝试从转储又产生能够实施的文件。

但是,在转储中通常仅包含存储器的直接来自能够实施的文件的部分。在运行时由程序所请求的存储器(例如来自所谓的堆)没有被包含在转储中。如果现在受保护的程序部分不在其在主存储器中的正常位置处、而是在其它位置(例如堆)处被实施,则这些程序部分没有被包含在转储中并且因此对攻击者提出新的挑战。该认识充分利用根据本发明的方法。

然而该方案在技术上蕴藏如下问题:在源代码的转化中机器代码被生成,所述机器代码也涉及相应的计算机程序中的其它代码或数据。这例如是全局变量的地址、过程的地址或如下地址,在所述地址上存放对操作系统功能的引用(IAT – Import AddressTable(输入地址表))。根据机器架构,所述地址要么相对于相应的实施地址要么作为绝对地址被存放在进程空间中。

如果通过根据本发明的方法受保护的计算机程序的过程的能够实施的代码被移位到其它地址上,则虽然绝对地址继续是有效的,但是相对于方法或者功能块的地址因此变得无效。

根据本发明的方法优选地包括该保护机制,所述保护机制以“Out Of PlaceExecution(不在适当的位置执行)”名字出现。为此优选地分析要实施的程序并且至少识别相对地址,以便所述相对地址在受保护的计算机程序运行时可以被纠正,使得程序保持有运行能力的。

结果是如下计算机程序,所述计算机程序不在如下位置处实施各个过程以及功能块,由编译器在所述位置处存放了所述过程和功能块,而是在计算机系统的主存储器中的变化的地址处实施各个过程以及功能块。要么完全没有代码要么仅仅被加密的代码位于由编译器存放了过程(代码)的位置处。因此,如果处理多个过程,则所述过程可以在不同的时间被存放在主存储器中的相同的位置处。由此进一步使攻击者或者操纵软件变得难以识别哪个过程必须被分配给哪个代码。

通过根据本发明的方法所采取的措施阻止由操纵软件或攻击者进行的不仅静态的分析而且动态的分析。一种胜任的措施例如是各个功能块或模块的变体的使用。在本发明的范围中认识到了:可以作出以下假设,根据本发明的方法的原则基于所述假设:

即使在了解功能块F的p-1个变体的情况下对于攻击者或操纵软件来说也不可能通过重建确定功能块的另一变体。

该假设基于如下认识:攻击者或操纵软件为了改变功能块的变体需要关于功能块以及其中所使用的算法的详细的知识。如果对于攻击者来说详细地理解算法及其在程序中的相互作用成功了,则攻击者也可以自己写一个这样的计算机程序并且不必破坏现有的程序。

借助于上面所作出的假设可以利用基于仿真的安全性概念正式地表明:可以实施这些攻击之一的攻击者除此之外未获得另外的信息并且什么也没有获悉。因此,除了执行微不足道的攻击以及花费非常大的、然而不能有效地以及经济地呈现的攻击之外,进行动态的分析的攻击者也可以被降低为静态的攻击者。

在本发明的范围中认识到了:根据本发明的保护方法的正确性可以以简单的方式被证明。因为所述方法例如通过变体构成来改变计算机程序的代码,所以可能的以及重要的是表明:这些变化不改变应当被保护的计算机程序的功能。所述方法的正确性可以通过证明变体的修改的正确性来证明。如果每个基本的修改是正确的,则这些修改的任意的联结也是正确的。在当前情况下这一点毫无疑问地被给定。

被称为模糊箱方法的用于保护计算机软件的保护方法根据柯克霍夫原则实现保护。相对于其安全性基于整个方法的保密的其它软件保护方法,在模糊箱方法中使用应用的复杂性的保密。因此,模糊箱方法基于在方法中所使用的密码密钥的以及程序结构的复杂交织的保密。然而,所述方法本身可以被公开,受保护的程序也是这样。由此得出多个优点。

- 将相对短的密钥保密比将完整的方法以及保护代码保密显著更简单。

- 通过方法的保密来保护是有疑问的,因为方法可以通过逆向工程被重建。在这里没有产生该危险。

- 代替折衷密钥比代替折衷方法更简单。如果其安全性基于保密的方法变得公开,则这意味着所述方法针对所有许可证和密钥的全局的破坏。而如果秘密密钥是已知的,则破坏局部地限于一个许可证。其它的利用其它密钥被保护的计算机程序因此不能被实施。

- 所述方法的安全性可以由不相关的专家公开地讨论以及分析。由此,用于所述方法的破坏所需的花费是能够量化的。与过去的方法不同,软件制造商可以有资格地判定所述保护是否值得。

该认识是本发明的基础,本发明现在首次将柯克霍夫原则应用于计算机程序的保护。至今专业人士在加密以及保密整个保护方法方面看到了大的优点。所述保护方法的公开遇到大的阻力,因为在其中看到了大的弱点。专业人士相信:仅仅密钥的以及方法和要保护的软件的被加密的部分的保密是一个缺点并且因此可以更简单地被操纵软件或入侵程序绕过。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号