生成和执行受保护的软件项目的制作方法

文档序号:12811187阅读:213来源:国知局
生成和执行受保护的软件项目的制作方法与工艺

本发明涉及生成受保护的软件项目的方法、执行软件项目的方法、受保护的软件项目、以及用于实施这样的方法的计算机程序和装置。



背景技术:

已知的是攻击者发动对软件应用的攻击。这样的攻击可以具有影响非常广泛且有破坏性的后果(就财务损失、名誉损失、时间损失、数据损失和数据泄露而言)。软件和系统开发者与攻击者进行持久的抗争,由此,开发者尝试开发措施以阻挠攻击者可能发动的攻击,并且其中攻击者尝试开发新的攻击,其克服或者绕过开发者所采取的措施。

一种示例攻击类型是所谓的“面向返回的编程”(rop)攻击。关于rop攻击,攻击者获取软件项目(也就是说,攻击者希望执行对其的攻击的软件项目)并在软件项目的代码(或者指令,诸如机器语言指令或者编译软件和/或数据的操作码)上执行静态分析。特别地,攻击者寻找软件项目中的机器语言指令(或操作码),其引起(或实现)函数返回或者过程返回(诸如,用于x86架构的oxc3指令)。在已经找到这样的“返回指令”的情况下,攻击者标识软件项目中的返回指令紧前面的指令中的一个或多个。与其紧前面的指令中的一个或多个一起,返回指令一起形成所谓的“小配件(gadget)”。

例如,用于软件项目中的特定函数f的指令可以沿着下面示例1的以下伪代码的行:

示例1

在该示例中,将“返回指令”图示为指令ret,并且指令inccx图示返回指令紧前面的一个或多个所标识的指令。因此,攻击者可能已经标识或者定位用于软件项目的代码中的指令ret。作为他的攻击的一部分,攻击者可能希望执行inccx指令——攻击者因此将ret指令紧前面的inccx指令的存在标识为对他有用(如将从以下讨论中变得明显)。因此,攻击者将指令inccx和ret标识为一起形成小配件,其可用于使攻击者在攻击中使用。当然,将领会到,除inccx之外的指令可以对攻击者有用,并且小配件可以包括返回指令紧前面的多个一个指令。

攻击者标识多个这样的小配件,每一个小配件潜在地具有(一个或多个)不同的相应指令,从而有效地标识或形成软件项目内的所标识的小配件的库。

rop攻击然后牵涉到攻击者执行所谓的“栈溢出攻击”(例如,标识软件项目中的缓冲器充溢易损性,其有效地使得攻击者能够向栈写入攻击者希望放置在栈上的不论什么数据)。这允许攻击者写入调用栈上的一个或多个返回地址。以该方式,攻击者可以写入在小配件中标识第一指令的返回地址,从而使处理器执行小配件中的指令。一旦已经执行该小配件中的指令,小配件的结尾处的返回指令使得执行在调用栈上的下一返回地址处继续——调用栈上的该返回地址还可以是下述值:攻击者已经设法将该值写入到调用栈,并且该值可以是在另一个小配件中标识第一指令的地址,这意味着攻击者可以使处理器执行该另一个小配件中的指令。扩展这一点,攻击者可以执行攻击者希望的任何小配件序列。本质上,通过将控制转移给子例程(函数或过程)的尾端部分而不是经由其正常入口点调用那些子例程,攻击者以非意图的方式使用软件项目内的现有代码。

例如,如果攻击者希望作为攻击的一部分而执行inccx指令,则攻击者可以在调用栈上包括以上示例小配件的inccx指令的地址。

如果初始软件项目足够大,则可用于攻击者且由攻击者生成的小配件的库是充分的以使得攻击者可以使用小配件执行的指令集变为图灵完整语言——因而,攻击者可以针对他希望的任何功能性(包括循环和条件分支)而执行任何指令序列。

rop攻击特别有破坏性,因为其利用软件项目自身中的指令,使得许多对策(诸如完整性验证)不会检测到rop攻击——这是因为没有新指令本身由攻击者引入/写入。

在给定rop攻击的性质的情况下,可能的是,攻击者自动化标识小配件和创建攻击者可运用的小配件库。遵循这一点,攻击者的期望功能性可以被容易地准备到攻击中(例如,作为要经由缓冲器充溢而加载到栈上的返回地址的序列)。

存在其它攻击,其利用存在于初始软件项目中的原始指令。附加地,攻击者不断地开发新的攻击并演进现有攻击。在给定可用于攻击者的资源之一是形成软件项目自身的指令集的情况下,非常有可能的是,利用形成软件项目的指令的rop相关攻击(或者其它完全不同的攻击)将由攻击者开发和部署。



技术实现要素:

将合期望的是,为软件项目的开发者提供抵抗这样的攻击的对策和防御。本发明的一些实施例的目的是提供抵抗这样的攻击的一个或多个对策和防御。类似地,将合期望的是,使攻击者更加难以自动化攻击的成功生成——如果攻击的生成不能够被自动化,则攻击者需要手动干预攻击生成,这减缓了攻击生成或者的确可以使攻击者寻找要攻击的不同的目标软件项目。本发明的一些实施例的目的是使攻击者更难自动化其攻击生成。将合期望的是,为软件项目的开发者提供抵抗这样的攻击的对策和防御。本发明的一些实施例的目的是提供抵抗这样的攻击的一个或多个对策和防御。此外,将合期望的是,具有在这样的攻击发生时检测和/或阻挠它们的能力,即便以上提及的对策和防御没有得到部署或者将要失效。本发明的一些实施例的目的是生成和/或执行受保护的软件项目,其具有在这样的攻击发生于运行时处时检测它们和/或采取抵抗它们的对策的能力。

根据本发明的第一方面,提供了一种生成受保护的软件项目的方法,存在用于受保护的软件项目的代码内的执行路径,其使得在执行用于第一函数的代码之前执行用于一个或多个第二函数的代码,其中用于所述一个或多个第二函数的代码的执行使得在一个或多个存储器位置处存储数据,该数据满足一个或多个预定属性的集合,其中在执行用于受保护的软件项目的代码时对受保护的软件项目的攻击缺失的情况下,第一函数被布置成提供第一功能性,所述方法包括:配置用于第一函数的代码,使得通过一个或多个处理器对用于第一函数的代码的执行仅在以下情况下提供第一功能性:在执行第一函数时存储在所述一个或多个存储器位置处的数据满足一个或多个预定属性的集合。

在一些实施例中,所述配置被布置成使得通过所述一个或多个处理器对用于第一函数的代码的执行在以下情况下提供与第一功能性不同的第二预定功能性:在执行第一函数时存储在所述一个或多个存储器位置处的数据没有满足一个或多个预定属性的集合。

在一些实施例中,所述配置包括作为用于第一函数的代码的一部分而包括代码部分,其在由所述一个或多个处理器执行时使所述一个或多个处理器:确定在执行第一函数时存储在所述一个或多个存储器位置处的数据是否满足一个或多个预定属性的集合;以及如果确定一个或多个预定属性的集合没有得到满足,则提供与第一功能性不同的第二预定功能性。所述代码部分可以作为用于第一函数的代码的一部分而被包括在用于第一函数的代码中的返回点的附近。可替换地,所述代码部分可以作为用于第一函数的代码的一部分而被包括在用于第一函数的代码的开头的附近。

在一些实施例中,第二预定功能性独立于在执行第一函数时存储在所述一个或多个存储器位置处的数据。

在一些实施例中,所述方法包括接收初始软件项目,其中用于初始软件项目的代码包括用于第一函数的初始代码,其中所述配置包括修改用于第一函数的初始代码以便针对受保护的软件项目而生成用于第一函数的代码。用于初始软件项目的代码可以包括用于所述一个或多个第二函数中的至少一个的初始代码,在该情况下,所述方法可以包括修改用于所述一个或多个第二函数中的所述至少一个的初始代码以便针对受保护的软件项目而生成用于所述一个或多个第二函数中的至少一个的代码。

根据本发明的第二方面,提供了一种执行软件项目的方法,存在用于软件项目的代码内的执行路径,其使得在执行用于第一函数的代码之前执行用于一个或多个第二函数的代码,其中用于所述一个或多个第二函数的代码的执行使得在一个或多个存储器位置处存储数据,所述数据满足一个或多个预定属性的集合,其中在执行用于软件项目的代码时对软件项目的攻击缺失的情况下,第一函数被布置成提供第一功能性,所述方法包括:通过一个或多个处理器执行用于第一函数的代码,其中所述执行仅在以下情况下提供第一功能性:在执行第一函数时存储在所述一个或多个存储器位置处的数据满足一个或多个预定属性的集合。

在一些实施例中,所述执行包括在以下情况下提供与第一功能性不同的第二预定功能性:在执行第一函数时存储在所述一个或多个存储器位置处的数据没有满足一个或多个预定属性的集合。

在一些实施例中,所述执行包括:确定在执行第一函数时存储在所述一个或多个存储器位置处的数据是否满足一个或多个预定属性的集合;以及如果确定一个或多个预定属性的集合没有得到满足,则提供与第一功能性不同的第二预定功能性。所述确定可以通过用于第一函数的代码的部分而执行,所述部分处于用于第一函数的代码中的返回点附近。可替换地,所述确定可以通过用于第一函数的代码的部分而执行,所述部分处于用于第一函数的代码的开头附近。

在一些实施例中,第二预定功能性独立于在执行第一函数时存储在所述一个或多个存储器位置处的数据。

在一些实施例中,在执行第一函数时存储在所述一个或多个存储器位置处的数据满足所述一个或多个预定属性指示已经以预定次序调用所述一个或多个第二函数和第一函数。在一些实施例中,在执行第一函数时存储在所述一个或多个存储器位置处的数据没有满足所述一个或多个预定属性指示尚未以预定次序调用所述一个或多个第二函数和第一函数。在这两种情况中的任一种情况下,第一函数可以是函数f0,并且一起地,所述一个或多个第二函数和第一函数可以形成一组函数fi,其中i=0,…,n,其中n是正整数,并且其中对于每一个i=1,…,n,函数fi被布置成调用函数fi-1。

在一些实施例中,通过用于所述一个或多个第二函数的代码的执行而存储的数据包括一个或多个预定值。

在一些实施例中,通过用于所述一个或多个第二函数的代码的执行而存储的数据包括一个或多个值,所述一个或多个值是至少部分地通过在执行所述一个或多个第二函数中的至少一个时执行的计算来确定的。

在一些实施例中,通过用于所述一个或多个第二函数的代码的执行而存储的数据包括所述一个或多个第二函数中的一个内的指令的地址,在所述地址处,执行要在由所述一个或多个第二函数中的所述一个调用的函数的执行已经完成之后进行恢复。

在一些实施例中,用于第一函数的代码被配置成使得在完成第一函数的执行时,用于软件项目的代码的执行在下述地址处进行恢复:所述地址取决于通过用于所述一个或多个第二函数的代码的执行而存储的数据的至少部分。用于软件项目的代码的执行在取决于通过用于所述一个或多个第二函数的代码的执行而存储的数据的至少部分的地址处进行恢复可以避免一个或多个空指令(dummyinstruction)的执行。

在一些实施例中,所述一个或多个存储器位置包括栈上的至少一个位置。

在一些实施例中,存储在所述一个或多个存储器位置处的数据对一个或多个预定属性的集合的满足至少部分地基于以下各项中的一个或多个:(a)存储在所述一个或多个存储器位置处的数据的至少部分具有预定值;(b)存储在所述一个或多个存储器位置处的两个或更多数据项目具有预定关系;以及(c)存储在所述一个或多个存储器位置处的数据的至少部分使得能够确定执行流要继续到的指令的地址以便提供第一功能性。

根据本发明的第三方面,提供了一种软件项目,其中存在用于软件项目的代码内的执行路径,其使得在执行用于第一函数的代码之前执行用于一个或多个第二函数的代码,其中用于所述一个或多个第二函数的代码的执行使得数据存储在一个或多个存储器位置处,所述数据满足一个或多个预定属性的集合,其中在执行用于软件项目的代码时对软件项目的攻击缺失的情况下,第一函数被布置成提供第一功能性,其中用于第一函数的代码被布置成仅在以下情况下提供第一功能性:在执行第一函数时存储在所述一个或多个存储器位置处的数据满足一个或多个预定属性的集合。

在一些实施例中,用于第一函数的代码被布置成使得在以下情况下提供与第一功能性不同的第二预定功能性:在执行第一函数时存储在所述一个或多个存储器位置处的数据没有满足一个或多个预定属性的集合。

在一些实施例中,用于第一函数的代码被布置成:确定在执行第一函数时存储在所述一个或多个存储器位置处的数据是否满足一个或多个预定属性的集合;以及如果确定一个或多个预定属性的集合没有得到满足,则提供与第一功能性不同的第二预定功能性。所述确定可以通过用于第一函数的代码的部分而执行,所述部分处于用于第一函数的代码中的返回点附近。可替换地,所述确定可以通过用于第一函数的代码的部分而执行,所述部分处于用于第一函数的代码的开头附近。

在一些实施例中,第二预定功能性独立于在执行第一函数时存储在所述一个或多个存储器位置处的数据。

在一些实施例中,在执行第一函数时存储在所述一个或多个存储器位置处的数据满足所述一个或多个预定属性指示已经以预定次序调用所述一个或多个第二函数和第一函数。在一些实施例中,在执行第一函数时存储在所述一个或多个存储器位置处的数据没有满足所述一个或多个预定属性指示尚未以预定次序调用所述一个或多个第二函数和第一函数。在这两种情况中的任一种情况下,第一函数可以是函数f0,并且一起地,所述一个或多个第二函数和第一函数可以形成一组函数fi,其中i=0,…,n,其中n是正整数,并且其中对于每一个i=1,…,n,函数fi被布置成调用函数fi-1。

在一些实施例中,通过用于所述一个或多个第二函数的代码的执行而存储的数据包括一个或多个预定值。

在一些实施例中,通过用于所述一个或多个第二函数的代码的执行而存储的数据包括一个或多个值,所述一个或多个值是至少部分地通过在执行所述一个或多个第二函数中的至少一个时执行的计算来确定的。

在一些实施例中,通过用于所述一个或多个第二函数的代码的执行而存储的数据包括所述一个或多个第二函数中的一个内的指令的地址,在所述地址处,执行要在由所述一个或多个第二函数中的所述一个调用的函数的执行已经完成之后进行恢复。

在一些实施例中,用于第一函数的代码被配置成使得在完成第一函数的执行时,用于软件项目的代码的执行在下述地址处进行恢复:所述地址取决于通过用于所述一个或多个第二函数的代码的执行而存储的数据的至少部分。用于软件项目的代码的执行在取决于通过用于所述一个或多个第二函数的代码的执行而存储的数据的至少部分的地址处进行恢复可以避免一个或多个空指令的执行。

在一些实施例中,所述一个或多个存储器位置包括栈上的至少一个位置。

在一些实施例中,存储在所述一个或多个存储器位置处的数据对一个或多个预定属性的集合的满足至少部分地基于以下各项中的一个或多个:(a)存储在所述一个或多个存储器位置处的数据的至少部分具有预定值;(b)存储在所述一个或多个存储器位置处的两个或更多数据项目具有预定关系;以及(c)存储在所述一个或多个存储器位置处的数据的至少部分使得能够确定执行流要继续到的指令的地址以便提供第一功能性。

根据本发明的第四方面,提供了一种生成受保护的软件项目的方法,所述方法包括:作为受保护的软件项目的一部分而包括第一代码部分,其中第一代码部分的至少部分对于攻击者有用以用于执行对受保护的软件项目的预定类型的攻击;以及作为受保护的软件项目的一部分而包括第二代码部分,其中第二代码部分在受保护的软件项目的运行时处使得能够修改第一代码部分的至少部分。

在一些实施例中,第一代码部分作为受保护的软件项目的一部分而被包括,使得从不在执行受保护的软件项目时执行第一代码部分的至少部分。

在一些实施例中,所述作为受保护的软件项目的一部分而包括第一代码部分包括:在用于受保护的软件项目的代码中标识第三代码部分;修改第三代码部分以形成第一代码部分;以及使用第一代码部分而不是第三代码部分作为受保护的软件项目的一部分;并且其中在受保护的软件项目的运行时处第一代码部分的所述至少部分的所述修改将第一代码部分改变成第三代码部分。

在一些实施例中,所述方法包括作为受保护的软件项目的一部分而包括另外的代码部分,其中所述另外的代码部分在受保护的软件项目的运行时处使得能够撤销第一代码部分的至少部分的所述修改。

在一些实施例中,所述方法包括接收初始软件项目并且修改初始软件项目以便生成受保护的软件项目,其中所述修改初始软件项目包括所述作为受保护的软件项目的一部分而包括第一代码部分以及所述作为受保护的软件项目的一部分而包括第二代码部分。

根据本发明的第五方面,提供了一种执行软件项目的方法,其中所述软件项目包括代码,所述代码包括第一代码部分,所述第一代码部分对于攻击者有用以用于执行对软件项目的预定类型的攻击,其中所述方法包括:在受保护的软件项目的运行时处修改第一代码部分的至少部分。

在一些实施例中,从不在执行软件项目时执行第一代码部分。

在一些实施例中,对第一代码部分的所述至少部分的所述修改生成经修改的第一代码部分,其被布置成执行用于软件项目的所意图的功能性。

在本发明的第四或第五方面的一些实施例中,预定类型是面向返回编程攻击。

在本发明的第四或第五方面的一些实施例中,第一代码部分的至少部分的所述修改被布置成使得如果攻击者执行预定攻击的攻击并且所述攻击被布置成使用第一代码部分,则经修改的第一代码部分而不是第一代码部分在运行时处的存在使所述攻击失败。

根据本发明的第六方面,提供了一种软件项目,包括:第一代码部分,其对于攻击者有用以用于执行对软件项目的预定类型的攻击;以及第二代码部分,其被布置成在受保护的软件项目的运行时处修改第一代码部分的至少部分。

在一些实施例中,从不在执行软件项目时执行第一代码部分。

在一些实施例中,对第一代码部分的所述至少部分的所述修改生成经修改的第一代码部分,其被布置成执行用于软件项目的所意图的功能性。

在一些实施例中,所述代码包括另外的代码部分,其中所述另外的代码部分在软件项目的运行时处使得能够撤销第一代码部分的至少部分的所述修改。

在一些实施例中,预定类型是面向返回编程攻击。

根据本发明的第七方面,提供了一种生成受保护的软件项目的方法,包括:执行根据本发明的第一方面的方法;以及执行根据本发明的第四方面的方法。经由本发明的第一方面且经由本发明的第四方面而应用的保护可以以任何次序应用以便生成受保护的软件项目。

根据本发明的第八方面,提供了一种执行软件项目的方法,包括:执行根据本发明的第二方面的方法;以及执行根据本发明的第五方面的方法。第二和第五方面的方法可以以任何次序或者同时执行。

根据本发明的第九方面,提供了一种装置,其被布置成实施以上描述的方法中的任一个。

根据本发明的第十方面,提供了一种计算机程序,其在由一个或多个处理器执行时使所述一个或多个处理器实施以上描述的方法中的任一个。

根据本发明的第十一方面,提供了一种计算机可读介质,其存储根据本发明的第十方面的计算机程序或者存储根据本发明的第三或第六方面的软件项目。

附图说明

现在将仅作为示例、参照附图来描述本发明的实施例,在附图中:

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

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

图3a和3b是示意性地图示了利用第一类型软件保护(或攻击对策)的本发明的实施例的流程图;

图4a、4b和4c示意性地图示了用于第一函数f0和一个或多个第二函数fi(i=1,…,n)的代码的各种布置,即,对应执行路径;

图5a和5b是示意性地图示了利用第二类型软件保护(或攻击对策)的本发明的实施例的流程图;

图6a示意性地图示了通过一个或多个第二函数而对数据的存储;以及

图6b示意性地图示了攻击可能对数据存储具有的影响的示例。

具体实施方式

在接下来的描述中以及在附图中,描述了本发明的某些实施例。然而,将领会到,本发明不限于所描述的实施例,并且一些实施例可以不将以下描述的所有特征都包括。然而,将明显的是,可以在不脱离于如在随附权利要求中阐述的本发明的更宽精神和范围的情况下在本文中做出各种修改和改变。

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存储数据和/或从存储介质104和/或存储器106读取数据。

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

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

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

最后,网络接口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在由处理器执行时可以被布置成执行(或使处理器执行)任何种类的期望数据处理。

软件保护系统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生成之后并且在向用户系统280分布之前,受保护的软件项目260可以经历各种附加处理。因此,将领会到,在该描述中,对受保护的软件项目260的使用或分布的引用包括由向受保护的软件项目260应用附加处理而引起的软件片段的使用或分布。例如,受保护的软件项目260可能需要被编译和/或与其它软件项目链接(例如,如果受保护的软件项目260要形成要被分布给用户系统280的较大软件应用的一部分的话)。然而,将领会到,可以不要求这样的附加处理。

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

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

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

将领会到,尽管图2将系统200图示为包括单个用户设备280、单个软件生成系统210和单个软件保护系统250,但是系统200可以包括多个用户设备280和/或多个软件生成系统210和/或多个软件保护系统250。

在上文中描述了本发明的实施例,其中软件开发者(a)使用软件生成系统210以生成初始(未受保护的)软件项目220,且然后(b)使用软件保护系统250以向初始软件项目220应用保护(或攻击对策)中的一个或多个(诸如马上要描述的那些保护),从而生成受保护的软件项目260。然而,将领会到,在本发明的一些实施例中,软件生成系统210的软件生成工具212可以被布置成随着初始软件项目220被编写/生成而向初始软件项目220应用这些保护(或攻击对策)中的一个或多个。在这样的实施例中,不需要分离的软件保护系统260,并且有效地,初始软件项目220是受保护的软件项目260。类似地,将领会到,在本发明的一些实施例中,软件开发者可以使用软件生成系统210的软件生成工具212编写初始软件项目220,使得初始软件项目220从一开始就包括这些保护(或攻击对策)中的一个或多个。再一次,在这样的实施例中,不需要分离的软件保护系统260,并且有效地,初始软件项目220是受保护的软件项目260。

2-软件保护/对策

图3a和3b是示意性地图示了利用第一类型软件保护(或攻击对策)的本发明的实施例的流程图。特别地,图3a是图示了根据本发明的实施例的、由软件保护工具252执行以生成受保护的软件项目260的方法300的流程图;而图3b是图示了根据本发明的实施例的、由用户系统280在执行受保护的软件项目260时执行的方法350的流程图。

我们首先转至由软件保护工具252执行以生成受保护的软件项目260的方法300。将领会到,除下文参照方法300描述的那些保护或攻击对策之外,软件保护工具252可以向初始软件项目220应用一个或多个其它保护或攻击对策以便生成受保护的软件项目260。

在方法300的步骤302处,软件保护工具252作为受保护的软件项目260的一部分而包括第一代码部分。该第一代码部分的至少部分(或者可能是全部)对于攻击者有用以用于执行对受保护的软件项目260的预定类型的攻击。

此处,第一代码部分可以包括一个或多个指令(诸如机器语言指令或操作码)。在一些实施例中,第一代码部分作为连续指令的序列而被包括在受保护的软件项目260中——然而,将领会到,对于其它实施例而言,情况不需要必然如此。因此,第一代码部分可以被视为软件保护工具252在受保护的软件项目260内包括或者作为受保护的软件项目260的一部分而包括的指令的一个或多个区段或部分或片断或集群。

预定类型的攻击可以例如是rop攻击。然而,将领会到,预定类型的攻击可以是攻击者可能希望对软件项目发动的任何其它种类(或类型或类别)的攻击(当前已知的或者尚待开发的)。预定类型的攻击可以例如是一定类别的攻击,其中作为对给定软件项目的攻击的一部分,攻击者尝试使用已经处于该给定软件项目中(或形成该给定软件项目)的一个或多个指令。

如所提及的那样,第一代码部分的至少部分对于攻击者有用以用于执行对受保护的软件项目260的预定类型的攻击。确切地是什么构成对于攻击者“有用”将至少部分地取决于预定类型的攻击。例如,如上文所提及,希望发动rop攻击的攻击者可能希望执行一个或多个指令(诸如,以上示例1中的inccx指令)的预定序列,在该情况下,第一代码部分可以包括一个或多个指令的该预定序列跟随有返回指令(诸如,由以上示例1中的inccx和ret指令组成的小配件)。

第一代码部分中的指令可以被视为对于攻击者有用以用于执行对受保护的软件项目260的预定类型的攻击,如果由攻击者在设计/开发和/或实施预定类型的攻击时可使用的工具(诸如静态分析工具或某种其它自动化工具)将把第一代码部分的至少部分标识为包括供攻击者用作预定类型的攻击的一部分的一个或多个指令的话。

第一代码部分可以作为受保护的软件项目260的一部分而被包括作为完全新的指令(即,作为除原始存在/现存在初始软件项目220中的指令之外的指令)。附加地或者可替换地,可以通过修改原始存在/现存在初始软件项目220中的指令中的一个或多个,作为受保护的软件项目260的一部分而包括第一代码部分。

例如,可以作为受保护的软件项目260的一部分而包括第一代码部分,使得从不在执行受保护的软件项目260时执行第一代码部分的至少部分。从不执行的该部分可以包括第一代码部分的所述至少部分中的一些或全部,其对于攻击者有用以用于执行对受保护的软件项目260的预定类型的攻击。以该方式,第一代码部分可以被视为“空”代码部分或者“诱饵”代码部分。这可以以数个方式实现,例如:

(a)可以作为受保护的软件项目260的一部分而包括指令,其中那些指令表示从不在受保护的软件项目260的执行期间被调用的函数,并且其中用于该函数的指令包括第一代码部分。

(b)可以作为初始软件项目220的现有函数的一部分而包括指令,其中第一代码部分的这些新指令包括引起执行流中的无条件跳转的指令,从而避免执行第一代码部分的指令的至少部分。例如,初始软件项目220可能已经包括用于函数f的代码,如以下在示例2a的伪代码中所示:

示例2a

软件保护工具252可以将附加指令(即,第一代码部分)包括到函数f中,使得在受保护的软件项目260中,用于函数f的指令如以下在示例2b的伪代码中所示:

示例2b

在该示例中,第一代码部分包括jmp和inccx指令。inccx指令形成攻击者可能发现在执行预定攻击类型的攻击时有用的第一代码部分的部分(因为inccx指令与现有ret指令一起可以形成攻击者可能希望使用的小配件)。由jmp表示的指令使处理器在执行用于函数f的指令时使执行流跳过或者省略inccx指令。

在一些实施例中,步骤302包括:在用于受保护的软件项目260的代码中标识现有代码部分;修改现有代码部分以形成第一代码部分;以及使用第一代码部分而不是现有代码部分作为受保护的软件项目260的一部分。以上提及的所标识的用于受保护的软件项目260的代码可以包括:来自初始软件项目220的一个或多个指令;和/或已经作为生成受保护的软件项目260的一部分而已由软件保护工具252引入的一个或多个指令。

例如,步骤302可以:包括在用于受保护的软件项目260的代码中标识现有代码部分;以及修改现有代码部分的一个或多个指令,使得凭借该修改,所得的经修改的现有代码部分(其形成第一代码部分)对于攻击者有用以用于执行预定攻击类型的攻击。现有代码部分的标识可以由软件保护工具252基于通过软件保护工具252对修改的类型的认识来实施,软件保护工具252被配置成连同通过软件保护工具252对代码部分的类型的认识一起进行执行通过软件保护工具252对修改的类型的认识,该代码部分可能对于攻击者有用以用于执行预定攻击类型的攻击(使得软件保护工具252可以标识现有代码部分,软件保护工具252知晓其能够将该现有代码部分修改成经修改的代码部分,所述经修改的代码部分可能对于攻击者有用以用于执行预定攻击类型的攻击)。

作为示例,假设初始软件项目220具有用于函数f的指令,如以下在示例3a的伪代码中所示:

示例3a

软件保护工具252可以被布置成改变/修改特定寄存器的标识。软件保护工具252可能希望生成受保护的软件项目260中的“诱饵”小配件,其牵涉到指令inccx和ret(因为软件保护工具252知晓由指令inccx和ret组成的小配件可能对于攻击者有用)。因此,软件保护工具252可以作为用于受保护的软件项目260的现有代码部分而标识函数f的指令incdx和ret,因为软件保护工具252知晓(a)其可以将寄存器dx的标识修改成寄存器cx,以及(b)其知晓通过做出这样的修改,所得的经修改的代码将形成由指令inccx和ret组成的小配件,其可能对于攻击者有用。软件保护工具252然后可以修改指令incdx,使得其变为inccx,如在以下示例3b的伪代码中所示。

示例3b

将领会到,可以使用作为受保护的软件项目260的一部分而包括第一代码部分的其它方式。

在方法300的步骤304处,软件保护工具252作为受保护的软件项目260的一部分而包括第二代码部分,其中第二代码部分在受保护的软件项目260的运行时处使得能够修改第一代码部分的至少部分。步骤304可以与步骤302同时执行或者在步骤302之后执行。

此处,第二代码部分可以包括一个或多个指令(诸如机器语言指令或操作码)。在一些实施例中,作为受保护的软件项目260中的连续指令的序列而包括第二代码部分——然而,将领会到,对于其它实施例而言,情况不需要必然如此。因此,第二代码部分可以被视为软件保护工具252在受保护的软件项目260内包括或者作为受保护的软件项目260的一部分而包括的指令和/或数据的一个或多个区段或部分或集群。

第二代码部分实现的修改可以取决于第一代码部分、和/或第一代码部分如何作为受保护的软件项目260的一部分而被包括、和/或第一代码部分作为受保护的软件项目260的一部分而被包括在受保护的软件项目260内何处。例如:

•如上文所提及,可以作为受保护的软件项目260的一部分而包括第一代码部分,使得从不在执行受保护的软件项目260时执行第一代码部分的至少部分。如第二代码部分所实现的对第一代码部分的修改可以是对从不执行的第一代码部分的所述至少部分的修改。所执行的实际修改然后可以根本是任何修改,因为第一代码部分的经修改的所述至少部分仍然将从不被执行,并且因此,修改不会影响受保护的软件项目260的正常操作/执行。

•如上文所提及,步骤302可以牵涉到:在用于受保护的软件项目260的代码中标识现有代码部分;修改现有代码部分以形成第一代码部分;以及使用第一代码部分而不是现有代码部分作为受保护的软件项目260的一部分。在该情况下,由第二代码部分实现的修改可以被布置成将第一代码部分改变(或复原)回到现有代码部分。以该方式,现有代码部分的原始意图的功能性将在运行时处维持。

本质上,如第二代码部分实现的对第一代码部分的修改意味着:如果攻击者将第一代码部分中的一些或全部标识为在执行预定类型的攻击时有用并且因此尝试在预定类型的攻击中使用第一代码部分中的一些或全部(例如,作为小配件),则攻击者将期望作为他的攻击的一部分而执行的指令可能实际地未被执行,因为第一代码部分中的一些或全部代码可以在运行时处凭借第二代码部分而修改。这意味着:攻击可能失败,或者最起码,攻击可以以攻击者没有意图/预期的方式执行和/或以对于攻击者没有用的方式执行。随着对第一代码部分的修改在运行时处发生,攻击者对受保护的软件项目260的在先静态分析将没有用。这使得攻击者自动化有用小配件的标识且成功地发动对受保护的软件项目260的攻击变得困难得多。

第二代码部分可以在任何点处被包括在受保护的软件项目260内。例如,第二代码部分可以在一定的点处被包括在受保护的软件项目260内,使得第二代码部分恰好在用于受保护的软件项目260的运行时的开始处(例如,在受保护的软件项目260的初始化期间)执行。可替换地,第二代码部分可以在一定的点处被包括在受保护的软件项目260内,使得第二代码部分在用于受保护的软件项目260的运行时期间的某稍后阶段处执行——例如,如果第一代码部分形成函数f的一部分,则第二代码部分可以作为函数f内/用于函数f的指令而被包括,且被包括在用于第一代码部分的指令前面(按执行次序)的函数f内的位置处;可替换地,如果第一代码部分形成函数f的一部分,则第二代码部分可以作为调用函数f的不同函数g内/用于该不同函数g的指令而被包括,且被包括在调用函数f的指令前面(按执行次序)的函数g内的位置处;等等。

第二代码部分可以包括自身(在被执行时)执行第一代码部分的修改的代码。可替换地,第二代码部分可以包括下述指令和/或数据:其给执行受保护的软件项目260的处理器的内核提供指令的表或列表,以供内核然后实施对第一代码部分的修改。将领会到,在本发明的其它实施例中,第二代码部分使得能够在第一代码部分的运行时处以其它方式进行修改。

方法300可以包括未在图3a中示出的以下可选步骤:作为受保护的软件项目260的一部分而包括另外的代码部分,其中所述另外的代码部分在受保护的软件项目260的运行时处使得能够撤销第二代码部分实现的对第一代码部分的至少部分的修改。例如,如果第一代码部分形成函数f的一部分并且第二代码部分作为调用函数f的不同函数g内/用于该不同函数g的指令而被包括且被包括在调用函数f的指令前面(按执行次序)的函数g内的位置处,则所述另外的代码部分可以作为该函数g(或随后调用的函数)内/用于该函数g的指令而被包括且被包括在第一代码部分后面(按执行次序)的位置处。

现在我们转至方法350,其由用户系统280在执行受保护的软件项目260时执行。

在步骤352处,用户系统280加载受保护的软件项目260(即,执行在加载时间处实施的通常操作)。当然,将领会到,本发明的实施例可以关于用于(潜在地由不同实体)已经加载的受保护的软件项目260的代码而实施,并且所以,步骤352是可选的。

在步骤354处,用户系统280在用于受保护的软件项目260的运行时期间执行受保护的软件项目260。

特别地,如上文所讨论,受保护的软件项目260包括第二代码部分,其在受保护的软件项目260的运行时处使得能够修改受保护的软件项目260内的第一代码部分的至少部分。因而,步骤354包括在受保护的软件项目260的运行时处修改第一代码部分的至少部分。

如上文所提及,对第一代码部分的至少部分的该修改可以在各种时间点处(例如,恰好在加载时间之后,在步骤352已经完成时或者在运行时期间的某稍后点处)执行。而且,如上文所提及,该修改可以直接地通过执行第二代码部分而执行,或者可以由内核来执行(其中第二代码部分已经将内核配置成或使内核准备好在某阶段处实施修改),或者通过第二代码部分实现的某其它手段而执行。

如上文所提及,方法300可以包括未在图3a中示出的以下可选步骤:作为受保护的软件项目260的一部分而包括另外的代码部分,其中所述另外的代码部分在受保护的软件项目260的运行时处使得能够撤销第二代码部分实现的对第一代码部分的至少部分的修改。因此,方法350可以包括未在图3b中示出的以下可选步骤:撤销第二代码部分实现的对第一代码部分的至少部分的修改。以上关于如何实现第一代码部分的该修改以及修改何时发生的评述类似地适用于如何由所述另外的代码部分实现修改的“撤销”以及该撤销何时发生。

随着要在步骤354处修改第一代码部分的至少部分,在做出该修改时,需要将第一代码部分的该至少部分加载在既可执行又可写入的存储器的部分中。在一些实施例中,用户系统280可以总是(在加载时间步骤352处)将代码加载到既可执行又可写入的存储器中,使得不需要针对这一点实施进一步操作。在其它实施例中,作为形成受保护的软件项目260的一部分,软件保护工具252可以被布置成将受保护的软件项目260配置成使得受保护的软件项目260的一个或多个量的代码将(在加载时间步骤352处)被加载到既可执行又可写入的存储器中,其中这一个或多个量的代码包括第一代码部分。完成这一点的方法是公知的(诸如,经由对内核的系统调用将某些存储器页面设置成可执行且可写入的)且因此不会在本文中详细地描述。

将领会到,可能的是,以上提及的用于保护软件项目220的措施(即,生成受保护的软件项目260)可能不对受保护的软件项目260上的所有攻击都进行阻挠。例如,在生成小配件的库时,攻击者可以选择该库的小配件,其恰好不是具有在运行时期间修改的指令的小配件(凭借以上第一类型保护)。而且,可能的是,攻击者可能能够以某种方式标识所包括的第二代码部分并抵消其效果(使得第一代码部分的修改不在运行时处生效)。因此,将合期望的是,能够检测和/或阻挠可能在运行时处发展的攻击。

图4a、4b和4c以及图5a和5b示意性地图示了利用第二类型软件保护(或攻击对策)的本发明的实施例。除以上提及的第一类型软件保护(如参照图3a和3b描述)之外或者独立于以上提及的第一类型软件保护(如参照图3a和3b描述),可以使用该第二类型软件保护(或攻击对策)。

关于该第二类型软件保护,用于受保护的软件项目260的代码要具有(a)用于第一函数f0的代码以及(b)用于一个或多个第二函数fi(其中i=1,…,n,其中n为正整数)的代码。附加地,在用于受保护的软件项目260的代码内,存在执行路径(或者控制流路径或函数调用的序列),其使得在执行用于第一函数f0的代码之前执行用于所述一个或多个第二函数fi(i=1,…,n)的代码(即,在执行用于第一函数f0的代码之前执行用于所述一个或多个第二函数fi(i=1,…,n)中的每一个的代码的至少部分)。图4a、4b和4c示意性地图示了用于第一函数f0和所述一个或多个第二函数fi(i=1,…,n)的代码的各种布置,即,对应执行路径,如下文更加详细地描述。

图4a示意性地图示了用于受保护的软件项目260的代码400(实际上,代码400和受保护的软件项目260可以被视为同一个东西)。代码400包括用于第一函数f0的代码以及用于三个第二函数f1、f2和f3的代码。代码400内的执行路径由虚线图示。特别地,如可以看出的那样,函数f0、f1、f2和f3可以以串行方式一个接一个地被调用,即,对于i=1,…,n,函数fi被布置成(作为用于函数fi的处理的至少部分)调用函数fi-1。将领会到,在该示例中,n=3;然而,本发明的实施例可以利用n的其它值。

图4b示意性地图示了用于受保护的软件项目260的代码400。代码400包括用于第一函数f0的代码以及用于两个第二函数f1和f2的代码以及用于另一个函数g的代码。代码400内的执行路径由虚线图示。特别地,如可以看出的那样,函数f0、f1、g和f2可以以串行方式一个接一个地被调用。这类似于图4a中示出的布置,只是在对函数f1和f2的调用期间调用函数g(即,函数f2调用函数g,函数g调用函数f1)。图4b被包括以图示代码400内的执行路径可以牵涉到除第一函数f0和所述一个或多个第二函数fi(i=1,…,n)之外还执行一个或多个函数。将领会到,在该示例中,n=2;然而,本发明的实施例可以利用n的其它值。类似地,将领会到,在该示例中,存在单个附加函数g,并且该附加函数g处于函数f2和f1之间;然而,在本发明的其它实施例中,可以存在执行流中的不同数目的附加函数g,并且它们可以在执行流中位于不同位置处。

图4c示意性地图示了用于受保护的软件项目260的代码400。代码400包括用于第一函数f0的代码以及用于三个第二函数f1、f2和f3的代码。代码400内的执行路径由虚线图示。特别地,如可以看出的那样,与图4a中示出的示例不同,函数f0、f1、f2和f3未以串行方式调用——取而代之:函数f3调用函数f2;一旦函数f2的执行已经完成,在某点处,控制就返回函数f3,在该点之后,函数f3调用函数f1;函数f1然后调用函数f0。再一次,将领会到,在该示例中,n=3;然而,本发明的实施例可以利用n的其它值。

将领会到,在用于受保护的软件项目260的代码400内,可以使用或实现其它执行路径或控制流路径,其牵涉到第一函数f0和一个或多个第二函数fi(i=1,…,n),并使得在执行用于第一函数f0的代码之前执行用于所述一个或多个第二函数fi(i=1,…,n)的代码。图4a、4b和4c中示出的执行路径仅仅是帮助理解的示例,并且其它执行路径可以更复杂或者更不复杂,且可以呈现出不同形状或流拓扑/结构。实际上,相同函数可以在执行路径内出现多次。

附加地,将领会到,可以存在在用于受保护的软件项目260的代码400内使用或实现的多个不同可能执行路径或控制流路径,其牵涉到第一函数f0和所述一个或多个第二函数fi(i=1,…,n),它们使得在执行用于第一函数f0的代码之前执行用于所述一个或多个第二函数fi(i=1,…,n)的代码。例如,在用于受保护的软件项目260的代码400内,如图4a和4c中所示的牵涉到f0,…,f3的执行路径二者可以是可能的/有效的,其中所使用的实际执行路径取决于运行时数据和所实施的决定/处理。

还将领会到,可以存在在用于受保护的软件项目260的代码400内使用或实现的一个或多个其它可能执行路径或控制流路径,其牵涉到第一函数f0,但不必然牵涉到所有所述一个或多个第二函数fi(i=1,…,n)。

如本文中所使用的那样,术语“函数”应当被理解成意指子例程、程序函数、过程或者任何其它可调用的代码片断中的一个或多个。

在通过用户系统280执行用于受保护的软件项目260的代码时对受保护的软件项目260的攻击缺失的情况下,第一函数f0被布置成提供第一功能性。该第一功能性可以是期望或意图用于受保护的软件项目260的任何功能性,即,初始软件项目220的开发者可能期望在受保护的软件项目260的“正常”(即,无攻击)操作或执行期间提供或实现的任何功能性。该第一功能性可以是任何这样的期望操作和/或处理,诸如以下各项中的一个或多个:(i)执行一个或多个计算;(ii)执行一个或多个数据项目的测试;(iii)执行数据证实(其可能导致第一功能性准许或拒绝对其它功能性的访问或以取决于证实的方式处理数据);(iv)执行口令验证(其可能导致第一功能性准许或拒绝对其它功能性的访问);等等。第一功能性还可以被理解成包括返回地址(即,指令的地址),在该返回地址处,执行要在第一函数f0的执行已经完成之后进行恢复(因为第一函数f0可以很好地包括一个或多个返回或跳转声明以退出/终止第一函数f0)——即,其中在第一函数f0已经实施或完成之后,执行或控制流应当继续(即,在攻击缺失的情况下,其中执行或控制流意图/期望继续)。除了由第一函数f0提供的第一功能性是最初从函数f0意图或期望的功能性之外,该第一功能性的性质和复杂性并不重要,即,操作/处理将在攻击者未执行攻击的条件之下提供。

如上文所提及,rop攻击牵涉到栈溢出,即,在栈上写入(或盖写)数据以使得执行流被修改。这可以例如通过下述操作而实现:攻击者标识软件项目中的缓冲器充溢易损性,其有效地使得攻击者能够向栈写入攻击者希望放置于栈上的不论什么数据。其它类型的栈溢出攻击(未必是rop攻击)是已知的。

如上文所讨论,对于受保护的软件项目260,将存在一个或多个“合法”(或“预期”/“预计”)执行路径(或控制流路径),其牵涉到第一函数f0和所述一个或多个第二函数fi(i=1,…,n),它们使得在执行用于第一函数f0的代码之前执行用于所述一个或多个第二函数fi(i=1,…,n)的代码。然而,当实施栈溢出攻击时(例如,当执行rop攻击时),攻击者可以在栈上盖写一个或多个函数调用返回地址,使得栈指示用于到达第一函数f0的执行的不同“合法”执行路径。这可以例如发生在第一函数f0的执行之前,即,使得实际上用于到达第一函数f0的执行的执行路径不是合法执行路径。这还可以例如发生在执行第一函数f0的同时——即,作为栈溢出攻击的一部分而向栈的写入可以发生在第一函数f0的执行期间或者作为第一函数f0的执行的一部分而发生(例如,如果第一函数f0或者其调用的函数具有攻击者已经运用的缓冲器充溢易损性的话)。在该情况下,实际上用于到达第一函数f0的执行的执行路径可能已经是合法执行路径,但是在第一函数f0的执行期间,攻击将栈改变成表示合法执行路径——这意味着函数调用返回将不依照合法执行路径。利用第二保护类型的本发明的实施例可以检测和/或响应于牵涉到表示合法执行路径的栈的改变。

图5a是图示了根据本发明的实施例的方法500的流程图,方法500由软件保护工具252执行以生成受保护的软件项目260;而图5b是图示了根据本发明的实施例的方法550的流程图,方法550由用户系统280在执行受保护的软件项目260时执行。

我们首先转至方法500,其由软件保护工具252执行以生成受保护的软件项目260。将领会到,除以下参照方法500描述的那些保护或攻击对策之外,软件保护工具252可以向初始软件项目220应用一个或多个其它保护或攻击对策以便生成受保护的软件项目260。

在方法300的步骤502处,标识第一函数f0和所述一个或多个第二函数fi(i=1,…,n)。换言之,标识执行路径(也就是“合法”执行路径),其牵涉到第一函数f0和一个或多个第二函数fi(i=1,…,n),并使得在执行用于第一函数f0的代码之前执行用于所述一个或多个第二函数fi(i=1,…,n)的代码。在一些实施例中,可能先前已经向软件保护工具252标识和指示该合法执行路径——因而,在图5a中,将步骤502示为可选的。

第一函数f0可以是用于受保护的软件项目260的任何函数,且可以是已经存在于初始软件项目220中的函数,或者可以是软件保护工具252作为形成受保护的软件项目260的一部分而引入为受保护的软件项目260的一部分的函数。类似地,所述一个或多个第二函数fi(i=1,…,n)中的每一个可以分别是到达或者引起所标识的第一函数f0的执行的合法执行路径中的任何函数。第二函数fi(i=1,…,n)中的一个或多个可以是已经存在于初始软件项目220中的函数,或者可以是软件保护工具252作为形成受保护的软件项目260的一部分而引入为受保护的软件项目260的一部分的函数。

关于本发明的实施例,用于所述一个或多个第二函数fi(i=1,…,n)的代码在受保护的软件项目260中的执行使得数据存储在一个或多个存储器位置处,其中该数据满足一个或多个预定属性的集合。图6a示意性地图示了通过所述一个或多个第二函数fi(i=1,…,n)对数据的存储。特别地,将数据d示为跨存储器600(其可以例如是栈)内的三个存储器位置602而存储。数据d由存储在相应存储器位置处的数据项目a、b、c形成——这些数据项目a、b、c是由于所述一个或多个第二函数fi(i=1,…,n)的代码的执行而写入到存储器600或存储在存储器600中的数据项目。当然,将领会到,设想到不同数目的存储器位置602,并且除了图6a中所示的数据外,不同量的数据可以存储在这些存储器位置602处。

马上将阐述一个或多个预定属性和数据d的类型的示例。

在所执行的攻击缺失的情况下,在用于受保护的软件项目260的代码的执行期间,数据d在一时间点处满足一个或多个预定属性的集合,在该时间点处,要执行用于第一函数f0的代码。

如以上所提及,如果执行栈溢出攻击(或者执行某其它种类的攻击,其中攻击者可以修改存储器600的内容),则数据d的内容可以作为攻击的结果而改变。图6b示意性地图示了攻击可能对所述一个或多个存储器位置602中数据d的存储具有的影响的示例。如可以看出的那样,取代存储在所述一个或多个存储器位置602处的数据d是数据d={a,b,c},存储在所述一个或多个存储器位置602处的数据d现在是数据d={a,b*,c*}。

情况可能是:利用一个或多个第二函数fi(i=1,…,n)的特定集合,用于那一个或多个第二函数fi(i=1,…,n)的现有代码(诸如,用于所述一个或多个第二函数fi(i=1,…,n)的初始软件项目220中的初始代码)的执行可能已经导致数据d存储在一个或多个存储器位置602处,其中该数据d满足一个或多个预定属性的该集合。例如,要存储的数据d可以包括用于所述一个或多个第二函数fi(i=1,…,n)的代码可能已经被配置成存储在栈上的一个或多个预定值;类似地,要存储的数据d可以包括一个或多个函数调用返回地址,其由于用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行而被自动地放置在栈上。在这样的情况下,所述一个或多个第二函数fi(i=1,…,n)已经适于用在用于受保护的软件项目260的该第二类型保护中。

然而,情况可能是:利用一个或多个第二函数fi(i=1,…,n)的特定集合,用于那一个或多个第二函数fi(i=1,…,n)的现有代码(诸如,用于所述一个或多个第二函数fi(i=1,…,n)的初始软件项目220中的初始代码)的执行没有导致数据d存储在一个或多个存储器位置602处,其中该数据d满足一个或多个预定属性的集合。在该情况下,方法500可以包括以下可选步骤504:针对作为受保护的软件项目260的一部分而包括,配置用于所述一个或多个第二函数fi(i=1,…,n)的代码,使得用于所述一个或多个第二函数fi(i=1,…,n)的经配置的代码的执行导致数据d存储在一个或多个存储器位置602处,其中该数据d满足一个或多个预定属性的集合。这可以牵涉到在初始软件项目220中修改用于所述一个或多个第二函数fi(i=1,…,n)中的至少一个的初始代码,以生成用于所述一个或多个第二函数fi(i=1,…,n)中的至少一个的代码,以用在受保护的软件项目260中。

在步骤506处,用于第一函数f0的方法500代码(用于作为受保护的软件项目260的一部分而使用)被配置成使得通过一个或多个处理器对用于第一函数f0的代码的执行仅在以下情况下提供以上提及的第一功能性:在执行第一函数时存储在所述一个或多个存储器位置602处的数据d满足一个或多个预定属性的集合。

我们现在转至方法550,其由用户系统280在执行受保护的软件项目260时执行。

在步骤552处,用户系统280加载受保护的软件项目260(即,执行在加载时间处实施的通常操作)。当然,将领会到,本发明的实施例可以关于用于(潜在地由不同实体)已经加载的受保护的软件项目260的代码而实施,并且所以,步骤552是可选的。

在步骤554处,用户系统280在用于受保护的软件项目260的运行时期间执行受保护的软件项目260。特别地,这牵涉到执行用于第一函数f0的代码。如上文所提及,第一函数f0的执行仅在以下情况下提供第一功能性:在执行第一函数f0时存储在所述一个或多个存储器位置602中的数据d满足一个或多个预定属性的集合。

这如何工作和如何被实现的示例在下文中提供。

首先,转至可作为用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行的结果而存储在存储器600中的所述一个或多个位置602中的数据d的类型:

(a)作为用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行的结果而存储的数据d可以包括一个或多个预定值。例如,用于第二函数fi的代码可以包括下述指令:该指令在栈上存储变量的预定值,诸如c/c++指令intx=204,其将使得表示值204的数据存储在栈上的位置处(诸如,图6a中示出的数据项目a)。

(b)作为用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行的结果而存储的数据d可以包括一个或多个值,其是至少部分地通过在执行所述一个或多个第二函数fi(i=1,…,n)中的至少一个时执行的计算来确定的。例如,用于第二函数fi的代码可以包括下述指令:该指令将两个变量之和作为第三变量存储在栈上,诸如c/c++指令intz=x+y;或者作为另一个示例,用于第二函数fi的代码可以包括下述指令:该指令在栈上将变量的值更新为变量的现有值的增量版本,诸如c/c++指令x++;或者作为另一个示例,用于第二函数fi的代码可以包括下述指令:该指令通过调用函数来设置或计算栈上的变量的值,诸如用于某函数f的c/c++指令x=f(y)。

(c)作为用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行的结果而存储的数据d可以包括所述一个或多个第二函数fi(i=1,…,n)中的一个内的指令的地址,在该地址处,执行要在由所述一个或多个第二函数fi(i=1,…,n)中的所述一个调用的函数的执行已经完成之后进行恢复,即,用于对该函数的调用的返回地址。该所调用的函数可以是第一函数f0或者所述一个或多个第二函数fi(i=1,…,n)中的一个,但情况不需要必然如此。

将领会到,存储在所述一个或多个存储器位置602处的数据d可以包括以上示例数据类型(a)-(c)中的一个或多个。附加地或者可替换地,存储在所述一个或多个存储器位置602处的数据d可以包括一个或多个不同类型的数据。

在一些实施例中,在执行第一函数f0时存储在所述一个或多个存储器位置602中的数据d对所述一个或多个预定属性的满足指示所述一个或多个第二函数fi(i=1,…,n)和第一函数f0已经以预定次序调用(即,数据d指示合法执行流/路径已经用于到达第一函数f0的执行)。类似地,在一些实施例中,在执行第一函数f0时存储在所述一个或多个存储器位置602中的数据d对所述一个或多个预定属性的满足的缺失指示所述一个或多个第二函数fi(i=1,…,n)和第一函数f0尚未以预定次序调用(即,数据d指示合法执行流/路径可能已经用于到达第一函数f0的执行)。例如,如果存在两个第二函数f1和f2,并且函数f1和f2被布置成将对应的预定值v1和v2作为数据存储在所述一个或多个存储器位置602中,则(a)值v1和v2在那一个或多个存储器位置602中的存在暗示已经作为执行流的一部分而调用函数f1和f2以到达第一函数f0的执行;而(b)除v1和v2外的值在那一个或多个存储器位置602中的存在暗示尚未作为执行流的一部分而调用函数f1和f2以到达第一函数f0的执行。

软件保护系统252可以使用一个或多个预定属性的任何集合(且可以可配置成使用从可用集合的组选择的特定集合)。这样的预定属性以及它们应当如何被满足的示例在下文中阐述。

存储在所述一个或多个存储器位置602处的数据d对一个或多个预定属性的集合的满足可以至少部分地基于存储在所述一个或多个存储器位置602处的数据d的至少部分是否具有(或假定为)预定值——此处,预定属性是“存储在所述一个或多个存储器位置602处的数据d的部分具有(或假定为)预定值”。关于以上类型(a)-(c)中的任一个的数据项目,仅在以下情况下,一个或多个预定属性的集合可以由存储在所述一个或多个存储器位置602处的数据d满足:形成该数据d的一部分的值具有(或假定为)预定值。对于类型(a)的数据,该预定值是应当通过用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行而存储的预定值;对于类型(b)的数据,该预定值是在攻击缺失的情况下应当通过在执行所述一个或多个第二函数fi(i=1,…,n)中的至少一个时执行的计算而获取(或者应当由该计算而引起)的预期值;对于类型(c)的数据,该预定值是预期返回地址,即,这样的地址:在该地址处,执行预期要在由所述一个或多个第二函数fi(i=1,…,n)中的所述一个调用的函数的执行已经完成之后进行恢复(以及因此,预期已被放置在栈上的地址)。

存储在所述一个或多个存储器位置602处的数据d对一个或多个预定属性的集合的满足可以至少部分地基于存储在所述一个或多个存储器位置602处的数据d的两个或更多项目是否具有预定关系。预定关系可以是任何种类的关系,诸如牵涉到以下各项中的一个或多个的关系:一个所存储的数据项目是大于还是小于另一个所存储的数据项目;两个或更多数据项目的某函数是否满足特定条件(诸如,函数的结果是预定值或者大于或小于预定值);两个数据项目之间的差异是否满足特定条件。此处,预定属性是:“存储在所述一个或多个存储器位置602处的数据d的两个或更多项目具有预定关系”。当两个或更多所存储的数据项目的绝对值不是预先已知的但其相对值是预先已知的时,该类型的属性特别有用。例如,两个返回地址(类型(c)数据)的绝对值可能不是预先(即,在加载时间之前)已知的,但这两个返回地址之间的差异可以是预先已知的,并且因此,如果数据d要包括这两个返回地址,则存储在所述一个或多个存储器位置602处的数据d对一个或多个预定属性的集合的满足可以仅在以下情况下发生:存储在这两个返回地址预期要存储于其中的存储器位置602中的两个值之间的差异是预定值。

在一些实施例中,用于第一函数f0的代码在步骤506处被配置成使得在完成第一函数f0的执行时,用于受保护的软件项目260的代码的执行在下述地址处进行恢复:该地址取决于作为用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行的结果而存储的数据d的至少部分。换句话说,存储在所述一个或多个存储器位置602处的数据d的至少部分使得能够确定执行流要继续到的指令的地址以便提供第一功能性。例如:

-假设第一函数f0由第二函数f1调用。用于第一函数f0的代码可以被配置成沿以下示例4的下列伪代码的行:

示例4

在该示例中,通过mov指令将sp的值加载到寄存器bx中。用于第一函数f0的代码的执行以指令jmpbx终止,这使执行在由存储在寄存器bx中的值指示的地址处继续。如果sp的值形成存储在所述一个或多个存储器位置602中的数据d的一部分,则(在攻击缺失的情况下)用于受保护的软件项目260的代码的执行在下述地址处进行恢复:该地址取决于通过用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行而存储的数据d的至少部分。例如,作为调用函数f0的一部分,函数f1可以将函数f1内的返回执行地址存储为值sp。

将领会到,值sp可以由第一函数f0基于存储在所述一个或多个存储器位置602中的数据d来计算。

自然地,如果值sp不是将从用于所述一个或多个第二函数fi(i=1,…,n)的代码的未受攻击的执行中出现的预期/正确值,则第一函数f0的执行的终止使执行在非意图地址处继续,这从而意味着未提供第一功能性。

-作为这一点的另一个示例,用于第一函数f0的代码可以被配置成沿以下示例5的下列伪代码的行:

示例5

示例5以与示例4相同的方式工作,只是寄存器bx中的值与值cx进行异或操作,并且稍后,寄存器bx中的值与预定值(也就是该示例中的0xabcd)进行异或操作。用于第一函数f0的代码的执行以指令jmpbx终止,这使执行在由存储在寄存器bx中的值指示的地址处继续。如果值cx形成存储在所述一个或多个存储器位置中的数据的一部分,则(在攻击缺失的情况下)用于受保护的软件项目260的代码的执行在下述地址处进行恢复:该地址取决于通过用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行而存储的数据的至少部分。例如,所述一个或多个第二函数fi(i=1,…,n)中的一个可以将预定值(也就是该示例中的0xabcd)存储为值cx,使得有效地,两个异或操作将彼此抵消掉。

自然地,如果值cx不是将从用于所述一个或多个第二函数fi(i=1,…,n)的代码的未受攻击的执行中出现的预期/正确值,则第一函数f0的执行的终止使执行在非意图地址处继续,这从而意味着未提供第一功能性。

在对该示例的进一步修改中,代码中的预定值(在该情况下,0xabcd)可以替换为至少部分地取决于存储在所述一个或多个存储器位置602中的数据d的数据。以该方式,这两个异或操作将仅在以下情况下一起正确地工作:例如,数据d内的两个数据项目具有预定关系(例如,彼此相等)。

-在这样的实施例中,在其处用于受保护的软件项目260的代码的执行在完成第一函数f0的执行之后恢复的地址取决于通过用于所述一个或多个第二函数fi(i=1,…,n)的代码的执行而存储的数据d的至少部分。函数f0可以被布置成使得该返回地址避免执行一个或多个空指令(诸如,软件保护工具252可能已经在调用了第一函数f0的函数中包括的一个或多个空指令)。这可以例如通过组合调用了第一函数f0的函数内的“正常”返回地址(如存储在栈上)与存储在所述一个或多个存储器位置中的另一个值(诸如,表示地址偏移的预定值)而实现——例如,通过向“正常”返回地址添加偏移,其中该偏移足以避免空指令的执行。

作为这一点的示例,用于第一函数f0的代码可以被配置成沿以下示例6的下列伪代码的行:

示例6

这与示例5相同,只是使用固定/预定偏移(诸如以上使用的值1234)来确定返回地址。在可替换示例中,偏移可以是形成数据d的一部分的值。

如上文所提及,第一功能性仅在以下情况下执行:一个或多个预定属性的集合由在执行第一函数f0时存储在所述一个或多个存储器位置602处的数据d满足。因此,在执行第一函数f0时存储在所述一个或多个存储器位置602处的数据d对一个或多个预定属性的集合的满足是作为第一函数f0的执行的结果而提供第一功能性的必要条件。在一些实施例中,这可能不是充分条件——特别地,可能需要满足一个或多个其它准则以便作为第一函数f0的执行的结果而提供第一功能性(例如,由于已经应用一个或多个其它保护技术以生成受保护的软件项目260)。

在步骤506处用于第一函数f0的代码的配置被布置成使得通过一个或多个处理器对用于第一函数的代码的执行在以下情况下提供与第一功能性不同的第二功能性:在执行第一函数时存储在所述一个或多个存储器位置602处的数据d没有满足一个或多个预定属性的集合。该第二功能性可以是随机功能性(例如,如果在其处用于受保护的软件项目260的代码的执行要在执行第一函数f0之后恢复的返回地址至少部分地取决于存储在所述一个或多个位置中的数据,则如果无效(或非预期)数据存储在所述一个或多个位置中,则该返回地址可以是任何地址,使得所执行的随后指令可以不是预先已知的)。

然而,在一些实施例中,第二功能性可以是预定的。作为示例,在步骤506处用于第一函数f0的代码的配置包括作为用于第一函数f0的代码的一部分而包括代码部分,其在由所述一个或多个处理器执行时使所述一个或多个处理器:(a)确定一个或多个预定属性的集合是否由在执行第一函数时存储在所述一个或多个存储器位置602处的数据d满足;以及(b)如果确定没有满足一个或多个预定属性的集合,则提供第二预定功能性(其不同于第一功能性)。换言之,代码部分可以具有用于就一个或多个预定属性的集合是否被满足实施显式测试/检查的指令,其中分支点基于测试的成果(即,如果测试指示一个或多个预定属性的集合得到满足,则提供第一功能性,并且如果测试指示一个或多个预定属性的集合没有被满足,则提供预定第二功能性)。作为示例,该代码部分可以被布置成比较来自存储在所述一个或多个存储器位置602中的数据d的值与预定值,且如果所存储的值与预定值不相等,则确定一个或多个预定属性的集合没有被满足。将领会到,取决于一个或多个预定属性的集合的性质,可以使用用于确定的其它测试或操作。

此处,该代码部分可以包括一个或多个指令(诸如机器语言指令或操作码)。在一些实施例中,作为用于第一函数f0的代码中的连续指令的序列而包括该代码部分——然而,将领会到,对于其它实施例,情况不需要必然如此。因此,代码部分可以被视为软件保护工具252包括在用于第一函数f0的代码内或者作为用于第一函数f0的代码的一部分而包括的指令的一个或多个区段或部分或片断或集群。

代码部分可以作为用于第一函数f0的代码的一部分而被包括在用于第一函数f0的代码中的返回点附近(例如,邻近或靠近用于第一函数f0的代码的实际结尾或返回指令)。以该方式,代码部分可以在第一函数f0的执行终止时执行或者恰好在第一函数f0的执行终止之前执行——因而,如果攻击者已经运用第一函数f0中(或者用于通过第一函数f0的执行而调用的函数的代码中)的缓冲器充溢易损性以发动攻击,则可以在第一函数f0的执行终止之前且在栈上的“受损坏”/“受攻击”的返回地址随后用于确定执行应当在何处继续之前检测攻击——第二功能性因此可以防止使用攻击者已经在栈上盖写的“受损坏”/“受攻击”的返回地址。

可替换地,代码部分可以作为用于第一函数f0的代码的一部分而被包括在用于第一函数f0的代码的开头附近(例如,作为或者邻近或者靠近用于第一函数f0的代码的第一指令)。以该方式,代码部分可以在第一函数f0的执行开始时或者恰好在第一函数f0的执行开始之后执行。因而,如果攻击者已经使得经由不合法执行流调用第一函数f0,则这可以在已经执行用于第一函数f0的代码中的许多部分(或任何部分)之前早前地检测到,使得可以避免第一功能性的提供以及取而代之可以提供第二功能性的提供。

如上文所讨论,第二预定功能性可以取决于在执行第一函数时存储在所述一个或多个存储器位置602处的数据d。然而,在一些实施例中,第二预定功能性可以独立于在执行第一函数时存储在所述一个或多个存储器位置602处的数据d。例如,第二预定功能性可以通过调用函数而实现,该函数引起受保护的软件项目260的执行的过早终止,和/或报告错误,和/或实现一个或多个其它对策。

如上文所提及,在步骤506处用于第一函数f0的代码的配置可以包括作为用于第一函数f0的代码的一部分而包括代码部分,所述代码部分具有用于就一个或多个属性的集合是否被满足实施显式测试的指令。在可替换实施例中,在步骤506处用于第一函数f0的代码的配置可以包括将用于第一函数f0的代码布置成实际上将存储在所述一个或多个存储器位置602处的数据d用于针对第一函数f0的(正常)计算——就一个或多个属性的集合是否被满足的显式测试因此可以不必然被实施。这可以牵涉到作为用于第一函数f0的代码的一部分而包括一个或多个新指令和/或修改用于第一函数f0的一个或多个现有指令(其中这些新的和/或经修改的指令供第一函数f0实际上将存储在所述一个或多个存储器位置602处的数据d用于针对第一函数f0的(正常)计算)。例如:(a)参照以上示例4,步骤506可以牵涉到作为用于第一函数f0的指令/代码的一部分而包括movbx、sp和jmpbx指令中的一个或二者;(b)参照以上示例5,步骤506可以牵涉到作为用于第一函数f0的指令/代码的一部分而包括movbx、sp、xorbx、cx、xorbx、0xabcd和jmpbx指令中的一个或二者。然而,将领会到,这些仅仅是示例,并且本发明的实施例可以牵涉到以不同方式包括/修改指令。

如上文所提及,可以存在用于受保护的软件项目260(或者初始软件项目220)的代码内的多个“合法”执行路径,其导致第一函数f0的执行。因此,在一些实施例中,步骤502可以牵涉到标识导致第一函数f0的执行的多个(例如,全部)这样的合法执行路径,并且步骤504可以针对每一个所标识的执行路径而执行。以该方式,第一函数f0可以被布置成提供第一功能性,假如已经经由任何合法执行路径到达第一函数f0的执行(使得第一函数f0可以被布置成在攻击缺失的情况下提供第一功能性)的话。

3-修改

将领会到,已经将所描述的方法示为以特定次序实施的各个步骤。然而,技术人员将领会到,这些步骤可以以不同的次序组合或实施,同时仍然实现期望结果。

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

将领会到,以上提及的功能性可以被实现为作为硬件和/或软件的一个或多个对应模块。例如,以上提及的功能性可以被实现为一个或多个软件组件以供系统的处理器执行。可替换地,以上提及的功能性可以被实现为硬件,诸如在一个或多个现场可编程门阵列(fpga)和/或一个或多个专用集成电路(asic)和/或一个或多个数字信号处理器(dsp)和/或其它硬件布置上。在本文包含的流程图中或者如上文描述的那样实现的方法步骤可以各自由对应相应模块实现;在本文包含的流程图中或者如上文描述的那样实现的多个方法步骤可以一起由单个模块实现。

将领会到,在本发明的实施例由计算机程序实现的范围内,那么存储或承载计算机程序的一个或多个存储介质和/或一个或多个传输介质形成本发明的方面。计算机程序可以具有一个或多个程序指令或程序代码,其在由一个或多个处理器(或者一个或多个计算机)执行时实施本发明的实施例。如本文中使用的术语“程序”可以是被设计用于在计算机系统上执行的指令序列,且可以包括子例程、函数、过程、模块、目标方法、目标实现、可执行应用、小应用程序、小服务程序、源代码、目标代码、字节代码、共享库、动态链接库和/或被设计用于在计算机系统上执行的其它指令序列。存储介质可以是磁盘(诸如硬盘驱动器或软盘)、光盘(诸如cd-rom、dvd-rom或蓝光盘)或存储器(诸如rom、ram、eeprom、eprom、闪速存储器或便携式/可移除存储器设备)等。传输介质可以是通信信号、数据广播、两个或更多计算机之间的通信链路等。

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