保护软件项目的制作方法

文档序号:11142309阅读:385来源:国知局
保护软件项目的制造方法与工艺

本发明涉及用于保护软件项目的方法以及用于实现此类方法的装置和计算机程序。特别地,本发明涉及保护软件项目,从而混淆取决于是否满足条件而引起通过软件项目的一部分的控制流程中的变化的条件,其中,条件的满足是基于对一个或多个条件变量的评估。



背景技术:

众所周知的是经常针对软件项目发起攻击。攻击者可能希望获得包含在软件项目内的秘密信息(诸如密码密钥),目的是滥用该秘密信息(例如通过将密码密钥分发给其他人/系统,使得那些人/系统可以以未授权方式使用该密码密钥)。同样地,攻击者可能希望修改软件项目的执行流程。例如,软件项目可具有决策点,其检查软件项目的用户是否具有某些许可或访问权限——如果用户具有那些许可或访问权限,则软件项目可准予对某些功能或数据的用户访问,否则拒绝此类访问。攻击者可能希望尝试在此决策点处修改软件项目的执行,使得即使用户不具有许可或访问权限,软件项目仍准予对该某些功能或数据的用户访问。

存在可以应用于初始软件项目以便生成受保护软件项目、旨在使得攻击者不可能(或者至少十分困难)成功地完成其攻击的众多众所周知的软件保护技术。

本发明寻求提供一种用于保护软件项目的替换方法,其相比于现有技术的那些而言提供各种优势。



技术实现要素:

根据本发明的第一方面,提供了一种保护软件项目、从而混淆取决于是否满足条件而引起通过软件项目的一部分的控制流程中的变化的条件的方法,其中,条件的满足是基于对一个或多个条件变量的评估。本方法包括:(i)修改软件项目,使得通过所述部分的控制流程并不取决于是否满足条件;以及(ii)在已修改软件项目的所述部分中向表达式中插入多个恒等变换,其中,定义并插入所述恒等变换使得,在不存在篡改的情况下,如果满足条件则所述恒等变换维持表达式的结果,并且使得如果不满足条件则所述恒等变换改变表达式的结果,其中,每个恒等变换直接地或间接地取决于一个或多个条件变量中的至少一个。

因此,通过恒等变换的使用,通过软件项目的所述部分的控制流程不再取决于条件和(一个或多个)条件变量。替代了条件在软件项目中是明确的,条件在恒等变换中变成隐含的。此外,希望篡改代码以迫使其沿着特定控制流程路径(例如,口令是正确的控制流程路径)的攻击者被要求篡改恒等变换中的每一个以便成功地攻击代码,而在原始软件项目中,对条件的单次攻击就会是足够的。

有利地,本方法还包括定义多个新变量。这向代码添加了复杂性以使得攻击者更加难以识别在攻击中要篡改的相关变量。

可选地,被分配给新变量中的至少一个的值并不是直接地或间接地基于一个或多个条件变量中的任何。可选地,被分配给新变量中的至少一个的值是恒定值。可选地,被分配给新变量中的至少一个的值是基于软件项目的程序变量,所述程序变量不同于一个或多个条件变量。

有利地,被分配给新变量中的至少一个的值直接地或间接地基于一个或多个条件变量中的至少一个。这将(一个或多个)条件变量散布在更多变量之中,再次要求攻击者篡改软件项目的附加部分以便实现成功的攻击。更有利地,所述一个或多个条件变量中的每一个被直接地或间接地用来向新变量中的至少一个分配值。在某些实施例中,至少一个恒等变换取决于新变量中的至少一个。可选地,本方法还包括(iii)重新表达条件以产生新条件,该新条件是基于新变量中的至少一个,其中,如果满足条件则满足新条件,并且其中,如果不满足条件则不满足新条件;以及(iv)修改软件项目,使得控制流程的至少一部分取决于是否满足新条件。可选地,本方法还包括修改软件项目的所述部分,使得一个或多个条件变量中的至少一个的至少一个实例被基于新变量中的至少一个的等价表达式替换。

可选地,本方法还包括:(v)识别在其处给一个或多个条件变量中的至少一个分配随后被用来测试是否满足条件的值的软件项目中的码块;以及(vi)在所述码块中向新变量中的至少某些分配值。可选地,在所述码块中向新变量中的至少某些分配值包括遍布所述码块插入赋值语句。

在一个实施例中,软件项目包括IF-THEN语句,其包括包含条件的IF代码区段和被布置成响应于满足条件而被执行的THEN代码区段,并且其中,修改软件项目包括移除IF-THEN语句,使得已修改软件项目始终执行THEN代码区段,无论是否满足条件。

在另一实施例中,软件项目包括IF-THEN-ELSE语句,其包括包含条件的IF代码区段、被布置成响应于满足条件而被执行的THEN代码区段和被布置成响应于不满足条件而被执行的ELSE代码区段,并且其中,修改软件项目包括移除IF-THEN-ELSE语句,使得已修改软件项目始终执行THEN代码区段,无论是否满足条件。

在又另一实施例中,软件项目包括IF-THEN-ELSE语句,其包括包含条件的逻辑补集的IF代码区段、被布置成响应于不满足条件而被执行的THEN代码区段和被布置成响应于满足条件而被执行的ELSE代码区段,并且其中,修改软件项目包括移除IF-THEN-ELSE语句,使得已修改软件项目始终执行ELSE代码区段,无论是否满足条件。

有利地,恒等变换中的至少一个是乘法恒等变换,其在不存在篡改的情况下如果满足条件则计值为1,并且如果不满足条件则不计值为1,其中,可通过将表达式中的变量乘以乘法恒等变换来将所述乘法恒等变换插入到表达式中。有利地,恒等变换中的至少一个是加法恒等变换,其在不存在篡改的情况下如果满足条件则计值为0,并且如果不满足条件则不计值为0,其中,可通过将加法恒等变换与表达式中的变量相加来将所述加法恒等变换插入到表达式中。可选地,使用包括通用恒等变换公式的恒等变换数据库来定义恒等变换。

可选地,本方法还包括:(vii)识别通过已修改软件项目的所述部分的所有控制流程路径;以及(viii)针对每个已识别控制流程路径,将沿着该控制流程路径的变量的值考虑在内,从而识别该控制流程路径中的用于插入到表达式中的相应的恒等变换。

可选地,本方法还包括识别要混淆的软件项目中的条件。

可选地,所述方法还包括在已修改软件项目的所述部分中的控制流程中插入分支点,从所述分支点采取的控制流程路径与是否满足条件无关。此类动作还可迷惑攻击者。

可选地,在已修改软件项目的所述部分之后,通过已修改软件项目的控制流程可取决于是否满足条件而改变。

根据本发明的第二方面,提供了一种保护软件项目的方法,该方法包括步骤:(a)使用第一方面的方法来保护软件项目从而混淆第一条件,所述第一条件取决于是否满足第一条件而引起通过软件项目的第一部分的控制流程中的变化;以及(b)使用第一方面的方法来保护软件项目从而混淆第二条件,所述第二条件取决于是否满足第二条件而引起通过软件项目的第二部分的控制流程中的变化。

可选地,在软件项目的所述第一和第二部分之间存在至少部分的重叠。可选地,第二条件是第一条件的逻辑补集。

根据本发明的第三方面,提供了一种产生计算机程序产品的方法,所述计算机程序产品包括通过实现第一或第二方面的方法来保护软件项目并至少部分地基于已修改软件项目来生成计算机程序产品。

根据本发明的第四方面,提供了一种被布置成实现第一或第二方面的方法的装置。

根据本发明的第五方面,提供了一种计算机程序,其在被处理器执行时引起处理器实现第一或第二方面的方法。

根据本发明的第六方面,提供了一种存储第五方面的计算机程序的计算机可读介质。

根据本发明的第七方面,提供了一种用于保护软件项目的装置。该装置包括输入、输出和处理部件。输入是用于接收要保护的软件项目,该软件项目包括取决于是否满足条件而引起通过软件项目的一部分的控制流程中的变化的条件,其中,条件的满足是基于一个或多个条件变量的评估。输出是用于输出受保护软件项目。处理部件用于通过以下各项从要保护的软件项目产生受保护软件项目:(i)修改软件项目,使得通过所述部分的控制流程并不取决于是否满足条件;以及(ii)在已修改软件项目的所述部分中向表达式中插入多个恒等变换,其中,定义并插入所述恒等变换使得,在不存在篡改的情况下,如果满足条件则所述恒等变换维持表达式的结果,并且使得如果不满足条件则所述恒等变换改变表达式的结果,其中,每个恒等变换直接地或间接地取决于一个或多个条件变量中的至少一个。

附图说明

现在将参考附图仅以示例的方式描述本发明的实施例,在所述附图中:

图1示意性地图示出计算机系统的示例;

图2示意性地图示出根据本发明的实施例的系统200;

图3示意性地图示出保护软件项目的方法300;

图4A示意性地图示出可使用图3的方法300来保护的示例性初始软件项目220;

图4B示意性地图示出方法300在处理图4A中所示的初始软件项目220时产生的受保护软件项目;

图5A示意性地图示出可用图3中所示的方法300来保护的另一初始软件项目220;

图5B示意性地图示出可用方法300从图5A中所示的初始软件项目220产生的受保护软件项目260;

图6A示意性地图示出可用图3中所示的方法300来保护的另一初始软件项目220;

图6B示意性地图示出可用方法300从图6A中所示的初始软件项目220产生的受保护软件项目260;

图7A示意性地图示出可用图3中所示的方法300来保护的另一初始软件项目220;以及

图7B示意性地图示出可用方法300从图7A中所示的初始软件项目220产生的受保护软件项目260。

图8示意性地图示出根据本发明的实施例的保护软件项目的方法300;

图9A示意性地图示出如在附录1中阐述的通过示例性软件项目的控制流程;

图9B示意性地图示出通过附录1软件项目的受保护版本的已修改控制流程,在附录2中阐述了软件项目的受保护版本;

图10示意性地图示出根据本发明的实施例的对IF-THEN语句的保护;以及

图11示意性地图示出根据本发明的实施例的对IF-THEN-ELSE语句的保护。

具体实施方式

在随后的描述中和在附图中,描述了本发明的某些实施例。然而,将认识到的是本发明不限于所描述的实施例,并且一些实施例可以不包括下面描述的特征中的所有。然而,将显而易见的是在可以在本文中进行各种修改和变更而不脱离如在所附权利要求中阐述的本发明的更宽泛的精神和范围。

1-系统概述

图1示意性地图示出计算机系统100的示例。系统100包括计算机102。计算机102包括:存储介质104、存储器106、处理器108、接口110、用户输出接口112、用户输入接口114和网络接口116,其全部被通过一个或多个通信总线118链接在一起。

存储介质104可以是任何形式的非易失性数据存储设备,诸如硬盘驱动、磁盘、光盘、ROM等中的一个或多个。存储介质104可存储用于处理器108执行以便使计算机102运行的操作系统。存储介质104还可存储一个或多个计算机程序(或软件或指令或代码)。

存储器106可以是适合于存储数据和/或计算机程序(或软件或指令或代码)的任何随机存取存储器(存储单元或易失性存储介质)。

处理器108可以是适合于执行一个或多个计算机程序(诸如存储在存储介质104上和/或存储器106中的那些)的任何数据处理单元,所述计算机程序中的某些可以是根据本发明的实施例的计算机程序或者在被处理器108执行时引起处理器108实现根据本发明的实施例的方法并将系统100配置成是根据本发明的实施例的系统的计算机程序。处理器108可包括单个数据处理单元或者并行地或相互合作地操作的多个数据处理单元。处理器108在实现用于本发明的实施例的数据处理操作时可向和/或从存储介质104和/或存储器106存储数据和/或读取数据。

接口110可以是用于提供到在计算机102外部或可从其移除的设备122的接口的任何单元。设备122可以是数据存储设备,例如光盘、磁盘、固态存储设备等中的一个或多个。设备122可具有处理能力——例如,该设备可以是智能卡。接口110因此可根据其从处理器108接收到的一个或多个命令从设备122访问数据或向设备122提供数据或者与设备122对接。

用户输入接口114被布置成从系统100的用户或操作者接收输入。用户可经由被连接到用户输入接口114或与之通信的系统100的一个或多个输入设备(诸如鼠标(或其它指针设备)126和/或键盘124)来提供此输入。然而,将认识到的是用户可经由一个或多个附加或替换输入设备(诸如触摸屏)向计算机102提供输入。计算机102可将经由用户输入接口114从输入设备接收到的输入存储在存储器106中以用于处理器108随后访问和处理,或者可将其径直传递至处理器108,使得处理器108可以相应地对用户输入进行响应。

用户输出接口112被布置成向系统100的用户或操作者提供图形/视觉和/或音频输出。同样地,处理器108可被布置成命令用户输出接口112形成表示期望图形输出的图像/视频信号,并将此信号提供给被连接到用户输出接口112的系统100的监视器(或屏幕或显示单元)120。附加地或替换地,处理器108可被布置成命令用户输出接口112形成表示期望音频输出的音频信号,并且将此信号提供给连接到用户输出接口112的系统100的一个或多个扬声器121。

最后,网络接口116提供用于使计算机102从一个或多个数据通信网络下载数据和/或向其上传数据的功能。

将认识到的是在图1中示出并在上文描述的系统100的架构仅仅是示例性的,并且在本发明的实施例中可使用具有不同架构(例如具有比图1中所示的更少的组件或者具有除图1中所示之外的附加和/或替换组件)的其它计算机系统100。作为示例,计算机系统100可以包括以下各项中的一个或多个:个人计算机;服务器计算机;移动电话;平板电脑;膝上计算机;电视机;机顶盒;游戏控制台;其它移动设备或消费者电子设备等。

图2示意性地图示出根据本发明的实施例的系统200。系统200包括:软件生成系统210;软件保护系统250;用户系统280;以及网络290。

软件生成系统210包括(或者执行或使用)生成初始软件项目220的软件生成工具212。软件生成工具212可以是例如软件生成系统210的处理器执行的软件应用程序。软件生成系统210可被布置成自主地生成初始软件项目220;附加地或替换地,软件生成系统210可被布置成在至少部分地编写构成初始软件项目220的一部分的软件代码的一个或多个软件开发者的控制下生成初始软件项目220。用于生成或开发软件项目的工具是众所周知的,并且因此在本文中不会更详细地描述。

初始软件项目220可包括源代码、目标代码、可执行代码和二进制代码中的一个或多个。可用一个或多个编程语言对初始软件项目220进行编程或编写,所述编程语言可包括编译编程语言和/或解释或脚本编程语言。初始软件项目220可包括一个或多个模块或软件组件或计算机程序,其可被呈现或存储于一个或多个文件内。事实上,初始软件项目220可以是整个软件应用程序、软件库或一个或多个软件函数或程序的整体或一部分或者其之间的任何地方(如本领域的技术人员将认识到的)。

初始软件项目220在被处理器执行时被布置成执行(或者引起处理器执行)基于一个或多个数据项目的数据处理。每个数据项目可以分别地是任何类型的数据,诸如音频数据、视频数据、多媒体数据、文本数据、财务数据、一个或多个密码密钥、数字权限管理数据、有条件访问数据等。数据处理可包括以下各项中的一个或多个:(a)至少部分地基于一个或多个数据项目中的至少一个的决策;(b)安全相关功能;(c)访问控制功能;(d)密码功能;以及(e)权限管理功能。然而,将认识到的是除上述示例之外或作为其替换,数据处理可包括一个或多个其它类型的功能或操作。作为一个示例,数据处理可涉及提供对被接收和/或存储为加密内容的内容(诸如音频和/或视频数据)的用户访问,其中,只有当用户具有适当的访问许可/权限时才为用户提供对内容的访问。一个或多个数据项目因此可包括:加密内容、关于用户和/或用户系统280的细节或其标识;指定一个或多个许可和/或权限的数据;以及一个或多个密码密钥(其可以被存储为初始软件项目220的一部分)。因此,期望的是保护初始软件项目220,使得攻击者不能以未授权方式使用初始软件项目220以从而即使攻击者未被授权访问内容也获得对内容的访问,即防止攻击者绕过由初始软件项目220提供的有条件访问和/或数字权限管理功能(例如,通过确定一个或多个解密密钥或者规避涉及是否应为用户提供对内容的访问的初始软件项目220中的决策点或分支点)。将认识到的是当然存在初始软件项目220可以执行的其它功能和/或初始软件项目220使用的初始软件项目220将期望(由于类似或可能替换的原因)保护其免于攻击者的其它信息。因此,如图2中所示,初始软件项目220被提供(或传输或传送)至软件保护系统250。

软件保护系统250包括(或者执行或使用)软件保护工具252。软件保护工具252可以是例如软件保护系统250的处理器执行的软件应用程序。软件保护工具252被布置成接收初始软件项目220作为输入。软件保护工具252基于接收到的初始软件项目220而生成受保护软件项目260。稍后将会描述软件保护工具252用来生成受保护软件项目260的方法。

软件生成系统210和软件保护系统250可被不同的实体运行或操作。因此,如图2中所示,软件保护系统250可将受保护软件项目260输出到软件生成系统210。用此模型,软件保护系统250向软件生成系统210提供保护服务。替换地,软件生成系统210和软件保护系统250可被同一实体运行或操作——事实上,软件生成系统210和软件保护系统250可构成单个系统的一部分(在图2中用虚线270示出),所述单个系统使用软件生成工具212来生成初始软件项目220并使用软件保护工具252通过生成受保护软件项目260来保护该初始软件项目220。

因此,软件生成系统210和/或软件保护系统250可经由网络290将受保护软件项目260输出(或提供或传送)到用户系统280。然而,将认识到的是受保护软件项目260的分发可由图2中未示出的不同实体执行。

还将认识到的是受保护软件项目260可在已经由软件保护系统250生成受保护软件项目260之后且在到用户系统280的分发之前经历各种附加处理。因此,将认识到的是在以下描述中,对受保护软件项目260的分发和使用的提及包括由对受保护软件项目260应用附加处理而引起的软件块的分发或使用。例如,受保护软件项目260可能需要被编译和/或与其它软件项目链接(例如,如果受保护软件项目260将构成要分发到用户系统280的较大软件应用程序的一部分)。然而,将认识到的是可不需要此类附加处理(例如,如果受保护软件项目260是准备好用于分发的最终JavaScript块的话)。

网络290可以是适合于向用户系统280传送或传输受保护软件项目260的任何种类的数据通信网络。因此,网络290可包括以下各项中的一个或多个:局域网、广域网、城域网、互联网、无线通信网、有线或线缆通信网、卫星通信网、电话网等。软件生成系统210和/或软件保护系统250可被布置成经由任何适当的数据通信协议经由网络290与用户系统280通信。事实上,可经由物理介质(诸如被存储在一个或多个CD或DVD上)将受保护软件项目260提供给用户系统280,使得网络290于是可包括用于将物理介质在物理上递送给用户系统280的递送系统。

用户系统280被布置成例如通过在用户系统280的一个或多个处理器上执行受保护软件项目280来使用受保护软件项目260。

用户系统280可以是适合于执行受保护软件项目280的任何系统。因此,用户系统280可以是以下各项中的一个或多个:个人计算机、膝上计算机、笔记本、平板计算机、移动电话、机顶盒、电视、服务器、游戏控制台等。软件保护系统250和软件生成系统210可例如包括一个或多个个人计算机和/或服务器计算机。因此,用户系统280、软件保护系统250和软件生成系统210中的每一个可包括如上文参考图1所述的一个或多个相应系统100。

将认识到的是虽然图2将系统200示为包括单个用户设备280、单个软件生成系统210以及单个软件保护系统250,但系统200可包括多个用户设备280和/或多个软件生成系统210和/或多个软件保护系统250。

2-软件保护技术

如上所述,软件保护工具252的目的是保护初始软件项目220的功能或数据处理和/或保护初始软件项目220所使用或处理的数据。特别地,受保护软件项目260将提供与初始软件项目220相同的功能或数据处理——然而,此功能或数据处理是以这样的方式在受保护软件项目260中实现的,即使得用户系统280的操作者不能以非预计或未授权方式从受保护软件项目260访问或使用此功能或数据处理(而如果向用户系统280提供了初始软件项目220,则用户系统280的操作者可能是能够以非预计或未授权方式访问或使用功能或数据处理的)。同样地,受保护软件项目260可以以受保护或已混淆方式存储秘密信息(诸如密码密钥)以从而使得攻击者更加难以(如果不是不可能的话)推断或访问该秘密信息(而如果向用户系统280提供了初始软件项目220,则用户系统280的操作者可能是能够从初始软件项目220推断或访问该秘密信息的)。

例如,初始软件项目220可包括至少部分地基于将由初始软件项目220处理的一个或多个数据项目中的至少一个的决策(或决策块或分支点)。如果初始软件项目220被提供给了用户系统280,则攻击者可能能够迫使初始软件项目220执行,使得在处理决策之后遵循执行路径,即使该执行路径并不意图被遵循。例如,决策可包括测试程序变量B为真还是假,并且初始软件项目220可被布置成使得如果决策识别到B为真,则执行/遵循执行路径PT,而如果决策识别到B为假,则执行/遵循执行路径PF。在这种情况下,攻击者可以(例如通过使用调试器)在决策识别到B为真的情况下迫使初始软件项目220遵循路径PF和/或在决策识别到B为假的情况下迫使初始软件项目220遵循路径PT。因此,在某些实施例中,软件保护工具250旨在通过当生成受保护软件项目260时对初始软件项目220内的决策应用一个或多个软件保护技术来防止攻击者(或者至少使攻击者更加难以)这样做。

“白盒”环境是用于软件项目的执行环境,其中,假设软件项目的攻击者具有对于对其进行操作的数据(包括中间值)、存储器内容和软件项目的执行/过程流程的完全访问以及可见性。此外,在白盒环境中,假设攻击者能够例如通过使用调试器来修改对其进行操作的数据、存储器内容和软件项目的执行/过程流程——这样,攻击者可以对软件项目进行实验并尝试操纵其操作,旨在规避最初预计的功能和/或识别秘密信息和/或出于其它目的。事实上,甚至可假设攻击者知道由软件项目执行的底层算法。将期望防止攻击者修改软件项目的执行/控制流程,例如防止攻击者迫使软件项目在决策块之后采取一个执行路径而不是合法的执行路径。存在在本文中称为“白盒混淆技术”的许多技术,其用于将初始软件项目220变换成受保护软件项目260,使得受保护软件项目260对白盒攻击有抵抗力,即,使得受保护软件项目260当在白盒环境中执行时对攻击者的攻击(诸如上文所述的那些)有抵抗力。

白盒混淆技术是软件保护技术的示例。在本发明的实施例中,软件保护工具252可对初始软件项目220应用软件保护技术以生成受保护软件项目260。

存在可在受保护软件项目260内实现上述软件保护的许多方式,即,存在其中可对初始软件项目应用上述软件保护技术以获得受保护软件项目260的许多方式。特别地,为了从初始软件项目220生成受保护软件项目260,软件保护工具252可修改初始软件项目220内的一个或多个代码部分和/或可向初始软件项目220中添加或引入一个或多个新代码部分。用来进行这些修改的实际方式或者用来编写新代码部分的实际方式当然可以改变——毕竟,存在编写软件以实现相同功能的许多方式。

3-分散和稀释程序决策

现在我们描述一种保护初始软件项目220、从而混淆取决于是否满足条件而引起通过软件项目的一部分的控制流程中的变化的条件的方法,其中,条件的满足是基于一个或多个条件变量的评估。取决于是否满足条件的软件项目部分在随后的大部分描述中称为“条件代码”。另外,在图9A中用参考标号900A来表示条件代码。

如图8中所示,方法800包括两个主要步骤。步骤S802涉及到修改软件项目,使得通过所述部分(即通过条件代码)的控制流程并不取决于是否满足条件。然后,步骤S803涉及在已修改软件项目的所述部分中向表达式中插入多个恒等变换,其中,定义并插入所述恒等变换使得在不存在篡改的情况下,如果满足条件则所述恒等变换保持表达式的结果,并且使得如果不满足条件则所述恒等变换改变表达式的结果,其中,每个恒等变换直接地或间接地取决于一个或多个条件变量中的至少一个。

计算恒等变换是容易的,其在不存在篡改的情况下使表达式的结果不改变(诸如加上零或乘以一),但是如果变量中的某些被篡改了而其它的没有,则其以混乱的方式改变结果。

在优选实施例中,存在定义多个新变量的附加初始步骤S801。这是如图8中的虚线所指示的可选步骤。新变量的定义增加软件项目的复杂性以使得攻击者更加难以识别在攻击中要篡改的相关变量。可选地,被分配给新变量中的至少一个的值并不是直接地或间接地基于一个或多个条件变量中的任何。可选地,被分配给新变量中的至少一个的值是恒定值。可选地,被分配给新变量中的至少一个的值是基于软件项目的程序变量,所述程序变量不同于一个或多个条件变量。有利地,被分配给新变量中的至少一个的值直接地或间接地基于一个或多个条件变量中的至少一个。这使得能够使用这些新变量来代替软件项目的所述部分中的(一个或多个)条件变量。更有利地,所述一个或多个条件变量中的每一个被直接地或间接地用来向新变量中的至少一个分配值。这样,如果期望的话,可使用一个或多个新变量的集合来完全替换条件变量的原始集合。在优选实施例中,至少一个恒等变换取决于新变量中的至少一个。

在包括全部的步骤S801-S803的特别优选实施例中,直接地或间接地使用一个或多个条件变量中的每一个来向新变量中的至少一个分配值。此外,每个恒等变换取决于新变量中的至少一个。

因此,通过分散和稀释与条件有关的程序决策来产生针对篡改受到保护的软件项目是可能的。特别地,通过将决策值(即条件变量的值)散布在更多值(即新变量的值)上来分散决策值,使得其更加难以被攻击者篡改。定义的新变量越多,攻击者成功地篡改代码将变得越难。同样地,定义的新变量越多,代码将变得越不高效。因此,必须在保护与效率之间权衡利弊。

新变量具有基于它们如何被导出/定义的特定关系(例如,它们可以来自共同的源)。例如,新变量x和y可能是例如原始条件变量v的两倍和一半。然后我们知道x是y的四倍。然后可以插入恒等变换以便取决于x是y的四倍(例如,x - 4y=0应为真)。然后,如果x或y通过篡改而被修改,则假定的关系不能保持,并且代码不再计算正确的恒等。表达式的值未被保持为结果,并且取决于那些表达式结果的下游代码然后失败。也就是说,本方法800能够使得代码在篡改下非常脆弱。一般地,篡改是面向目标的活动(例如,无论口令是否正确都引起执行继续进行)。在此类面向目标的上下文中,使得软件在篡改下失败而不是继续进行防止攻击者获得非法访问。

为了稀释并分散决策,定义新变量(诸如上述y和z),使得信息散布于更多的存储位置上。因此,(一个或多个)决策控制值(即,一个或多个条件变量的值)散布在更多的变量上,并且原始决策更难以成功地篡改。使用已修改控制流程和恒等变换,在没有明确地叙述决策所基于的条件(或条件的补集)的情况下保持原始决策(和从而的程序功能)。因此,在不存在篡改的情况下,本方法不引起软件项目的正常功能改变。

将认识到的是可按照不同的顺序执行步骤,只要最终结果相同即可。

使用示例,现在我们将详细地考虑这种方法。

示例性初始软件项目(P1)

附录1示出了用类似于C的代码编程的示例性初始软件项目220。如可以看到的,程序(P1)包括使用IF-THEN-ELSE语句表达的各种决策。这些决策中的每一个与明确叙述的条件相关联:在P1-Line 07上的决策中,明确叙述的条件是“format == m1”;在P1-Line 22上的决策中,明确叙述的条件是“check != 1”;在P1-Line 28上的决策中,明确叙述的条件是“format == m1”;在P1-Line 29上的决策中,明确叙述的条件是“c1 > 0”;并且在P1-Line 37上的决策中,明确叙述的条件是“c2 > 0”。

这些决策中的大多数不要求针对攻击的保护,因为其将是攻击者不感兴趣的。例如,P1-Line 07决策涉及可使用的不同数据格式之间的选择,其并不是攻击者尝试操纵的特别有用的目标(由于程序将已经进行操作以选择用于数据的正确格式,所以对于攻击者而言在改变此行为时要获得的东西很少)。然而,P1-Line 22决策是关键的。

P1-Line 22决策基于check值是否被设定成正确的值来确定程序操作的其余部分,其中,check是程序变量。换言之,在P1-Line 22-44中通过软件项目的所述部分的控制流程取决于check的值(其是否是1)而改变。因此,P1-Line 22-44在这种情况下表示条件代码。check的值取决于格式而来自输入阵列(阵列a)的不同元素。如果format=m1,则check的值来自a[3](参见P2-Line 11);否则,check的值来自a[1](参见P2-Line 20-21)。在任一种情况下,P1-Line 22决策取决于check值是否等于1。如果check值等于1,则程序基于数据格式来计算正确的结果(参见P1-Line 27-42)。然而,如果check值不等于1,则程序计算故意不正确的结果,即无用数据(参见P1-Line 23-25)。特别地,在这种情况下,条件变量(check)的值是静态的;在某些情况下,可以在程序的执行期间动态地计算和改变此类值。P1-Line 22决策很容易识别和改变,因此将期望针对此类攻击保护此决策。相关地,在这种情况下期望针对攻击者进行保护的代码部分是当check值等于1时计算正确结果的代码部分。换言之,要保护的重要代码部分是ELSE代码区段,其定义当在check的值等于1时所采取的步骤(参见P1-Line 27-41)。当check值不等于1时发生什么并不那么重要(参见P1 Line 23-25中的THEN代码区段),只要从正确的“check=1”结果产生不同的结果即可。因此,在这种情况下,check是被评估以确定是否满足条件的条件变量。此外,“check=1”是在这种情况下要保护的关键条件。特别地,P1-Line 22并未明确地叙述此条件,而是替代地明确地叙述了此条件的逻辑补集(即,check != 1)。这是因为在这种情况下ELSE代码区段是最重要的。当然,通过交换THEN和ELSE代码区段(P1 Line 23-25和P1 Line 27-41)来重写P1以明确地叙述P1-Line 22上的“check=1”条件将是可能的。无论哪种方式,可以看到“check=1”条件取决于是否满足条件而引起通过软件项目的控制流程中的变化(从P1-Line22向前)。因此,具有取决于条件的可变控制流程路径的软件项目的部分(即,条件代码)是在P1-Line 22-44中阐述的部分。P1-Line 22决策是攻击者相对容易识别的,并且是攻击者尝试操纵的可能目标,因为其成功操纵可以为攻击者得到来自程序的期望输出,否则程序将不会在其处提供期望输出(即,其正常地将输出故意不正确的值)。因此,期望的是使用方法800通过混淆关联条件(“check=1”条件)来保护此决策。

示例性受保护软件项目(P2)

附录2示出了可使用方法800产生的示例性受保护软件项目260。在附录2中用粗体并加下划线示出了附录1中的代码与附录2中的代码之间的差别。下面将描述这些差别。

新变量

首先,在条件代码之前,在附录2的程序(P2)中在P2-Line 4和P2-Line 6上定义了新变量(d1d2d3d4以及d5)。然后向这些新变量分配值。最初在P2-Line 6上向新变量分配值(d1=0;d2=0;d3=0;d4=m1;d5=0)。随后取决于数据格式而重新分配新变量值中的某些(参见P2-Line 12-17以及P2-Line 20-26)。如果变量format的值等于m1,则:

d1 = check

d2未被重新赋值,因此d2 = 0

d3 = d1 + m0 = check + m0 = check (因为m0 = 0

d4 = d4 + m1 = m1 + m1 = 2*m1 = 2 (因为m1 = 1

d5 = d4 + m1= 2 + m1 = 3 (因为 m1= 1

否则:

d1未被重新赋值,因此d1 = 0

d2 = a[1]check = d2,因此d2 = check

d3 = check + m0 = check (因为m0 = 0

d4 = 2*d4 + m0 = 2*m1 + m0 = 2 (因为m0 = 0m l = 1

d5 = d4 + d3 = 2 + check

如可以看到的,新变量的值中的某些直接地或间接地基于条件变量check。例如,如果format=m1,则d1被直接地分配条件变量check的值(参见P2-Line 12),并且d3然后被赋值成等于d1+m0(参见P2-Line 15),因此d3间接地基于check,因为d3=d1+m0=check+m0。同样地,如果format≠m1,则d3的值通过d3=check+m0而直接地与条件变量相关(参见P2-Line 22),并且d5的值通过d5=d4+d3=d4+check+m0而间接地与条件变量相关(参见P2-Line 26)。一般地,条件变量被直接地或间接地用来向新变量中的至少一个分配值。在本示例中,条件变量check被直接地或间接地用来向新变量中的两个分配值。

还可以看到新变量的值中的某些不是直接地或间接地基于条件变量check。特别地,如果format=m1,则d2d4d5的值并不基于条件变量check的值;并且如果format≠m1,则d1d4d5的值并不基于条件变量check的值。在某些情况下,被分配给新变量中的某些的值可以是恒定值。例如,如果format=m1,则d2的值未被重新分配,因此d2=0;并且如果format≠m1,则d1的值未被重新分配,因此d1=0

新变量中的至少一个的值可除条件变量之外基于程序变量的值。例如,如果format=m1,则d3的值部分地基于程序变量m0的值,并且d4d5的值基于程序变量m1的值。同样地,如果format≠m1,则d3的值部分地基于程序变量m0的值,并且d4d5的值基于程序变量m0m1的值。

如上所述,在P1-Line 22-44中通过条件代码的控制流程取决于是否满足条件“check=1”而改变。有利地,期望的是识别在其处条件变量(check)被分配随后(在P1-Line 22中)被用来测试是否满足条件的值的较早的码块。在其处对check分配值的此较早码块然后还可以用来向新变量中的至少某些分配值。在附录1的示例中,在P1-Line 7-14中(如果format=1)或P1-Line 15-21中(如果format≠1)分配check的值。因此,在附录2中所示的受保护软件项目中,在对应的代码部分中为新变量中的某些分配值(参见P2-Line 8-18和P2-Line 19-29)。更有利地,遍布于整个(一个或多个)相关码块插入赋值语句(再次地,参见P2-Line 8-18和P2-Line 19-29)。

控制流程修改:第1部分

受保护软件项目(P2)与初始软件项目(P1)之间的另一差别是代码已被修改,使得控制流程不再取决于是否满足条件“check=1”。在P2中,这是通过P1中的先前明确地叙述关键决策(和关键条件的逻辑补集)的IF-THEN-ELSE语句的移除而实现的(参见P1-Line 22和P1-Line 26)。特别地,初始软件项目包括IF-THEN-ELSE语句(即,条件代码),其包括包含条件的逻辑补集的IF代码区段、被布置成响应于不满足条件(即check !=1)而被执行的THEN代码区段和被布置成响应于满足条件(即check=1)而被执行的ELSE代码区段。IF-THEN-ELSE语句在受保护软件项目中已被移除,使得P2替代地始终执行ELSE代码区段,无论是否满足条件。换言之,P2包括已修改代码区段(参见P2-Line 30-45),其对应于来自P1的ELSE代码区段(参见P1-Line 27-42),并且其无论check的值是否等于1都被执行。

恒等变换

为了受保护软件项目(P2)以与初始软件项目(P1)相同的方式运行,还对与来自P1的ELSE代码区段相对应的已修改代码区段(参见P2-Line 30-45)进行了进一步修改。特别地,在该代码区段中向表达式中插入了多个恒等变换。定义并插入恒等变换,使得如果满足条件“check=1”,则其保持表达式的结果,并且使得如果不满足条件“check=1”,则其改变表达式的结果。恒等变换基于新变量和/或条件变量(check)和/或其它程序变量和/或恒定值来定义简单的表达式。每个恒等变换直接地或间接地基于条件变量(check)。恒等变换可通过取决于新变量中的至少一个(其本身取决于条件变量)而间接地基于条件变量(check)。恒等变换被有效地用来将新变量和新代码与原始代码结合在一起以形成更复杂的控制流程,并且使得攻击者难以识别什么是新的和什么是原始的。

更详细地,考虑P2-Line 30-37中的已修改代码区段。此代码区段涉及其中format=1的先前ELSE代码区段的部分。因此,此已修改代码区段是基于P1-Line 28-35。此区段中的恒等变换如下:

如果满足关键条件(即如果check=1),则这些恒等变换中的每一个很明显计值为1。因此,此代码区段中的result变量的值如下:

因此,通过使用这些恒等变换,在此已修改代码区段中获得与在初始软件项目(P1)的对应区段中获得的用于result的相同的值是可能的,只要满足条件(check=1)即可。特别地,在初始软件项目中,P1-Line 30给出result = k1 + c1(参考P2-Line 32),并且P1-Line 33给出result = k1 - c1(参考P2-Line 35)。

同样地,考虑P2-Line 38-45中的已修改代码区段。此代码区段涉及其中format≠1的先前ELSE代码区段的部分。因此,此已修改代码区段是基于P1-Line 36-43。此区段中的恒等变换如下:

如果满足关键条件(即如果check=1),则这些恒等变换中的每一个很明显计值为1。因此,此代码区段中的result变量的值如下:

因此,通过使用这些恒等变换,在此已修改代码区段中获得与在初始软件项目(P1)的对应区段中获得的用于result的相同的值是可能的,只要满足条件(check=1)即可。特别地,在初始软件项目中,P1-Line 38给出result = k2 + c2 (参考P2-Line 40),并且P1-Line 41给出result = k2 - c2(参考P2-Line 43)。

如果不满足条件(即check≠1),则恒等变换(IT1—IT7)很明显未计值为1,因为所有这些恒等变换都直接地或间接地使用决策变量check及其值作为参数中的一个。只有当check=1时,这些计算才能产生正确的结果。针对check≠1result的值将是不同的(即,无用数据)。特别地,从已修改代码(P2)获得的无用数据值可以不同于从初始代码(P1)获得的无用数据值,但是这在这种情况下是很好的,因为程序只要求当不满足条件时生成与在满足条件时生成的值相比不同的值。因此,受保护软件项目260的操作在语义上类似于初始软件项目220的操作,即使实施方式是不同的。

上述恒等变换IT1—IT7中的每一个可称为乘法恒等变换,因为在不存在篡改的情况下,其每个如果满足条件则计值为1且如果不满足条件则不计值为1。可通过将表达式变量乘以乘法恒等变换(如在P2-Line 32、P2-Line 35、P2-Line 40以及P2-Line 43中一样)来向表达式中插入乘法恒等变换。例如,在P2-Line 32中,通过将变量k1乘以IT1来向表达式“k1+c1”中插入IT1

另一种恒等变换是加法恒等变换,其在不存在篡改的情况下如果满足条件则计值为0,并且如果不满足条件则不计值为0。可通过将加法恒等变换与表达式变量相加而在表达式中插入此类加法恒等变换。例如,可以通过如下地将加法恒等变换IT8k1相加来修改表达式“k1 + c1”:“(k1 + IT8) + c1”。替换地,可以通过如下地将加法恒等变换IT8k1相加来修改表达式“k1 * c1”:“(k1 + IT8) * c1”。特别地,可将乘法恒等变换和加法恒等变换都插入同一表达式中。例如,可通过将变量k1乘以乘法恒等变换IT1并通过将加法恒等变换IT8与变量c1相加来修改表达式“k1+c1”:“(k1 * IT1) + (c1 + IT8)”。

重要的是,受保护软件项目260并未明确地叙述原始叙述的条件“check != 1”或原始叙述的条件的逻辑补集“check == 1”。替代地,check决策现在在向程序变量result分配值的已修改代码中是隐含的。换言之,check决策借助于使用恒等变换而在已修改代码中变成隐含的。因此,原始叙述的条件“check != 1”和原始叙述的条件的逻辑补集二者在受保护软件项目中已被混淆,同时保持了相同的程序功能。这意味着攻击者更加难以识别到正在进行决策以及该决策所基于的条件。此外,要求程序代码的多得多的分析以便攻击者操纵程序的运算以实现期望的结果。

一般地,可以使用许多数学技术来创建不同的恒等变换。理论上,恒等变换的数目可以是无限的。实际上,开发一种发生器以自动化用以生成包括通用恒等变换公式的恒等变换数据库的过程是可能的。恒等变换数据库包括可以被参数化的预定义恒等变换。代数简化器提供了此类恒等的现成来源,并且在Henry S. Warren的著作“Hacker's Delight”(ISBN 978-0-201-91465-8)中可以找到尤其是关于计算机计算的更多内容。在恒等变换数据库中,每个恒等变换公式被分类为乘法或加法类型的恒等变换。此外,每个恒等变换公式可与固定数目的新变量相关联,所述新变量中的每一个可用某特定性质来阐明以便保证运行时间时的恒等变换语义。

方法800可包括识别通过软件项目的已修改部分的所有控制流程路径,以及针对每个已识别控制流程路径,识别在该控制流程路径中用于插入到表达式中的相应的恒等变换,考虑沿着该控制流程路径的变量的值。所述变量可能是新变量和/或此上下文中的现有程序变量。

控制流程修改:第2部分

在图9A和9B中图示出初始和受保护软件项目之间的控制流程修改。图9A示意性地图示出通过附录1中所示的初始软件项目的控制流程,并且图9B示意性地图示出通过附录2中所示的受保护软件项目的控制流程。

如图9A中所示,初始软件项目包括单个决策点(check !=1),攻击者可以对其进行攻击以便修改控制流程以满足其需要。因此,在初始软件项目中仅存在单个攻击点。条件代码(其取决于决策)是在图9A中描绘的代码段900A。

相反地,如图9B中所示,先前在P1-Line 22中叙述的决策已被分散并稀释,使得存在散布于受保护示例程序内的各处的许多攻击点。P1-Line 22-44处的整个条件代码900A已被P2-Line 30-45处的新代码段900B替换。此新的受保护代码段在没有明示决策check的情况下保持相同的语义。如果保持check条件,则代码段900B将产生与条件代码900A相同的结果;否则,其将产生无用数据结果(无用数据结果在代码段900A和900B中可以是不同的)。在新代码段900B中,条件由于恒等变换的使用而是隐含的。

比较分散和稀释保护之前和之后(如图9A和9B中所示)的两个程序,很明显在初始软件项目内要改变check != 1决策是非常容易的,因为要实现成功的攻击只需要入侵仅单个地点(如在图9A中用check != 1决策的灰色阴影所示)。换言之,骇客只需要修改图9A中的check != 1决策以便保证迫使程序随后沿着在图的右手侧上的“错误”执行路径执行。然而,要成功地攻击受保护软件代码项目很明显更加困难且有挑战性,因为需要一起入侵许多地点(如在图9B中用各种已修改代码块的灰色阴影所示)。如果攻击者仅破坏了这些地点中的某些,则攻击者不能保证获得期望的结果(即,非无用数据),因此攻击将不成功。

分散和稀释决策

在学术界和商界两者中都存在用以保护程序决策的不同性质的不同控制流程保护技术。几乎所有的已知保护技术都是基于直接方法,其在不对决策进行分散和稀释的情况下对特定程序决策位置应用保护。因此,在现有技术中,通过经由受保护程序来运行不同的决策值来识别决策本身以及取决于该决策的周围和随后的代码(即条件代码)仍然是可能的。这意味着现有保护并不是持久的且易受到更高级攻击的攻击以突破决策和与决策相关联的后续逻辑。另外,受保护决策代码是通过使用数学专家来提供必需的混淆和缠绕而针对每次新的使用先前新生成的。

相反地,方法800可被视为用于已混淆且缠绕的决策代码的自动化生成的计算机实现方法。本方法可在有条件访问或其它情况下使用,其中,已混淆数据包含证书信息,其连同由诸如用户或外围设备之类的访问代理提供的信息一起确定访问应被许可还是拒绝。因此,方法800特别适合于混淆二进制决策。很清楚,本文所述的自动化方法与每次要求高价的人-时(staff-hour)的历史方法相比能够以明显降低的成本提供决策安全。

重要的是,根据本方法,关键决策在受保护软件项目中被分散并稀释,使得通过受保护软件项目的执行路径并不取决于是否满足关键条件。此保护的一般规则是替换方案之间的给定决策应产生非常类似的控制流程行为,无论进行的决策如何。例如,接受或未接受给定认证令牌的代码块应同样地表现,无论该令牌在其执行期间是被接受还是拒绝。特别地,控制流程在进行决策的点之后的一定时间内不应以可区别的方式不同。最后,当然可出现行为方面的差异。然而,这可以在比进行决策的点显著地更晚的点处发生,从而使得决策过程的逆向工程对于攻击者而言尽可能地费力。

此外,可以通过用许多其它决策对给定决策进行分散和稀释(即,通过将属于多个不同决策的代码混合)并将决策代码与其它周围行为和程序代码的其余部分混合来隐藏该给定决策。因此,用多个攻击点替换了单个决策攻击点,这也使得以任何有目的的方式修改决策是的确困难的。

事实上,本发明不仅提供了对决策代码保护的新方法,而且提供了用以就整体上跨程序的数据流程和控制流程二者而言移除本发明所引入的新程序相关性与原始程序相关性之间的可检测边界的新混合方法。

新变量的引入增加了代码的复杂性。基于新变量的恒等变换的使用使得能够在代码内隐藏条件变量(check)的影响。已修改代码在没有明示条件check的情况下保持相同的语义。

用于保护的条件代码

从安全观点出发,并不是每个程序决策都是安全关键的。某些是并非安全目标的正常商业逻辑。然而,期望的是保护对于商业模型而言关键且可能针对安全漏洞易受攻击的某些程序决策(例如,P1-Line 22决策)。对此类决策的任何替换方案可以引起负面的商业影响。一般地,用程序语言中的条件分支来表示此类决策。让我们更详细地考虑两种条件分支(IF-THEN分支和IF-THEN-ELSE分支)。

图10示意性地图示出使用本发明的方法800的IF-THEN分支的混淆。在本示例中,软件项目包括IF-THEN语句,其包括包含条件的IF代码区段和被布置成响应于满足条件而被执行的THEN代码区段。在这种情况下,根据方法800来修改软件项目包括移除IF-THEN语句,使得已修改软件项目始终执行THEN代码区段,无论是否满足条件。换言之,在对IF-THEN分支应用分散和稀释决策保护之后,此分支的决策部分完全消失,并且其语义被隐藏,使得多个执行路径被单个执行路径替换。该条件分支替代地被与先前和随后的码块(“先前块”和“后续块”)混合的IF-THEN代码的受保护THEN部分替换,使得在应用此类保护之后可能非常难以从新代码提取决策语义(参见图10的右手侧)。在运行时间,在图10中的右手侧上的已修改/受保护代码中不存在关于受保护决策的明示决策检查。无论决策是保持(真)还是失败(假),控制流程仍是相同的。实际上,此新代码的计算结果暗示此类决策,使得只有当保持决策时,才能保证正确的结果。使用典型的编译技术来保持通过先前码块、受保护THEN块以及后续码块(“后续块”)的数据流程的原始语义是相对简单的。我们将这些方面和细节视为在先技术且超出本发明。还参见与图4A和4B相关的附录3中的描述。

图11示意性地图示出使用本发明的方法800的IF-THEN-ELSE分支的混淆。在本示例中,软件项目包括IF-THEN-ELSE语句,其包括包含决策的IF代码区段、被布置成响应于决策为真而被执行的THEN代码区段和被布置成响应于决策为假而被执行的ELSE代码区段。如图11中所示,已从安全观点出发决定了决策的哪个部分更加关键,存在使用方法800来保护此类IF-THEN-ELSE分支的两个基本方式:(a)仅THEN代码区段的保护;或者(b)仅ELSE代码区段的保护。因此,决策的第一部分及其语义被完全隐藏(即混淆),并且决策的另一部分(其仍是明示的)可以从软件项目内的受保护第一部分抛弃。如图11中所示,软件项目可包括在IF-THEN-ELSE语句之前和之后的码块(“先前块”和“后续块”)。用后续块来执行受保护THEN或ELSE代码区段的程序分析从而将后续块分离成两个段:后续块A和后续块B是可能的。后续块A独立于IF-THEN-ELSE语句且可移动至软件项目中的较早位置(即在未受保护(即明示)ELSE或THEN代码区段之前),并且可进一步与受保护部分混合。后续块B以某种方式取决于IF-THEN-ELSE语句(例如取决于在IF-THEN-ELSE语句期间分配的变量),并且可移动至刚好在不受保护(即明示)ELSE或THEN代码区段之后。

考虑图11(a),其中只有THEN代码区段受到保护。在这种情况下,软件项目包括IF-THEN-ELSE语句,其包括包含条件的IF代码区段、被布置成响应于满足条件而被执行的THEN代码区段和被布置成响应于不满足条件而被执行的ELSE代码区段,其中,修改软件项目包括移除IF-THEN-ELSE语句,使得已修改软件项目始终执行THEN代码区段,无论是否满足条件。因此,“真”和THEN代码区段被完全隐藏(即混淆),并且被与先前块和后续块A1两者中的代码混合的受保护THEN部分替换。“假”和ELSE代码区段被重新表达为明示IF-THEN分支并被移动至后续块A1与后续块B1之间。还参见与图5A和5B相关的附录3中的描述。

考虑图11(b),其中只有THEN代码区段受到保护。在这种情况下,软件项目包括IF-THEN-ELSE语句,其包括包含条件的逻辑补集的IF代码区段、被布置成响应于不满足条件而被执行的THEN代码区段和被布置成响应于满足条件而被执行的ELSE代码区段,其中,修改软件项目包括移除IF-THEN-ELSE语句,使得已修改软件项目始终执行ELSE代码区段,无论是否满足条件。因此,“假”和ELSE代码区段被完全隐藏(即混淆),并且被与先前块和后续块A2两者中的代码混合的受保护ELSE部分替换。“真”和THEN代码区段被重新表达为明示IF-THEN分支并被移动至后续块A2与后续块B2之间。

在某些情况下进一步修改代码是可能的。例如,如果未受保护(明示)ELSE或THEN代码区段是不显著的(例如,其如在附录1中那样生成无用数据),则将此代码部分从受保护软件项目完全删除是可能的(如在附录2中那样,其中不存在明示的“check != 1”决策,即使其是已被保护的相反条件(即check==1))。在图11的(c)和(d)部分中图示出这种可能性。

替换地,如果决策的两个部分都是显著的且两者都要求保护,则再次地递归地应用此保护或者使用其它保护技术来保护第二代码区段是可能的。例如,考虑其中期望保护THEN代码区段(和关联条件)以及ELSE代码区段(和关联互补条件)两者的IF-THEN-ELSE语句。在这种情况下,将理解的是可以使用方法800来首先对THEN代码区段和关联条件应用保护(即混淆)。这将包括定义新变量,修改控制流程使得无论是否满足条件都始终执行THEN代码区段,以及酌情插入恒等变换。然后,相同的方法800可以再次地用来对ELSE代码区段应用保护(即混淆)。这可以涉及到定义另外的新变量。替换地,在第二迭代中可以使用在第一迭代中定义的新变量中的某些或所有。由于恒等变换对(一个或多个)条件变量的依赖性,很可能在第二迭代中需要不同的恒等变换。在任何情况下,在两次迭代之后,受保护代码将不会明示地叙述条件或条件的补集,并且受保护代码将使得THEN和ELSE代码区段两者将始终执行,无论是否满足条件。

将理解的是本方法800可以同样地用来保护软件项目中的IF-THEN-ELSEIF语句、IF-THEN-ELSEIF-ELSE语句或SWITCH语句的一部分。再次地,其是识别要保护的条件并保护关于该条件的代码区段的问题。特别地,当满足条件时执行的代码区段将是要保护的代码区段。还参见与图6A-7B有关的附录3中的描述。

变型

本方法800还可包括识别要混淆的条件的步骤。为了使得保护软件能够自动地识别要混淆的条件,期望软件程序员或安全工程师对初始软件项目加注释从而识别要保护的关键决策,使得编译过程可以执行期望的稀释和分散。替换地,可在不需要对软件加注释的情况下手动地识别用于保护的关键条件。还期望软件程序员或安全工程师对需要保护决策的哪个(哪些)部分加注释(例如,IF-THEN-ELSE语句的THEN或ELSE或THEN和ELSE部分)。还期望软件程序员或安全工程师对是否可完全移除未被保护的决策分支加注释(参见图11的(c)和(d)部分)。

本方法800还可包括识别条件取决于其的一个或多个条件变量的步骤。本方法800还可包括识别其中条件变量(例如,check)被分配随后被用来测试是否满足条件的值的软件项目中代码块的步骤。

本方法800还可包括重新表达(原始)条件以产生新条件,其中,该新条件是基于本身取决于(一个或多个)条件变量的新变量中的至少一个。该新条件被设立成使得如果满足(原始)条件则其被满足,并且如果不满足(原始)条件则其不被满足。本方法800然后还可包括修改软件项目,使得控制流程的至少一部分取决于是否满足新条件。因此,受保护代码仍可包括条件代码的一部分,但是条件本身被混淆。

本方法800还可包括修改软件项目的所述部分,使得一个或多个条件变量中的至少一个的至少一个实例被基于新变量中的至少一个的等价表达式替换。这意味着成功的攻击必须除(一个或多个)条件变量之外还篡改新变量。

本方法800还可包括在软件项目的已修改部分(例如,代码段900B)中在控制流程中插入分支点,其中,从所述分支点采取的控制流程路径与是否满足条件无关。换言之,通过向代码中插入一个或多个假决策点(即分支点)来进一步混淆已分散并稀释的决策是可能的。这使得攻击者甚至更加难以成功地攻击代码,因为人为地增加了复杂性。

根据本方法,在软件项目的已修改部分(例如代码段900B)之后,通过软件项目的控制流程可取决于是否满足条件而改变。

虽然上文参考附录1和2描述的示例仅包括了单个条件变量(即check),但将理解的是方法800可同样地应用于混淆其满足是基于超过一个条件变量的条件。

4-修改

将认识到的是所述的方法已被示为按照特定顺序实现的单独步骤。然而,技术人员将认识到这些步骤可被组合或者按照不同的顺序实现,同时仍达到期望的结果。

将认识到的是可使用各种不同的信息处理系统来实现本发明的实施例。特别地,虽然附图及其讨论提供了示例性计算系统和方法,但是这些仅仅是为了在讨论本发明的各种方面时提供有用参考而提出的。可在任何适当的数据处理设备上实现本发明的实施例,所述数据处理设备诸如个人计算机、膝上型计算机、个人数字助理、移动电话、机顶盒、电视、服务器计算机等。当然,已出于讨论的目的简化了系统和方法的描述,并且其仅仅是可被用于本发明的实施例的许多不同类型的系统和方法中的一个。将认识到的是逻辑块之间的边界仅仅是说明性的,并且替换实施例可将逻辑块或元素合并,或者可对各种逻辑块或元素施加功能的替换分解。

将认识到的是可将上述功能实现为作为硬件和/或软件的一个或多个对应模块。例如,可将上述功能实现为一个或多个软件组件以便由系统的处理器执行。替换地,可将上述功能实现为硬件,诸如在一个或多个现场可编程门阵列(FPGA)和/或一个或多个专用集成电路(ASIC)和/或一个或多个数字信号处理器(DSP)和/或其它硬件布置上。在本文中包含的流程图中或者如上所述地实现的方法步骤每个可由对应的相应模块实现;在本文中包含的流程图中或者如上所述地实现的多个方法步骤可一起由单个模块实现。

将认识到的是只要由计算机程序实现本发明的实施例的范围,则承载计算机程序的存储介质和传输介质构成本发明的方面。计算机程序可具有一个或多个程序指令或程序代码,其在被计算机执行时实现本发明的实施例。如本文所使用的术语“程序”可以是针对在计算机系统上执行而设计的指令序列,并且可包括子例程、函数、程序、模块、对象方法、对象实现、可执行应用程序、小应用程序、小服务程序、源代码、目标代码、共享库、动态链接库和/或针对在计算机系统上执行而设计的其它指令序列。存储介质可以是磁盘(诸如硬驱或软盘)、光盘(诸如CD-ROM、DVD-ROM或Blu-Ray盘)或存储器(诸如ROM、RAM、EEPROM、EPROM、闪存或便携式/可移除存储器设备)等。传输介质可以是通信信号、数据广播、两个或更多计算机之间的通信链路等。

附录1:用类似于C的代码编程的示例性初始软件项目

附录2:用类似于C的代码编程的示例性受保护软件项目

附录3:条件块替换

描述了保护软件项目以产生受保护软件项目的第一方法,软件项目包括被布置成响应于满足第一条件而根据预定第一函数来设定程序变量的值的条件代码,其中,第一条件是基于一个或多个条件变量,该方法包括:确定第二函数,其至少部分地基于一个或多个条件变量,并且其在一个或多个条件变量满足第一条件时评估为与预定第一函数相同的值;以及用替换代码来替换条件代码,其中,替换代码包括第一代码部分,其被布置成根据第二函数来设定程序变量的值,无论一个或多个条件变量是否满足第一条件。

条件代码可包括选替代码(alternative code),其被布置成响应于满足第二条件而执行预定操作,其中,第二条件不同于第一条件,并且其中,替换代码还包括在第一代码部分之后的第二代码部分,第二代码部分被布置成响应于满足第二条件而执行预定操作。

第二条件是第一条件的逻辑补集。

条件代码可包括IF-THEN-ELSE语句,其包括包含明示条件的IF代码区段、被布置成响应于满足明示条件而被执行的THEN代码区段和被布置成响应于不满足明示条件而被执行的ELSE代码区段,其中,明示条件是第一条件,使得THEN代码区段被布置成响应于满足明示条件而根据第一预定函数来设定程序变量的值,并且其中,ELSE代码区段包括选替代码。

条件代码可包括IF-THEN-ELSE语句,其包括包含明示条件的IF代码区段、被布置成响应于满足明示条件而被执行的THEN代码区段和被布置成响应于不满足明示条件而被执行的ELSE代码区段,其中,明示条件是第二条件,使得ELSE代码区段被布置成响应于满足第一条件而根据预定第一函数来设定程序变量的值,并且其中,THEN代码区段包括选替代码。

第二条件可以不是第一条件的逻辑补集。

选替代码可进一步被布置成响应于满足一个或多个相应的另外的条件而执行一个或多个另外的预定操作,其中,针对每个另外的预定操作,替换代码包括在第一代码部分之后的相应的另外的代码部分,相应的另外的代码部分被布置成响应于满足相应的另外的条件而执行所述另外的预定操作。

第二条件和一个或多个相应的另外的条件可共同地表示第一条件的逻辑补集。

第二条件和一个或多个相应的另外的条件可以不共同地表示第一条件的逻辑补集。

选替代码可包括被布置成设定程序变量的值的代码。

替换代码可定义一个或多个额外变量,其中,每个额外变量分别地至少部分地基于一个或多个条件变量中的至少一个,第二函数可至少部分地基于一个或多个额外变量。

第二函数可以不直接地基于一个或多个条件变量的子集,在这种情况下,针对子集中的条件变量中的每一个,一个或多个额外变量中的至少一个至少部分地基于该条件变量。

第二函数可进一步至少部分地基于并不基于一个或多个条件变量的一个或多个假变量。

假变量中的一个或多个中的至少一个可以是恒定值。

可在替换代码中定义一个或多个假变量中的至少一个。

可已经在软件项目中定义一个或多个假变量中的至少一个。

程序变量可以是一个或多个条件变量中的一个。

程序变量可以不是一个或多个条件变量中的一个。

预定第一函数可至少部分地基于一个或多个条件变量中的至少一个。

预定第一函数可不基于一个或多个条件变量。

本方法可还包括:在软件项目内识别将被替换代码替换的条件代码。

描述了被布置成实现第一方法的第一装置。描述了第一计算机程序,其在被处理器执行时引起处理器实现第一方法。描述了存储第一计算机程序的计算机可读介质。

描述了产生计算机程序产品的第二方法,其包括保护软件项目以通过实现第一方法来产生受保护软件项目并至少部分地基于受保护软件项目来生成计算机程序产品。

描述了用于保护软件项目的第二装置,包括:输入,用于接收要保护的软件项目,该软件项目包括被布置成响应于满足第一条件而根据预定第一函数来设定程序变量的值的条件代码,其中,第一条件是基于一个或多个条件变量;输出,用于输出受保护软件项目;以及处理部件,其用于通过以下各项从要保护的软件项目产生受保护软件项目:确定第二函数,其至少部分地基于一个或多个条件变量,并且其在一个或多个条件变量满足第一条件时评估为与预定第一函数相同的值;以及用替换代码来替换条件代码,其中,替换代码包括第一代码部分,其被布置成无论一个或多个条件变量是否满足第一条件都根据第二函数来设定程序变量的值。

描述了用于产生计算机程序产品的第三装置,包括:输入,用于从第二装置接收受保护软件项目;输出,用于输出计算机程序产品;以及处理部件,用于至少部分地基于受保护软件项目来生成计算机程序产品。

图3是示意性地图示出可操作用于保护初始软件项目220以产生受保护软件项目260的方法300。方法300包括确定310用以替换初始软件项目220内的条件代码的替换代码并用该替换代码来替换320条件代码以便产生受保护软件项目260的步骤。可选地,本方法包括识别330要保护的初始软件项目220内的条件代码的初始步骤。下面将进一步参考图4A和4B来更详细地讨论图3的方法300。

图4A示意性地图示出可使用图3的方法300来保护的示例性初始软件项目220。示例性初始软件项目220包括初始部分410、决策420、条件代码430和其余部分440。

初始软件项目220的初始部分410是如果要执行软件项目220则要处理的第一项目。换言之,初始部分410是初始软件项目220的执行路径中的第一项目。初始部分410包含指定当初始部分410被执行时被处理的一个或多个指令的代码。虽然初始部分410在图4A中被示为基本码块(即,包含要被一个接一个地连续执行的指令序列),但将认识到的是初始部分410也可更复杂。作为示例,初始部分410可包括除图4A中所示的决策420和条件代码430之外的附加决策和条件代码。事实上,还可以通过单独地将那些附加决策和条件代码视为作为方法300的主题的条件420和条件代码430并适当地重新表达初始部分410(和下面进一步讨论的其余部分440)的内容而使用图3的方法来保护此类附加决策和条件代码。此外,将认识到的是初始软件项目220可能不包括初始部分410,在这种情况下,初始软件项目220的执行路径中的第一项目是决策420。在处理初始软件项目220的初始部分410之后,处理向前继续执行决策320,其为初始软件项目220的执行路径中的下一项目。

决策420表示在该处存在可遵循的多个执行路径的程序中的点。决策420通过评估是否满足条件来确定应遵循哪个执行路径(即接下来应处理或执行哪个代码)。该条件是基于程序内的一个或多个变量(其可称为“条件变量”),使得关于是否满足条件的确定取决于决策420被处理时的此类变量的值。如果当处理决策420时满足条件,则决策420将确定接下来应处理(或执行)条件代码430。然而,如果当处理决策420时不满足条件,则决策420将确定接下来应处理初始软件项目220的其余部分440。换言之,如果满足条件,则将选择图4A上的标记为“是”的执行路径,否则将选择标记为“否”的执行路径。

如果满足决策420所基于的条件,则处理条件代码430;否则不处理条件代码430。换言之,响应于满足条件而处理条件代码430。条件代码430包含指定如果满足条件则要处理的一个或多个指令的代码。条件代码430包括根据预定函数来设定(或分配)变量(其可称为“程序变量”)的值的至少一个指令。将认识到的是条件代码430还可包括实现其它操作的指令。

程序变量是超出条件代码430的范围可访问的变量,使得程序变量可被用作初始软件项目220的其余部分440中的代码的一部分和/或程序变量可被用作由条件代码430分配新值之前的初始软件项目220的初始部分410中的代码的一部分。此外,决策420所基于的条件可至少部分地基于程序变量。换言之,程序变量可以是一个或多个“条件变量”中的一个。

预定函数是设定程序变量的值的函数。预定函数可将程序变量的值设定成恒定值。预定函数可至少部分地基于条件变量中的一个或多个。如前所述,程序变量本身可以是条件变量中的一个,使得用于程序变量的新值可至少部分地基于程序变量的当前值。预定函数可至少部分地基于软件项目内的任何其它变量。预定函数可被简单地表达为例如单个代码行中的单个赋值或者其可用更复杂的方式来表达。作为示例,可以将预定函数表达为对条件代码430内的多个代码行上的程序变量的多个赋值。条件代码还可包括其自己的子决策和子条件代码,使得有条件地(即基于与子决策相关联的条件)表达预定函数。

总而言之,条件代码430被布置成响应于满足条件而根据预定函数来设定程序变量的值,该条件是基于一个或多个条件变量。一旦处理了条件代码,则处理将前进至执行初始软件项目220的其余部分440。

初始软件项目220的其余部分440是执行路径中的最后项目,无论在决策420之后遵循哪个执行路径。如果满足用于决策420的条件,则从条件代码430的处理接着执行其余部分440。否则,如果不满足用于决策420的条件,则从决策420的处理接着执行其余部分440。其余部分440包含指定当执行其余部分440时处理的一个或多个指令的代码。虽然其余部分440在图4A中被示为基本码块,但将认识到的是,就初始软件项目220的初始部分410而论,其余部分440可能更加复杂。因此,其余部分440还可包括除图4A中所示的决策420和条件代码430之外的附加决策和条件代码。再次地,就初始部分410而论,还可以通过单独地将那些附加决策和条件代码视为分别地作为本方法300的主题的条件420和条件代码430并适当地重新表达初始部分410和其余部分440的内容而使用图3的方法300来保护此类附加决策和条件代码。此外,还将认识到的是初始软件项目220可能不包括其余部分440,在这种情况下,如果满足决策420的条件,则初始软件项目220的执行路径中的最后一个项目是条件代码430——否则执行路径中的最后一个项目是决策420。

程序决策和条件代码是大多数软件项目的构造中的基本元素。事实上,在许多编程语言中可用的常见语句(或结构)是IF-THEN语句。IF-THEN语句可用来实现如在图4A中示出且在上文讨论的初始软件项目220。IF-THEN语句具有两个区段,IF区段和THEN区段。IF区段允许指定条件,而THEN区段允许指定只有当满足在IF区段中指定的条件时才将运行的代码。IF区段因此可用来指定决策420,而THEN区段可用来指定条件代码430。

作为示例,软件项目可能被布置成允许用户观看加密内容项目,条件是用户被认证和/或被授权观看该内容项目。软件项目因此可能具有初始部分310,其实现认证和/或授权例程并设定指定已认证用户名的变量和/或指示用户是否被授权观看内容项目的变量。软件项目然后可能具有决策420,其具有必须已被设定用户名变量(即用户已被认证)和/或授权变量具有指示用户被授权观看内容项目的值的关联条件。软件项目还可具有条件代码430,其被布置成响应于满足条件(即用户被认证和/或授权观看媒体项目)而被执行,条件代码430进一步被布置成将表示用于已加密内容项目的解密密钥的变量的值设定成有效解密密钥。最后,软件项目可具有其余部分440,其使用存储在变量中的解密密钥将内容项目解密并将其显示给用户。如果在决策420处满足条件(即用户被认证和/或授权),则变量将被设定成有效解密密钥的值,并且其余部分440将正确地将内容项目解密并显示给用户。然而,如果在决策420处不满足条件(即用户未被认证和/或未被授权观看内容),则将不执行条件代码430,使得解密密钥变量将不被设定成有效解密密钥的值。因此,当处理前进至其余部分440时,其余部分440将不会正确地将已加密内容项目解密。

如上文所讨论的,被提供有初始软件项目220的攻击者能够迫使初始软件项目220执行,使得在处理决策之后遵循执行路径,即使该执行路径并不意图被遵循,这是可能的。作为示例,用来攻击程序中的决策的常见技术是在调试器下运行应用程序并修改代码以采取一个特定执行路径,无论条件变量如何。很明显,此类攻击可能对依赖于决策来对软件项目的用户施加约束的软件项目具有严重的影响。参考上述解密密钥示例,存在攻击者尝试越过决策使得解密密钥被设定成有效解密密钥、使得即使不满足用户被认证和/或授权的条件攻击者也可以观看内容项目的明显动机。在软件项目中存在许多类型的决策,对于其而言期望保护该决策的结果。其中所述方法可能特别适用的领域的示例包括访问控制、IP许可管理、数字权限管理、在线帐单或电子投票。然而,将认识到的是所述方法更一般地可以用来保护任何种类的软件项目中的决策和条件代码。

如上文所讨论的,用于保护软件项目的方法300包括确定310用以替换初始软件项目220内的条件430代码的替换代码并用该替换代码来替换条件代码430以便产生受保护软件项目260的步骤。

图4B示意性地图示出方法300在处理图4A中所示的初始软件项目220时产生的受保护软件项目。在受保护软件项目260中,存在于初始软件项目220中的决策420和条件代码430已被用方法300确定310的替换代码450替换。方法300并未替换存在于初始软件项目220中的初始部分410,其也未替换初始软件项目220的其余部分440。换言之,如果初始软件项目220具有初始部分410和其余部分440,则这些部分也将存在于受保护软件项目中。虽然图4B图示出具有通过被用条件代码450替换来保护的单个决策420和条件代码430的受保护软件项目260,但将认识到的是方法300可用来通过以用于每个决策的替换代码来替换该决策及其相应条件代码来保护多个决策及其相应的条件代码,从而产生具有多个替换代码区段的受保护软件项目260。作为示例,可迭代地执行方法300以保护初始软件项目内的多个决策。方法300可在第一迭代中替换320初始软件项目220中的第一决策,产生中间受保护软件项目(即决策中的仅一个已被保护)。方法300然后可对中间受保护软件项目执行进一步迭代直至要保护的决策中的每一个已被用替换代码替换320而产生受保护软件项目260为止。例如可能的是执行方法300一次以替换320初始软件项目中的第一决策,产生第一受保护软件项目,并且然后对第一受保护软件项目第二次执行方法300以替换320第二决策并产生最终受保护软件项目260。替换地,将认识到的是可以同时地替换320初始软件项目中的多个决策。

由方法300创建的替换代码450包括第一代码部分,其根据由方法300确定310的函数(称为“替换函数”)来设定程序变量。决策420在其被替换代码450替换320时被移除,意味着替换代码的第一部分将始终被处理,无论是否满足原始决策420所基于的条件。因此,在受保护软件项目260中,替换代码的第一部分将始终根据替换函数来设定程序变量的值。

公式化由方法300确定310的替换函数使得其至少部分地基于一个或多个条件变量(即与原始决策相关联的条件所基于的变量),使得其在满足条件时评估为与条件代码430中的原始预定函数相同的值。如果不满足条件,则理想地替换函数的输出应不同于原始预定函数的输出。将认识到的是取决于替换函数的公式化,替换函数的输出可偶尔提供与原始预定函数相同的输出,即使不满足条件(例如,如果在替换函数中使用随机数发生器的话)。然而,假如当不满足条件时输出正常地不同于原始预定函数的输出,则对替换代码450的攻击将更加困难(即,替换代码450对攻击的弹性更高)。

存在可用来形成替换函数的多种方式。形成替换函数的一个此类技术是将至少一个转换函数g(或变换函数)与原始预定函数的各项中的一个或多个组合(例如,可将变换函数附加或预先计划到原始预定函数的一个或多个项)。变换函数被形成为使得其至少部分地基于条件变量(即g(cv1, cv2,…, cvk))。形成变换函数使得如果满足决策420在初始软件项目220中基于的条件,则变换函数采取不改变其被与之组合的原始预定函数的项的值的恒等值。然而,如果不满足决策420所基于的条件,则变换函数采取非恒等值,该非恒等值改变其被与之组合的原始预定函数的项的值。

存在现在将考虑的两个基本类型的变换函数。这些类型在其被与原始函数的项组合的方式方面不同。

第一此类变换函数可以使用乘法运算与原始预定函数的项组合(另外称为乘法变换函数)。作为示例,如果初始软件项目220中的原始函数进行操作以根据以下函数来设定程序变量z:

z=x+y

则乘法变换函数gm可以使用乘法运算与原始函数的x项组合而产生如下的替换函数:

z = (x * gm(cv1, cv2,…, cvk)) + y

如将认识到的,正常乘法下的恒等值是1,因为将值乘以1不改变其值,而将值乘以除1之外的任何东西将改变其值。因此,在乘法变换函数的情况下,应形成函数使得其如果满足初始软件项目220中的决策所基于的条件则取1的值,否则取任何其它值。这意味着如果满足条件则程序变量z将被设定成值x+y,否则被设定成某个其它值(如果不满足条件的话)。

第二种变换函数可以使用加法运算与原始函数组合(另外称为加法变换函数)。可以将加法变换函数ga与上述原始函数的x项组合以产生如下的替换函数:

如将认识到的,正常加法下的恒等值是0,因为将0与值相加将不改变值,而加上除0之外的任何东西将改变该值。因此,在加法变换函数的情况下,应形成函数使得其如果满足初始软件项目220中的决策所基于的条件则取0的值,否则取任何其它值。这意味着如果满足条件则程序变量z将被设定成值x+y,否则被设定成某个其它值(如果不满足条件的话)。

虽然上述示例示出了对原始函数中的第一项(即x)应用变换函数,但将认识到的是可对原始函数中的项中的任何(或所有)应用变换函数,并且可对同一项应用超过一个变换函数。此外,应用于原始函数的变换函数每个可相互不同,并且也可以是不同种类的变换函数——亦即,可将乘法变换函数和加法变换函数的混合体一起使用。

作为示例,方法300可以利用数据库来检索预定义的变换函数,其可以被参数化以便确定310用于替换代码450的替换函数。替换地,方法300可利用变换函数发生器来生成变换函数。代数简化器提供了此类变换函数恒等的现成来源,并且在Henry S. Warren的著作“Hacker's Delight”(ISBN 978-0-201-91465-8)中可以找到尤其是关于计算机计算的更多内容。

将认识到的是可使用形成替换函数的其它方式,条件是替换函数至少部分地基于初始软件项目220中的决策420所基于的条件变量,并且替换函数在满足条件时评估为与原始函数相同。

总而言之,在步骤310处,方法300确定替换函数,其至少部分地基于初始软件项目220中的决策420的条件所基于的一个或多个条件变量。当条件变量满足条件时,替换函数评估为与初始软件项目220的条件代码430中的原始预定函数相同的值。方法300然后用包括第一代码部分的替换代码450来替换320条件代码430,该第一代码部分根据替换函数来设定程序变量的值,无论条件变量是否满足条件。

无论条件变量是否满足条件都执行用方法300确定310的替换代码450。因此,决策420不再被明示地包括在受保护软件项目260中。替代地,由条件代码430在满足条件时根据函数设定的程序变量现在被根据替换函数来设定,无论是否满足条件。这意味着决策420在受保护软件项目260中已被掩蔽,因为软件项目在这里取决于是否满足条件而不同地表现不再是显而易见的。在初始软件项目220中,行为方面的差别是容易地显而易见的,因为存在只有当满足条件时才执行的条件代码,而在受保护软件项目260中软件以类似的方式表现,如论是否满足条件——即程序变量被根据替换函数而设定成一定的值。当使用程序变量时,仅使得受保护软件项目260中的未满足条件的效果稍后在软件中显而易见,因为只有当满足条件时,程序变量的值才将是正确的。这意味着决策420(其在受保护软件项目260中可被视为是隐含的,与在初始软件项目220中是明示的相反)更加难以让攻击者识别和篡改,特别是由于决策的效果可与由于决策而引起行为的变化的代码分离。

现在将关于图5A、5B、6A、6B、7A和7B来更详细地讨论方法300的操作。

图5A、6A和7A示意性地图示出可用方法300来保护的初始软件项目220的变化,而图5B、6B和7B示出了由本方法分别地针对初始软件项目220中的每一个产生的受保护软件项目260的作为结果的变化。

一般地,图5A、6A和7A图示出包括被布置成当不满足决策420的条件时执行其它操作的选替代码的初始软件项目220。通过方法300确定310的替换代码一般地用于取决于在受保护项目260中决定的相同的条件而保持选替代码。换言之,只有条件代码(关于何时满足条件)被改变,使得其不再取决于其关联条件是否被满足。

图5A示意性地图示出可用图3中所示的方法300来保护的另一初始软件项目220。然而,图5A中所示的初始软件项目220另外包括选替代码510。

选替代码510被布置成响应于不满足决策420所基于的条件而被执行。也就是说,在决策420处,如果不满足条件,则决策将确定接下来应处理选替代码510。选替代码可执行许多预定操作,诸如例如,将程序变量的值设定成不同的值或者设定其它变量的值。在选替代码510已被处理之后,处理继续前进至评估初始软件项目220的其余部分440。

除上文所讨论的IF-THEN语句之外,许多编程语言提供了IF-THEN-ELSE语句。IF-THEN-ELSE语句可用来实现图5A中所示的初始软件项目220。IF-THEN-ELSE语句具有三个区段,即IF区段、THEN区段和ELSE区段。IF-THEN-ELSE语句的IF和THEN区段以与上文所讨论的针对IF-THEN语句类似的方式进行操作。ELSE区段允许指定将只有当不满足在IF区段中指定的条件时才会运行的代码。ELSE区段因此可用来指定选替代码510。虽然IF-THEN-ELSE语句仅具有在IF区段中明示地叙述的一个条件,但可以将IF-THEN-ELSE区段视为具有与之相关联的两个条件。第一条件将是在IF区段中明示地叙述的那个条件,而第二条件作为第一条件的逻辑补集而从IF区段隐含。ELSE区段因此可以被视为被布置成响应于第二条件而被执行。IF-THEN-ELSE语句因此可以被使用作为彼此的逻辑补集的两个条件而重写为两个单独的IF-THEN语句。替换地,可以通过将IF区段变成明示地叙述先前ELSE区段的条件(即先前IF区段的逻辑补集)并将来自先前ELSE区段的代码置于THEN区段中且将来自先前THEN区段的代码置于ELSE区段中来重写IF-THEN-ELSE语句。因此可以将其视为关于在IF区段中明示地叙述两个条件中的哪一个和哪个代码被置于THEN或ELSE区段中是略微任意的,条件是保持代码和其可进行响应的相应条件之间的关系。因此,可以替换地用被用于决策420的条件的逻辑补集来表示图5A中所示的初始软件项目。在这种情况下,设定程序变量的值的条件代码被布置成响应于不满足条件而被执行(即在图5A中标记为“否”的执行路径上),而选替代码将被布置成响应于满足条件而被执行(即在图5A中标记为“是”的执行路径上)。

图5B示意性地图示出可用方法300从图5A中所示的初始软件项目220产生的受保护软件项目260。

如前所述,本方法包括确定310替换代码的步骤,其根据用以替换条件代码430的替换函数来确定设定变量的替换代码的第一部分450,如在上文更深入地讨论的。在图5B中所示的情况下,确定310替换代码的步骤还确定替换代码的第二部分530,其被布置成执行与初始软件项目220的选替代码510相同的操作,并且被进一步布置成响应于满足条件的决策520而被处理。第二部分530因此等价于选替代码510且取决于针对其执行被满足的相同条件(即决策420的逻辑补集)。应注意的是替换代码的第二部分530被布置成在替换代码的第一部分450之后执行。如上文所讨论的,这是因为替换代码的第一部分450设定程序变量的值,无论是否满足条件。因此,如果选替代码被布置成将程序变量的值设定成不同的值,则替换代码的第一部分450将始终覆写该值,如果第一部分450在替换代码的第二部分之前被处理的话。

图6A示意性地图示出可用图3中所示的方法300来保护的另一初始软件项目220。如关于图5A所讨论的,可以认为选替代码510可对隐含的第二条件进行响应,隐含的第二条件是决策420所基于的条件的逻辑补集。在图6A中,此第二条件明示地与第二决策610相关联。第二决策610被布置成如果不满足用于决策420的条件则被评估,而选替代码510被布置成使得只有当满足第二条件时其才被处理。否则,如果不满足用于决策420的条件且不满足用于第二决策610的条件,则处理将继续前进至评估软件项目的其余部分440。自然地,如果第二条件是决策420所基于的条件的逻辑补集,则图6A中所示的初始软件项目220在功能上等价于图5A中所示的,但其中第二条件被明示地叙述。然而,第二条件不需要是决策420所基于的条件的逻辑补集。

除上文所讨论的IF-THEN和IF-THEN-ELSE语句之外,许多编程语言也提供可用来实现图6A中所示的布置的IF-THEN-ELSEIF语句。IF-THEN-ELSEIF语句具有三个区段,即IF区段、THEN区段和ELSEIF区段。IF-THEN-ELSEIF语句的IF和THEN区段以与上文所讨论的针对IF-THEN语句和IF-THEN-ELSE语句类似的方式进行操作。ELSEIF区段允许指定第二条件以及选替代码,其只有当不满足IF条件且满足ELSEIF条件时才将被处理。ELSEIF区段因此可被用来指定第二决策610以及选替代码510。

图6A中所示的初始软件项目220可选地还可包含附加选替代码620(用虚线示出),其被布置成响应于不满足第二条件而被处理。这意味着如果不满足与决策420相关联的条件,则将执行选替代码510或620的至少一部分。许多编程语言包含可用来实现此布置的IF-THEN-ELSEIF-ELSE语句。

图6B示意性地图示出可用方法300从图6A中所示的初始软件项目220产生的受保护软件项目260。图6B中所示的受保护软件项目260类似于图5B中所示的,除了决策610是基于第二条件之外,该第二条件不需要是进行第一决策420所基于的条件的逻辑补集。

如果图6A中所示的初始软件项目220包括可选附加选替代码620,则图6B的受保护软件项目260包含替换代码的另外的部分630(也用虚线示出)。该另外部分被布置成如果决策610确定不满足第二条件则被执行。该另外部分进一步被布置成在被处理时执行与附加选替代码620相同的操作。

图7A示意性地图示出可用图3中所示的方法300来保护的另一初始软件项目220。图7A中所示的初始软件项目220再次地非常类似于上文所讨论的图6A中所示的。其举例说明另外的决策710可以是基于满足另外的条件,其中,另外的选替代码部分620被布置成如果满足另外的条件则被执行。虽然图7A仅示出了具有相关联的另外的条件的一个另外的决策710,但将认识到的是可将任何数目的另外的决策链接(或连结)在一起,如果不满足与链中的先前决策相关联的条件,则评估每个另外的决策。

除上文提及的IF-THEN、IF-THEN-ELSE和IF-THEN-ELSEIF语句之外,许多编程语言包括可用来实现图7A中所示的布置的附加语句。一个此类语句是IF-THEN-ELSEIF-ELSE语句,在给出以上其它语句的描述的情况下,其应是不言而喻的。IF-THEN-ELSEIF-ELSE语句类似于IF-THEN-ELSEIF-ELSE语句,但在结尾处具有ELSE区段。ELSE区段被布置成如果不满足与ELSEIF区段相关联的条件则被处理(并且当然假定不满足与IF区段相关联的条件)。结尾处的ELSE语句的包括确保在ELSEIF区段中定义的一个或多个另外的条件(将认识到的是,在IF-THEN-ELSEIF语句或IF-THEN-ELSEIF-ELSE语句中可存在超过一个ELSEIF区段)以及由ELSE区段定义的隐含条件共同地表示在IF区段中指定的条件(即,决策420所基于的条件)的逻辑补集。图7B示意性地图示出可用方法300从图7A中所示的初始软件项目220产生的受保护软件项目260。方法300以与上文关于图6A所讨论的类似的方式产生用于图7A中所示的初始软件项目220的替换代码。针对每个另外的条件710和选替代码620的另外部分,由方法300确定310的替换代码包括对应决策710和替换代码630的一部分。

如上文所讨论的,由方法300确定310的替换函数被公式化成使得其至少部分地基于条件变量(即与原始决策420相关联的条件所基于的变量)。作为确定310替换代码的步骤的一部分,替换代码可定义一个或多个额外变量。这些额外变量被定义成使得其每一个都分别地至少部分地基于条件变量中的至少一个。然后替换函数可基于那些额外变量以及、或替代地条件变量本身。在未在替换函数中直接地使用条件变量中的特定的一个(或多个)的情况下,一个或多个额外变量中的至少一个应至少部分地基于未被直接地使用的那些特定条件变量。这确保替换函数仍基于所有条件变量,虽然是间接地。这确保在替换函数的变量中表示条件。

除上文所讨论的各种类型的“IF...”语句之外,许多编程语言指定可用来实现图4A、5A、6A或7A中的任何中所示的布置的另一语句,即SWITCH语句。SWITCH语句包含EXPRESSION区段和一个或多个CASE区段以及可选的DEFAULT区段。EXPRESSION区段包含可以被评估以提供值(其不必是布尔值)的表达式。CASE区段每个具有关联值且被布置成如果EXPRESSION区段的值与该值匹配则被执行。换言之,可以将每个CASE区段视为在被与EXPRESSION语句的表达式组合时具有关联条件(即,条件是当表达式语句的值与CASE区段的值匹配时)。可选的DEFAULT区段包含如果没有一个CASE区段则将被处理的代码。当处理SWITCH语句时,具有所评估的条件的匹配值的CASE区段将被处理,如果此类CASE区段存在的话,否则DEFAULT区段将被处理(再次地假定存在一个)。因此,为了使用SWITCH语句来实现图4A、5A、6A或7A中所示的布置,需要在EXPRESSION区段中以及与要考虑的每个明示条件相关联的CASE区段中定义适当的表达式。然后可在SWITCH语句的DEFAULT区段中指定ELSE区段(即作为明示条件的逻辑补集的隐含条件)。

技术人员将熟悉IF-THEN、IF-THEN-ELSE、IF-THEN-ELSEIF、IF-THEN-ELSEIF-ELSE和SWITCH类型的语句及其实现图4A、5A、6A或7A中所示的布置的使用。如从基于图4A、4B、5A、5B、6A、6B、7A和7B的上述讨论将认识到的,方法300提供了将软件项目中的决策从可从该决策得到的关联控制流程路径解耦的效果。本质上,本方法用并非以决策为条件的代码(其不再是决策的一部分)来替换控制流程路径。因此无论进行的决策如何都将执行替换代码,但是将只有当已满足与第一控制流程路径相关联的条件时才将产生期望的结果。换言之,程序的可见控制流程行为不再与在程序内进行的重要决策匹配,因为在受保护软件项目260中执行相同的代码,无论重要决策的结果如何(即无论是否满足条件)。该重要决策因此被有效地隐藏在受保护软件项目260内。事实上,来自决策的影响(即故意地“不正确”值的分配)可仅在稍后在软件项目的执行中(即当要使用该“不正确”的值时)变得显而易见。因此,可以认为已经遍及软件项目分散并稀释该重要决策,使得攻击者更加难以识别和篡改该重要决策。将认识到的是,不是保护对象的其它控制流程路径(即其涉及不重要决策)仍可存在于受保护软件项目260中。

替换函数还可至少部分地基于一个或多个假变量。所述假变量可以是恒定值或与决策420相关联的条件并未基于的软件项目中的其它变量。换言之,假变量并非基于一个或多个条件变量。替换代码的确定310可包括定义假变量,其可基于恒定值或软件项目内的其它变量。然而,初始软件项目220内的现有变量也可被用作替换函数所基于的假变量。

在替换函数的公式化中包括额外和/或假变量(即,使得替换函数至少部分地基于所述额外和/或假变量)意味着攻击者又更加难以分析受保护软件项目。这是因为额外和/或假变量的定义和包括要求攻击者分析更大量的代码以便分析替换函数。因此期望在软件项目内广泛地分布并使用额外和/或假变量以进一步增加成功的攻击将需要的分析量。在使用方法300来保护软件项目内的多个决策(例如,通过迭代地对每个决策应用方法300)的情况下,可使用相同的额外和/或假变量。这又进一步增加攻击者身上的分析负担。

返回参考图3,方法300还可包括识别330要保护的条件代码的可选第一步骤。该识别步骤330识别要用方法300来保护的决策420。这可以用多种方式实现。

作为示例,可用指定要用方法300来保护的初始软件项目220内的决策的注释来增补用于初始软件项目220的代码。识别330条件代码的步骤因此可涉及到识别已针对保护被注释的那些决策。注释可包括附加信息,诸如例如,在确定替换代码时是否要使用条件或假变量和可能的应创建多少变量。

作为替换示例,可以在初始软件项目220的创作者(或开发者)所使用的开发环境中嵌入用于运行方法300的工具。该工具因此可能允许开发者相对于特定选择条件代码块来选择运行方法300,其可用在开发环境内生成的替换代码来替换条件代码块。

将认识到的是可使用识别330要保护的条件代码的其它方式。

附录1示出了用类似于C的代码编程的示例性初始软件项目220。如可以看到的,程序包括使用IF-THEN-ELSE语句表达的各种决策,诸如在行7、22、28、29和37上。这些决策中的大多数不要求针对攻击的保护,因为其将是攻击者不感兴趣的。例如,行7上的决策涉及可使用的不同数据格式之间的选择,并且其并不是攻击者尝试操纵的特别有用的目标(由于程序将已经进行操作以选择用于数据的正确格式,所以对于攻击者而言在改变此行为时要获得的东西很少)。然而,行22上的决策是关键的。此决策基于“check”值是否被设定成正确的值来确定程序的操作。如果“check”值是正确的,则程序计算基于数据格式的正确结果,然而,如果“check”值不正确,则程序计算故意不正确的结果(即无用数据)。此决策是攻击者相对容易识别的,并且是攻击者尝试操纵的可能目标,因为其成功操纵可以为攻击者得到来自程序的期望输出,否则程序将不会在其处提供期望输出(即,其将输出故意不正确的值)。因此,期望使用方法300来保护此决策。

附录2示出了可使用方法300产生的示例性受保护软件项目260。用粗体并加下划线示出了附录1和附录2中的代码之间的差别。

首先,在附录2的行4和6上定义了新变量。这些变量是额外和假变量的混合体。例如,在行12上对d1分配条件变量“check”的值,使得其成为额外变量,同时,在行15上,变量d3是基于另一变量m0,使得其成为假变量,如上文所讨论的。

接下来,存在于附录1的行22-26和44中的IF-THEN-ELSE语句已被移除。如上所述,乘法变换函数已经在附录2的行32、35、40和43上与向程序变量“result”分配值的函数组合。应注意的是,虽然附录2的代码包含四个单独赋值语句,但是这些单独的赋值语句可以被共同地视为分配给程序变量“result”的单个函数。在附录2的行32、35、40和43上用粗体并加下划线示出了乘法变换函数。如果条件变量“check”的值为1(即如果满足条件)则这些乘法变换函数中的每一个将计值为“1”,否则计值为不同的值。这意味着只有当满足条件时才将分配正确的值,否则将分配不同的值。这在语义上类似于附录1中所示的初始软件项目220的操作,即使实施方式是不同的。

如从附录1和2可以看到的,被保护的决策及其关联条件不再被受保护软件项目260中的代码明示地叙述——其现在隐含在向程序变量“result”分配值的函数中。这意味着攻击者更加难以识别到正在进行决策以及该决策所基于的条件。此外,需要对程序代码的多得多的分析以便操纵程序的操作以实现攻击者的期望结果。

已描述了一种用于将软件项目中的决策代码从相关联的第一控制流程路径解耦的方法,决策代码包括包含第一控制流程路径的软件项目中的多个控制流程路径,每个控制流程路径与基于一个或多个相应条件变量的相应条件相关联,并且每个控制流程路径被布置成当满足所述相应条件时被执行,第一控制流程路径被布置成根据预定第一函数来设定程序变量的值,本方法包括:确定第二函数,其至少部分地基于与第一控制流程路径相关联的条件所基于的一个或多个条件变量,并且当一个或多个条件变量满足与第一控制流程路径相关联的条件时,其评估为与预定第一函数相同的值;以及用并非决策代码的一部分的替换代码来替换第一控制流程路径,其中,替换代码包括第一代码部分,其被布置成根据第二函数来设定程序变量的值,无论一个或多个条件变量是否满足与第一控制流程路径相关联的条件。

还描述了一种用于将软件项目中的决策从相关联的第一控制流程路径解耦的方法,所述决策包括包含第一控制流程路径的多个控制流程路径,每个控制流程路径与基于一个或多个相应条件变量的相应条件相关联,并且被布置成当满足所述条件时被执行,第一控制流程路径被布置成根据预定第一函数来设定程序变量的值,本方法包括:确定第二函数,其至少部分地基于与第一控制流程路径相关联的条件所基于的一个或多个条件变量,并且当一个或多个条件变量满足与第一控制流程路径条件相关联的条件时,其评估为与预定第一函数相同的值;以及用并非决策的一部分的替换代码来替换第一控制流程路径,其中,替换代码包括第一代码部分,其被布置成根据第二函数来设定程序变量的值,无论一个或多个条件变量是否满足与第一控制流程路径相关联的条件。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1