使用部分映像散列确认可执行文件完整性的系统和方法

文档序号:6651852阅读:193来源:国知局
专利名称:使用部分映像散列确认可执行文件完整性的系统和方法
技术领域
本发明涉及数据认证或验证。
背景技术
运行在用户计算机上的可执行文件可能包括病毒或特洛伊木马。可执行文件也被称为二进制映像,且包括,例如,诸如可移植可执行代码(PE)、宏、如VisualBasic脚本(VBS)的脚本等任何可执行对象。病毒是修改磁盘上的二进制映像的程序或代码片段,一般违背用户意愿且不为用户所知。病毒也可以自我复制。反复制作自己的副本的简单病毒相对较容易产生。即使这样的简单病毒也是危险的,因为它们可能会迅速使用所有可用的存储器,造成系统停机。其它危险类型的病毒能够在网络上传输自己并绕过安全系统。与病毒不同,特洛伊木马不自我复制,但是它们可以一样有破坏性,通常将自己化装为良性应用程序。例如,特洛伊木马可以是由不受怀疑的用户独立装入的。隐伏类型的特洛伊木马是声称使你的计算机摆脱病毒而实际将病毒引入至你的计算机的程序。从而,在计算机上运行可执行文件可能是危险的。
标识已被例如病毒或特洛伊木马破坏的可执行代码的一种方法涉及当将可执行文件安装或下载至计算设备时使用可信的密码散列。密码散列或简称为“散列”,将可执行文件编译为概括的形式,即摘要。可信散列在散列的创建时间已知为良好的,或表示未被破坏的代码。为了为可执行文件(即,二进制映像、可执行代码、脚本、宏等)生成可信散列,在可执行文件,包括诸如数据等相关联的资源上执行消息摘要或校验和计算,以在将该可执行文件从一个位置传送至另一个位置之前获取第一结果。在已传送的可执行文件上进行同一计算来获取第二结果。将第一结果与第二结果比较,来确定所接收的可执行文件是否是原来发送的同一数据。例如,如果之前和之后的计算结果匹配,那么所接收的数据很可能是正确的。否则,所接收的可执行文件已被破坏。以这种方式,对完全二进制映像散列的使用有效地减少了下载或安装已破坏的二进制映像的风险。

发明内容
描述了用于使用部分映像散列来确认可执行文件的完整性的系统和方法。在一个方面,生成多个部分映像散列,其组合表示整个二进制映像的摘要。在将该二进制映像加载至计算设备之后,截取将该二进制映像的一部调页调页至存储器来执行的请求。响应于截取该请求,并在将该部分调页至存储器来执行之前,计算该部分的确认散列。将确认散列与该多个部分映像散列中的部分散列进行比较,来确定该部分的代码完整性。该部分散列表示与该部分相同的代码段。


附图中,组件参考标号的最左位数字标识其中该组件首次出现的特定附图。
图1示出了使用部分散列来确认可执行文件的完整性的示例性系统。
图2示出了使用部分散列来确认可执行文件的完整性的示例性过程。
图3示出了可在其中完全或部分实现使用部分散列来确认可执行文件的完整性的系统和方法的合适的计算环境的示例。
具体实施例方式
综述一般在执行可执行代码之前的任一时刻仅将该代码的一部分映射至存储器,来有效地利用处理和存储器资源。例如,调页是由虚拟存储器操作系统用于在任一时刻将可执行文件(例如,PE文件)的仅某些字节作为代码从存储设备加载/映射至存储器的技术。例如,当计算机程序需要不在主存储器中的一页时,操作系统将所需的页复制至存储器。在另一示例中,诸如VB脚本引擎等脚本引擎可以将一部分脚本(独立于任何页或页大小概念的部分)作为代码从存储设备映射至存储器。
考虑到用来将不同类型和数量的可执行代码加载至存储器用于执行的不同技术,并为讨论起见,在后文中短语“一部分”指示任意数量的字节,其中字节的数量对于正被执行的特定代码-存储器加载操作是适当的。例如,对调页操作,短语“一部分”或“部分”指的是由页边界(一页或多页)描述的多个字节。在另一示例中,对于非调页操作(例如,由脚本引擎执行的可执行代码存储器加载操作),短语“一部分”或“部分”指的是对用于将代码/脚本移动至存储器以供后续执行的特定实现适当的多个字节。无论使用何种技术来将可执行代码加载至存储器用于执行,在这样的部分中的字节数是任意的,且一般比完整的可执行文件中的字节数少,通常是由正被实现的特定可执行代码加载体系结构决定的。
加载至存储器的部分可执行代码的字节大小一般小于完整的可执行文件的大小的一个原因是,由于将完整的可执行文件加载至存储器一般所需过高数量的存储器和处理资源,尤其是当仅调度了小部分(例如,一页或多页)可执行文件来执行时。例如,当可执行文件被安装至数据存储设备之后,如果在将整个映像(可执行文件)的第一部分加载至存储器中用于执行之前刚确认该映像的单个散列,那么存储器和处理器资源将不能被有效利用。这是因为计算完整映像散列需要将整个可执行文件调页至存储器中。
这样的进程要求对代码片段、数据和/或资源进行调页,这些代码片段、数据和/或资源在正常调页操作环境中,即使有过调页操作也不会在该特定时刻被页入。这样的部分加载操作在资源和性能开销方面基本上也是过高的。为这些原因,当将代码的一部分映射至存储器中用于执行来确定与该部分相关联的代码是否已被破坏时使用完全映像散列是不现实的。从而,可执行代码加载体系结构一般加载远小于完整的可执行文件的部分至存储器用于执行。这确保了有效地使用存储器和处理资源。
鉴于上述原因,当可执行文件的一部分被调页至存储器中,如果该部分自上一次进行完全可执行文件散列完整性检查以来已被破坏,那么现有系统在执行该被破坏的代码之前根本不会检测到该被破坏的代码。到此刻,被破坏的代码已经可能损害了系统的一个或多个部分的完整性。换言之,如果在完整性检查之后页被破坏,那么实现完全映像完整性检查的任何现有系统可能会遇到问题。为此,运行可执行文件仍旧十分危险。
与常规的代码完整性基础架构相反,以下描述的用于确认可执行文件完整性的系统和方法在紧接将代码移动(调页等)至存储器中来执行之前,使用部分散列来检测任何代码是否在安装至系统之后已被破坏。该系统和方法不依赖于常规系统的完全映像散列基础架构就可达到这一目的。为此,该系统和方法为每一可执行文件生成多个散列。每一个别的散列表示该可执行文件的相应部分,使得每一散列是少于该可执行文件的所有字节的摘要。在该实现中,例如,每一散列是可执行文件的相应页的摘要——即,按页散列。(页中的字节数是任意的,且是由该特别实现的调页体系结构来决定的。)在另一实现中,每一散列不是按页散列,而是表示少于或多于可执行文件的一页的摘要。
由于该系统和方法从存储设备中加载可执行文件的一部分(例如,一页或其它)至存储器,该系统和方法仅检查该部分的完整性。这导致极小的资源或性能影响,因为无需加载可执行文件(例如,整个可执行文件)的任何其它/无关的部分就可以确认该部分。
当用于使用部分散列来确认可执行文件的完整性的系统和方法标识将被加载至存储器的可执行文件的破坏的部分,例如作为进页操作的一部分时,该破坏的部分不被映射至存储器来执行。在一种实现中,当在调页操作中标识可执行文件的破坏的部分时,相应的进页操作失败,在某些实现中这会抛出异常。以这种方式,该系统和方法在可以执行代码之前检测代码的破坏页。这基本上减少了执行可执行文件的风险,从而提供了对抗涉及可执行文件的病毒、特洛伊木马攻击和/或类似物的额外保护。
现在将详细描述用于使用部分散列来确认可执行文件的完整性的系统和方法的这些和其它方面。
示例性系统尽管并非必需,但将在由诸如个人计算机等计算设备执行的计算机可执行指令(程序模块)的通用语境中描述用于使用部分散列来确认可执行文件的完整性的系统和方法。程序模块一般包括例程、程序、对象、组件、数据结构等,它们执行特定的任务或实现特定的抽象数据类型。尽管该系统和方法是在前述语境中描述的,后文描述的动作和操作也可以用硬件实现。
图1示出了用于使用部分散列来确认可执行文件的完整性的示例性系统100。在该实现中,系统100包括客户计算设备102。计算设备102是任何类型的计算设备,诸如个人计算机、膝上型计算机、服务器、小形状因子移动计算设备(例如,手机、个人数字助理或手持式计算机)等。计算设备102包括程序模块104和程序数据106。程序模块102包括,例如,为可执行文件的各个部分生成多个密码散列(即,部分映像散列108)的一个或多个计算机程序模块,以及在代码调页(或部分加载)操作中使用多个密码散列中相应的一个来确认可执行文件的程序模块。例如,按部分的可执行文件散列模块110为可执行文件的各个部分生成部分映像散列108。在该实现中为文件系统插件(例如,过滤器驱动程序)的映像部分完整性验证模块112在代码调页操作中使用所生成的密码散列来确认该可执行文件。为说明起见,用于对密码求散列以生成部分映像散列108的可执行文件被示为“其它数据”114的各个部分。
为讨论和说明起见,按部分的可执行文件散列模块110和映像部分完整性确认模块112被示为在单个计算设备102上实现。然而,这些程序模块可以在含有计算设备102的所有程序模块104和程序数据106或其子集的不同计算设备上实现。例如,在一个实现中,第一计算设备实现可执行文件散列模块110来生成包含可执行文件和相应的部分映像散列108用于安装和/或下载至第二计算设备的包。第二计算设备实现映像部分完整性确认模块112,以在代码调页(或部分加载)操作中使用多个密码散列中相应的几个来确认该可执行文件。
现在通过首先描述按部分的可执行文件散列模块110的示例性操作,然后描述映像部分完整性确认模块112的示例性操作,来更详细地描述系统100的操作。
示例性按部分的可执行文件密码散列如上所述,按部分的可执行文件散列模块110为可执行文件的各个部分生成部分映像散列108。部分映像散列108的每一部分散列108表示可执行文件的各个部分的散列,使得每一散列108是少于可执行文件所有字节的部分的摘要(除非整个可执行文件的大小小于或等于该部分的大小)。例如,在一种实现中,每一散列108不是每页散列,但是表示了可执行文件少于一页或多于一页的部分的摘要(即,不是基于页大小边界的摘要)。在该实现中,为讨论起见,每一散列108是可执行文件的相应一页的摘要——即,每页散列。(一页中的字节数是任意的,且是由特别实现的调页体系结构来决定的。)由按部分的可执行文件散列模块110实现来创建多个部分散列108的特定散列算法是任意的,且可以是用于生成二进制码的散列的任何算法。这样的算法的示例包括,例如SHA-1和MD5。
系统100可以将可执行文件与其相应的部分映像散列108以多种不同的方式相关联。例如,在一种实现中,系统100利用制造或更新系统目录应用程序(见“其它程序模块”118)来将可执行文件与其相应的部分映像散列108打包成系统目录108。这样的打包可以作为系统目录120创建操作的一部分,或者作为系统目录120更新进程的一部分来执行。在一种实现中,系统目录120基于也包括部分映像散列108的小巧文件(cabinet file)结构。尽管系统目录的使用是常见的,但是常规的系统目录不包括任何可执行文件的部分映像散列108。相反,如果常规系统目录包括任何类型的可执行文件散列,那么该可执行文件散列将是整个可执行文件的单个可执行文件散列。在一种实现中,系统目录120包括部分映像散列108和完全可执行文件散列;该完全可执行文件散列是为了与常规代码完整性基础架构向后兼容。
在另一种实现中,系统100利用密码签署应用程序(见“其它程序模块”118)来将可执行文件与其相应的部分映像散列108打包成自签署文件122。在该实现中,自签署文件是PKC#7数据格式,从而允许最终用户跟踪对最终证书授权的相关联的签名和X.509证书。在一种实现中,自签署文件122包括部分映像散列108和完全可执行文件散列;该完全可执行文件散列是为了与常规代码完整性基础架构向后兼容。
示例性可执行文件完整性确认无论系统100如何将部分映像散列108与相应的可执行文件相关联(例如,将可执行文件与其部分映像散列108关联成系统目录120或自签署文件122),这样的关联允许映像部分完整性确认模块112在代码加载操作中以最少的资源和性能影响来执行可执行文件确认。这是因为由于可执行文件的各个部分是在调页(或部分加载)操作中从存储设备复制至存储器以便后续执行的,与各个部分相关联的相应部分映像散列108用于确认各个部分。(以下参考图3示出和描述了示例性RAM、ROM以及诸如磁盘驱动器、CD-ROM、DVD等存储设备。)如下所述,这是独立于将无关/额外的代码和资源(例如,页或脚本)拉入存储器的任何需求来完成的。
文件系统116、存储器管理器124以及映像部分完整性确认模块112在操作系统(OS)调页(或部分加载)操作中协作以确认被拉入存储器中以供执行的可执行文件的各部分。(在一种实现中,存储器管理器和文件系统被实现为操作系统的相应部分。)为了这些目的,当执行代码(见“其它程序模块”118)想要为后续执行加载存储在存储设备上的可执行文件的一部分时,作为段创建进程的一部分,存储器管理器124向文件系统116发送打开请求来打开该可执行文件。接着,存储器管理器向文件系统116传递一个或多个进页(或进部分)请求,以将可执行文件的一页或多页调页或映射至存储器用于执行。为讨论起见,在调页操作中,“进部分请求”是进页请求。在另一实现中,“进部分请求”是对不是由页边界描述而是由正被实现的代码加载体系结构(例如,脚本引擎加载体系结构等)描述的某些其它数量的字节的请求。打开、进页请求以及进部分请求被示为“其它数据”114的相应部分。
为了在代码的执行之前验证代码的这一个或多个部分的完整性,可执行文件部分完整性确认模块112截取这些请求。响应于打开文件(例如,创建请求)的接收,可执行文件部分完整性确认模块112评估由打开请求所标识的数据(目标)的来源,来确定目标是数据还是代码。数据一般不被映射为代码,反之亦然。如果目标被映射为代码,则可执行文件部分完整性确认模块112定位与该目标相关联的部分映像散列108,并将该散列中的每一个映射至存储器中。在一种实现中,这是通过确定部分映像散列是被打包至系统目录120还是自签署文件122来完成的。为此,可执行文件部分完整性确认模块112首先使用由按部分的可执行文件散列模块110用来创建部分映像散列108的同一算法来计算该可执行文件头的散列。计算出的散列与每一部分映像散列108是同一可配置字节大小。为说明起见,该计算出的散列被示为“其它数据”114中“为验证而计算出的散列”中相应的一个。
可执行文件部分完整性确认模块112将计算出的散列与存储在系统目录120中的各个部分映像散列108进行比较,来搜索具有匹配计算出的散列的所有位的相关联部分映像散列108的可执行文件。如果找到了这样的匹配散列108,那么所关心的可执行文件是“目录签署的”,即是在系统目录120中表示的。在该情形中,可执行文件部分完整性确认模块112将与该可执行文件相关联的每一部分映像散列108读入RAM中。注意,该复制操作不是检查了完整性的调页(或其它代码部分加载)操作,因为该散列列表是来自非可执行数据文件的数据,而不是从可执行二进制文件中读取/调页的信息。
如果该所关心的可执行文件(目标)不是目录签署的,那么可执行文件部分完整性确认模块112确定该所关心的可执行文件是否是自签署的,例如具有嵌入的PKCS#7签署的内容。如果是,那么确认过滤程序112读取证书数据,确认该证书可以被最终上溯至一组已知/可信的证书根中的一个,然后将每页散列108的嵌入列表(位于目标的签名中)复制至存储器中。在一种实现中,该自签署文件也包括可执行文件的完全散列,用于执行常规代码完整性检查。
响应于由可执行文件部分完整性确认模块112进行的截取,存储器管理器124向文件系统116传递对可执行文件的一个或多个部分的“进部分”请求,其中该可执行文件是前一打开文件请求的主体,可执行文件部分完整性去忍模块112确认所请求的一个或多个部分的每一部分的完整性。更具体地,可执行文件部分完整性确认模块112为由该进页/进部分请求标识的每一页/部分计算散列,并将每一相应的散列与该部分之前计算出的相应部分映像散列108进行比较。(如上所述,响应于打开文件请求,部分映像散列108被复制至存储器)。
如果计算出的散列与存储的散列匹配,那么可执行文件部分完整性确认模块112允许该进页/进部分操作完成,从而将所请求的部分映射至存储器用于执行。如果该计算出的散列与相应的部分映像散列108不匹配,那么可执行文件部分完整性确认模块112使该进页/进部分请求失败,且该被修改/破坏/篡改的代码将不作为代码被拉入存储器中,从而,之后将不被执行。
考虑上述,由于系统100实现调页和其它存储器代码加载操作来将可执行文件的一部分(例如,一页)从存储设备拉入至存储器中,系统100仅检查被拉入的该部分代码的完整性。这引起极小的资源或性能的影响,因为仅确认该部分,而没有加载可执行文件的任何额外/无关部分(例如,整个可执行文件)。
示例性过程图2示出了用于使用部分散列确认可执行文件的完整性的示例性过程200。为讨论和说明起见,参考图1的组件来描述该过程的操作。组件参考标号的最左边的数字表示其中该组件首次出现的特定附图。在框202处,按部分的可执行文件散列模块110(图1)为可执行文件生成部分映像散列108。在框204处,部分映像散列108与该可执行文件相关联。在一种实现中,这是通过将该可执行文件与部分映像散列108封装至系统目录120来完成的。在另一种实现中,这是通过将该可执行文件与部分映像散列108封装至自签署文件122来完成的。系统目录120和/或自签署文件122可被安装或下载至不同的计算设备上。
在框206处,映像部分完整性确认模块112(图1)截取从存储器管理器124发送给文件系统116的文件打开(创建段)请求。在框208处,响应于该文件打开请求操作的接收,映像部分完整性确认模块112评估该请求的目标数据源,来确定它是代码(可执行文件)还是数据(不是可执行文件)。如果该目标为可执行文件,那么映像部分完整性确认模块112定位与该目标相关联的每一部分映像散列108,并将它们复制至存储器中以供快速访问(例如,当接收到关联于部分映像散列108的一个或多个的进页请求时的访问)。在框210处,响应于截取由存储器管理器124定向至文件系统116的进页或进部分请求,映像部分完整性确认模块112为作为所截取的请求的目标的那部分代码计算散列(用于确认的计算出的散列)。该部分代码由文件系统从数据存储单元中拉出,用于拉入至存储器中以供执行——如果该部分之后被确认为没有被破坏。
为此,在框212处,映像部分完整性确认模块112将所计算出的散列与相应的一个部分映像散列108进行比较,来验证通过所截取的请求(框210)而请求的该部分代码的完整性。在框214处,如果该部分代码被确定为没有被破坏(即,计算出的散列匹配相对应的一个部分映像散列108),那么映像部分完整性确认模块112允许在调页操作中将该部分代码映射至存储器以供后续执行。否则,在框216处,如果该部分代码被确定为被破坏的(即,计算出的散列不匹配相对应的一个部分映像散列108),那么映像部分完整性确认模块112使所截取的请求失败,使得该部分代码不被映射至存储器用于执行。
示例性操作环境图3示出了可在其中完全或部分实现用于使用部分散列来确认可执行文件完整性的系统和方法的合适的计算环境300的示例。示例性计算环境300只是适用于图1的示例性系统和图2的示例性操作的计算环境的一个示例,并不旨在对此处描述的系统和方法的使用范围或功能提出任何限制。也不应该把计算环境300解释为对计算环境300中示出的任一组件或其组合有任何依赖性或要求。
本发明可用众多其它通用或专用计算系统、环境或配置来操作。可适于使用的公知的计算系统、环境和/或配置的示例包括,但不限于,个人计算机、膝上型计算机、小形状因子移动计算设备(例如,手机、个人数字助理或手持式计算机)、服务器计算机、多处理器系统、基于微处理器的系统、网络PC、小型机、大型机、包含上述系统或设备中的任一个的分布式计算机环境等。架构的简单或子集形式也可以在有限资源的客户机中实现,诸如手持式计算机或其它计算设备。本发明在分布式计算环境中实现,其中任务由通过通信网络连接的远程处理设备执行。在分布式计算环境中,程序模块可以位于本地和远程计算机存储器存储设备中。
参考图3,示例性系统300示出了可在其中完全或部分实现用于使用部分散列来确认可执行文件完整性的系统和方法的合适的计算环境300的示例。系统300包括实现例如图1的客户计算机102的计算机310形式的通用计算设备。计算机310的组件可以包括,但不限于,处理单元320、系统存储器330和将包括系统存储器在内的各种系统组件耦合至处理单元320的系统总线321。系统总线321可以是若干类型的总线结构中的任一种,包括存储器总线或存储器控制器、外围总线和使用各种总线体系结构中的任一种的局部总线。作为示例,而非限制,这样的体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、扩展的ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线和外围部件互连(PCI)总线(也被称为Mezzanine总线)。
计算机310通常包括各种计算机可读介质。计算机可读介质可以是能够被计算机310访问的任何可用介质,且包括易失性和非易失性介质、可移动和不可移动介质。作为示例,而非限制,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以任何方法或技术实现的用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、或能用于存储所需信息且可以由计算机310访问的任何其它介质。
通信介质通常具体化为诸如载波或其它传输机制等已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,且包含任何信息传递介质。术语“已调制数据信号”指的是这样一种信号,其一个或多个特征以在信号中编码信息的方式被设定或更改。作为示例,而非限制,通信介质包括有线介质,诸如有线网络或直接线连接,以及无线介质,诸如声学、RF、红外线和其它无线介质。上述中任一个的组合也应包括在计算机可读介质的范围之内。
系统存储器330包括易失性或非易失性存储器形式的计算机存储介质,诸如只读存储器(ROM)331和随机存取存储器(RAM)332。基本输入/输出系统333(BIOS)包含有助于诸如启动时在计算机310中元件之间传递信息的基本例程,它通常存储在ROM 331中。RAM 332通常包含处理单元320可以立即访问和/或目前正在操作的数据和/或程序模块。作为示例,而非限制,图3示出了操作系统334、应用程序335、其它程序模块336和程序数据337。
计算机310也可以包括其它可移动/不可移动、易失性/非易失性计算机存储介质。仅作为示例,图3示出了从不可移动、非易失性磁介质中读取或向其写入的硬盘驱动器341,从可移动、非易失性磁盘352中读取或向其写入的磁盘驱动器351,以及从诸如CD ROM或其它光学介质等可移动、非易失性光盘356中读取或向其写入的光盘驱动器355。可以在示例性操作环境中使用的其它可移动/不可移动、易失性/非易失性计算机存储介质包括,但不限于,盒式磁带、闪存卡、数字多功能盘、数字录像带、固态RAM、固态ROM等。硬盘驱动器341通常由不可移动存储器接口,诸如接口340连接至系统总线321,磁盘驱动器351和光盘驱动器355通常由可移动存储器接口,诸如接口350连接至系统总线321。
以上描述和在图3中示出的驱动器及其相关联的计算机存储介质为计算机310提供了对计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图3中,硬盘驱动器341被示为存储操作系统344、应用程序345、其它程序模块346和程序数据347。注意,这些组件可以与操作系统334、应用程序335、其它程序模块336和程序数据337相同或不同。应用程序335包括,例如图1的程序模块104。程序数据337包括,例如图1的程序数据106。操作系统344、应用程序345、其它程序模块346和程序数据347在这里被标注了不同的标号是为了说明至少它们是不同的副本。
用户可以通过输入设备,诸如键盘362和定点设备361(通常指鼠标、跟踪球或触摸垫)向计算机310输入命令和信息。其它输入设备(未示出)可以包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等。这些和其它输入设备通常由耦合至系统总线321的用户输入接口360连接至处理单元320,但也可以由其它接口或总线结构,诸如并行端口、游戏端口或通用串行总线(USB)连接。
监视器391或其它类型的显示设备也经由接口,诸如视频接口390连接至系统总线321。除监视器以外,计算机也可以包括其它外围输出设备,诸如打印机396和音频设备397,它们可以通过输出外围接口395连接。
计算机310可使用至一个或多个远程计算机,诸如远程计算机380的逻辑连接在网络化环境中操作。在一种实现中,远程计算机380表示由映像部分完整性确认模块112在代码调页操作中为后续的每一可执行文件部分安装或下载可执行文件和图1的部分映像散列108的计算设备。远程计算机380可以是个人计算机、服务器、路由器、网络PC、对等设备或其它常见网络节点,且是由其特定实现来决定的,可以包括上文相对于计算机102描述的许多或所有元件(例如,程序模块104和程序数据106等),尽管在图3中只示出存储器存储设备381。图3中所示逻辑连接包括局域网(LAN)371和广域网(WAN)373,但也可以包括其它网络。这样的网络环境在办公室、企业范围计算机网络、内联网和因特网中是常见的。
当在LAN网络环境中使用时,计算机310通过网络接口或适配器370连接至LAN 371。当在WAN网络环境中使用时,计算机310通常包括调制解调器372或用于通过诸如因特网等WAN 373建立通信的其它装置。调制解调器372可以是内置或外置的,它可以通过用户输入接口360或其它合适的机制连接至系统总线321。在网络化环境中,相对于计算机310所描述的程序模块或其部分可以存储在远程存储器存储设备中。作为示例,而非限制,图3示出了远程应用程序385驻留在存储器设备381上。所示的网络连接是示例性的,且可以使用在计算机之间建立通信链路的其它手段。
结论尽管以对结构特征和/或方法操作或动作专用的语言描述了用于使用部分散列来确认可执行文件完整性的系统和方法,但可以理解,所附权利要求书中定义的实现不必限于所描述的具体特征或动作。例如,尽管映像部分完整性确认模块112被示为作为插件结合到文件系统116中,但是程序模块112也可以是插件或以其它方式结合到除文件系统之外的其它程序模块中。例如,在一种实现中,映像部分完整性确认模块112的操作由存储器管理器124直接访问(作为插件或其它)。从而,这些具体特征和操作被揭示为实现所要求保护的主题的示例性形式。
权利要求
1.一种计算机实现的方法,包括生成表示可执行文件的多个部分映像散列,所述多个部分映像散列中的每一部分散列表示少于所述可执行文件的所有字节的部分;在将所述可执行文件加载至计算设备上之后,截取将所述可执行文件的一部分调页至存储器中用于执行的请求;以及响应于截取所述请求,并在将所述部分调页至存储器用于执行之前计算所述部分的确认散列;以及将所述确认散列与所述多个部分映像散列中的一个部分散列进行比较,来确定所述部分的代码完整性,所述部分散列表示与所述部分相同的代码段。
2.如权利要求1所述的方法,其特征在于,所述多个部分映像散列是在将所述可执行文件加载至所述计算设备之前计算的。
3.如权利要求1所述的方法,其特征在于,所述多个部分映像散列被存储在系统目录或自签署密码文件中。
4.如权利要求1所述的方法,其特征在于,还包括确定所述确认散列匹配所述部分散列;以及响应于所述确定,将所述部分调页至存储器中用于执行。
5.如权利要求1所述的方法,其特征在于,还包括确定所述确认散列不匹配所述部分散列;以及响应于所述确定,使将所述部分调页至存储器中用于执行的请求失败。
6.如权利要求1所述的方法,其特征在于,还包括在将所述可执行文件加载至计算设备之后,截取为所述可执行文件创建代码段的打开请求;以及响应于截取所述打开请求计算所述可执行文件头的标识散列;将所述标识散列与存储在系统目录中的多个部分可执行文件散列中的相应的几个进行比较,来标识多个部分二进制散列中匹配所述文件头的散列,所述散列是所述多个部分映像散列中的第一散列;以及响应于定位所述散列,将所述可执行文件的多个部分映像散列从所述系统目录复制至存储器中,用于之后响应于将所述可执行文件的一个或多个部分调页至存储器用于执行而进行的部分映像散列码完整性确认操作。
7.如权利要求1所述的方法,其特征在于,还包括在将所述可执行文件加载至计算设备之后,截取为所述可执行文件创建代码段的打开请求;以及响应于截取所述打开请求,并响应于确定所述可执行文件是自签署密码文件,将所述多个部分映像散列从所述自签署密码文件中复制至存储器中,用于之后响应于将所述可执行文件的一个或多个部分调页至存储器用于执行而进行的部分映像散列码完整性确认操作。
8.一种包含处理器可执行计算机程序指令的计算机可读介质,所述计算机程序指令用于生成表示可执行文件的摘要的多个部分映像散列,所述多个部分映像散列中的每一部分散列表示少于所述可执行文件的所有字节的部分;在将所述可执行文件加载至计算设备之后,截取将所述可执行文件的一部分调页至存储器中用于执行的请求;以及响应于截取所述请求,并在将所述部分调页至存储器用于执行之前计算所述部分的确认散列;以及将所述确认散列与所述多个部分映像散列中的一个部分散列进行比较,来确定所述部分的代码完整性,所述部分散列表示与所述部分相同的代码段。
9.如权利要求8所述的计算机可读介质,其特征在于,所述多个部分映像散列是在将所述可执行文件加载至所述计算设备之前计算的。
10.如权利要求8所述的计算机可读介质,其特征在于,所述多个部分映像散列被存储在系统目录或自签署密码文件中。
11.如权利要求8所述的计算机可读介质,其特征在于,所述计算机程序指令还包括指令,用于确定所述确认散列匹配所述部分散列;以及响应于所述确定,将所述部分调页至存储器中用于执行。
12.如权利要求8所述的计算机可读介质,其特征在于,所述计算机程序指令还包括指令,用于确定所述确认散列不匹配所述部分散列;以及响应于所述确定,使将所述部分调页至存储器中用于执行的请求失败。
13.如权利要求8所述的计算机可读介质,其特征在于,所述计算机程序指令还包括指令,用于在将所述可执行文件加载至计算设备之后,截取为所述可执行文件创建代码段的打开请求;以及响应于截取所述打开请求计算所述可执行文件头的标识散列;将所述标识散列与存储在系统目录中的多个部分可执行文件散列中的相应的几个进行比较,来标识多个部分二进制散列中匹配所述文件头的散列,所述散列是所述多个部分映像散列中的第一散列;以及响应于定位所述散列,将所述可执行文件的多个部分映像散列从所述系统目录复制至存储器中,用于之后响应于将所述可执行文件的一个或多个部分调页至存储器用于执行而进行的部分映像散列码完整性确认操作。
14.如权利要求8所述的计算机可读介质,其特征在于,所述计算机程序指令还包括指令,用于在将所述可执行文件加载至计算设备之后,截取为所述可执行文件创建代码段的打开请求;以及响应于截取所述打开请求,并响应于确定所述可执行文件是自签署密码文件,将所述多个部分映像散列从所述自签署密码文件复制至存储器中,用于之后响应于将所述可执行文件的一个或多个部分调页至存储器用于执行而进行的部分映像散列码完整性确认操作。
15.一种计算设备包括处理器;以及耦合至所述处理器的存储器,所述存储器包括所述处理器可执行的计算机程序指令,用于生成表示可执行文件的摘要的多个部分映像散列,所述多个部分映像散列中的每一部分散列表示少于所述可执行文件的所有字节的部分;在将所述可执行文件加载至计算设备之后,截取将所述可执行文件的一部分调页至存储器中用于执行的请求;以及响应于截取所述请求,并在将所述部分调页至存储器用于执行之前计算所述部分的确认散列;以及将所述确认散列与所述多个部分映像散列中的一个部分散列进行比较,来确定所述部分的代码完整性,所述部分散列表示与所述部分相同的代码段。
16.如权利要求15所述的计算设备,其特征在于,所述多个部分映像散列被存储在系统目录或自签署密码文件中。
17.如权利要求15所述的计算设备,其特征在于,所述计算机程序指令还包括指令,用于确定所述确认散列匹配所述部分散列;以及响应于所述确定,将所述部分调页至存储器中用于执行。
18.如权利要求15所述的计算设备,其特征在于,所述计算机程序指令还包括指令,用于确定所述确认散列不匹配所述部分散列;以及响应于所述确定,使将所述部分调页至存储器中用于执行的请求失败。
19.如权利要求15所述的计算设备,其特征在于,所述计算机程序指令还包括指令,用于在将所述可执行文件加载至计算设备之后,截取为所述可执行文件创建代码段的打开请求;以及响应于截取所述打开请求计算所述可执行文件头的标识散列;将所述标识散列与存储在系统目录中的多个部分可执行文件散列中的相应的几个进行比较,来标识多个部分二进制散列中匹配所述文件头的散列,所述散列是所述多个部分映像散列中的第一散列;以及响应于定位所述散列,将所述可执行文件的多个部分映像散列从所述系统目录复制至存储器中,用于之后响应于将所述可执行文件的一个或多个部分调页至存储器用于执行而进行的部分映像散列码完整性确认操作。
20.如权利要求15所述的计算设备,其特征在于,所述计算机程序指令还包括指令,用于在将所述可执行文件加载至计算设备之后,截取为所述可执行文件创建代码段的打开请求;以及响应于截取所述打开请求,并响应于确定所述可执行文件是自签署密码文件,将所述多个部分映像散列从所述自签署密码文件复制至存储器中,用于之后响应于将所述可执行文件的一个或多个部分调页至存储器用于执行而进行的部分映像散列码完整性确认操作。
全文摘要
描述了用于确认可执行文件的完整性的系统和方法。在一个方面,生成多个部分映像散列,其组合表示整个可执行文件的摘要。在将该可执行文件加载至计算设备之后,截取将该可执行文件的一部分调页至存储器来运行的请求。响应于截取该请求,并在调页该部分至存储器来执行之前,计算该部分的确认散列。将确认散列与该多个部分映像散列中的一个部分散列进行比较,来确定该部分的代码完整性。该部分散列表示与该部分相同的代码段。
文档编号G06F1/00GK1808326SQ20051013614
公开日2006年7月26日 申请日期2005年12月19日 优先权日2005年1月18日
发明者J·D·斯瓦茨, P·J·哈林, Y·L·谢 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1