用于外来代码检测的系统和方法

文档序号:6566794阅读:224来源:国知局
专利名称:用于外来代码检测的系统和方法
用于外来代码检测的系统和方法版权声明和许可本专利文件的公开内容的一部分可能包含须经版权保护的材料。本版权所有 者不反对任何专利文件或专利公开像出现在专利与商标局专利文件或记录中一样 的复制,但在除此之外的任何情况下保留版权。以下标注应适用于本文件Copyright 2004, Microsoft Corp.。发明领域本发明一般涉及计算领域,尤其涉及检测非旨在驻留在计算机系统的进程空 间中的外来代码的技术。发明背景当今的计算机系统常遭受到各种破坏或禁止计算机系统的期望操作、并使得 系统以损坏或非期望方式运行的攻击。计算机病毒、蠕虫和特洛伊木马程序是不同 形式攻击的示例。攻击也可以来自计算机系统的不择手段的用户或者远程黑客。这 些攻击通常是以尝试修改由计算机系统执行的现有程序代码或尝试在计算机系统 中常规程序执行的各个阶段插入新的未经授权的程序代码的形式出现。防止这些恶 意攻击的系统和方法变得日益重要。一般而言,这种攻击是通过使计算机执行外来代码实现的。在这种情况下"外 来"代码是指不旨在或期望在特定程序的进程空间中执行的代码。它通常由黑客写 成用以进入程序的进程空间以完成某些目的,诸如删除、破坏或为了如非法制作音 乐的未经授权拷贝等其它目的操纵代码或数据等。防止外来代码的这种攻击有助于确保计算机系统(或至少是特定程序)的行 为完整性。维持完整性的一种方式是执行模块认证,其中保护一个或多个软件模块 的安全性以免被篡改。这提供了对诸如代码补丁、重定向和软件断点等对软件的恶 意改变的一定程度的保护。模块认证的一种形式是确保包含在软件模块中的内容没有被改变(或者至少 诸如代码部分等模块的不期望改变的部分真正保持未变)。这可以通过静态模块认证来完成。静态模块认证是验证模块(在某些情况下可被认为是"on-disk (盘上)"模块)的持久存储图像的过程。例如,检查盘上模块的一种机制可以通过取文件的 散列值、并将所得散列值与已由受信任签署者签名的文件的预先计算散列值作比较来完成。散列(Hashing)的处理是一种众所周知的密码技术,它使用相对唯一但相比 原始数据小得多的表示来标识数据。如SHA-1等好的散列算法即使对于源数据中 (或者该情况下的二进制文件)微小的变化也会生成显著不同的散列值。因此,当 预期的攻击是对所存储代码的修改时,散列法在检测出修改方面很有效。然而,对于检查代码和数据的完整性和安全性方面有基本的限制。简而言之, 不能一直检查所有的代码和数据。从性能的角度看,用户可能不希望计算机系统专 门使用其过量的资源来不断地搜索代码或数据篡改。例如,像Microsoft Suite等大 型软件程序的大小是许多兆字节,并且会花费大量的资源来反复检査整个程序以获 得代码或数据篡改的证据。解决该性能问题的一个方法是通过在存储器中选择一些数量的随机页面然后 扫描它们来检查外来代码。可以在某些设定的时间间隔或在事件发生时扫描这些页 面。通过随机地检查有限量的代码和数据,可为用户释放更多的资源以供使用,同 时提供对外来代码破坏计算机系统完整性的合理检查。然而,用于检查对计算机系统的攻击的一种经改进方式是仔细地选择程序的 哪些部分用于检查可能的篡改。例如,如果没有引用代码,那么它不能被执行,这 意味着它不会对计算机系统完整性造成危险。因此,提供智能技术来检测外来代码 是有优势的,其中检查和验证将要执行的代码或者很有可能要执行的代码。具体地, 通过检查可引用任何外来代码的进程空间中的线程堆栈来确定外来代码的存在是 有优势的。此外,检查指令指针所指向的代码、页面出错历史、以及任何指针和可 执行的其相关联函数,诸如整个动态链接库(DLL)中的指针和函数、事件处理器 的指针和函数等,是有优势的。发明内容本发明的各个方面示教了检测外来代码的一种智能方法。本发明一方面的重 点在于可能运行的代码,即以某种方式引用的代码。在本发明的一方面,不管线程 堆栈是否活动检査由线程堆栈引用的代码。特别地,检査在任何给定线程堆栈上引 用的选定代码页面。此外,在本发明的另一方面,也选择邻近那些选定页面的任何可疑页面来作外来代码检查。在本发明的又一方面,检查线程堆栈上引用的随机页 面。在本发明的其它方面,在处理器的指令指针所指向的页面中检查外来代码。 在本发明的另外方面,检查页面出错历史,这容许检査从扩展存储器页入到物理存 储器的任何页面,以及要求页入这些页面的任何代码。在本发明的其它方面,检査 诸如故障处理器的事件处理函数以及指向其的指针,它们处理计算机系统用户、计 算机系统本身或者两者同时带来的事件。所有这些方面具有相同的概念,即检查可 能要执行的代码,而相反不检查不大可能执行的代码。以下描述本发明的其他特征。


结合附图能更好地理解上述发明内容和以下对发明的详细描述。为了说明本 发明,示出了描述本发明的各个方面的示例性实施例。然而,本发明不限于所揭示 的特定系统和方法。包括以下附图图1提供了对结合其可实施本发明的合适计算设备的简要描述;图2示出了外来代码检测候选,即位于进程空间中的几个线程堆栈;图3A示出了遍历线程堆栈并在页面中检査外来代码的概念;图3B示出了检查线程堆栈所引用的随机页面的概念;图3C示出了在邻近可疑页面中检查外来代码的概念;图4示出了对事件处理函数和指针检査外来代码的存在;图5示出了对指令指针检査外来代码;图6示出了对页面出错历史检查外来代码;图7示出了外来代码检测的示例性实现。
具体实施方式
概述首先,以下针对本发明的各个方面描述了一示例性计算环境。其次,详细描 述了这些方面。例如,讨论了检测外来代码的方法,其中认证模块遍历堆栈,并且 检查存储器中堆栈所引用的任何页面。或者,认证模块检査随机页面和堆栈所引用 页面的邻近可疑页面。此外,检查由指令指针引用的页面、以及由事件处理函数引用的任何页面,不管是用户调用的、系统调用的、还是两者都调用的。此外,对页面出错历史检查 被页入到物理存储器中的页面、以及请求那些页面页入的代码。这些仅是一些示例, 意在示出贯穿本发明各个方面的宽泛原理检査可能运行的代码,不检査不大可能 运行的代码。示例性计算环境图1和以下讨论旨在提供对结合其可实施本发明的合适计算设备的简要描述。 例如,图1中示出的任何客户机或服务器计算机或设备可采取这种形式。然而,应 该理解,可构想手提式、便携式和所有类型的其他计算设备和计算对象可结合本发 明使用,即,计算环境中可生成、处理、接收和/或发送数据的任何地方。尽管以 下描述了通用计算机,但这仅是一个示例,本发明可使用具有网络/总线互通和交 互的瘦客户机来实现。因而,本发明可在网络化主机服务环境中实现,其中牵涉极 少或最少的客户机资源,例如其中客户机设备仅用作连接网络/总线的接口 (诸如 置入装置中的一对象)的网络化环境。本质上,可存储数据以及数据可从中获取或 发送到另一计算机的任何地方都是对本发明的对象持久方法的操作而言合乎需要 或合适的环境。虽然不是必须的,但是本发明可通过操作系统实现,供服务开发者用于设备 或对象、和/或包括在根据本发明运行的应用程序或服务器软件中。可在计算机可 执行指令的通用环境中描述软件,诸如可由例如客户机工作站、服务器或其他设备 的一个或多个计算机执行的程序模块。 一般而言,程序模块包括例程、程序、对象、 组件、数据结构等等,它们执行特定的任务或实现特定的抽象数据类型。通常,在 各个实施例中可按需组合或分布程序模块的功能。此外,本发明可用其他计算机系 统配置和协议来实践。适用于本发明的其它众所周知的计算系统、环境和/或配置 包括但不限于个人计算机(PC)、自动取款机、服务器计算机、手提式或膝上型 设备、多处理器系统、基于微处理器的系统、可编程消费电子产品、网络PC、装 置、灯光、环境控制元件、小型机、大型计算机等。图1由此示出了可实现本发明的合适计算系统环境的一个示例100,尽管如上所阐明的,计算系统环境ioo仅是合适计算环境的一个示例,且并不旨在提出对本发明的使用范围或功能的任何限制。计算环境100也不应当被解释为对有关示例性 操作环境100中示出的任一组件或其组合具有任何依赖或要求。参考图1,用于实现本发明的示例性系统包括计算机110形式的通用计算设 备。计算机110的组件可包括但不限于,处理单元120、系统存储器130以及将包括系统存储器的各个系统组件耦合至处理单元120的系统总线121。系统总线121 可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线 以及使用各类总线体系结构的任一种的局域总线。作为示例而非限制,这类体系结 构包括工业标准体系结构(ISA)总线、微信道体系结构(MCA)总线、增强ISA (EISA)总线、视频电子技术标准协会(VESA)局域总线以及外围部件互连(PCI) 总线(也称为Mezzanine总线)。计算机110通常包括各种计算机可读介质。计算机可读介质可以是可由计算 机110访问的任一可用介质,并且包括易失性和非易失性介质、可移动和不可移动 介质。作为示例而非限制,计算机可读介质包括计算机存储介质和通信介质。计算 机存储介质包括以储存诸如计算机可读指令、数据结构、程序模块或其它数据等信 息的任一方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存 储介质包括但不限于,RAM、 ROM、 EEPROM、闪存或其它存储器技术、CDROM、 数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁性存储 设备、或可用来储存所需信息并可由计算机110访问的任一其它介质。通信介质通 常具体化为诸如载波或其它传输机制的已调制数据信号中的计算机可读指令、数据 结构、程序模块或其它数据,并包括任一信息传送介质。术语"已调制数据信号" 指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示 例而非限制,通信介质包括有线介质,诸如有线网络或直接接线连接,以及无线介 质,诸如声学、RF、红外和其它无线介质。上述任一个的组合也应当包括在计算 机可读介质的范围之内。系统存储器130包括易失性和/或非易失性存储器形式的计算机存储介质,诸 如只读存储器(ROM) 131和随机存取存储器(RAM) 132。包含如在启动时帮助 在计算机110内的元件之间传输信息的基本例程的基本输入/输出系统133 (BIOS) 通常储存在ROM 131中。RAM 132通常包含处理单元120立即可访问或者当前正 在操作的数据和/或程序模块。作为示例而非限制,图1示出了操作系统134、应用 程序135、其它程序模块136和程序数据137。计算机110还可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。 仅作为示例,图1示出了对不可移动、非易失性磁介质进行读写的硬盘驱动器141、 对可移动、非易失性磁盘152进行读写的磁盘驱动器151、以及对可移动、非易失 性光盘156,如CD-RW、 DVD-RW或其它光学介质进行读写的光盘驱动器155。 可在示例性操作环境中使用的其它可移动/不可移动、易失性/非易失性计算机存储介质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字录像带、固态RAM、 固态ROM等等。硬盘驱动器141通常通过不可移动的存储器接口,如接口 140连 接到系统总线121,而磁盘驱动器151和光盘驱动器155通常通过可移动存储器接 口,如接口 150连接到系统总线121。上文讨论并在图1示出的驱动器及其关联的计算机存储介质为计算机110提 供了计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图1中, 硬盘驱动器141被示为储存操作系统144、应用程序145、其它程序模块146和程 序数据147。注意,这些组件可以与操作系统134、应用程序135、其它程序模块 136和程序数据137相同,也可以与它们不同。这里对操作系统144、应用程序145、 其它程序模块146和程序数据147给予不同的标号来说明至少它们是不同的副本。 用户可以通过输入设备,诸如键盘162和定位设备161 (诸如鼠标、跟踪球或触摸 板等)向计算机110输入命令和信息。其它输入设备(未示出)可包括话筒、操纵 杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通常通过耦合至 系统总线121的用户输入接口 160连接至处理单元120,但是也可以通过其它接口 和总线结构,诸如并行端口、游戏端口或通用串行总线(USB)连接。图形接口 182也可被连接到系统总线121。 一个或多个图形处理单元(GPU) 184可与图形 接口 182通信。监视器191或其它类型的显示设备也通过接口,诸如视频接口 l卯 连接至系统总线121,该接口又可与视频存储器186通信。除监视器之外,计算机 也可包括其它外围输出设备,诸如扬声器197和打印机196,它们通过输出外围接 口 195连接。计算机110可以使用到一个或多个远程计算机,如远程计算机180的逻辑连 接在网络化或分布式环境中操作。远程计算机180可以是个人计算机、服务器、路 由器、网络PC、对等设备或其它公用网络节点,并通常包括许多或所有相关于计 算机IIO所描述的元件,尽管在图1中仅示出了存储器存储设备181。图1描述的 逻辑连接包括局域网(LAN) 171和广域网(WAN) 173,但也可包括其它网络/ 总线。这类网络环境常见于家庭、办公室、企业范围计算机网络、内联网以及因特 网。当在LAN网络环境中使用时,计算机IIO通过网络接口或适配器170连接至 LAN 171。当在WAN网络环境中使用时,计算机110通常包括调制解调器172或 用于通过WAN173,如因特网建立通信的其它装置。可以是内置或外置的调制解 调器172通过用户输入接口 160或其他适当的机制连接至系统总线121。在网络化环境中,相关于计算机110所描述的程序模块或其部分可储存在远程存储器存储设备中。作为示例而非限制,图1示出远程应用程序185驻留在存储器设备181上。 可以理解,示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的 其它手段。外来代码检测方面以下讨论的本发明的各方面在进程空间中检查外来代码的存在。具体地,将 执行或可能执行的代码是要检查的目标。图2示出了用于外来代码检测的一些候选 200。通常,诸如可执行代码的代码和所支持库被映射到进程空间中。进程空间不 执行,而仅是定义在该进程空间中运作的任何事物可访问的存储器边界、资源等。 线程是在进程空间的边界内运作的执行的实例。在一个进程空间中可以执行许多线 程,且一般地,在进程空间中创建的所有存储器和资源可被该进程空间中的任一执 行线程使用。通常,每个线程具有它自己的堆栈,这种堆栈可以被称为"线程堆栈"。在 本发明的一个方面,图2示出了在进程空间224内分配的三个这种线程堆栈218、 220和222,这些线程堆栈是用于外来代码检测的候选,因为它们可能引用可能运 行的代码。诸如ModAuth 204等认证模块在每个线程堆栈所引用的要执行页面内 检查外来代码的存在。例如,ModAuth 204检査线程堆栈A 218的页面206和208, 以查看它们是否包含任何外来代码。它对线程堆栈B310执行相同的操作,检查其 页面310,并且对线程堆栈C 322检查其页面312、 314和316。ModAuth 204尝试要避免的(如用粗体"X"所示)是检查包含页面228、 230、 232和234的其他存储空间(进程空间)226。由于存储空间226不是进程空间224 的一部分,其内容228、 230、 232和234将不会被执行,因此ModAuth 204无需 在该存储空间226中检查任何外来代码。简而言之,ModAuth 204检查潜在地可能 执行的这类代码。在图2中,ModAuth 204将其对任何外来代码的搜索限制在进程 空间224的线程堆栈218、 220和222中。这种智能外来代码检查导致了极大地改 进的计算机性能,因为处理器无需浪费宝贵的时钟周期来检查不会被执行的代码。在本发明的另一方面,图3A示出了认证模块ModAuth 304遍历线程堆栈,以 获取可能引用页面306、 308或310中的外来代码的返回地址。同样地,以任何方 式可能最终导致外来代码执行的堆栈上所引用的任何要执行代码值得ModAuth 304检查。堆栈遍历仅是获取对外来代码引用的一种手段,即通过堆栈上的返回地 址,但可以采用找到对可能执行代码的引用的其它技术。在本领域中堆栈遍历的概念是公知的,尤其是在调试阶段使用时。在该阶段, 在提供有关堆栈框架的信息(也被称为激活记录)及其大小的调试符号的帮助下完成堆栈遍历,这样可执行可靠的堆栈遍历。在本发明的一个方面,ModAuth304遍 历线程堆栈。具体地,ModAuth304遍历线程堆栈A318的框架(未示出),检査 本地变量和引用要执行代码的页面306和308的返回地址。它对线程堆栈B作出 相同的操作,该线程堆栈包含引用页面310的返回地址。这样,ModAuth304可检査整个进程空间324中的所有线程堆栈。在图3B中,在本发明的另一方面,ModAuth304检查进程空间324的线程堆 栈所引用的随机页面。具体地,ModAuth304检查页面306,但是并不必然检查线 程堆栈A318中的页面308,并且它不检查线程堆栈B 320中的页面310。对随机 页面的检查可以在每个指定时间间隔进行或者在特定时间间隔内进行若干次。检查 实现依赖于运行ModAuth 304功能的系统的性能。换言之,ModAuth 304针对不存 在外来代码必须认证的越是频繁,要认证的页面越是多,就会越多地降低系统性能, 因为更多的计算资源将必须专用于检测外来代码。在图3C中,在本发明的又一方面,ModAuth 304不仅检査选定页面,而且也 检查邻近选定页面的任何可疑页面。例如,如果ModAuth 304已选择检查线程堆 栈A318中的页面308,那么它可能也要检查接着要执行的页面,即页面306。同 样地,如果ModAuth404已选择检查线程堆栈B 320中的页面310,那么它也可能 要检査下一页面,即页面311。选定页面可随机或非随机地选择。在任一情况下, 可检查选定页面的下一、上一或任何邻近页面。在本发明的另一方面,图4示出了可对事件处理器函数以及指向这些函数的 指针检查外来代码,其中函数通常是计算机系统事件处理器函数。事件处理器的一 个示例是响应一事件执行的函数或方法。事件可包括(1)用户动作,诸如键击和 鼠标移动,(2)系统事件,诸如存储器用完(例如异常处理器函数),或(3)这 两者的混合,诸如用户开启拼写检查器并由系统每分钟更新拼写检查。检査这些函 数的完整性是有利的原因在于它们可能在任何时刻被调用执行,并由此落入"可能 执行的代码"的类别。典型的事件处理器包括以下函数,但不限于这些示例 onclick (处理当用户点击一元时发生的事件) ondblclick (处理当用户双击一元时发生的事件) onkeydown (处理当按下按键时发生的事件) onkeypress (处理当用户按下字母数字键时发生的事件) onkeyup (处理当放开按键时发生的事件) onmousemove (处理当用户在一元上移动鼠标指针时发生的事件) onmouseout (处理当用户将指针从一元上移开时发生的事件) 这些仅是许多事件处理函数中的一些,这些事件处理函数可预防外来代码以改进程序的行为完整性。在图4中,示出了三种类型的事件用户413可通过按键或鼠标移动401来 创建事件,窗口系统414程序可以发生403;或者可由用户实施定时器例程415并 由系统更新505。这些事件由一些运行中的应用程序404处理,应用程序404具有 指向这些函数的指针以处理这些事件。例如,在定时器例程415事件时,应用程序 404处理该事件并通过指针416调用Spell—Checker—Routine() 406。这个例程406 会每隔60秒钟执行拼写检查。ModAuth 408通过检査(418)指向像Spell—Checker—Routine() 406等的事件处 理函数的指针416,并检査(420)例程406本身即检查包含例程406的页面来预 防任何外来代码渗入。换而言之,黑客412可能改变(426)指向指定例程(在所 示示例中为Spell—Checker—Routine() 406)的指针416,从而指针416将指向(422) 某个外来代码410而不再指向指定例程406。同样地,黑客412可能侵入(428) 指定例程406,使得这个例程406引用(424)某个外来代码410,或者黑客412 可能将某个外来代码插入例程本身406。如果ModAuth 408要保护系统代码的完整 性,则它必须预防这种侵入情况。预防这些情况的原因在于事件处理代码将响应可 能发生的特定事件而运行。不会指示ModAuth 408来认证将不运行的代码,而是 相反会指示ModAuth 408来认证将运行或可能运行的代码,因为这些代码可能潜 在地调用外来代码。在本发明的又一个方面,图5示出了检查计算机系统的指令指针(或程序计 数器)以及它所指向的代码。指令指针504是寄存器,它指向(506)要从存储器 加载并接着执行的下一指令512。指令指针504 —般存储在处理器502中。认证模块(未示出)可检查指令指针504是否被改写以指向(514)某个外来 代码516,或者它是否指向(506)下一个要执行的指令512,但是该指令实际上是 某个外来代码516且不是指定代码518。由于指令指针指向(506)将要执行的指 令,因此检查是否可能经由指令指针执行外部代码是合乎需要的。检查事件处理函数和代码所引用的指令指针只是需要检查的这类代码中的一 些示例,即可能运行的代码。这对于包括动态链接库、子系统程序(例如负责窗口操作的那些程序)等也成立。本领域技术人员会理解对这种可能运行代码的检査, 而不管检查(存储在页面上的)代码的标准是基于事件处理、指令指示、动态链接 库、还是窗口子系统等。 检查页面出错历史页面出错是当程序请求当前不在物理存储器中的代码或数据时发生的中断。 该中断触发操作系统从诸如磁盘驱动器等某个外部存储器中获取代码或数据,并将 其加载到诸如RAM等物理存储器中。该情况不同于无效页面出错或页面出错错误, 后两者是在当操作系统在由物理存储器和至少某些部分的外部存储器组成的虚拟 存储器中找不到代码或数据时发生。这通常在虚拟存储区域或将虚拟地址映射到实 际地址的表格发生损坏时发生。当发生页面出错时,创建其历史和所有其他页面出错。该历史包含有关哪个 页面被页入到物理存储器中以及哪个代码请求页入特定页面的信息。当页面被页入 到物理存储器时,很有可能执行页面中的代码。因此,检查页面出错历史是寻找潜 在外来代码的有效方式,因为页面中的代码和请求页面的代码可能被执行,且也可 能是外来代码或至少包含某些外来代码。图6示出了检查页面出错历史600。虚拟存储器602是扩展物理存储器604 的一种方式。这种扩展是通过硬盘606的协助来完成的。通过在物理存储器604 与硬盘606之间交换(618)页面614,在程序看来物理存储器604比其实际的要 大,即其大小是虚拟存储器602的大小。虚拟存储器602是物理存储器604和硬盘 606的页面文件608的总和。因此,硬盘606可包含分割出来以供虚拟存储器602 使用的单独磁盘空间610。页面出错历史620维护哪些页面614被页入到物理存储器604中、以及哪个 调用者612请求(616)将特定页面614页入的记录。通过检查页面出错历史620, 认证模块ModAuth 722能知道要检查物理存储器604中的哪些页面。同样地,基 于页面出错历史620, ModAuth 722能知道哪个代码请求页入特定页面。如上所述,ModAuth 622会想要检査页入页面的原因在于它将很可能被执行。 此外,通过检查页面出错历史620, ModAuth 622也能够检查请求页面614的调用 者612。如果调用者612是不期望驻留在物理存储器中的某个外来代码,那么它可 能页入某个其它的外来或恶意代码。本发明一方面的示例性实现在图7中,示出了本发明一方面的示例性实现。具体地,在框702,认证模块检查当前线程堆栈所引用的页面。这些页面上的代码将被执行或可能被执行,因此 检查它对防止外来代码渗入是重要的。接着,在框704,认证模块检查进程空间内其他线程堆栈所引用的页面,因为在任何环境切换时,这些其他线程堆栈中的任一个可能被调用,且它们所引用的代 码将被或者至少是可能被执行。同样,在框706,检查可能调用的任何函数以及指向他们的指针。这些函数可 能是基于某个用户事件、计算机系统事件或其组合调用的事件处理函数。由于可能 基于一指定事件调用事件处理函数,因此检查这些函数以防外来代码渗入是重要 的。换而言之,检查这些函数所驻留的页面是重要的。在框708,检査指令指针。由于该指针指向在当前执行指令之后将要执行的代 码,因此检査和确定指令指针是被侵入而指向外来代码,还是指向可能被侵入并由 此包含外来代码(由此可能进一步引用外来代码等)的正确指令集是重要的。在框710,检查页面出错历史。从硬盘上的页面文件被页入到物理存储器中的 页面是将可能运行的页面,因此对其检査外来代码。此外,也检査请求页入这些页 面的任何调用代码。这种调用代码可能是调用更多外来代码的外来代码。在框712,如果这种代码被认为是外来代码,则本发明的这个方面至少执行一 个动作以防止执行代码。这种动作可以包括在某个随机时间点使得系统出错、使得 进程被终止并从存储器卸载、信令另一进程终止或改变行为,或者触发显示用户界 面。在框714,示例性实现在某个指定时间段之后再次执行检查。该时间段对于每 次反复检查可能在长度上都一样,或者它可能是任意的。这大部分是基于性能考虑, 因为认证模块越是必须频繁地检査外来代码,运行该模块的系统就会越慢。此外, 这种外来代码检测模块并非必须检查所有将运行或潜在地可能运行的代码,而是它 可以仅检查任何可执行代码或可能被调用的代码的几个页面。虽然如各个附图中所示已结合优选方面描述了本发明,应该理解可以使用其 他类似的方面,或者可以对所描述的方面作出修改或增加以执行本发明相同的功能 而不背离于此。例如,描述了外来代码检测,其中检查将运行和可能运行的代码以 确定外来代码的存在。这种外来代码检测的一个示例包括检查引用带有代码的页面 的给定进程空间中的当前堆栈线程;其他示例包括检查随机页面和邻近页面。然而, 通过这里的示教也可构想这些所描述方面的其他等效方法。因此,本发明不应限于 任何单个方面,而是应该在广度和范围上根据所附权利要求来解释。
权利要求
1.一种检测对执行外来代码的尝试的方法,包括基于关于包含在存储器的页面中的代码将被执行的可能性的标准来标识包含所述代码的存储器的页面;验证所述代码是否满足完整性测试;以及如果所述代码不满足所述完整性测试,则采取至少一个动作来防止代码执行。
2. 如权利要求l所述的方法,其特征在于,所述标准是引用所述页面的线程 堆栈。
3. 如权利要求2所述的方法,其特征在于,所述页面是随机选择的。
4. 如权利要求2所述的方法,其特征在于,还包括所述线程堆栈引用的附加 页面,其中所述附加页面邻近所述页面,其中所述附加页面是基于所述标准标识的、并由所述完整性测试验证、且如果所述附加页面上的所述代码不满足所述完整性测 试则采取预防动作。
5. 如权利要求l所述的方法,其特征在于,所述标准是将所述页面标识为被 页入到物理存储器、以及调用要被页入的所述页面的任何调用代码的页面出错历 史。
6. 如权利要求l所述的方法,其特征在于,所述标准包括事件处理代码,其 中可以基于用户事件、计算机系统事件或它们的组合中的任一个来调用所述事件处 理代码。
7. 如权利要求l所述的方法,其特征在于,所述标准包括由指令指针引用的 页面。
8. 如权利要求l所述的方法,其特征在于,所述标准包括包含动态链接库函 数的页面。
9. 如权利要求l所述的方法,其特征在于,所述完整性测试包括检查所述页 面的散列是否匹配一存储的散列。
10. 如权利要求1所述的方法,其特征在于,所述防止代码执行的至少一个动作是以下之一在某个随机时间点使得系统出错、使得一进程被终止并从存储器卸载、通知另一进程终止或改变行为、或者触发显示用户界面。
11. 一种用于检测对执行外来代码的尝试的系统,包括一代码,其中所述代码包含计算机可执行指令;一存储器页面,其中所述代码驻留在所述页面上,其中所述页面驻留在计算 机系统的进程空间中;一认证模块,其中所述认证模块基于关于包含在所述页面中的所述代码将被 执行的可能性的标准来标识所述页面,其中所述认证模块验证所述代码是否满足完 整性测试;如果所述代码不满足所述完整性测试,则所述认证模块采取至少一个动 作来防止代码执行。
12. 如权利要求11所述的系统,其特征在于,所述标准是引用所述页面的线 程堆栈。
13. 如权利要求12所述的系统,其特征在于,所述页面是随机选择的。
14. 如权利要求12所述的系统,其特征在于,还包括由所述线程堆栈引用的 附加页面,其中所述附加页面邻近所述页面,其中所述附加页面是基于所述标准标 识的、并由所述完整性测试验证、且如果所述附加页面上的所述代码不满足所述完 整性测试则采取预防动作。
15. 如权利要求11所述的系统,其特征在于,所述标准是将所述页面标识为 被页入到物理存储器、以及调用要被页入的所述页面的任何调用代码的页面出错历 史。
16. 如权利要求11所述的系统,其特征在于,所述标准包括事件处理代码, 其中可以基亍用户事件、计算机系统事件或它们的组合中的任一个来调用所述事件 处理代码。
17. 如权利要求11所述的系统,其特征在于,所述标准包括由指令指针引用 的页面。
18. 如权利要求11所述的系统,其特征在于,所述标准包括包含动态链接库 函数的页面。
19. 如权利要求11所述的系统,其特征在于,所述完整性测试包括检查所述 页面的散列是否匹配一存储的散列。
20. 如权利要求U所述的系统,其特征在于,所述防止代码执行的至少一个 动作是以下之一在某个随机时间点使得系统出错、使得一进程被终止并从存储器 卸载、通知另一进程终止或改变行为,或者触发显示用户界面。
全文摘要
介绍了一种用于有效外来代码检测的方法和系统。在本发明的一个方面,认证模块检查进程空间中线程堆栈所引用的页面,其中这些页面可能包含外来代码。模块可以遍历线程堆栈以检查引用这种页面的返回地址。在另一方面,模块检查堆栈所引用的随机页面。在又一方面,模块检查堆栈所引用的经检查页面的任何邻近可疑页面。此外,模块检查指令指针所引用的页面,页面出错历史所描述的页面和调用代码、以及具有事件处理函数、动态链接库函数或可能要运行的其他函数的任何页面。
文档编号G06F12/14GK101405705SQ200680007679
公开日2009年4月8日 申请日期2006年4月6日 优先权日2005年4月8日
发明者K·豪特乐利得, U·隆顿, V·A·舒宾 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1