一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

保卫软件例程的制作方法

2022-06-01 19:28:19 来源:中国专利 TAG:

1.本发明涉及保卫软件例程的方法、执行这种被保卫的软件例程的方法、以及对应的装置和计算机程序。


背景技术:

2.软件应用经常在恶劣环境中操作或执行。攻击可能经常被认为对软件项目的执行具有一定程度的控制。事实上,攻击可能经常容易引起软件项目中的功能或例程被运行多次。这可以是为了对例程进行逆向工程而进行的,例如通过将例程的一些或所有可能的输入映射到一些或所有可能的输出。附加地或可替代地,这可以简单地进行,以启用针对其攻击者没有被授权的软件的附加功能,或者获取由这样的例程所使用或生成的秘密数据。
3.特别地,在浏览器或解释器中运行的软件项目可能经常容易受到这些种类的重新运行攻击。这是因为软件项目通常以高级编程或脚本语言的形式来提供,并且通常在如下执行环境(诸如,解释器)中运行:该执行环境提供了对软件的代码的一些调试/询问及其执行流程。这种攻击也可能处于在更传统的执行环境中运行的编译软件上,例如通过使用提供类似功能的调试工具。


技术实现要素:

4.本发明的目的是解决现有技术中的问题,诸如上面概述的那些问题。特别地,提供一种用于保护软件项目免受这样的重新运行攻击的改进方法将是合期望的。
5.根据本发明的第一方面,提供了一种保卫在执行环境中执行的软件实例中实现的软件例程的方法,所述方法包括:通过存储对所述软件例程的引用来利用所述引用初始化软件实例的代码块,使得所存储的引用对于所述代码块外部的代码是不可访问的;以及返回对所述代码块的引用,对所述代码块的引用由所述代码块外部的软件实例使用以调取所述软件例程;其中所述代码块被配置为:(a)使用所存储的引用来调取所述软件例程;以及(b)在所述代码块对所述软件例程进行预定次数的调取之后,修改所存储的引用以便防止所述代码块进一步调取所述软件例程。
6.根据本发明的第二方面,提供了一种在执行环境中执行的软件实例中执行软件例程的方法,所述方法包括:执行软件实例的代码块,所述执行所述代码块包括所述代码块进行如下操作:使用对所述软件例程的引用来调取所述软件例程,对所述软件例程的引用被存储为所述代码块的初始化的一部分,使得所存储的引用对于所述代码块外部的代码是不可访问的;以及在确定所述软件例程已经被所述代码块调取了预定次数时,修改所存储的引用以便防止所述代码块进一步调取所述软件例程。
7.在上面描述的方法中,执行环境可以防止所述代码块外部的代码访问所存储的引用。
8.存储所述引用可以包括将所述软件例程的存储器地址存储在指针中,并且修改步骤包括修改存储在指针中的存储器地址。
9.可替代地,存储所述引用可以包括将所述软件例程作为函数对象存储在函数对象变量中,并且修改步骤包括覆写存储在函数对象变量中的函数对象。
10.可以通过执行另外的代码块来存储对所述软件例程的引用,所述另外的代码块一旦被执行,就不能够由所述另外的代码块外部的代码来访问,并且其中所述代码块由所述另外的代码块来定义。
11.根据本发明的第三方面,提供了一种保卫在执行环境中执行的软件实例中实现的软件例程的方法,所述方法包括:通过存储损坏数据来初始化所述软件实例的代码块,使得所存储的损坏数据对于所述代码块外部的代码是不可访问的;以及返回对所述代码块的引用,对所述代码块的引用由所述代码块外部的软件实例使用以调取所述软件例程,其中所述代码块被配置为:(i)调取所述软件例程,所述调取包括应用所存储的损坏数据来修改软件例程数据,以及(ii)基于对所述软件例程的调取来更新所存储的损坏数据,其中软件实例被配置为:接收对应于所存储的损坏数据的修复数据,并且通过将修复数据应用于软件例程数据来获得针对所述软件例程的结果,从而补偿所述修改。
12.在一些实施例中,初始化步骤进一步包括:存储对所述软件例程的引用,使得所存储的引用对于所述代码块外部的代码是不可访问的。所述代码块可以被配置为使用所存储的引用来调取所述软件例程。
13.根据本发明的第四方面,提供了一种在执行环境中执行的软件实例中执行软件例程的方法,所述方法包括:执行软件实例的代码块,所述执行软件实例的所述代码块包括所述代码块进行如下操作:(a)调取所述软件例程,所述调取包括应用所存储的损坏数据来修改软件例程数据,其中所述损坏数据被存储为所述代码块的初始化的一部分,使得所存储的损坏数据对于所述代码块外部的代码是不可访问的,以及(b)基于对所述软件例程的调取来更新所存储的损坏数据;接收对应于所存储的损坏数据的修复数据;以及通过将修复数据应用于软件例程数据来获得针对所述软件例程的结果,从而补偿所述修改。
14.在一些实施例中,调取所述软件例程的步骤使用对所述软件例程的引用,其中所述引用被存储为所述代码块的初始化的一部分,使得所存储的引用对于所述代码块外部的代码是不可访问的。
15.在第三或第四方面的方法的一些实施例中,软件例程数据可以包括由所述软件例程使用的数据和/或由所述软件例程生成的数据。
16.在第三或第四方面的方法的一些实施例中,应用所存储的损坏数据来修改所述软件例程的数据可以包括以下各项中的任何一个或多个:(a)将所存储的损坏数据应用于所述软件例程的一个或多个输入;(b)将所存储的损坏数据应用于所述软件例程的一个或多个输出;以及(c)作为所述软件例程的一部分,将所存储的损坏数据应用于所述软件例程的中间数据。
17.在第三或第四方面的方法的一些实施例中,获得针对所述软件例程的结果的步骤是所述执行所述代码块的一部分。
18.在第三或第四方面的方法的一些实施例中,将修复数据应用于所述软件例程的数据包括以下各项中的任何一个或多个:(a)将修复数据应用于所述软件例程的一个或多个输入;(b)将修复数据应用于所述软件例程的一个或多个输出;以及(c)作为所述软件例程的一部分,将修复数据应用于所述软件例程的中间数据。
19.在第三或第四方面的方法的一些实施例中,执行环境可以防止所述代码块外部的代码访问所存储的损坏数据。
20.在第三或第四方面的方法的一些实施例中,可以通过执行另外的代码块来存储所述损坏数据,所述另外的代码块一旦被执行,就不能够由所述另外的代码块外部的代码来访问,并且其中所述代码块由所述另外的代码块来定义。
21.先前描述的方法的所述另外的代码块可以是匿名函数。附加地,所述所存储的引用可以形成所述另外的代码块的闭包(closure)的一部分。所述所存储的损坏数据可以形成所述另外的代码块的闭包的一部分。
22.在一些实施例中,执行环境实现边界作为所述闭包的一部分,从而防止所述另外的代码块外部的代码询问所述闭包。
23.在先前描述的任何方法中,执行环境可以包括以下各项中的任一个:(a)javascript虚拟机,并且所述软件至少部分地以javascript实现;(b)java虚拟机,并且所述软件至少部分地以java实现;(c)lisp解释器,并且所述软件至少部分地以lisp实现;以及(d)python解释器,并且所述软件至少部分地以python实现。
24.根据本发明的第四方面,提供了一种保卫软件的方法,所述方法包括:接收包括至少一个软件例程的软件;修改所述软件,使得当在运行时环境中作为软件实例执行时,所述软件实例通过执行如先前描述的任何方法来保卫所述至少一个软件例程。
25.根据本发明的第五方面,提供了一种装置,所述装置被布置成执行根据本发明的第一至第四方面的任何实施例的方法。
26.特别地,可以提供一种系统,所述系统包括一个或多个处理器以及耦合到所述一个或多个处理器的存储器,所述存储器被配置为执行存储在所述存储器中的编程指令,所述编程指令包括本发明的第一至第四方面的任何实施例的步骤。
27.根据本发明的第六方面,提供了一种计算机程序,所述计算机程序在由一个或多个处理器执行时使得所述一个或多个处理器执行根据本发明的第一至第四方面的任何实施例的方法。所述计算机程序可以存储在计算机可读介质上。所述计算机可读介质可以是非暂时性的。
附图说明
28.现在将参考附图,仅通过示例的方式描述本发明的实施例,其中:图1示意性地图示了计算机系统的示例;图2示意性地图示了根据本发明实施例的示例系统;图3示意性地图示了用于与图2的系统一起使用的受保护软件项目240的示例;图4是图示了根据本发明的一些实施例的操作保护系统的示例方法的流程图;图5示意性地图示了在诸如图1的系统之类的系统上执行的初始软件项目的示例;图6示意性地图示了在诸如图1的系统之类的系统上执行的受保护软件项目的示例;图7a是图示了当运行诸如图6中的受保护软件项目之类的受保护软件项目时执行的示例方法的流程图;图7b是图示了当运行诸如图6中的受保护软件项目之类的受保护软件项目时执行
的示例方法的流程图;图8示意性地图示了在诸如图1的系统之类的系统上执行的受保护软件项目的示例;图9a是图示了当运行诸如图8中的受保护软件项目之类的受保护软件项目时执行的示例方法的流程图;以及图9b是图示了当运行诸如图8中的受保护软件项目之类的受保护软件项目时执行的示例方法的流程图。
具体实施方式
29.在以下描述以及附图中,描述了本发明的某些实施例。然而,应当领会的是,本发明不限于所描述的实施例,并且一些实施例可能不包括下面描述的所有特征。然而,应当明显的是,在不脱离所附权利要求中阐述的本发明的更宽泛的精神和范围的情况下,可以在本文中进行各种修改和改变。
30.图1示意性地图示了计算机系统100的示例。系统100包括计算机102。计算机102包括:存储介质104、存储器106、处理器108、接口110、用户输出接口112、用户输入接口114和网络接口116,它们可以通过一个或多个通信总线118链接在一起。
31.存储介质104可以是任何形式的非易失性数据存储设备,诸如硬盘驱动器、磁盘、光盘、固态存储设备、rom等中的一个或多个。存储介质104可以存储用于使处理器108执行以便使计算机102运作的操作系统。存储介质104还可以存储一个或多个计算机程序(或软件)。
32.存储器106可以是适合于存储数据和/或计算机程序(或软件)的任何随机存取存储器(存储单元或易失性存储介质)。
33.处理器108可以是适合于执行一个或多个计算机程序(诸如,存储在存储介质104上和/或存储器106中的那些)的任何数据处理单元,这些计算机程序中的一些可以是根据本发明的实施例的计算机程序,或者是在由处理器108执行时使得处理器108实行根据本发明的实施例的方法并且将系统100配置为根据本发明的实施例的系统的计算机程序。处理器108可以包括单个数据处理单元、或并行地、单独地或彼此协作地操作的多个数据处理单元。在实行本发明的实施例的数据处理操作时,处理器108可以将数据存储到存储介质104和/或存储器106,和/或从存储介质104和/或存储器106读取数据。
34.接口110可以是用于提供去往设备122的接口的任何单元,设备122在计算机102外部或者可从计算机102移除。设备122可以是数据存储设备,例如光盘、磁盘、固态存储设备等中的一个或多个。设备122可以具有处理能力——例如,该设备可以是智能卡。因此,接口110可以根据它从处理器108接收到的一个或多个命令来从设备122访问数据、或者向设备122提供数据、或者与设备122对接。
35.用户输入接口114被布置成接收来自系统100的用户或操作者的输入。用户经由系统100的连接到用户输入接口114或者与用户输入接口114通信的一个或多个输入设备(诸如,鼠标(或其他定点设备)126和/或键盘124)来提供该输入。然而,应当领会的是,用户可以经由一个或多个附加的或替代的输入设备(诸如,触摸屏)向计算机102提供输入。计算机102可以将经由用户输入接口114从输入设备接收到的输入存储在存储器106中,以供处理
器108随后访问和处理,或者可以将其直接传递给处理器108,使得处理器108可以相应地对用户输入做出响应。
36.用户输出接口112被布置成向系统100的用户或操作者提供图形/视觉和/或音频输出。由此,处理器108可以被布置成指示用户输出接口112来形成表示期望图形输出的图像/视频信号,并且将该信号提供给系统100的连接到用户输出接口112的监视器(或屏幕或显示单元)120。附加地或可替代地,处理器108可以被布置成指示用户输出接口112来形成表示期望音频输出的音频信号,并且将该信号提供给系统100的连接到用户输出接口112的一个或多个扬声器121。
37.最后,网络接口116为计算机102提供用于从一个或多个数据通信网络下载数据和/或向一个或多个数据通信网络上传数据的功能。
38.应当领会的是,在图1中图示并且在上面描述的系统100的架构仅仅是示例性的,并且在本发明的实施例中可以使用具有不同架构(例如,与图1中所示的组件相比具有更少的组件、或者与图1中所示的组件相比具有附加的组件和/或替代的组件)的其他计算机系统100。作为示例,计算机系统100可以包括以下各项中的一个或多个:个人计算机;服务器计算机;移动电话;平板设备;膝上型电脑;电视机;机顶盒;游戏控制台;其他移动设备或消费电子设备;等等。
39.图2示意性地图示了根据本发明的一些实施例的示例系统200。系统200包括计算机系统(或客户端系统或用户系统)210、保护系统220、可选的强制实施系统230和网络270。
40.总的来说,计算机系统210被布置成执行或处理软件项目240。软件项目240是受保护软件项目——已经被应用于软件项目240(或软件项目240所并入或使用)的“保护”的性质将在稍后更详细地描述。保护系统220负责基于初始软件项目250来生成受保护软件项目240。在受保护软件项目240的执行期间,可选的强制实施系统230可以用于强制实施受保护软件项目240的完整性(或至少强制实施受保护软件项目240中的一些或全部的完整性)。这种强制实施可以包括参与(或帮助)被应用于受保护软件项目240的一个或多个保护。如将变得明显的,系统200使得能够保护初始软件项目250,使得所得到的受保护软件项目240可以在计算机系统210上执行。可选地,这也可以包括强制实施系统230在计算机系统210上的受保护软件项目240的执行期间强制实施受保护软件项目240中的一些或全部的完整性。
41.计算机系统210、保护系统220以及可选地强制实施系统230可以被布置成通过或经由网络270彼此通信。网络270可以是适合于从计算机系统210、保护系统220和强制实施系统230中的任何一个向计算机系统210、保护系统220和强制实施系统230中的另一个传输或传送数据的任何种类的网络。例如,网络270可以包括以下各项中的一个或多个:局域网、广域网、城域网、互联网、无线通信网络、线缆网络、数字广播网络、卫星通信网络、电话网络等。计算机系统210、保护系统220和强制实施系统230可以经由任何合适的通信机制/协议在网络270上通信,以便彼此传送数据。然而,应当领会的是,其他通信场景也是可能的。
42.虽然图2图示了单个计算机系统210、单个保护系统220和单个强制实施系统230,但是应当领会的是,可以存在多个计算机系统210和/或多个保护系统220和/或多个强制实施系统230,并且为了便于说明,已经简化了图2a。
43.计算机系统210、保护系统220和强制实施系统230可以各自是或者可以各自包括如上面参考图1所描述的一个或多个计算机系统100。例如,计算机系统210可以是个人计算
机、服务器计算机、膝上型电脑、移动电话、平板电脑、电视等。类似地,保护系统220和强制实施系统230可以例如各自包括一个或多个服务器计算机。
44.保护系统220和强制实施系统230可以由分离的实体来操作,或者可以由相同实体来操作。保护系统220和强制实施系统230可以在物理上彼此分离,或者它们可以共享一个或多个计算机系统100(例如,它们可以至少部分地使用一个或多个公共服务器来实现)。
45.计算机系统210的操作者可能是攻击者,因为该操作者可能希望针对在计算机系统210上执行的软件项目(或基于或使用该软件项目)发起攻击。例如:(a)软件项目可能包含或生成攻击者希望经由该攻击而获得的秘密信息(诸如,一个或多个密码学密钥、一个或多个秘密密钥、其他用户的数据等);(b)攻击者可能尝试使用该软件项目(以并非该软件项目的创建者初始所意图或授权的方式)来实现攻击者没有被授予或授权的功能,诸如通过绕开或阻止安全性检查;(c)攻击者可能希望实现并非最初利用该软件项目所意图的新功能/替代功能;(d)攻击者可能希望使用该软件项目来尝试从一个或多个服务器(例如,托管与提供或包含该软件项目的网页相关联的网站的服务器)获得对功能或数据的未授权访问;等等。
46.所谓的“白盒”攻击环境是针对软件项目执行的攻击模型,其中该模型标识出:攻击者具有如下面更详细描述的各种能力(即,攻击者可以实行某些动作/操作,并且具有对某些数据的访问权)。因此,如果当软件项目实际正在特定执行环境中执行(例如,使用特定计算机/处理器等)时,攻击者将具有那些能力,则可以说,该软件项目正在“白盒”环境中执行。在白盒攻击环境中,假定软件项目的攻击者具有对正在被操作的数据(包括中间值)、存储器内容和软件项目的执行/过程/控制流的完全访问权和可见性。此外,在白盒攻击环境中,假定攻击者能够例如通过使用调试器来修改正在被操作的数据、存储器内容和软件项目的执行/过程/控制流——以此方式,攻击者可以在该软件项目上进行试验并且尝试操纵该软件项目的操作,其目的是绕开初始所意图的功能和/或标识秘密信息和/或用于其他目的。
47.然而,软件项目可能需要使用或存储或生成秘密信息(例如,一个或多个密码学密钥或标识符),其中该信息需要对攻击者保持隐藏,或者不可由攻击者使用/不可由攻击者访问(除了作为软件项目的正确/所意图功能的一部分);软件项目可能需要基于特定判定逻辑来执行代码的不同部分,其中重要的是确保攻击者不能够违背该判定逻辑而迫使该软件执行代码的一部分而不是代码的另一部分;等等。计算机系统210的设置、配置和能力不一定为软件项目的提供者所知晓(或完全知晓),和/或不可由软件项目的提供者来控制(或完全控制),并且因此可以假定,软件项目可能最终会在白盒攻击环境中执行。由于脚本语言或解释语言(与所谓的经编译的二进制可执行文件相反)的人类可读性质,当软件项目以脚本语言或解释语言(诸如javascript)来编写时,这尤其重要——计算机系统210的用户可以查看、监测和修改这样的软件项目的执行(例如,在解释期间或在即时编译之后),这使得攻击者容易地复制和修改软件项目和/或其数据或控制流,以试图启动针对/使用软件项目的攻击。这就是为什么不是在计算机系统210上执行初始软件项目250,而是由保护系统220对初始软件项目250应用一个或多个软件保护技术,从而产生受保护软件项目240。在计算机系统210上执行的正是该受保护软件项目240。为了生成受保护软件项目240而应用的保护技术旨在使攻击者难以对受保护软件项目240实行成功的攻击,和/或旨在减少/减轻
攻击者进行的这种攻击的后果——即,该保护技术旨在针对白盒攻击环境来保卫初始软件项目250。
48.保护系统220包括保护应用222或者被布置成执行保护应用222。总的来说,保护应用222接收初始软件项目250,并且将一个或多个“保护”应用于软件项目250,从而生成并输出受保护软件项目240。因此,保护应用222包括一个或多个保护器模块或组件224,该保护器模块或组件224被布置成将一个或多个“保护”应用于初始软件项目250,或者应用于已经具有由一个或多个保护器模块224应用的这些保护中的一个或多个的软件项目250的版本(如稍后将更详细描述的)。
49.强制实施系统230包括完整性强制实施应用232或者被布置成执行完整性强制实施应用232。总的来说,在受保护软件项目240的执行或运行时期间,受保护软件项目240的执行可以取决于经由网络270从完整性强制实施应用232接收到的强制实施数据(或强制实施值/数据,或强制实施结果)。完整性强制实施应用232可以取决于受保护软件项目240在执行期间的行为(诸如,从受保护软件项目240观察到或接收到的数据)来生成强制实施数据。在一些实施例中,在受保护软件项目240的执行或运行时期间,受保护软件项目240经由网络270从完整性检查应用232接收(或获取或以其他方式获得)修复数据(其性质将被简要描述)。完整性检查应用232可以视受保护软件项目满足一个或多个完整性验证检查的情况(的要求)来提供修复数据。
50.初始软件项目250和受保护软件项目240可以各自包括一个或多个计算机程序(或软件或模块),它们可以被存储为一个或多个文件。每个文件可以包含或实现一个或多个功能。初始软件项目250和受保护软件项目240可以各自是或者实现一个或多个完整的软件应用、或软件应用的一个或多个组件(例如,库文件)、或较小的组件(例如,代码片段)。初始软件项目250可以包括用一种或多种语言编写的源代码,这些语言中的一个或多个可以与用于受保护软件项目240的(一个或多个)语言相同,尽管这不是必需的。初始软件项目250和受保护软件项目240可以各自包括编译/可执行代码和/或源代码(或解释代码)。初始软件项目250和受保护软件项目240可以包括经编译的代码,以用于作为计算机系统210处的本机应用(的一部分)来执行。初始软件项目250和受保护软件项目240可以包括用于在计算机系统210上执行的虚拟机内执行的代码。初始软件项目250和受保护软件项目240可以包括用于在计算机系统210上执行的浏览器内执行的代码(例如,作为webapp或网页的代码)。
51.如本文中关于软件项目所使用的术语“代码”指代软件项目的指令/命令。除了代码之外,软件项目(例如,初始软件项目250和受保护软件项目240)可以包括数据和/或其他资源,使得“代码”的执行(或软件项目的执行)包括执行这些指令/命令中的一些或全部,其中该执行可能潜在地涉及使用数据和/或其他资源中的一些,如果它们存在于软件项目中的话。如本文中关于软件项目所使用的术语“软件元素”指代软件项目的代码和/或其他组件(例如,数据和/或其他资源/资产)。因此,软件项目(或用于软件项目)的软件元素可以包括(a)软件项目(或用于软件项目)的一段或多段代码(例如,一个或多个指令/命令)、和/或(b)软件项目(或用于软件项目)的一段或多段数据或其他资源、和/或(c)一个或多个代码块(如下面将简要描述的)。
52.图3示意性地图示了用于与图2的系统200一起使用的受保护软件项目240的示例。初始软件项目250包括初始软件元素。受保护软件项目240可以包括来自初始软件项目250
的一些未改变的初始软件元素310(尽管应当领会的是,受保护软件项目240可以不包括初始软件项目250的未改变的初始软件元素310)。保护应用222在将一个或多个保护应用于初始软件项目250时可以修改来自初始软件项目250的初始软件元素的一个或多个部分,和/或可以引入一个或多个附加软件元素——这些所修改和/或引入的软件元素在本文中将被称为更新软件元素300。
53.如上所提到的,(一个或多个)保护器模块224的目的是保护(或保卫)初始软件项目250的功能或数据处理,和/或保护(或保卫)由初始软件项目250使用或处理或生成或存储的数据。这可以通过应用各种软件保护技术(本文中被称为“保护”)来实现,这些软件保护技术诸如伪装技术、同态数据转换、控制流转换、白盒密码学、密钥隐藏、程序互锁和边界混合中的一个或多个。
54.特别地,受保护软件项目240(即,由保护器模块224处理之后的初始软件项目250)将至少提供与初始软件项目250相同的功能或数据处理。然而,该功能或数据处理通常以如下方式在受保护软件项目240中实现:即,执行受保护软件项目240的计算机系统210的操作者不能够(或至少发现难以)以非意图或未授权的方式从受保护软件项目240访问或使用该功能或数据处理,而如果计算机系统210改为执行初始软件项目250(即,以未受保护的形式),则计算机系统210的操作者可能已经能够发起成功的攻击,并且从而以非意图或未授权的方式来访问或使用该功能或数据处理。类似地,由于(一个或多个)保护器模块224进行的处理,受保护软件项目240可以使用受保护的或模糊的操作来生成或使用或访问以经编码的(或受保护的/模糊的)形式表示的秘密信息(诸如,密码学密钥或标识符)或者利用其/对其进行操作——这使得攻击者更难以(如果不是不可能的话)推断出或访问该秘密信息(而在尚未应用保护的情况下,这种信息可能已经从初始软件项目250中推断出,或者可从初始软件项目250访问)。
55.例如:
•ꢀ
初始软件项目250可以包括判定(或判定块或分支点),该判定至少部分地基于要由初始软件项目250处理的一个或多个数据项目。如果初始软件项目250以其未受保护的形式被执行,则攻击者可能能够迫使初始软件项目250执行,使得在处理该判定之后,执行路径被遵循,即使该执行路径并不意味着已经被遵循。例如,该判定可以包括测试程序变量b是真还是假,并且初始软件项目250可以被布置成使得如果该判定标识出b为真,则执行路径pt被遵循/执行,而如果该判定标识出b为假,则执行路径pf被遵循/执行。在这种情况下,如果该判定标识出b为真,则攻击者可以(例如,通过使用调试器或通过覆写初始软件项目250)来迫使初始软件项目250遵循路径pf,和/或如果该判定标识出b为假,则攻击者可以迫使初始软件项目250遵循路径pt。因此,在一些实施例中,(一个或多个)保护器模块224中的一个或多个旨在通过将一个或多个软件保护技术应用于初始软件项目250内的该判定来防止攻击者(或至少使攻击者更难以)这样做。
56.•ꢀ
初始软件项目250可以包括一个或多个安全性相关功能;访问控制功能;密码学功能;以及权限管理功能;等等。这些功能通常涉及使用或生成秘密数据,诸如一个或多个密码学密钥。该处理可以涉及使用一个或多个密码学密钥和/或对其/利用其进行操作。如果攻击者能够标识或确定秘密数据,则出现了安全性漏洞,并且由该秘密数据保护的数据(诸如,音频和/或视频内容)的控制或管理可能会被规避。因此,在一些实施例中,(一个或
多个)保护器模块224中的一个或多个旨在通过将一个或多个软件保护技术应用于初始软件项目250内的这种功能来防止攻击者(或至少使攻击者更难以)标识或确定一个或多个秘密数据段。这可以涉及将受保护软件项目240布置成使得它在受保护软件项目240本身内以模糊的方式来表示秘密数据。附加地或可替代地,这可以涉及将受保护软件项目240布置成具有能够以模糊或加密的形式向/从存储器动态地读取和写入秘密数据的功能。
57.•ꢀ
受保护软件项目240可以包括附加功能(即,最初不在初始软件项目250中的功能)。该附加功能可以被包括在初始软件项目250中,以帮助(一个或多个)保护器模块224来形成受保护软件项目240。
58.存在许多在本文中被称为“白盒混淆技术”的技术,用于对初始软件项目250进行变换,使得它抵抗白盒攻击(即,在白盒攻击环境下可能被启动或可用的攻击)。这种白盒混淆技术的示例可以在s. chow等人的“white-box cryptography and an aes implementation”,selected areas in cryptography,9
th annual international workshop,sac 2002,lecture notes in computer science 2595(2003),p250-270和s. chow等人的“a white-box des implementation for drm applications
”ꢀ
digital rights management,acm ccs-9 workshop,drm 2002,lecture notes in computer science 2696(2003),p1-15中找到,其全部公开内容通过引用并入本文中。附加的示例可以在us61/055,694和w02009/140774中找到,其全部公开内容通过引用并入本文中。一些白盒混淆技术(诸如,上面描述的那些技术和下面阐述的其他技术)使得能够以经变换/安全的方式来存储和/或使用以及可能地操纵秘密/敏感数据(诸如,密码学密钥),攻击者难以/不可能从该方式来访问或导出底层的秘密/敏感数据。一些白盒混淆技术实现数据流混淆,参见例如us7,350,085、us7,397,916、us6,594,761和us6,842,862,其全部公开内容通过引用并入本文中。一些白盒混淆技术实现控制流混淆,参见例如us6, 779,114、us6,594,761和us6,842,862,其全部公开内容通过引用并入本文中。然而,应当领会的是,存在其他白盒混淆技术,并且本发明的实施例可以使用任何白盒混淆技术。
59.作为另一个示例,初始软件项目250有可能旨在被提供(或分发)给特定的计算机系统210(或特定的一组计算机系统210)以及由其使用,并且因此期望将初始软件项目250“锁定”到(一个或多个)特定的计算机系统210,即防止初始软件项目250(一旦被保护)在另一个计算机系统210上执行。因此,存在许多在本文中被称为“节点锁定”保护技术的技术,用于对初始软件项目250进行变换,使得受保护软件项目240可以在一个或多个预定/特定的计算机系统210上执行(或被由执行),但是将不会在其他计算机系统210上执行。这种节点锁定技术的示例可以在wo2012/126077中找到,其全部公开内容通过引用并入本文中。然而,应当领会的是,存在其他节点锁定技术,并且本发明的实施例可以使用任何节点锁定技术。
60.数字加水印是一种众所周知的技术。特别地,数字加水印涉及修改初始数字对象以产生带水印的数字对象。进行修改以便将特定数据(被称为有效载荷数据)嵌入或隐藏到初始数字对象中。有效载荷数据例如可以包括标识数字对象的所有权或其他权利信息的数据。有效载荷数据可以标识带水印的数字对象的(预期)接收者,在这种情况下,有效载荷数据被称为数字指纹,这种数字加水印可以用于帮助跟踪对数字对象的未授权拷贝的来源。数字加水印可以被应用于软件项目。这种软件加水印技术的示例可以在us7,395,433中找
到,其全部公开内容通过引用并入本文中。然而,应当领会的是,存在其他软件加水印技术,并且本发明的实施例可以使用任何软件加水印技术。
61.可能期望向不同的计算机系统210(或计算机系统210的不同用户)提供初始软件项目250的不同版本或实例。初始软件项目250的不同版本提供相同的功能,然而,初始软件项目250的不同版本被不同地编程或实现。这可以帮助限制攻击者成功攻击受保护软件项目240的影响。特别地,如果攻击者成功地攻击了受保护软件项目240的其版本,则该攻击(或通过该攻击发现或访问的数据,诸如密码学密钥)可能不适合于与受保护软件项目240的不同版本一起使用。类似地,具有初始软件项目250的不同受保护实例240帮助标识受保护软件项目240的特定用户(例如,特定计算机系统210)。因此,存在许多在本文中被称为“多样化”技术的技术,用于对初始软件项目250进行变换,使得生成初始软件项目250的不同受保护版本(即,使得引入“多样化”)。这种多样化技术的示例可以在wo2011/120123中找到,其全部公开内容通过引用并入本文中。然而,应当领会的是,存在其他多样化技术,并且本发明的实施例可以使用任何多样化技术。
62.上面提到的白盒混淆技术、节点锁定技术、软件加水印技术和多样化技术是软件保护技术的示例。应当领会的是,存在将保护应用于初始软件项目250的其他方法。因此,本文中使用的术语“软件保护技术”或“保护”应被认为意指将保护应用于初始软件项目250的任何方法(目的是挫败攻击者的攻击,或至少使攻击者更加难以成功进行其攻击),诸如上面提到的白盒混淆技术(其目的是针对白盒攻击环境进行保卫)中的任何一个或多个、和/或上面提到的节点锁定技术中的任何一个或多个、和/或上面提到的软件加水印技术中的任何一个或多个、和/或上面提到的多样化技术中的任何一个或多个、和/或下面简要描述的保护技术中的任何一个。因此,(一个或多个)保护器模块224可以被布置成将上面提到的软件保护技术或保护中的任何一个或多个应用于初始软件项目250,以生成受保护软件项目240——这可以涉及第一保护器模块224将软件保护技术应用于一些或所有初始软件项目250,并且然后可能地一个或多个保护器模块224将软件保护技术应用于前面的保护器模块224的一些或所有输出(例如,保护的顺序应用/分层)。因此,所得的受保护软件项目240可以被称为“受保护软件”。
63.(一个或多个)保护器模块224可以有众多方式在初始软件项目250内实现上面提到的软件保护技术。例如,为了保护初始软件项目250,(一个或多个)保护器模块224可以修改初始软件项目250内的一个或多个软件元素,和/或可以将一个或多个新的软件元素添加或引入到初始软件项目250中。当然,进行这些修改的实际方式或编写新软件元素的实际方式可以变化——毕竟,存在无数种编写软件的方式来实现相同的功能。
64.用于实现(一个或多个)保护器模块224以便从初始软件项目250生成受保护软件项目240的众多示例和方法可以在例如wo2015/150391和wo2015/150376中找到,其全部公开内容通过引用并入本文中。保护器模块224可以被布置成应用的保护技术的另外示例可以在wo2013/142981、wo2013/142979、wo2013/142983和wo2013/142980中找到,其全部公开内容通过引用并入本文中。
65.保护系统220可以包括或实现库数据库/存储库(图2中未示出)。库数据库可以包括一个或多个预先生成的受保护软件模块(或函数或程序或软件片段)、以及潜在地用于相同底层功能/软件的多个不同所实现/受保护的实例。这些模块是“预先生成的”,因为它们
是独立于初始软件项目250而生成的,并且潜在地是在接收到初始软件项目250之前生成的。因此,该库数据库可以被视为对于保护应用222可用的储存库,使得保护应用222(或保护器模块或组件224中的一个或多个)可以使用或在受保护软件项目240内包括被存储在库数据库内的一个或多个模块。为此,保护系统220可以被布置成执行库应用,该库应用生成被存储在库数据库中的软件模块。wo2015/150376中描述了生成受保护模块的这种库应用的示例,其全部公开内容通过引用并入本文中。保护应用222可以被布置成直接从库数据库获得软件模块,或者可以被布置成经由库应用从库数据库获得软件模块。应当领会的是,库应用可以是除保护系统220之外的实体的一部分,并且可以由该实体执行。类似地,应当领会的是,库数据库可以是除保护系统220之外的实体的一部分,并且可以由该实体提供。
66.图4是图示了根据本发明的一些实施例的操作保护系统220的示例方法400的流程图。
67.在步骤402处,保护系统220获得初始软件项目250。这可以包括保护系统220从不同的实体接收初始软件项目250。可替代地,这可以包括保护系统220生成初始软件项目250(例如,如果保护系统220正在由生成/写入并保护其自己的软件的实体所操作)。
68.在步骤404处,保护系统220使用保护应用222从所获得的初始软件项目250来生成受保护软件项目240。这可以包括:(a)将一个或多个模块或软件元素(例如,来自库数据库的软件元素)包括到初始软件项目250中,和/或(b)应用上面提到的软件保护技术中的一个或多个。如上所提到的,这可以涉及生成初始软件项目250的多个不同的受保护实例或版本。
69.在步骤406处,保护系统220可以输出受保护软件项目240。受保护软件项目240可以被存储在软件项目数据库中以供稍后访问——该数据库可以由保护系统220或不同的实体来托管。受保护软件项目240可以被提供给初始软件项目250的供应商(例如,在其中保护系统220向外部软件开发者提供保护服务的模型中)。受保护软件项目240可以经由网络270被提供给计算机系统210(例如,在如下模型中:其中保护系统220从计算机系统210接收针对软件项目的请求,并且响应于该请求向计算机系统210提供受保护软件项目240——保护系统220可以响应于该请求而生成受保护软件项目240,或者可以使用已经生成的受保护软件项目240作为对该请求的响应)。
70.图5示意性地图示了初始软件项目250的示例。特别地,图5图示了初始软件项目在诸如计算机系统100之类的系统上执行(或运行)而没有应用任何如上所阐述的“保护”时的预期行为。
71.系统210包括执行环境500。执行环境500包括(或在其中运行/执行)初始软件项目250的软件实例540。执行环境500可以包括以下各项中的任何一个或多个:虚拟机;操作系统;设备驱动器;运行时库;等等。如果初始软件项目250是以脚本语言或解释语言来编写的,则执行环境500可以包括对应的解释器。可以使用的解释语言的示例包括(但不限于):lisp;javascript;java;ruby等等。以这种方式,应当理解的是,执行环境500可以是适合于运行(或执行)初始软件项目240的任何执行环境500。
72.初始软件项目240包括一个或多个代码块530(在图5中,n个这种块被示为530-1;530-2;530-3;
……
;530-n)。为了便于讨论,下面将详细描述单个代码块530,但是应当领会的是,该讨论可以应用于代码块530-1;530-2;530-3;
……
;530-n中的任一个。
73.执行环境500通常被布置成运行(或执行)初始软件项目240作为软件实例540。软件实例540通常包括(或者已经加载了或以其他方式可用)初始软件项目240的代码块530。
74.代码块530可以被认为是上面描述的软件元素的特定类型(或子集)。代码块530通常包括初始软件项目250的(用于初始软件项目250的)一段或多段代码(例如,一个或多个指令/命令)。代码块530通常被布置成由初始软件项目250中的其他代码可调用(或者可由其他代码调取或以其他方式可以使得被其他代码执行)。换句话说,代码块530可以是或者包括一个或多个软件例程(或可调用单元)。应当领会的是,本领域中已知存在许多类型的例程,包括(但不限于)子例程、函数、过程、方法、子程序等等。软件例程通常被布置成在被执行时执行一个或多个任务(或提供一个或多个功能元素)。还应当领会的是,代码块530可以包括一个或多个另外的代码块530(或者定义一个或多个另外的代码块530或以其他方式使得一个或多个另外的代码块530被实例化)。作为示例,图5示出了包括其他代码块530-2;535-3;535-n的代码块530-1;软件实例540中的一个或多个代码块530可以具有下面将各自对应的所存储的引用535,这将在下面简要描述。图5示出了n个这种引用,如535-1;535-2;535-3;
……
;535-n。
75.软件实例340还可以包括一个或多个变量539(图5示出了多个这种变量,如539-1,1;539-1,2;539-2,1;
……
;539-n,1,其中前导后缀指示相应代码块的后缀)。变量539可以存储数据(诸如,一个或多个值、一个或多个对象等等)。通常,变量539可以由初始软件项目250中的代码(诸如,由一个或多个代码块530)来使用(或访问或以其他方式从其读取和/或向其写入)。变量539的这种使用通常将在初始软件项目250的执行的过程中。变量539的使用在计算机编程领域中是众所周知的,并且本文中不再进一步描述。变量539可以在特定代码块530中被定义(或被实例化或分配、或以其他方式由特定代码块530创建)。应当领会的是,给定代码块530可以定义多于一个变量539。
76.所存储的引用535通常被存储为软件实例540的一部分。每个所存储的引用535被布置成使得初始软件项目250中的其他指令(例如另外的代码块530)能够调取(或执行)对应的代码块530。换句话说,可以使用相应的所存储的引用535来调用代码块530。例如,所存储的引用535可以包括特定代码块530-a(或特定代码块530-a的例程)的存储器地址。另外的代码块530-b可以使用该存储器地址来调用特定代码块530-a(或例程)。特别地,另外的代码块530-b可以指令(或请求或以其他方式使得)该执行(通常由执行环境500来控制)跳转到该存储器地址,从而引起特定代码块530-a(或例程)的执行。
77.应当领会的是,所存储的引用535可以被存储为如上所描述的变量539。例如,在所存储的引用535可以包括特定代码块530的存储器地址的情况下,该存储器地址可以被存储为指针类型变量539(本文中被简称为指针)。
78.软件实例540的执行环境500可以使得特定变量539不能够由执行实例的所有部分中的指令或代码来访问。通常,特定变量539仅能够由对应的代码块530(或其中的代码)来访问。此外,在对应的代码块530定义了一个或多个另外的代码块530的情况下,通常,一个或多个另外的代码块530(或其中的代码)可以访问特定变量539。例如,在图5中,代码块530-1定义了变量539-1,1和变量539-1,2。变量539-1,1和变量539-1,2可由代码块530-1来访问。变量539-1,1和变量539-1,2也可由另外的代码块530-2;530-3;530-n来访问,该另外的代码块530-2;530-3;530-n由代码块530-1所定义。特定另外的代码块530-2定义了另外
的变量539-2,1。另外的变量539-2,1可由特定另外的代码块530-2,1来访问。另外的变量539-2,1不可由代码块530-1访问。另外的变量539-2,1不可由其他另外的代码块530-3;530-n访问。对变量539的访问通常由执行环境来强制实施。应当领会的是,即使当变量539-b不可由给定代码块530-a访问时,给定代码块530-a也可能能够调取(或执行)变量539-b对于其可访问的第二代码块530-b来访问变量539-b。然而,这里,第二代码块530-b有效地调解(或限制)给定代码块530-a对变量539-b可能具有什么影响(如果有的话),或者即使给定代码块530-a可以读取变量539-b的值。
79.由此,应当领会的是,每个代码块530可以被认为具有(或关联于)边界595,该边界595在逻辑上涵盖了所述代码块530、在所述代码块530中定义的变量539、以及所述代码块530内的另外的代码块530-a的边界595-a。图5图示了用于n个相应代码块530-1;530-2;530-3;
……
;530-n的n个这种边界,如595-1;595-2;595-3;
……
;595-n。边界595外部的软件实例540的代码不能够访问边界595内部的变量539。执行环境500通常允许边界595内部的代码块530来访问边界595外部的变量539。以这种方式,应当领会的是,边界595可以等同于在诸如javascript之类的一些编程语言中定义的代码块530的范围。应当领会的是,可能存在如下情况:其中特定边界595内的代码块530可能被阻止访问特定边界595外部的给定变量539。例如,代码块530的变量可以具有与给定变量539相同的名称,这可以防止代码块530访问给定变量539。
80.应当领会的是,在一些情况下,软件实例540中的一个或多个(或每个)代码块530可以形成相应对象570的一部分。图5示出了用于相应代码块530-2;530-3;
……
;595-n的多个这种边界,如595-2;595-3;
……
;595-n。对象570可以进一步包括对应代码块530的变量539(或者在对应代码块530中定义的变量539,或者由对应代码块530实例化或分配或以其他方式创建的变量539)。针对代码块530的所存储的引用535可以是(或包括)针对对象570的所存储的引用。在一些情况下,在代码块530的边界595外部的软件实例540的代码可以经由所存储的引用535来访问代码块530的变量539。应当领会的是,对应于代码块530的对象570可以被理解为一些编程语言(诸如,javascript、ml、lisp、python)中的闭包(或闭包对象)。
81.在软件实例540的示例执行中,代码块530-1可以开始由执行环境500来执行。可以到达代码块530-1中的指令,这使得使用对应的所存储的引用535-2来调取另外的代码块530-2。因此,该执行可以跳转到另外的代码块530-2,并且所述另外的代码块530-2的执行可以开始。另外的代码块530-2中的指令可以使得将变量539-1,1添加到另外的变量539-2,1,将结果存储在另一个变量539-1,2中。可以到达代码块530-1中的指令,这使得使用对应的所存储的引用535-2来调取另外的代码块530-3。因此,执行环境可以跳转到另外的代码块530-3,并且开始所述另外的代码块530-3的执行。这里列出了以javascript编写的用于这种执行的初始软件项目的工作示例:
这里,整个列表是代码块530-1;函数add()(包括大括号之间的代码)是另外的代码块530-2;函数subtract()(包括大括号之间的代码)是另外的代码块530-3;foo是变量539-1,1;bar是另一个变量539-1,2;baz是另外的变量539-2,1;所存储的引用535-2被存储在函数对象add中,所存储的引用535-3被存储在函数对象subtract中。
82.图6示意性地图示了在诸如图2的系统210之类的系统上执行(或运行)的受保护软件项目240的示例。受保护软件项目240可以是对应于上面参考图5描述的已经使用第一保护方法而被保护的初始软件项目250的受保护软件项目240。这里,相似的数字指示相似的元件,并且除了以下方面之外,关于图5的描述等同地适用于图6。
83.代码块530-2是软件例程530-2,该软件例程530-2是利用第一保护方法的保卫的目标。
84.该软件实例540进一步包括代码块530-4(被称为包装代码块530-4)。应当领会的是,上面对通用代码块530的讨论适用于包装代码块530-4。软件实例被布置成存储对软件例程530-2的引用535-2,使得所存储的引用535-2对于包装代码块530-4外部的代码(或指令)是不可访问的。特别地,对软件例程530-2的引用535-2可以被存储在包装代码块530-4的边界595-4内部(通常使得没有另外的边界595将对软件例程530-1的引用535-2和包装代码块530-4分离)。在包装代码块530-4是对象570-4的一部分(诸如,闭包)的情况下,对软件例程530-2的引用535-1可以被存储为私有变量,诸如形成对象570-4的一部分的变量539。应当理解的是,对象570-4的私有变量是不能够由对象570-4外部的软件实例540中的代码来访问的变量。此外,对象570的私有变量是不能够由对象570外部的软件实例540中的代码经由对象570的所存储的引用535来访问的变量。
85.包装代码块530-4被布置成在调取包装代码块530-4时使用对软件例程530-2的所存储的引用535-2来调取软件例程530-2。
86.包装代码块530-4通常被布置成确定软件例程530-2是否已经被包装代码块530-4
调取了预定次数。包装代码块530-4可以被布置成存储计数器变量,以用于对软件例程530-2的调取次数进行计数(或记录或以其他方式跟踪)。应当领会的是,通常存储计数器变量,使得计数器变量对于包装代码块530-4外部的代码(或指令)是不可访问的。计数器变量的这种存储可以以与上面讨论的存储对软件例程530-2的引用535-2相同的方式来实现。
87.通常,包装代码块530-4被布置成:在包装代码块530-4对软件例程530-1进行预定次数的调取之后,修改对软件例程530-2的所存储的引用535-2。应当领会的是,对软件例程530-2的所存储的引用535-2的这种修改可以是防止包装代码块530-4进一步调取软件例程530-2的任何修改。例如,以下各项中的任一个:将所存储的引用设置为不同的值(诸如,空值);解除分配(或释放)保存所存储的引用的变量;在使用指针来存储所存储的引用的情况下,修改该指针中存储的存储器地址;覆写所存储的引用的函数对象等等。然而,应当领会的是,在软件例程530-2仅被包装代码块530-4调取一次的情况下,不需要进行确定。这里,包装代码块530-4可以被布置成在每次调取包装代码块530-4时修改对软件例程530-2的所存储的引用535-2。
88.应当领会的是,包装代码块530-4可以被布置成在调取软件例程530-2时将任何输入(或参数)(诸如,直接提供给软件例程530-4的输入或参数)传递给软件例程530-2。类似地,包装代码块530-4可以被布置成:当软件例程返回(或终止或以其他方式完成)时,传递来自软件例程530-2的任何输出(或返回值)作为包装代码块530-4的输出(或返回值)。
89.软件实例540被布置成调取包装代码块530-4,以便调取软件例程530-2。通常,软件实例540被布置成:当在包装代码块530-4外部时,使用对包装代码块530-4的所存储的引用530-4来调取软件例程530-2。由此,应当领会的是,在受保护软件项目240中,与软件例程530-2的调取相关的初始软件项目250中的一些或所有代码可能已经被别名化(或被替换或以其他方式重定向)为与包装代码块530-4的调取相关的代码。例如,对软件例程530-2的一个或多个函数调用可以用对包装代码块530-4的函数调用来替换。
90.以这种方式,应当领会的是,对所选择的软件例程可以被执行的次数进行了限制。能够影响调用栈(或控制流或以其他方式调取实例的代码块)并且希望运行该软件例程超过该预定次数的攻击者会面临窘境。攻击者可能会尝试并直接调取该软件例程。然而,因为攻击者无权直接访问对软件例程530-2的引用535-2(由于如上所阐述的其存储),所以攻击者将不能够直接调取该软件例程。攻击者可能会尝试并使用包装代码块来调取该软件例程。然而,如上所阐述,包装代码块将该软件例程的调取次数限制为预定次数。附加地,在软件实例通过调取包装代码块来调取该软件例程时,攻击者甚至可能不知道该软件例程的存在,更不用说其目的了。
91.在一些情况下,受保护软件项目240包括另外的代码块530-99。在软件实例540中,另外的代码块530-99通常在它被定义的代码中的同一点处执行。换句话说,另外的代码块530-99是不可调用的,这是因为对另外的代码块530-99的引用没有被存储为软件实例的一部分。这种另外的代码块530-99通常被称为匿名函数(或lambda函数)。例如,如果受保护软件项目240是以javascript存在的,则可以使用这种技术。
92.如先前所描述,另外的代码块530-99可以具有(或关联于)逻辑上涵盖了代码块530-99的边界595-99。通常,一旦被执行,该另外的代码块就形成如先前所描述的对象570-99的一部分(诸如,闭包)。
93.另外的代码块530-99可以被布置成定义包装代码块530-4。以这种方式,包装代码块530-4在另外的代码块530-99的边界595-99内,因此可以访问对软件例程530-2的引用535-2。
94.软件实例540被布置成存储对包装代码块530-4的引用535-4,使得引用535-4对于另外的代码块530-99外部的代码是不可访问的。特别地,对软件例程530-2的引用535-2可以被存储在另外的代码块530-99的边界595-99内部(通常使得没有另外的边界595将对软件例程530-1的引用535-2和另外的代码块530-99分离),作为将引用535-2存储在包装代码块530-4的边界595-4内部的替代方案。在另外的代码块530-99是对象570-99的一部分(诸如,闭包)的情况下,对软件例程530-2的引用535-1可以被存储为私有变量,诸如形成对象570-99的一部分的变量539。应当领会的是,由于不存在对另外的代码块530-99(或对应的对象570-99)的引用,所以在另外的代码块530-99外部的代码不能够访问对软件例程530-2的引用535-2。由于包装代码块530-4在另外的代码块530-99的边界595-99内部,所以对软件例程530-2的引用535-1可以仍然可由包装代码块530-4来访问。
95.这里列出了以javascript编写的用于这种执行的这种受保护软件项目240的工作示例:。
96.这里,整个列表是代码块530-1;函数add()(包括大括号之间的代码)是软件例程530-2。在sec_add的指派中执行的匿名函数是另外的代码块530-99;func是所存储的引用535-2;由匿名函数返回的函数是代码块530-4,并且sec_add是对代码块530-4的所存储的
引用。为了易于理解,软件例程530-2 add()是被引用的函数,因此存储在add中的附加引用被无效(nullify)。然而,应当领会的是,软件例程530-2 add()可以在没有显式引用(诸如,匿名函数)的情况下创建。
97.图7a示出了由受保护软件项目240(诸如,上面参考图6描述的受保护软件项目240)在执行期间使用的初始化方法700。方法700通常涉及保卫在执行环境500中执行的软件实例540中实现的软件例程350-2。该方法包括以下步骤。
98.步骤710包括:利用对软件例程530-2的引用535-2来初始化软件实例540的代码块530-4(诸如,上面讨论的包装代码块)。步骤710包括存储该引用,使得所存储的引用对于包装代码块530-4外部的软件实例的代码是不可访问的。步骤710可以包括另外的代码块530-99(诸如,匿名函数)存储对软件例程530-2的引用535-2。特别地,引用535-2可以被存储为该匿名函数的闭包对象的一部分。
99.步骤720包括返回引用535-4,其中引用535-4指向包装代码块530-4。步骤720可以包括将对包装代码块530-4的引用535-4返回给软件实例540。步骤720可以包括另外的代码块530-99返回引用535-4。通常,对包装代码块530-4的引用535-4对于包装代码块530-4外部的软件实例的代码是可访问的。
100.图7b示出了由受保护软件项目240(诸如,上面参考图6描述的受保护软件项目240)在执行期间使用的方法750。方法750通常遵循初始化方法,诸如方法700。方法750可以被认为是执行软件实例540的包装代码块530-4,并且包括以下步骤。
101.步骤752包括调取软件例程530-2。子步骤752包括使用对软件例程530-2的引用535-2以便调取软件例程530-2。
102.步骤754包括确定该软件例程已经被代码块调取了预定次数。通常,如果在子步骤754确定该软件例程已经被代码块调取了预定次数,则执行步骤756。
103.步骤756包括修改所存储的引用535-2,以便防止对软件例程530-2的进一步调取,如先前所描述的那样。
104.图8示意性地图示了在诸如图2a或2b的系统210之类的系统上执行(或运行)的受保护软件项目240的示例。受保护软件项目240可以是对应于上面参考图5描述的已经使用第二保护方法而被保护的初始软件项目240的受保护软件项目250。这里,相似的数字表示相似的元件,并且除了以下方面之外,关于图5和6的描述等同地适用于图7。
105.代码块530-2是软件例程530-2,该软件例程530-2是利用第二种保护方法的保卫的目标。
106.软件实例被布置成存储损坏数据531-4,使得所存储的损坏数据531-4对于包装代码块530-4外部的代码(或指令)是不可访问的。如先前所描述的那样,损坏数据531-4通常被存储为变量539或被存储在变量539中。损坏数据531-4可以被存储在包装代码块530-4的边界595-4内部(通常使得没有另外的边界595-n将对软件例程530-1的引用535-2和包装代码块530-4分离)。在包装代码块530-4是对象570-4的一部分(诸如,闭包)的情况下,损坏数据531-4可以被存储为私有变量539,该私有变量539形成对象570-4的一部分。
107.包装代码块530-4被布置成在调取包装代码块530-4时使用对软件例程530-2的所存储的引用535-2来调取软件例程530-2。特别地,包装代码块530-4被布置成应用所存储的损坏数据531-4(通常作为软件例程530-2的调取的一部分)来修改软件例程数据。包装代码
块530-4还被布置成基于对软件例程530-2的调取来更新所存储的损坏数据531-4。包装代码块530-4可以被布置成基于以下各项中的任何一个或多个来更新所存储的损坏数据531-4:对软件例程530-2的调取次数;用于软件例程530-2的输入(或参数);来自软件例程530-2的作为输出(或返回值)的输出(或返回值);在软件例程530-2的执行期间计算(或使用)的中间数据(或值);等等。
108.应当领会的是,软件例程数据通常指代在该软件例程的处理(或执行)中使用的数据。附加地或可替代地,软件例程数据可以指代由该软件例程生成的数据。软件例程数据可以包括以下各项中的任何一个或多个:用于软件例程530-2的输入(或参数);来自软件例程530-2的作为输出(或返回值)的输出(或返回值);在软件例程530-2的执行期间计算(或使用)的中间数据(或值);等等。
109.软件实例540被布置成接收对应于所存储的损坏数据的修复(或补偿)数据。软件实例被布置成将修复数据应用于软件例程数据。修复数据通常被布置成补偿由于应用损坏数据而导致的软件例程数据的修改。在一些情况下,修复数据可以被应用于与损坏数据相同的软件数据。将修复数据和损坏数据一起应用于软件数据的影响可能是什么也没有。换句话说,修复数据可以在逻辑上或数学上消除损坏数据。在一些情况下,修复数据可以被应用于不同于损坏数据的软件数据。在这种情况下,修复数据可以消除损坏数据对软件数据的影响。还应当领会的是,可以在应用损坏数据之前应用修复数据。在这种情况下,损坏数据可以消除修复数据对软件数据的影响。在一些情况下,修复数据和损坏数据的应用可以导致对软件数据执行附加的操作(或处理)。
110.以这种方式,应当领会的是,在没有修复数据的情况下(或者如果修复数据不正确,即修复数据不补偿损坏数据),软件实例540的功能受到损害。特别地,该软件例程的结果可能是不正确的,或者没有被获得。
111.修复数据通常由先前描述的完整性强制实施应用232来生成和/或提供。应当领会的是,完整性强制实施应用232可以基于软件实例540的状态的知识来生成修复数据。完整性强制实施应用232可以基于软件实例540的预测状态来生成修复数据。例如,完整性强制实施应用232可能已经存储了或者能够模拟针对给定任务调取软件例程的次数。完整性强制实施应用232可能已经存储了或能够模拟软件例程针对给定任务的先前输出或输出链等等。以这种方式,应当领会的是,对软件例程的执行进行了限制。能够影响调用栈(或控制流或以其他方式调取实例的代码块)并且希望运行该软件例程的攻击者仍然需要获得适当的修复数据,否则软件实例将不会正确地运作。附加地,如果攻击者简单地调取该软件例程,则与完整性强制实施应用232的同步可能会丢失。因此,由于对该软件例程的非预期附加调取,由完整性强制实施应用232提供的另外的修复数据可能不会正确地补偿(未更新的)损坏数据。
112.附加地或可替代地,应当领会的是,软件实例540的一个或多个不同的软件例程530-2可以生成和/或提供修复数据。这可以基于不同软件例程的先前执行来生成。这可以基于对软件例程530-2和一个或多个不同软件例程530-2的预期调用序列来完成。由此,如果软件例程530-2在预期序列之外被调用(即,如果调用图被破坏),则所生成的修复将与损坏数据不匹配,并且该软件实例将不会正确地运作。
113.在一些情况下,例如当受保护软件项目240以javascript编写时,受保护软件项目
240包括如先前所阐述的另外的代码块530-99。
114.软件实例540被布置成将损坏数据531-4存储到包装代码块530-4,使得该损坏数据对于另外的代码块530-99外部的代码是不可访问的。
115.损坏数据531-4可以被存储在另外的代码块530-99的边界595-99内部(通常使得没有另外的边界595将损坏数据531-4和另外的代码块530-99分离),作为将损坏数据531-4存储在包装代码块530-4的边界595-4内部的替代方案。在另外的代码块530-99是对象570-99的一部分(诸如,闭包)的情况下,损坏数据531-4可以被存储为私有变量,诸如形成对象570-99的一部分的变量539。应当领会的是,由于不存在对另外的代码块530-99(或对应的对象570-99)的引用,所以在另外的代码块530-99外部的代码不能够访问损坏数据531-4。由于包装代码块530-4在另外的代码块530-99的边界595-99内部,所以损坏数据531-4可以仍然可由包装代码块530-4来访问。
116.这里列出了以javascript编写的用于这种执行的这种受保护软件项目的工作示例:。
117.这里,整个列表是代码块530-1;函数add()(包括大括号之间的代码)是软件例程530-2。在cor_add的指派中执行的匿名函数是另外的代码块595-99;func是所存储的引用535-2;由匿名函数返回的函数是代码块530-4,并且cor_add是对代码块530-4的所存储的引用。corrupt是所存储的损坏数据531-4,并且fixup是修复数据(未示出接收修复数据的步骤)。
118.图9a示出了由受保护软件项目240(诸如,上面参考图8描述的受保护软件项目240)在执行期间使用的初始化方法900。方法900通常涉及保卫在执行环境500中执行的软件实例540中实现的软件例程350-2。该方法包括以下步骤。
119.步骤910包括利用损坏数据531-4来初始化软件实例540的包装代码块530-4。通常,步骤910包括存储损坏数据531-4,使得所存储的损坏数据531-4对于包装代码块530-4外部的软件实例的代码是不可访问的。步骤910可以包括另外的代码块530-99(诸如,匿名函数)存储损坏数据531-4。特别地,损坏数据531-4可以被存储为匿名函数的闭包对象的一部分。
120.步骤920包括返回引用535-4,其中引用535-4指向包装代码块530-4。步骤920可以包括将对包装代码块530-4的引用535-4返回给软件实例540。步骤920可以包括另外的代码块530-99返回引用535-4。通常,对包装代码块530-4的引用535-4对于包装代码块530-4外部的软件实例的代码是可访问的。
121.图9b示出了由受保护软件项目240(诸如,上面参考图8描述的受保护软件项目240)在执行期间使用的方法950。方法950通常遵循初始化方法,诸如方法900。方法950可以被认为是执行软件实例540的包装代码块530-4,并且包括以下步骤。
122.步骤952包括调取软件例程530-2。步骤952包括使用对软件例程530-2的引用535-2以便调取软件例程530-2。步骤952包括应用所存储的损坏数据531-4来修改软件例程数据,如先前所描述的那样。
123.步骤954包括基于对该软件例程的调取来更新所存储的损坏数据531-4。
124.步骤956包括从完整性强制实施应用232接收修复数据。
125.步骤958包括获得针对该软件例程的结果。步骤958通常包括将修复数据应用于软件例程数据。应当领会的是,步骤956和步骤958可以与一些或所有前面的步骤952;954同时地(或部分同时地)发生。例如,修复数据可以在应用损坏数据期间或之前被应用于软件例程数据,如先前所讨论的那样。
126.应当领会的是,所描述的方法已经被示出为以特定次序实行的个体步骤。然而,本领域技术人员应当领会,这些步骤可以被组合或以不同的次序实行,同时仍然实现期望的结果。
127.应当领会的是,本发明的实施例可以使用各种不同的信息处理系统来实现。特别地,尽管附图及其讨论提供了示例性计算系统和方法,但是呈现这些仅仅是为了在讨论本发明的各种方面时提供有用的参考。本发明的实施例可以在任何合适的数据处理设备上实行,该数据处理设备诸如个人计算机、膝上型电脑、个人数字助理、移动电话、机顶盒、电视、服务器计算机等。还应当领会的是,合适的数据处理设备可以包括嵌入式设备。这种设备的示例可以包括(但不限于)汽车中的嵌入式处理系统。当然,出于讨论的目的,已经简化了系统和方法的描述,并且它们只是可以用于本发明的实施例的许多不同类型的系统和方法中的一个。应当领会的是,逻辑块之间的边界仅仅是说明性的,并且替代实施例可以合并逻辑块或元素,或者可以在各种逻辑块或元素下强加功能的替代分解。
128.应当领会的是,上面提及的功能可以被实现为作为硬件和/或软件的一个或多个对应模块。例如,上面提及的功能可以被实现为一个或多个软件组件以供该系统的处理器执行。可替代地,上面提及的功能可以被实现为硬件,诸如一个或多个现场可编程门阵列(fpga)、和/或一个或多个专用集成电路(asic)、和/或一个或多个数字信号处理器(dsp)、和/或其他硬件布置。在本文中包含的流程图中实现的或如上所描述的方法步骤可以均由对应的相应模块来实现;在本文中包含的流程图中实现的或如上所描述的多个方法步骤可
以由单个模块一起实现。
129.应当领会的是,由于本发明的实施例由计算机程序来实现,因此存储或承载计算机程序的一个或多个存储介质和/或一个或多个传输介质形成本发明的方面。计算机程序可以具有一个或多个程序指令或程序代码,当由一个或多个处理器(或一个或多个计算机)执行时,这些程序指令或程序代码实现本发明的实施例。本文中使用的术语“程序”、“软件”或“软件项目”可以是被设计用于在计算机系统上执行的指令序列,并且可以包括子例程、函数、过程、模块、对象方法、对象实现、可执行应用、小应用、小服务程序、源代码、对象代码、字节代码、共享库、动态链接库、和/或被设计用于在计算机系统上执行的其他指令序列,其可能具有数据和/或其他资源。存储介质可以是磁盘(诸如,硬盘或软盘)、光盘(诸如,cd-rom、dvd-rom或蓝光盘)、或存储器(诸如,rom、ram、eeprom、eprom、闪速存储器、或便携式/可移除存储器设备)等。传输介质可以是通信信号、数据广播、两个或更多个计算机之间的通信链路等。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献