技术领域
[0001] 本发明涉及网络安全领域,并且更具体地,涉及为了检测恶意软件对文件的执行进行仿真的仿真器和方法。
相关背景技术
[0002] 包括恶意应用程序的现代应用程序的代码可能包括复杂的指令集,该指令包含转换、调用(包括递归调用)、循环等等。应当注意的是,可执行文件的计算复杂度正在不断增长。这是由于使用包含大量函数库的高级编程语言扩展了软件的功能,以及计算机硬件和操作系统(ОS)的复杂性更高。这种日益增长的复杂性适于受信任的应用程序和恶意应用程序两者。恶意应用程序可能执行许多特征性动作,例如盗窃密码和其它机密用户数据、在僵尸网络中合并计算机以进行DDoS攻击或分发垃圾邮件、以勒索为目的阻止系统正常运行、以及对用户的其它负面和有害的行为。
[0003] 研究潜在恶意代码的方法之一是使用仿真器,该仿真器可在应用程序的行为分析期间应用于防病毒应用程序中。存在各种仿真方法。这些方法之一是一种通过创建处理器的寄存器、存储器和处理器的指令集的虚拟副本对计算机系统的硬件组件(处理器、存储器和其它设备)和这些组件的各种结构进行的软件/硬件仿真。此外,还可以采用混合方法进行仿真,该混合方法包括硬件和软件仿真。在这种混合方法中,通过创建OS(虚拟操作系统)的组件的虚拟副本来执行对计算机的操作系统的附加仿真,在该OS中仿真应用程序的执行。例如,这种组件是操作系统的内核中负责其基本操作机制的部分,例如输入/输出子系统、用户级文件系统、用于创建和启动进程的机制、对中断和异常的处理、对系统API(应用程序编程接口)函数的调用、设备的驱动程序、存储器管理等等。因此,应用程序的指令在不是现实世界的处理器上的仿真器中执行,而是在处理器的虚拟副本上执行,系统API函数调用被仿真并且该函数执行的仿真结果被返回。
[0004] 在仿真期间,形成函数调用的日志,防病毒扫描也可以访问该日志。日志通常会保留有关在仿真执行过程中由进程进行的API函数调用的数据,以及有关从被调用的API函数返回的数据(将控制权转移至返回地址)。该日志的完整性特别影响在受恶意软件影响的计算机系统上检测恶意文件的质量。例如,减少了误报错误(false positive error)和漏报错误(false negative error),从而导致高检测率和低误报率。为此,防病毒软件检查日志中与恶意文件的防病毒数据库签名的对应关系,这些签名是恶意文件特有的已知函数调用序列。因此,如果在函数调用的日志中找到至少一个签名,则防病毒软件会将正在检查的文件分类为恶意文件。
[0005] 现代许多恶意应用程序采用各种反仿真方法(反仿真技巧),从而有可能确定该应用程序不是在实际计算机上而是在仿真器中执行的事实。在这种情况下,恶意应用程序将不会在仿真器中执行任何恶意动作,因为这些技巧会在其执行开始时起作用并且将不会调用恶意功能。作为结果,防病毒应用程序将错误地认为该恶意应用程序是受信任的,并将允许其在实际计算机上执行,或者将其视为“灰色”应用程序,即,需要用户许可才能执行其功能的应用程序,这取决于防病毒应用程序的设置。反仿真技巧可能涉及检查正在运行的服务是否存在、设置系统变量以及实际OS中存在的其它元素。例如,当一些检查未成功执行时,仿真程序简单地终止其执行。此外,恶意应用程序可能会检查API函数调用的正确实现,或者查询仿真器中可能没有实现的罕见API函数。
[0006] 因此,为了提高对恶意软件应用程序的检测质量并阻止反仿真技巧,防病毒仿真器应当尽可能完全地仿真计算机的硬件和软件组件。然而,实际上不可能对OS和硬件组件完全进行仿真,因为实际上必须复制整个OS的代码,这会影响任务的执行速度。许多恶意应用程序会检查其执行时间,如果该时间大于预期值,则恶意应用程序会发现它不是在实际环境中执行,而是在仿真器中执行。此外,仿真器的实现越完整,仿真所需的计算机资源就越多。因此,仿真器通常会对最重要的硬件和软件组件以及可能最常使用的API函数调用进行仿真。很少使用的API函数的调用可以以所谓的“存根(stub)”函数的形式实现(不执行任何有意义的动作的函数,从而返回空白结果或形式不变的输入数据)。可替选地,仿真器可以即时(on the fly)生成很少使用的API函数的调用的实现,从而返回生成的结果。生成的结果可能是任意的,或者也可能取决于函数的类型‑例如,响应于使用结构化文件的函数调用,可以返回任意的文件处理程序。这种方法可以实现性能与检测质量之间的最佳平衡,但是由于恶意应用程序可能会使用反仿真技巧,因此它也存在明显的缺点。因此,防病毒公司正在不断改进和更新仿真器代码,并结合新的API函数调用的实现,以及更正已实现的API函数调用。例如,如果发现了新的恶意应用程序,该应用程序调用了一个罕见的API函数,而该函数在仿真器中仅存在存根,则将编写此API函数的更完整的实现并在用户的计算机上更新仿真器的代码。然而,问题在于,函数的实现的更新需要发布整个仿真器的代码的更新。更新进程相当复杂并且需要很多时间。此外,直到更新仿真器之前,仿真的质量将不足以检测到新的恶意应用程序。
[0007] 当在更新仿真器的代码之前使用新的反仿真技巧时,传统方法中的仿真质量降低。
[0008] 因此,需要解决仿真质量不足的问题。
具体实施方式
[0031] 本文在用于对文件的执行进行仿真的系统、方法和计算机程序产品的上下文中描述了各示例性方面。本领域的普通技术人员将认识到,以下描述仅是说明性的,而不旨在以任何方式进行限制。其它方面将很容易将其自身暗示给了解本发明的优点的本领域的技术人员。现在将详细参考如附图中所示的示例性方面的实现。在整个附图和以下描述中将尽可能使用相同的附图标记来指代相同或类似的项目。
[0032] 现在将介绍将在描述本发明的不同方面时使用的许多定义和概念。
[0033] “仿真”是指软件、硬件或其组合的复合体,其被设置成将函数从第一计算系统拷贝至不同于第一计算系统的第二计算系统,使得第二计算系统的仿真行为尽可能与原始(第一计算)系统的行为相对应。
[0034] “文件执行的仿真”是指使用计算机的一个设备或多个设备来模仿文件在另一个设备上的执行。
[0035] “指令执行的仿真”是指使用计算机的一个设备或多个设备来模仿指令在另一个设备上的执行。术语“指令”是指可执行代码的指令,其可以包含在可执行文件中、可执行文件的图像中、和/或包含在包含可执行代码的非可执行文件(例如DLL库)中。
[0036] “文件的图像”是指在对文件的执行进行仿真的过程中文件的表示。换句话说,文件的图像包括描述文件的数据集,该数据集至少具有用于文件的执行(以及对该执行的仿真)所必需的完整性。在对文件的执行进行仿真的过程中,仿真模块可以对图像文件的图像的指令的执行进行仿真。图像文件指令可以以不同的方式实现:以机器指令的形式和以中间代码(Microsoft中间语言(Microsoft Intermediate Language,MSIL)指令或P代码)或脚本的形式。
[0037] “用于对文件执行进行仿真的模块”是指使用硬件(诸如集成微电路(专用集成电路(Application Specific Integrated Circuit,ASIC))或可编程门阵列(现场可编程门阵列(Field‑Programmable Gate Array,FPGA)))来实现的真实的设备、系统、部件、部件组,或者例如软件和硬件的组合(诸如微处理器系统和软件指令集、以及神经形态芯片(神经轴突芯片))。仿真模块的功能可以仅由硬件实现,也可以由组合实现,其中仿真模块的一些功能由软件实现,而一些功能由硬件实现。在一些实施方式中,仿真模块可以在通用计算机(例如在图6中描述的通用计算机)的处理器上实现。系统组件可以在单个计算设备上实现或分布在多个互连的计算设备之间。
[0038] “可执行文件”是指包含具有可以在计算机上执行的形式的应用程序的文件。因此,在本发明中,术语“应用程序”和“可执行文件”可以互换使用。
[0039] “API函数的虚拟代码”是指由用于使计算机的处理器生成该API函数的执行结果的指令组成的代码。
[0040] “API函数的本机代码”是指API函数的先前编译的机器代码(用于仿真器的虚拟处理器),其由指令组成并且对相应的API函数的执行进行完全仿真。换句话说,本机代码包含适于在仿真器的虚拟处理器上执行的真实API函数的至少一些指令。
[0041] 图1示出了处理API函数调用的传统仿真器的框图。应当注意,API函数可能不限于Windows API。如本文中所使用的,“API函数”可以是指任何可用的API的函数,诸如Linux Kernel API、OpenGL、Qt等等。当在真实的OS中执行应用程序(可执行文件)102期间启用API函数调用104时,OS可以执行涉及OS的复杂内部架构的大量动作。示意性地,API函数调用104导致在处理器上执行大量指令,此后API函数的执行结果106被返回给应用程序102。在仿真器的执行期间,API函数调用不一定会导致一系列相同的指令与在真实的OS中相同的执行,而是将API函数执行的仿真(模仿)结果108返回给应用程序102。例如,若试图创建文件,则仿真器400可以将指针返回给虚拟文件。即使文件的通过真实的OS和仿真器400的执行返回文件指针,但是由于处理器的特定寄存器可以改变(例如当调用API函数时)的事实,所启用的API函数的执行结果(106和108)可能会有所不同,而这可能无法完全反映在仿真器的执行中。应当注意,这种差异可能用于阻碍仿真,尤其是被恶意程序使用。
[0042] 图2示出了根据本发明的各方面的用于计算机的示例性保护组件的框图。用于计算设备300的保护(防病毒)组件200可以包含被设计为确保计算机300的安全性的模块,该模块包括但不限于:访问扫描器(on‑access scanner)、按需扫描器(on‑demand scanner)、电子邮件防病毒程序、网页防病毒程序、主动保护模块、HIPS(主机入侵防护系统)模块、DLP(数据丢失防护)模块、漏洞扫描器、仿真器400、网络防火墙等等。在一个实施方式中,所示的模块可以是保护组件200的组件。在另一实施方式中,这些模块可以被实现为单独的软件组件。
[0043] 访问扫描器可以被配置成检测在用户的计算机系统上正在打开、启动和保存的所有文件的恶意活动。按需扫描器与访问扫描器的不同之处在于,按需扫描器可以根据用户的要求扫描用户指定的文件和目录。
[0044] 电子邮件防病毒程序可以被配置成检查传入和传出的电子邮件中是否存在恶意对象。网络防病毒程序可以用于防止执行可能包含在用户访问的网站上的恶意代码,并且还可以阻止特定网站的打开。HIPS模块可以被配置成检测程序的有害活动和恶意活动,并在执行时阻止此类活动。DLP模块可以被配置成检测并防止计算机或网络中的机密数据丢失。漏洞扫描器可以被配置成检测计算机上的漏洞。例如,漏洞扫描器可以检测到保护模块200的特定组件已断开连接、病毒数据库不是最新的、网络端口已关闭等。网络防火墙可以被配置成根据指定规则来监控和过滤网络流量。仿真器400可以被配置成在仿真器400中的文件指令的执行期间模拟访客系统,并且将在下面更详细地讨论。主动保护组件200可以使用行为签名来检测正在执行的文件的行为并通过信任级别对其进行分类。
[0045] 图3示出了根据本发明的各方面的在仿真器中文件指令的执行。仿真器400可以安装在用户的计算设备(以下称为计算机)300上。仿真器400可以是图2中所示的保护组件200的组件,或者可以是独立的应用程序,或者可以是计算机300的硬件组件或操作系统(OS)305的一部分。在一个实施方式中,仿真器400可以用于检测文件320中的恶意代码,但也可用于其它目的。例如,如果仿真器400是可执行文件,则其可以用于诸如文件320的应用程序的调试。可以由仿真模块403起到执行设备在仿真器400中的作用,仿真模块403可以直接仿真指令的执行。下文将描述仿真器400和仿真器400的各种组件。在图3中以文件320的形式示出了可以具有各种功能的应用程序,包括例如软件安装程序。在其它实施方式中,文件
320可以是不可执行的,并且为了其再现,额外需要编译器或解释器。文件320可以存储在磁盘27或另一外部存储器上,并且可以包含可以在处理器上执行的指令。因此,在不同的实施方式中,文件320可以是以下之一:
[0046] 可执行文件,例如PE(Portable Executable,便携式可执行文件)格式的文件;
[0047] 库文件,例如用于OS Windows的动态链接库或DLL;
[0048] 驱动程序;
[0049] 可以由JavaScript解释器执行的脚本文件(例如JavaScript文件),或可以由控制台命令解释器(例如OS Windows的cmd.exe)执行的批处理文件。
[0050] 此外,为了简化描述,在下文中将考虑可执行文件。可执行文件的示例是OS Windows中的可移植可执行(PE)格式的文件。PE文件可能包含以下主要字段:标头,代码部分,数据部分和导入表,其中可能包含指向插件库的链接。
[0051] 然而,如上所述,文件320可以是任何给定的文件,其包含可以在处理器上执行的指令。
[0052] 在一个实施方式中,当文件320是可执行文件时,由仿真模块403对文件320的指令的执行进行的仿真可以在该可执行文件的进程的上下文中发生。即,对文件320的指令的执行进行的仿真在该进程的入口点开始。
[0053] 在另一个实施方式中,当文件320是库文件(例如DLL)时,对库文件的指令的执行进行的仿真发生在指定进程的上下文中。该指定进程可以是由仿真器400指定的进程,并且可以被专门创建为用于库文件的指令的仿真的主进程(host process)。这样的进程可能包含多次调用需要被仿真的库函数。
[0054] 在又一特定示例性实施方式中,当文件320是驱动程序时,仿真模块403可以通过使用系统进程(在OS Windows中,为系统进程)来调用驱动程序的指令。换句话说,仿真模块402可以在系统进程的上下文中对驱动程序文件的执行进行仿真。
[0055] 在一个实施方式中,当文件320是脚本文件(或脚本语言的库)时,仿真模块403可以在文件320的解释器进程的上下文中对脚本文件的指令进行仿真。文件320可以另外发送至解释器的输入端。对于一些流行的脚本语言,仿真器400可以另外包括解释器实施方式。然而,文件320通常与解释器文件一起被分发,并且在这种情况下,仿真模块403可以开始对解释器进程的执行进行仿真。解释器进程的执行将导致文件320(是脚本文件)加载至仿真模块403的输入端处。在一个示例中,当文件是“bat”格式的文件(包含控制台命令)时,仿真模块403可以在控制台命令解释器cmd.exe的进程的上下文中对文件320的执行进行仿真。
[0056] 在提出的实施方式中,计算机系统补充有仿真器400,该仿真器400以可以在应用程序级别执行的程序的形式体现。在其它实施方式中,仿真器400可以是操作系统305的一部分或单独的设备。已经被加载到计算机设备300的存储器310中并且可以在处理器301上执行的仿真器400可以执行文件320的解析及其代码的处理。有利地,被分析的应用程序可以被加载到仿真器400的地址空间中。仿真器400的软件实现使得可以以类似于处理器301和操作系统305的方式来处理应用程序的代码和资源。仿真器400可以连接至更新服务器340,更新服务器340可以被配置成更新仿真器400的代码,以及更新仿真器400的分离的模块。
[0057] 图4示出了根据本发明的各方面的仿真器的框图。在用于实现能够执行文件320的指令的仿真器400的一个实施方式中,可能需要重新创建处理器401(在本文中也被称为虚拟处理器)、处理器的寄存器404、存储器405和存储器管理器411。解码器402可以用于将文件320的代码指令转换为执行设备的命令的内部系统。处理器的寄存器404可以直接位于处理器401的内核中。另外,仿真器400可以包括文件系统408、输入/输出设备409和数据传输网络410。在一些实施方式中,可能再现操作系统305和外部服务的功能。可以在仿真器400的地址空间中再现将在其上下文中执行文件320的进程420。可以将进程420放置在重新创建的存储器405中。存储器管理器411可以被配置成执行各种存储器操作,例如但不限于:分配、解除分配、保留、映射、取消映射等。例如,存储器管理器411可以创建和销毁重新创建的存储器405。
[0058] 对于可执行文件,进程420是可执行文件进程。其它类型的文件320将在进程420的上下文中执行,进程420的特定变型实施方式已在上面指出。可以放置单独的功能单元(即请求处理器406)以监控仿真器400中正在处理的程序指令以及可能需要发送到真实环境以执行的程序指令。在仿真器400中以可执行命令序列的形式的程序的执行的进程可以由日志记录模块407管理。日志记录模块407可以位于仿真器400上并且可以在计算机300上复制,或者可以位于计算机300上。在这种情况下,保护组件200可以访问日志记录模块407或其副本,并且可以快速地检测恶意代码的签名。应当注意,图4中所示的模块401‑411可以是模拟计算机300上存在的实际模块(例如,处理器301、存储器310以及计算机300的其它硬件和软件)的执行的虚拟副本。
[0059] 仿真器400可以包括仿真模块403,仿真模块403可操作地连接至执行模块440和虚拟函数441。真实处理器301的主要元件可以是被配置成执行所有指令的执行设备。这样的执行设备可以分为两个主要组:算术和逻辑单元(ALU)以及浮点单元(FPU)。因此,在仿真器400中,执行设备的角色由仿真模块403扮演。
[0060] 此外,仿真器400可以包括一组可更新模块430。这组模块可以包括至少一个可更新模块。每个可更新模块可以包含一个或多个本机函数的实施方式。在一个实施方式中,可更新模块430可以包含属于计算机300上存在的同一库的多个API函数的本机实施方式。在一个实施方式中,仿真器400可以将所生成的代码用于库的没有写入本机代码并且因此不存在于可更新模块430中的其它函数。生成的代码可以返回生成的结果,该结果可以是任意的或者取决于函数的类型,或者生成的代码可以简单地返回默认值。生成的代码可以用于不执行有用功能的函数或很少使用的函数,例如但不限于FlushFileBuffers、FreeConsole、LockFile、SetConsoleCursor。生成的代码可以以虚拟代码的形式实现,并且可以由执行模块440执行。换句话说,生成的代码也可以是虚拟代码。在另一个实施方式中,库的其它函数可能根本没有实施方式,在这种情况下,控制将直接转移至执行模块440。如上所述,可更新模块430可以包含多个API函数的本机实施方式,该API函数与存在于计算机300上的同一库有关。然而,至少在某些情况下,在可更新模块430中包括来自存在于计算机
300上的库的所有API函数的实现可能是不可行的。在这种情况下,当可更新模块430中不存在库的一些API函数的实现(实施方式)时,可以以执行模块440可以使用其自己的规则继续执行的方式将控制转移至执行模块440。
[0061] 在本发明中,“本机代码”是指API函数的先前编译的机器代码,其包括被设计为由仿真器400执行的指令。这些指令被配置成模拟相应的API函数的执行。因此,本机代码包含真实API函数的所有指令或大部分指令,该指令适于在仿真器400的虚拟处理器401上执行。还应注意,相同的本机代码也可以在计算机的真实处理器上执行。API函数的本机代码的执行可以由仿真器400的虚拟处理器401上的仿真模块403、以与执行进程420相同的方式进行仿真,在执行进程420的上下文中,执行文件320的指令。对API函数441的虚拟代码的执行进行的仿真可能已经由计算机300的真实处理器301上的执行模块440完成。换句话说,虚拟代码未执行API函数441的详细仿真,但可以仅生成API函数441的执行结果。该生成的结果可以指示API函数的执行结果。根据API函数的虚拟代码的实现,所生成的结果可以包括可返回值以及寄存器的状态的变化和/或处理器的堆栈的状态的变化。例如,响应于调用用于处理文件的函数,仿真模块403可以返回所请求文件的文件处理器。还应当注意,可以关于寄存器的状态的变化和/或处理器的堆栈状态的变化来执行对其它指令的仿真。
[0062] 在本发明的实施方式中,至少一个可更新模块430可以包括为具有32位架构和64位架构的处理器编写的API函数的两种实现。在另一实施方式中,对于包含32位API函数的实现的至少一个可更新模块430,还可以编写附加的可更新模块430,其包含用于64位架构的那些相同API函数的实现。仿真器400(模块401‑411,执行模块440)的单个代码可以用于32位和64位API函数的仿真。这使得可以对为32位处理器架构和64位处理器架构编写的文件的进程的执行进行仿真。作为结果,有利地,可以显著地减少仿真器400的主代码所占用的磁盘空间量,并且可以提高仿真的速度和性能。还应当注意,包含API函数的32位实现的模块和包含API函数的64位实现的模块可以由更新服务器340彼此独立地更新。
[0063] 执行模块440可以包括虚拟函数441及其实现。仿真器400可以链接至更新服务器340,更新服务器340可以被配置成用于更新模块430、虚拟函数441、仿真模块403和执行模块440。这些模块的更新可以独立地完成。
[0064] 应当注意,仿真器400的所示模块和仿真器的可更新模块430可以通过不同的方法来实现。在一个实施方式中,每个可更新模块430可以彼此分开地存储在计算机300上(例如,在不同的文件中)。仿真模块403、执行模块440和虚拟函数441也可以保持彼此分开。在另一个示例中,同一文件可以包括多个模块。例如,执行模块440可以包含虚拟函数441。
[0065] 在一个实施方式中,API函数可以以单个副本来实现‑以可更新模块430之一或者以虚拟函数441的形式实现。在一个实施方式中,在多个地方重复实现API函数是可能的。例如,如果特定函数最初以虚拟函数441的形式实现,则可以在可更新模块430中开发该函数的本机实现方式,该函数可被更新服务器340更新并发送至计算机300。由于模块403、440的更新可以比模块430的更新更少地发生,因此在仿真器400中可以存在该函数的两种实现。其中一种实现可以在可更新模块430中,而另一种实现可以是以虚拟函数441的形式。将在仿真过程中使用的函数的特定实现的选择可以在仿真器400的初始化阶段或在仿真过程中进行。下面讨论仿真器400的初始化。
[0066] 在OS Windows的示例上简要地解释了加载操作系统的进程。首先,加载Windows引导管理器,Windows引导管理器负责查找已安装的OS Windows并选择已安装的OS Windows用于加载。接下来,加载基本驱动程序,例如,使得可以与安装有所选的OS的硬盘分区一起使用。接下来,从磁盘读取OS内核的一部分并将其加载至存储器(例如Ntosrnl.exe和hal.dll)中。接下来,对注册表、存储器管理器、对象管理器等进行初始化。然后加载会话管理器(smss.exe),会话管理器负责加载系统变量、Win32子系统以及进一步加载winlogon.exe。在用户成功通过身份验证后,将加载使用启动密钥注册的应用程序和服务。在全部加载了使用启动密钥注册的应用程序和服务之后,操作系统将完全准备好与用户进行交互,从而等待应用程序的启动和数据的输入。
[0067] 对于仿真器400的初始化和执行,可能不必完全地仿真操作系统305的加载。例如,可以保留仅以简化形式将OS 305的内核和会话管理器加载至仿真器400的存储器405中的阶段。换句话说,仿真对OS 305的执行最重要的功能就足够了,从而能够仿真应用程序。对于Win32应用程序,可能有必要先对smss.exe的启动进行仿真,然后再对csrss.exe的启动进行仿真,这将初始化Windows子系统并使其可以创建进程和线程。由于对潜在恶意的应用程序的仿真需要创建更详细的运行时间环境(例如,对启动的其它进程的仿真),因此可能有必要对winlogon.exe的启动进行仿真,然后对诸如explorer.exe和services.ехе的进程的“启动”进行仿真。此外,有可能从后者对svchost.exe进程的“启动”进行仿真。如本文中所使用的,术语“启动”是指在在真实OS内创建进程的期间发生的相同进程的仿真器400中的重新创建,但是以某种简化的形式。这种方法可以将真实的OS重新创建成足以能够启动几乎任何旨在在该OS中工作的应用程序的程度。
[0068] 此外,仿真器400的初始化可以包括将模块401‑411、440、441以及可更新模块430中的一些或所有加载至存储器405中。在其中执行文件320的进程420在文件320的仿真开始之前加载到存储器405中。
[0069] 在一个实施方式中,仿真器400可以在对进程420的执行进行仿真之前被初始化。在另一个实施方式中,在仿真器400的初始化期间,可以根据文件320的导入表来将可更新模块430加载到存储器405中。换句话说,可更新模块430可以包含来自文件320的导入表的函数的实现。因此,仿真器400、特别是仿真模块403和执行模块440,可以在仿真器400初始化之后“知道”它们将仿真或执行哪些API函数。因此,在先前描述的方法中,如果在该组可更新模块430中未找到API函数,则仿真模块403可以将控制转移至执行模块440。该操作通常不占用太多时间。在另一实施方式中,如果执行完整的防病毒扫描(按需或按计划),则可以将该组模块中的所有可更新模块430加载至仿真器400的存储器405中。如本文中所使用的,“完整的防病毒扫描”是指检查特定磁盘、磁盘分区或目录的所有文件。在另一个实施方式中,当在访问时执行防病毒扫描时,可以将该组模块430中指定数量的最常用的可更新模块加载至存储器405中。在另一个实施方式中,可以在对进程420的执行进行仿真之前通过加载仿真器的图像(或仿真器的快照)来初始化仿真器400。使用仿真器图像的示例在美国专利No.9,111,096中公开。
[0070] 应当注意,在一个实施方式中,当可更新模块430包含API函数的实现(其复制虚拟API函数441的实现)时,可更新模块430还可以包含优先级信息,该优先级信息指示哪个API函数的实现被认为具有更高的优先级。这种优先级信息可以包含有API函数的名称及其优先级或实施日期的表格的形式。因此,在仿真器400的初始化期间,可以将API函数的优先级变型实现加载至存储器405中。因此,对于每个API函数,存储器中可以存在单个实现,从而确保了仿真器400的最佳有效性。
[0071] 图5示出了根据本发明的各方面的用于对文件的执行进行仿真的方法。该仿真方法可以由初始化的仿真器400执行。上面已经描述了仿真器400的初始化进程以及仿真器400的初始化的特定实施方式。根据一个实施方式,在仿真器400的初始化之后并且在仿真开始之前,仿真器400可以创建进程。存储器管理器411可以创建进程420的将在其中将执行文件320的指令的地址空间,并且可以将创建的地址空间附加至创建的进程420。
[0072] 在步骤501,仿真模块403可以用于在仿真器400的虚拟处理器401上执行对文件320的指令执行的仿真。仿真模块403可以响应于API函数的启用而停止对进程420的执行的仿真。在步骤502,仿真模块403可以确定在图4中所示的可更新模块430之一中是否存在所启用的API函数。如果仿真模块403在可更新模块430之一中找到所启用的API函数,则在步骤503,仿真模块403可以根据来自相应的可更新模块430的API函数的实现,通过执行API函数指令来对API函数的执行进行仿真。然而,如果仿真模块403在可更新模块430之一中没有找到所启用的API函数,则在步骤504,执行模块440可以根据可以使用执行模块440生成的API函数的虚拟实现来生成相应API函数的执行结果。执行模块440的仿真可以不在仿真器
400的虚拟处理器401上完成,而可以在仿真器400的进程的上下文中在计算机300的真实处理器301上完成。作为结果,在步骤505,仿真模块403可以根据位于API函数的返回地址处的指令继续对进程420的执行进行仿真。换句话说,在步骤505,仿真模块403可以利用API函数的执行的仿真结果。
[0073] 还应当注意,在上述仿真步骤期间,日志记录模块407可以在日志处理中记录关于API函数的启用的数据和关于从API函数返回的数据。此外,在仿真过程中或刚好在仿真完成之后,保护组件200可以使用仿真器400提供的结果,以使用例如启发式规则来搜索病毒签名。如果保护组件200找到病毒签名,则保护组件可以将文件320声明为恶意文件。至少在一些实施方式中,保护组件200可以采取随后的缓解步骤以消除发现的威胁。这样的缓解步骤可以包括但不限于:防止在真实计算机300上执行文件320,尝试补救或删除文件320,以及其它缓解动作。
[0074] 根据本发明的实施方式,仿真模块403可以继续仿真,直到出现用于停止仿真的停止条件为止。在一个实施方式中,停止条件可以包括但不限于以下内容中的一项:
[0075] 已经模拟了预定数量的指令和/或API函数;
[0076] 为仿真分配的时间已经过去;
[0077] 已经触发病毒签名。
[0078] 在一个示例性实施方式中,如果在存储器405中不存在包含API函数的可更新模块430,则仿真模块403可以将该可更新模块430加载至存储器405中。接下来,可以继续通过仿真模块403仿真相应的API函数403。在另一个实施方式中,仿真模块403可以不将仿真器400所保持的进程列表中包括的所有进程加载到存储器405中。仿真器400所保持的进程列表可以反映这些进程的名称和唯一标识符。如果列表中包括的进程之一被正在研究的文件320的指令启用,则仿真模块403可以按需将相应的进程加载到存储器405中,以便继续进行正确的仿真。
[0079] 在另一个特定实施方式中,在上述步骤504,执行模块440可以生成配置成返回所启用的API函数的执行结果的代码。由执行模块440生成的代码可以是存根。此外,所生成的代码可以返回所生成的结果。在各种实施方式中,生成的结果可以具有任意值,或者可以取决于API函数调用的参数并且可以取决于用于启用相应API函数的约定。例如,响应于对文件操作的API函数的启用,由执行模块440生成的代码可以返回任意文件处理程序,作为API函数启用的结果。作为另一个非限制性示例,如果所启用的API函数处理整数,则由执行模块440生成的代码可以返回任意整数,例如0。如果API函数调用参数或API函数调用约定对于仿真模块403是未知的,则仿真模块403可以停止该仿真。还应当注意,由执行模块440生成的代码可以是虚拟代码或本机代码。
[0080] 总之,所公开的实施方式通过利用仿真器400的可更新模块430中包含的API函数的实现来提高对文件的指令的执行的仿真质量。此外,利用可更新模块430中包含的API函数的实现可以提高文件指令的仿真的可靠性。仿真器400能够仿真真实系统的功能就越多,仿真的可靠性越高。此外,由仿真器400仿真真实系统的功能越准确,仿真的可靠性越高。有利地,可以通过使用被配置成使用前述技术的仿真器400来实现针对恶意代码增加的检测率。作为另一好处,通过使用包含API函数的实现的可更新模块430,可以减少对新威胁的响应时间。
[0081] 图6是示出了根据示例性方面的计算机系统300的框图,在计算机系统300上可以实现用于仿真文件的执行的系统和方法的方面。计算机系统300可以表示图3的代管仿真器400的计算机系统,并且该计算机系统可以是多个计算设备的形式,或者是单个计算设备的形式,例如台式电脑、笔记本电脑、手提电脑、移动计算设备、智能手机、平板电脑、服务器、主机、嵌入式设备和其它形式的计算设备。
[0082] 如图所示,计算机系统300包括中央处理单元(Central Processing Unit,CPU)301、系统存储器22和连接各种系统组件的系统总线23,各种系统组件包括与中央处理单元
301相关联的存储器。系统总线23可以包括总线存储器或总线存储器控制器、外围总线、以及能够与任何其它的总线架构交互的本地总线。总线的示例可以包括PCI、ISA、串行总线TM TM TM TM 2
(PCI‑Express)、超传输 (HyperTransport )、无限带宽 (InfiniBand )、串行ATA、I C、和其它合适的互连。中央处理单元301(也称为处理器)可以包括单组或多组具有单核或多核的处理器。处理器301可以执行实现本发明的技术的一种或多种计算机可执行代码。系统存储器310可以为用于存储本文中所使用的数据和/或由处理器301可执行的计算机程序的任何存储器。系统存储器310可以包括易失性存储器(诸如随机存取存储器(Random Access Memory,RAM)25)和非易失性存储器(诸如只读存储器(Read‑Only Memory,ROM)24、闪存等)或其任意组合。基本输入/输出系统(Basic Input/Output System,BIOS)26可以存储用于在计算机系统300的元件之间传输信息的基本程序,例如在使用ROM24加载操作系统时的那些基本程序。
[0083] 计算机系统300可以包括一个或多个存储设备,诸如一个或多个可移除存储设备27、一个或多个不可移除存储设备28、或其组合。所述一个或多个可移除存储设备27和一个或多个不可移除存储设备28借助存储器接口32连接到系统总线23。在一个方面,存储设备和相应的计算机可读存储介质为用于存储计算机指令、数据结构、程序模块、和计算机系统
300的其它数据的电源独立的模块。系统存储器310、可移除存储设备27和不可移除存储设备28可以使用各种各样的计算机可读存储介质。计算机可读存储介质的示例包括:机器存储器,诸如缓存、SRAM、DRAM、零电容RAM、双晶体管RAM、eDRAM、EDO RAM、DDR RAM、EEPROM、NRAM、RRAM、SONOS、PRAM;闪存或其它存储技术,诸如在固态驱动器(Solid State Drive,SSD)或闪存驱动器中;磁带盒、磁带、和磁盘存储器,诸如在硬盘驱动器或软盘中;光学存储器,诸如在光盘(CD‑ROM)或数字通用光盘(Digital Versatile Disk,DVD)中;以及可用于存储期望数据且可被计算机系统300访问的任何其它介质。
[0084] 计算机系统300的系统存储器310、可移除存储设备27和不可移除存储设备28可以用于存储操作系统305、附加应用程序37、其它程序模块38和程序数据39。计算机系统300可以包括用于传送来自输入设备40的数据的外围接口46,所述输入设备40诸如键盘、鼠标、光笔、游戏控制器、语音输入设备、触点输入设备、或其它外围设备,诸如借助一个或多个I/O端口的打印机或扫描仪,该一个或多个I/O端口诸如串行端口、并行端口、通用串行总线(Universal Serial Bus,USB)、或其它外围接口。显示设备47(诸如一个或多个监控器、投影仪或集成显示器)也可以通过输出接口48(诸如视频适配器)连接到系统总线23。除了显示设备47之外,计算机系统300还可以装配有其它外围输出设备(未示出),诸如扬声器和其它视听设备。
[0085] 计算机系统300可以使用与一个或多个远程计算机49的网络连接而在网络环境中工作。所述一个或多个远程计算机49可以为本地计算机工作站或服务器,其包括前面在描述计算机系统300的性质时所述的元件中的大多数元件或全部元件。其它设备也可以存在于计算机网络中,诸如但不限于路由器、网站、对等设备或其它网络节点。计算机系统300可以包括用于借助一个或多个网络而与远程计算机49通信的一个或多个网络接口51或网络适配器,该一个或多个网络诸如局域计算机网络(Local‑Area computer Network,LAN)50、广域计算机网络(Wide‑Area computer Network,WAN)、内联网、和因特网。网络接口51的示例可以包括以太网接口、帧中继接口、SONET(同步光纤网)接口、和无线接口。
[0086] 本发明的各个方面可以为系统、方法和/或计算机程序产品。计算机程序产品可以包括一种或多种计算机可读存储介质,该计算机可读存储介质上具有用于使处理器执行本发明的各方面的计算机可读程序指令。
[0087] 计算机可读存储介质可以为有形设备,该有形设备可以保持且存储指令或数据结构的形式的程序代码,该程序代码可以被计算设备(诸如计算系统300)的处理器访问。计算机可读存储介质可以为电子存储设备、磁性存储设备、光学存储设备、电磁存储设备、半导体存储设备、或其任何合适的组合。作为示例,这类计算机可读存储介质可以包括随机存取存储器(RAM)、只读存储器(ROM)、电可擦可编程只读存储器(EEPROM)、便携式光盘只读存储器(CD‑ROM)、数字通用光盘(DVD)、闪存、硬盘、便携式电脑磁盘、记忆棒、软盘、或甚至机械编码设备,诸如在其上记录有指令的凹槽中的打孔卡或凸起结构。如在本文中所使用的,计算机可读存储介质不应被视为暂时性信号本身,暂时性信号诸如无线电波或其它自由传播的电磁波、通过波导或传输介质传播的电磁波、或通过电线传输的电信号。
[0088] 可以将本文中所描述的计算机可读程序指令从计算机可读存储介质下载到相应的计算设备、或借助网络(例如,因特网、局域网、广域网和/或无线网络)下载到外部计算机或外部存储设备。该网络可以包括铜传输电缆、光学传输光纤、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。在每个计算设备中的网络接口从网络接收计算机可读程序指令并转发该计算机可读程序指令,用以存储在相应的计算设备内的计算机可读存储介质中。
[0089] 用于执行本发明的操作的计算机可读程序指令可以为汇编指令、指令集架构(Instruction‑Set‑Architecture,ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或以一种或多种编程语言(包括面向对象的编程语言和传统程序化编程语言)的任何组合编写的源代码或目标代码。计算机可读程序指令(作为独立的软件包)可以完全地在用户的计算机上、部分地在用户的计算机上、部分地在用户的计算机上且部分地在远程计算机上、或完全地在远程计算机或服务器上执行。在后一种情况中,远程计算机可以通过任何类型的网络(包括LAN或WAN)连接到用户的计算机,或可以进行与外部计算机的连接(例如通过因特网)。在一些实施方式中,电子电路(包括例如可编程逻辑电路、现场可编程门阵列(FPGA)、或可编程逻辑阵列(Programmable Logic Array,PLA))可以通过利用计算机可读程序指令的状态信息而执行计算机可读程序指令,以使该电子电路个性化,从而执行本发明的各方面。
[0090] 在各个方面中,本发明中所描述的系统和方法可以按照模块来处理。如本文中所使用的术语“模块”指的是例如现实世界的设备、部件、或使用硬件(例如通过专用集成电路(ASIC)或FPGA)实现的部件的布置,或者指的是硬件和软件的组合,例如通过微处理器系统和实现模块功能的指令集(该指令集在被执行时将微处理器系统转换成专用设备)来实现这样的组合。一个模块还可以被实施为两个模块的组合,其中单独地通过硬件促进某些功能,并且通过硬件和软件的组合促进其它功能。在某些实现方式中,模块的至少一部分(以及在一些情况下,模块的全部)可以在计算机系统的处理器上运行。因此,每个模块可以以各种适合的配置来实现,而不应受限于本文中所例示的任何特定的实现方式。
[0091] 为了清楚起见,本文中没有公开各个方面的所有常规特征。应当领会的是,在本发明的任何实际的实现方式的开发中,必须做出许多特定实现方式的决定,以便实现开发者的特定目标,并且这些特定目标将对于不同的实现方式和不同的开发者变化。应当理解的是,这种开发努力会是复杂的且费时的,但对于了解本发明的优点的本领域的普通技术人员来说仍然是工程的例行任务。
[0092] 此外,应当理解的是,本文中所使用的措辞或术语出于描述而非限制的目的,从而本说明书的术语或措辞应当由本领域技术人员根据本文中所提出的教导和指导结合(一个或多个)相关领域的技术人员的知识来解释。此外,不旨在将本说明书或权利要求中的任何术语归于不常见的或特定的含义,除非明确如此阐述。
[0093] 本文中所公开的各个方面包括本文中以说明性方式所引用的已知模块的现在和未来已知的等同物。此外,尽管已经示出并描述了各个方面和应用,但是对于了解本发明的优点的本领域技术人员将明显的是,在不脱离本文中所公开的发明构思的前提下,相比于上文所提及的内容而言的更多修改是可行的。