首页> 中国专利> 程序代码执行行为的监控方法、计算机设备

程序代码执行行为的监控方法、计算机设备

摘要

本申请提供一种程序代码监控的方法,包括:计算机设备在虚拟执行环境中执行第一程序代码对应的第一代码,第一代码属于外部代码,外部代码为第一程序代码中调用的除内部代码之外的代码,外部代码包括计算设备的操作系统提供的系统代码,内部代码为第一程序代码产生的进程自身的代码;在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完第二代码之前,计算机设备将第一程序代码的执行环境切换为模拟执行环境,第二代码为待执行的代码;在模拟执行环境中执行第二代码。本申请能够在实现对程序代码进行指令级别的监控这一目标的情况下,降低性能开销,提高系统的运行效率。

著录项

  • 公开/公告号CN113268726A

    专利类型发明专利

  • 公开/公告日2021-08-17

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN202010097557.7

  • 发明设计人 袁劲枫;陈甲;

    申请日2020-02-17

  • 分类号G06F21/53(20130101);G06F21/56(20130101);

  • 代理机构11329 北京龙双利达知识产权代理有限公司;

  • 代理人周乔;王君

  • 地址 518129 广东省深圳市龙岗区坂田华为总部办公楼

  • 入库时间 2023-06-19 12:14:58

说明书

技术领域

本申请涉及领域,并且更具体地,涉及一种程序代码执行行为的监控方法、计算机设备。

背景技术

随着计算机技术的发展,计算机的安全性成为人们关注的焦点。伴随着高级持续性威胁(advanced persistent threat,APT)攻击的持续发展,高级恶意代码也日新月异。因此如何对一个程序代码进行分析从而确定该程序程序代码是否为恶意程序成为一个需要解决的问题。

对程序代码进行分析的技术主要分为静态程序分析和动态程序分析。静态程序分析是指在不运行程序代码的条件下,对程序代码的静态特征和功能模块进行分析的技术。静态程序分析技术例如分析指令的统计特性、代码的结构特性等等。然而静态程序分析只能识别出已知的病毒或恶意代码,无法检测出变种或加壳后的恶意代码,也无法检测未知的恶意代码。

动态分析技术是指在程序代码运行的情况下,通过收集并分析程序代码运行时的动态行为特征进行检测的技术。动态分析技术有助于检测出未知的恶意代码或者恶意代码的变种,因此动态分析技术逐渐被安全厂商认可和采用。一种传统的技术方案中,在基于模拟器软件构建的模拟执行环境中运行程序代码,并对该程序代码进行监控。程序代码在模拟执行环境中运行时,模拟器软件先对程序代码进行翻译后再在真实的硬件系统中运行。因此,在模拟执行环境中能够实现对程序代码进行指令级的监控,但系统运行的效率较低。另一种传统的技术方案中,在基于虚拟化技术构建的虚拟执行环境中运行程序代码,并对该程序代码进行监控。由于在虚拟执行环境中不需要对程序代码进行翻译,系统运行的效率较高,但只能对程序代码实行系统调用级别的监控。

发明内容

本申请实施例提供一种程序代码执行行为的监控方法、计算机设备,能够在实现对执行的程序代码进行指令级别的监控这一目标的情况下,降低性能开销,使得系统的运行效率较高。

第一方面,提供了一种程序代码监控的方法,包括:计算机设备在虚拟执行环境中执行第一程序代码对应的第一代码;在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完第二代码之前,计算机设备将第一程序代码的执行环境切换为模拟执行环境,第二代码为待执行的代码;在模拟执行环境中执行第二代码。

其中,第一代码属于外部代码,外部代码为第一程序代码中调用的除内部代码之外的代码,外部代码包括计算设备的操作系统提供的系统代码,内部代码为第一程序代码产生的进程自身的代码。

上述技术方案中,能够在宿主系统中创建动态执行环境时,会同时创建两种动态执行环境,即模拟执行环境和虚拟执行环境。在模拟执行环境中执行程序代码中的内部代码,以对程序代码中的内部代码进行监控,在虚拟执行环境中执行程序代码中的外部代码(比如系统库代码、内核代码、其它进程代码等等),这样,既能够实现对程序代码进行指令级别的监控,又能够实现较低的系统整体性能开销。

一种可能的实现方式中,在所述计算机设备在虚拟执行环境中执行第一程序代码对应的第一代码之前,所述方法还包括:

在初始化阶段,所述计算机设备在所述虚拟执行环境中配置初始化系统状态,所述初始化系统状态包括以下中的任意一种或多种:处理器寄存器的初始值,内存空间对应的访问权限均为不可执行,设备输入输出IO的初始状态;

在所述初始化阶段,所述计算机设备在所述模拟执行环境中对模拟执行引擎进行初始化,所述模拟执行引擎处于已初始化但未执行的状态。

另一种可能的实现方式中,所述计算机设备在所述模拟执行环境中监控所述第二代码在执行过程中的行为信息。

上述技术方案中,当内部代码被加载并且执行时,动态切换到模拟执行环境继续执行,当内部代码执行完毕时,再动态切换回虚拟执行环境继续执行。通过在两个执行环境中的按需动态切换,能够实现只有内部代码才会在模拟环境中执行,而虚拟机中外部代码(比如系统库代码、内核代码、其它进程代码等等)的执行都是在虚拟执行环境中执行,这样既能够实现对目标程序的指令级别的监控能力,又能够实现较低的系统整体性能开销。

另一种可能的实现方式中,计算机设备根据页异常以及嵌套页表确定所述第二代码属于所述内部代码。

其中,所述嵌套页表中记录有第一内存空间对应的访问权限,所述第二代码存储在所述第一内存空间中,所述页异常表示对所述第一内存空间的访问请求和所述第一内存空间对应的访问权限之间的冲突信息。

另一种可能的实现方式中,所述页异常为第一冲突异常,所述计算机设备捕获到第一冲突异常,所述第一冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为不可写,也不可执行的情况下发送的;所述计算机设备根据所述第一冲突异常,确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,所述页异常为第二冲突异常,所述计算机设备捕获到所述第二冲突异常,所述第二冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为可写但不可执行的情况下发送的;所述计算机设备根据所述第二冲突异常确定所述第二代码属于所述内部代码或所述外部代码二者之一;所述计算机设备根据所述第二代码的语义信息确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,所述方法还包括:

所述计算机设备通过虚拟化平台构建所述虚拟执行环境;所述计算机设备通过模拟器软件构建所述模拟执行环境。

另一种可能的实现方式中,所述模拟器软件为快速仿真器QEMU。

另一种可能的实现方式中,所述虚拟化平台为基于内核的虚拟机KVM或Xen。

另一种可能的实现方式中,所述方法还包括:对所述第一程序代码的执行环境中的以下中的任意一种或多种内容进行切换:处理器的上下文,内存访问,输入输出IO处理。

第二方面,提供了一种计算机设备,包括:

第一执行模块,用于在虚拟执行环境中执行第一程序代码对应的第一代码,所述第一代码属于外部代码;

其中,所述虚拟执行环境是基于虚拟化技术提供的运行环境,所述外部代码为所述第一程序代码中调用的除所述内部代码之外的代码,所述外部代码包括所述计算设备的操作系统提供的系统代码,所述内部代码为所述第一程序代码产生的进程自身的代码。

切换模块,用于在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完所述第二代码之前,将所述第一程序代码的执行环境切换为模拟执行环境;

其中,所述模拟执行环境是基于模拟器提供的运行环境,所述第二代码为待执行的代码。

第二执行模块,用于在所述模拟执行环境中执行所述第二代码。

一种可能的实现方式中,还包括:

配置模块,用于在初始化阶段,在所述虚拟执行环境中配置初始化系统状态,所述初始化系统状态包括以下中的任意一种或多种:

处理器寄存器的初始值,内存空间对应的访问权限均为不可执行,设备输入输出IO的初始状态;

所述配置模块还用于:在所述初始化阶段,在所述模拟执行环境中对模拟执行引擎进行初始化,所述模拟执行引擎处于已初始化但未执行的状态。

另一种可能的实现方式中,所述第二执行模块还用于:

在所述模拟执行环境中监控所述第二代码在执行过程中的行为信息。

另一种可能的实现方式中,还包括:

确定模块,用于根据页异常以及嵌套页表确定所述第二代码属于所述内部代码。

其中,所述嵌套页表中记录有第一内存空间对应的访问权限,所述第二代码存储在所述第一内存空间中,所述页异常表示对所述第一内存空间的访问请求和所述第一内存空间对应的访问权限之间的冲突信息。

另一种可能的实现方式中,所述页异常为第一冲突异常,所述确定模块具体用于:捕获到第一冲突异常,所述第一冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为不可写,也不可执行的情况下发送的;根据所述第一冲突异常,确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,所述页异常为第二冲突异常,所述确定模块具体用于:捕获到所述第二冲突异常,所述第二冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为可写但不可执行的情况下发送的;根据所述第二冲突异常确定所述第二代码属于所述内部代码或所述外部代码二者之一;根据所述第二代码的语义信息确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,还包括:

创建模块,用于通过虚拟化平台构建所述虚拟执行环境;

所述创建模块,还用于通过模拟器软件构建所述模拟执行环境。

另一种可能的实现方式中,所述模拟器软件为快速仿真器QEMU。

另一种可能的实现方式中,所述虚拟化平台为基于内核的虚拟机KVM或Xen。

另一种可能的实现方式中,所述切换模块还用于:对所述第一程序代码的执行环境中的以下中的任意一种或多种内容进行切换:处理器的上下文,内存访问,输入输出IO处理。

第三方面,提供了一种计算机设备,包括:至少一个处理器和存储器,其中该存储器用于存储计算机程序,该至少一个处理器用于从存储器中调用并运行该计算机程序,使得执行上述第一方面或第一方面任意一种可能的实现方式提供的方法。

可选地,在具体实现中,该处理器的个数不做限制。该处理器是通用处理器,可选地,该通用处理器能够通过硬件来实现或通过软件来实现。当通过硬件实现时,该处理器是逻辑电路、集成电路等;当通过软件来实现时,该处理器是一个通用处理器,通过读取存储器中存储的软件代码来实现,该存储器集成在处理器中,位于该处理器之外,独立存在。

具体的,所述至少一个处理器,用于在虚拟执行环境中执行所述第一程序代码对应的第一代码,所述第一代码属于外部代码,其中,所述虚拟执行环境是基于虚拟化技术提供的运行环境,所述外部代码为所述第一程序代码中调用的除所述内部代码之外的代码,所述外部代码包括所述计算设备的操作系统提供的系统代码,所述内部代码为所述第一程序代码产生的进程自身的代码;在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完所述第二代码之前,将所述第一程序代码的执行环境切换为模拟执行环境,其中,所述模拟执行环境是基于模拟器提供的运行环境,所述第二代码为待执行的代码;在所述模拟执行环境中执行所述第二代码。

一种可能的实现方式中,所述至少一个处理器在在虚拟执行环境中执行第一程序代码对应的第一代码之前,还用于:在初始化阶段,所述计算机设备在所述虚拟执行环境中配置初始化系统状态,所述初始化系统状态包括以下中的任意一种或多种:处理器寄存器的初始值,内存空间对应的访问权限均为不可执行,设备输入输出IO的初始状态;在所述初始化阶段,所述计算机设备在所述模拟执行环境中对模拟执行引擎进行初始化,以使所述模拟执行引擎处于已初始化但未执行的状态。

另一种可能的实现方式中,所述至少一个处理器,还用于:在所述模拟执行环境中监控所述第二代码在执行过程中的行为信息。

另一种可能的实现方式中,所述至少一个处理器执行完所述第二代码之前,还用于:根据页异常以及嵌套页表确定所述第二代码属于所述内部代码,其中,所述嵌套页表中记录有第一内存空间对应的访问权限,所述第二代码存储在所述第一内存空间中,所述页异常表示对所述第一内存空间的访问请求和所述第一内存空间对应的访问权限之间的冲突信息。

另一种可能的实现方式中,所述页异常为第一冲突异常,所述至少一个处理器具体用于:捕获到第一冲突异常,所述第一冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为不可写,也不可执行的情况下发送的;根据所述第一冲突异常,确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,所述页异常为第二冲突异常,所述至少一个处理器具体用于:捕获到所述第二冲突异常,所述第二冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为可写但不可执行的情况下发送的;根据所述第二冲突异常确定所述第二代码属于所述内部代码或所述外部代码二者之一;根据所述第二代码的语义信息确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,所述至少一个处理器还用于:通过虚拟化平台构建所述虚拟执行环境;通过模拟器软件构建所述模拟执行环境。

另一种可能的实现方式中,所述模拟器软件为快速仿真器QEMU。

另一种可能的实现方式中,所述虚拟化平台为基于内核的虚拟机KVM或Xen。

另一种可能的实现方式中,所述至少一个处理器还用于:对所述第一程序代码的执行环境中的以下中的任意一种或多种内容进行切换:处理器的上下文,内存访问,输入输出IO处理。

第四方面,提供了一种计算机程序产品,该计算机程序产品包括:计算机程序代码,当该计算机程序代码在计算机上运行时,使得计算机执行上述第一方面或第一方面任意一种可能的实现方式中的方法。

第五方面,提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序代码,当该计算机程序代码在计算机上运行时,使得计算机执行上述第一方面或第一方面任意一种可能的实现方式中的方法。这些计算机可读存储包括但不限于如下的一个或者多个:只读存储器(read-only memory,ROM)、可编程ROM(programmable ROM,PROM)、可擦除的PROM(erasable PROM,EPROM)、Flash存储器、电EPROM(electrically EPROM,EEPROM)以及硬盘驱动器(hard drive)。

第六方面,提供一种芯片,该芯片包括处理器与数据接口,其中,处理器通过所述数据接口读取存储器上存储的指令,以执行第一方面或第一方面任意一种可能的实现方式中的方法。

在具体实现过程中,该芯片可以以中央处理器(central processing unit,CPU)、微控制器(micro controller unit,MCU)、微处理器(micro processing unit,MPU)、数字信号处理器(digital signal processing,DSP)、片上系统(system on chip,SoC)、专用集成电路(application-specific integrated circuit,ASIC)、现场可编程门阵列(fieldprogrammable gate array,FPGA)或可编辑逻辑器件(programmable logic device,PLD)的形式实现。

可选地,在具体实现中,该处理器的个数不做限制。该处理器是通用处理器,可选地,该通用处理器能够通过硬件来实现或通过软件来实现。当通过硬件实现时,该处理器是逻辑电路、集成电路等;当通过软件来实现时,该处理器是一个通用处理器,通过读取存储器中存储的软件代码来实现,该存储器集成在处理器中,位于该处理器之外,独立存在。

附图说明

图1是本申请实施例提供的一种计算机设备100的架构示意图。

图2是本申请实施例中存储在内存中的程序代码的分类的示意图。

图3是本申请实施例提供的一种计算机设备100的网络部署示意图。

图4是本申请实施例提供的另一种计算机设备100的网络部署示意图。

图5是本申请实施例提供的一种程序代码监控的方法的示意性流程图。

图6是本申请实施例提供的一种系统架构图。

图7是适用本申请实施例的计算机设备虚拟化逻辑架构的示意图。

图8是基于图7所示的逻辑架构的内存寻址过程的示意图。

图9是本申请实施例提供的一种程序代码监控的方法的示意性流程图。

图10是本申请实施例提供的一种对处理器的上下文进行切换的方法的示意性流程图。

图11是本申请实施例提供的一种对内存访问的切换方法的示意性流程图。

图12是本申请实施例提供的一种确定内部代码即将被执行的方法的示意性流程图。

图13是本申请实施例提供的一种可能的KVM虚拟化平台的架构图。

图14是本申请实施例提供的一种可能的Xen虚拟化平台的架构图。

图15是本申请实施例提供的另一种计算机设备1500的示意性框图。

具体实施方式

下面将结合附图,对本申请实施例中的技术方案进行描述。

首先结合图1对适用本申请实施例的程序的监控方法的计算机设备100进行详细说明。

计算设备也被称为计算机系统,包括硬件层、运行在硬件层之上的操作系统层,以及运行在操作系统层上的应用层。该硬件层包括处理单元、内存和内存控制单元等硬件,随后对该硬件的功能和结构进行详细说明。该操作系统是任意一种或多种通过进程(Process)实现业务处理的计算机操作系统,例如,Linux操作系统、Unix操作系统、Android操作系统、iOS操作系统或windows操作系统等。该应用层包含浏览器、通讯录、文字处理软件、即时通信软件等应用程序。并且,在本申请实施例中,可选地,该计算机系统是智能手机等手持设备,或个人计算机等终端设备,本申请并未特别限定,只要能够通过运行记录有本申请实施例的程序的监控方法的代码的程序,以根据本申请实施例的程序的监控方法对加载的样本程序进行监控即可。本申请实施例的程序的监控方法的执行主体是计算机系统,或者,是计算机系统中能够调用程序并执行程序的功能模块。

在本申请实施例中,程序是用来实现某种相对独立功能的一组有序指令(或者说,代码)的集合。程序通常采用模块化设计,即将程序的功能细化拆解为多个更小的功能模块。程序中包含至少一个函数,函数是实现一个功能模块的代码段。因此函数是程序功能模块化的基本单元,可选地,该函数也被视为子程序。

图1是本申请实施例提供的一种计算机设备100的架构示意图。图1所示的计算设备用于执行程序的监控方法计算机设备100包括:至少一个处理器110和内存120。

可选地,计算机设备110还包括系统总线,其中处理器110和内存120分别与系统总线连接。处理器110能够通过系统总线访问内存120,例如,处理器110能够通过系统总线在内存120中进行数据读写或代码执行。该系统总线是快捷外设部件互连标准(peripheralcomponent interconnect express,PCI)总线或扩展工业标准结构(extended industrystandard architecture,EISA)总线等。所述系统总线分为地址总线、数据总线、控制总线等。为便于表示,图1中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

其中,处理器110的功能主要是解释计算机程序的指令(或者说,代码)以及处理计算机软件中的数据。其中,该计算机程序的指令以及计算机软件中的数据能够保存在内存120或者缓存单元116中。

在本申请实施例中,处理器110可能是集成电路芯片,具有信号的处理能力。作为示例而非限定,处理器110是通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(application specific integrated circuit,ASIC)、现成可编程门阵列(field programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。其中,通用处理器是微处理器等。例如,该处理器110是中央处理单元(central processing unit,CPU)。

其中,每个处理器110包括至少一个处理单元112和内存控制单元114。

可选地,处理单元112也称为核心(core)或内核,是处理器最重要的组成部分。处理单元112是由单晶硅以一定的生产工艺制造出来的,处理器所有的计算、接受命令、存储命令、处理数据都由核心执行。处理单元分别独立地运行程序指令,利用并行计算的能力加快程序的运行速度。各种处理单元都具有固定的逻辑结构,例如,处理单元包括例如,一级缓存、二级缓存、执行单元、指令级单元和总线接口等逻辑单元。

内存控制单元114用于控制内存120与处理单元112之间的数据交互。具体地说,内存控制单元114从处理单元112接收内存访问请求,并基于该内存访问请求控制针对内存的访问。作为示例而非限定,在本申请实施例中,内存控制单元是内存管理单元(memorymanagement unit,MMU)等器件。

在本申请实施例,各内存控制单元114通过系统总线进行针对内存120的寻址。并且在系统总线中配置仲裁器(未图示),该仲裁器负责处理和协调多个处理单元112的竞争访问。

在本申请实施例中,处理单元112和内存控制单元114通过芯片内部的连接线,例如地址线,通信连接,从而实现处理单元112和内存控制单元114之间的通信。

可选地,每个处理器110还包括缓存单元116,其中,缓存是数据交换的缓冲区(称作cache)。当处理单元112要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助处理单元112更快地运行。

内存(memory)120能够为计算机设备100中的进程提供运行空间,例如,内存120中保存用于生成进程的计算机程序(具体地说,是程序的代码)。计算机程序被处理器运行而生成进程后,处理器在内存120中为该进程分配对应的存储空间。进一步的,上述存储空间进一步包括文本段、初始化数据段、位初始化数据段、栈段、堆段等等。内存120在上述进程对应的存储空间中保存进程运行期间产生的数据,例如,中间数据,或过程数据等等。

可选地,内存也称为内存储器,其作用是用于暂时存放处理器110中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,处理器110就会把需要运算的数据调到内存中进行运算,当运算完成后处理单元112再将结果传送出来。

作为示例而非限定,在本申请实施例中,内存120是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器是只读存储器(read-only memory,ROM)、可编程只读存储器(programmable ROM,PROM)、可擦除可编程只读存储器(erasable PROM,EPROM)、电可擦除可编程只读存储器(electrically EPROM,EEPROM)或闪存。易失性存储器是随机存取存储器(random access memory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(staticRAM,SRAM)、动态随机存取存储器(dynamic RAM,DRAM)、同步动态随机存取存储器(synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(double data rateSDRAM,DDR SDRAM)、增强型同步动态随机存取存储器(enhanced SDRAM,ESDRAM)、同步连接动态随机存取存储器(synchlink DRAM,SLDRAM)和直接内存总线随机存取存储器(directrambus RAM,DR RAM)。应注意,本文描述的系统和方法的内存120旨在包括但不限于这些和任意其它适合类型的存储器。

应理解,以上列举的计算机设备100的结构仅为示例性说明,本申请并未限定于此,本申请实施例的计算机设备100包括现有技术中计算机系统中的各种硬件,例如,该计算设备110还包括除内存120以外的其他存储器,例如,磁盘存储器等。

本申请实施例的一种可能的实现方式中,在计算机设备100上通过模拟器软件实现同时运行至少一个操作系统,每一个操作系统都运行多个程序。计算机设备100上运行的该操作系统能够为程序代码提供一个执行环境,为了便于描述,该执行环境称为模拟执行环境。

模拟器软件有多种,凡是采用了动态二进制转换技术实现处理器、存储器等硬件的软件模拟或者仿真的程序软件,都能够被认为是模拟器软件。比如Bochs、VirtualBox、Vmware、模拟器软件为快速仿真器(quick emulator,QEMU)等等。

具体的,以QEMU作为示例。本申请实施例中QEMU能够通过动态二进制转换来模拟处理器,存储器等硬件。整个系统的执行其实是通过QEMU模拟的硬件,因此,在程序代码执行的过程中,需要先经过QEMU对即将执行的客户虚拟机程序代码进行指令翻译后再在真实的硬件系统中运行。例如,QEMU对即将执行的程序代码进行二进制指令翻译,转换成语义更低的中间指令,然后再生成宿主机对应平台的指令执行代码。执行翻译后的宿主机代码即完成一次二进制翻译执行过程。

在本申请实施例的另一种可能的实现方式中,可选地,还能够在计算机设备100上应用虚拟化技术。通过虚拟化技术实现在计算机设备100中同时运行多个虚拟机。其中,每个虚拟机上运行至少一个操作系统,每一个操作系统都运行多个程序。计算机设备100上运行的该虚拟机为程序代码提供一个执行环境,为了便于描述,该执行环境称为虚拟执行环境。

该虚拟化技术有多种,本申请实施例中适用的虚拟化技术,指经过硬件加速的虚拟化技术,由虚拟机监视器(virtual machine monitor,VMM)借助硬件提供的虚拟化能力负责完成资源的虚拟,比如内核虚拟机(kernel virtual machine,KVM),其通过Intel处理器中的VT-d/VT-x等硬件辅助的虚拟化技术来实现整个系统资源的虚拟化,因此该类虚拟化技术执行效率和性能较高。除此之外,还包括比如Xen、Hyper-V等等都属于该类虚拟化技术的代表。

应理解,虚拟化技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户比原本的组态更好的方式来应用这些资源。这些资源的虚拟部分不受现有资源的架设方式,地域或物理组态所限制。

随着计算机技术的发展,计算机的安全性成为人们关注的焦点。伴随着高级持续性威胁(advanced persistent threat,APT)攻击的持续发展,高级恶意代码也日新月异,传统的基于特征码匹配技术的静态恶意代码检测已经越来越难以应对。基于程序运行时的动态行为特征检测技术逐渐被安全厂商认可和采用,其中沙箱被实践证明是一种有效的基于动态行为监控的恶意代码检测系统,通过构建隔离的真实执行环境,监控和记录样本程序(具体地说,是样本进程所生成的进程)在执行的过程中的所有行为,提交给后端分析引擎进行分析,判断该样本程序的代码是否为恶意代码。

由于沙箱系统的普遍采用,高级恶意代码也相应增加了对抗沙箱监控的技术。比如恶意代码在初始运行时对执行环境进行检测,判断当前是否在沙箱系统中运行,如果是则直接退出运行,从而躲避沙箱系统的行为监控。另一方面,恶意代码通过破坏沙箱系统的行为监控机制从而导致沙箱监控失效。因此,一套高效的沙箱系统必须具备很强的防检测和防破坏能力。最后,随着样本程序数量的急剧增加,为了应付用户海量样本程序的分析任务,沙箱系统需要同时具备高性能监控能力,行为监控带来的开销必须非常小,从而能够支持大规模并发监控。

图1所示的计算机设备100是沙箱系统所在的主机。计算机设备100上运行的虚拟机提供样本程序运行的环境,通过VMM、或者安全虚拟机上运行的监控程序,对样本程序生成的目标进程的访问行为进行监控。本申请实施例对计算机设备100部署的位置不做具体限定。

作为一个示例,参见图3,计算机设备100部署在各个核心网络的入口点,作为旁路设备,对各个核心网络的未知程序代码的行为进行检测,并提供检测结果。在计算机设备100旁路部署时,以交换机、路由器、防火墙等设备为例的流量转发路径上的转发设备(图3中未示出),将流经转发设备流量进行镜像后,将镜像流量发送给旁路部署的计算机设备100。例如,计算机设备100位于公网边界,又如,该计算机设备100位于园区分支网的入口,又如,该计算机设备100位于企业内部子网络的入口,又如,该计算机设备100位于企业数据中心(data center,DC)服务器的入口等。

作为另一个示例,参见图4,在云场景中,计算机设备100作为互联网中的一个服务器,通过网页用户界面(Website User Interface,WUI)等提供服务接口,接收个人电脑或其他网关(例如,园区分支网的入口网关,企业内部子网络的入口网关,企业DC服务器的入口网关)等设备提供的未知程序,并对该未知程序进行程序代码行为的检测。可选地,计算机设备100还根据配置,将对未知程序的检测结果发送给提交未知程序的设备,或者将对未知程序的检测结果发送给第三方设备。这里的第三方设备是指除计算机设备100和提交未知程序的设备之外的设备。

以在模拟环境中运行的沙箱系统作为示例。由于在程序代码执行的过程中,需要先经过模拟器软件对即将执行的客户虚拟机程序代码进行指令翻译后再在真实的硬件系统中运行。因此,通过模拟器软件在指令翻译执行的过程中通过添加监控代码的方式对客户虚拟机的执行进行监控。比如在QEMU对客户指令进行翻译的过程中添加额外的监控代码,当被翻译的宿主机代码块执行时同时也会执行监控代码,从而记录实时的动态行为信息。基于模拟执行环境的沙箱动态行为监控具备指令级行为监控能力,并且对被监控样本完全透明,具备很强的防躲避和破坏能力。但是,由于需要对即将执行的客户虚拟机程序代码进行指令翻译后再执行,因此系统运行的效率较低。

以在虚拟中运行的沙箱系统作为示例。在程序代码执行的过程中,该程序代码直接在真实硬件上执行,基于虚拟执行环境的动态沙箱行为监控系统将监控代码部署在VMM层,并可基于VMM修改目标监控函数开头指令中断指令。当程序代码在真实硬件上运行并调用目标函数时,会触发中断异常陷入VMM。

监控代码能够在VMM监控到目标函数被调用,从而实现对程序代码进行应用程序接口(application programming interface,API)级别的行为监控。由于不需要对即将执行的客户虚拟机程序代码进行指令翻译,因此系统运行的效率较高。但是,在虚拟环境中运行的沙箱系统只能对即将执行的客户虚拟机程序代码进行API级别的行为监控,而不能实现对其进行指令级别的行为监控,监控能力较低。

本申请实施例提供的技术方案,能够在监控和记录即将执行的程序代码在执行过程中的所有行为信息,包括程序代码执行过的所有指令序列以及指令序列中携带的数据信息和语义信息(例如,函数调用名,函数调用的参数数据、返回值等等)。同时,本申请实施例提供的技术方案还能够实现较低的性能开销,使得系统的运行效率较高。

为了便于对本方案进行描述,下面先对本申请实施例中执行的程序代码进行详细描述。

图4是本申请实施例中存储在内存中的程序代码的分类的示意图。参见图4,在本申请实施例中,内存中存储的代码分为内部代码和外部代码两类。可选的,内部代码也被称为目标代码,外部代码也被称为非目标代码。

应理解,内部代码和外部代码是相对于一个由程序产生的进程而言的。

对于一个进程而言,内部代码是指生成该进程的程序自身的代码,属于该进程,是不和其它进程共享的代码,用于完成其自身的逻辑功能。比如Windows进程PE文件中具备可执行属性的段(通常是TEXT段)。使用T1表示进程1自身的代码段,系统中所有运行中的进程的内部代码集合Tall={T1,T2,…,Tn}、n表示系统中运行的进程数量。对于恶意样本程序,即该部分内容包含恶意样本实现恶意行为的代码,是沙箱系统需要监控的内容。

外部代码是指全局的所有进程共享的代码。例如,该外部代码包括:用户共享代码以及系统内核代码。作为示例而非限定,在本申请实施例中,外部代码在内存中只存在一份,每个进程通过虚拟内存映射的方式将这些共享的物理内存分别映射到自身的虚拟地址空间,从而实现共享使用。

用户共享代码也称为系统共享库代码,是一种操作系统提供的用于完成特定系统服务功能的代码。系统中的所有进程都共享该代码,由操作系统负责映射到具体进程地址空间,比如Windows系统中的kernel32.dll、user32.dll以及Linux系统中的c运行时库libc.so等等。程序通过库函数调用的方式执行该部分代码获取系统提供的服务。

系统内核代码包括但不限于:操作系统内核代码、设备驱动代码等等。该系统内核代码负责提供系统核心的服务功能,比如进程调度,设备操作等等。所有进程共享同一份内核代码,通过系统调用的方式请求服务。

在本申请实施例中,程序在执行过程中,程序的执行流会在图2所示的代码中多次切换。比如程序自身代码调用库函数之后,执行流将会跳转到系统库代码段;库函数调用返回后执行流重新返回程序自身代码段;程序自身代码调用系统调用之后,执行流将会跳转到系统内核代码段;系统调用返回之后执行流将重新返回程序自身代码段。

在本申请实施例提供的技术方案中,在宿主系统中创建动态执行环境时,会同时创建两种动态执行环境,即模拟执行环境和虚拟执行环境。在模拟执行环境中加载并且执行待执行的程序代码中的内部代码,并在模拟执行环境中部署监控程序(也就是说,在模拟环境中部署沙箱系统),通过该监控程序对内部代码进行监控。在虚拟执行环境中加载并且执行待执行的程序代码中的外部代码(比如系统库代码、内核代码、其它进程代码等等),由于外部代码属于系统的正常服务功能,并不包含恶意行为,因此不需要对虚拟执行环境中执行的外部代码进行监控。这样,既能够实现对内部程序的进行指令级别的监控,又能够实现较低的系统整体性能开销。

具体的,本申请实施例中在模拟执行环境中对内部代码的监控行为包括但不限于:对内部代码中的全部执行指令数据信息进行监控,例如,对程序执行流在内部代码中执行时产生的指令序列以及指令序列中携带的数据流信息进行监控;对内部代码在执行时调用的所有库函数、系统调用信息进行监控,例如,内部代码调用kernel32.dll中的CreateFile函数创建新的文件,本申请实施例中能够记录该库函数名以及函数调用的参数数据、返回值等等。

下面结合图5,对本申请实施例提供的一种程序代码监控的方法进行详细描述。

图5是本申请实施例提供的一种程序代码监控的方法的示意性流程图。如图5所示,该方法包括步骤510-530,下面分别对步骤510-530进行详细描述。

步骤510:计算机设备在虚拟执行环境中执行第一程序代码对应的第一代码。

本申请实施例中第一代码属于外部代码。为所述第一程序代码中调用的除所述内部代码之外的代码。其中,外部代码包括全局的所有进程共享的代码。例如,该外部代码包括:用户共享代码以及计算机设备的操作系统提供的系统代码。内部代码为所述第一程序代码产生的进程自身的代码,用于完成其自身的逻辑功能,是不和其它进程共享的代码。。具体的请参考图2中有关外部代码和内部代码的描述,此处不再赘述。

所述虚拟执行环境是通过虚拟化技术实现的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。具体的请参见上文中的描述,此处不再赘述。

可选的,在步骤510之前,所述计算机设备还会进行初始化过程。具体的,在初始化阶段,所述计算机设备在虚拟执行环境中配置初始化系统状态,该初始化系统状态包括以下中的任意一种或多种:处理器寄存器的初始值,内存空间对应的访问权限均为不可执行,设备输入输出IO的初始状态。所述计算机设备还在模拟执行环境中对模拟执行引擎进行初始化,所述模拟执行引擎处于已初始化但未执行的状态。

步骤520:所述计算机设备在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完所述第二代码之前,所述计算机设备将所述第一程序代码的执行环境切换为模拟执行环境。

其中,第二代码是指执行第一代码的过程中,待执行的代码。

模拟执行环境是通过模拟器软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。具体的请参见上文中的描述,此处不再赘述。

可选的,在一些实施例中,在执行完所述第二代码之前,所述计算机设备还根据页异常以及嵌套页表确定第二代码属于所述内部代码。其中,该嵌套页表中记录有存储第二代码的存储空间对应的访问权限,页异常表示存储该第二代码的存储空间的访问请求和该存储空间对应的访问权限之间的冲突信息。具体的请参见下文中图6-图8中的描述,此处暂不详述。

本申请实施例中计算机设备根据页异常以及嵌套页表确定第二代码属于所述内部代码的实现方式有多种。一种可能的实现方式中,若对所述第一内存空间的访问请求为执行请求,所述嵌套页表中记录的所述第一内存空间对应的访问权限为不可写,也不可执行,所述计算机设备确定所述第二代码属于所述内部代码。另一种可能的实现方式中,若对所述第一内存空间的访问请求为执行请求,所述嵌套页表中记录的所述第一内存空间对应的访问权限为可写但不可执行,所述计算机设备确定所述第二代码属于内部代码或外部代码中的一个,并根据第二代码的语义信息确定该第二代码属于内部代码。具体的实现方式请参考下文图12中的描述,此处暂不详述。

步骤530:所述计算机设备在所述模拟执行环境中执行所述第二代码。

具体的,所述计算机设备在所述模拟执行环境中监控所述第二代码在执行过程中的行为信息。

上述技术方案中,在宿主系统中创建动态执行环境时,会同时创建两种动态执行环境,即模拟执行环境和虚拟执行环境。在模拟执行环境中执行程序代码中的内部代码,以对程序代码中的内部代码进行监控,在虚拟执行环境中执行程序代码中的外部代码(比如系统库代码、内核代码、其它进程代码等等),这样,既能够实现对程序代码进行指令级别的监控,又能够实现较低的系统整体性能开销。

可选的,在一些实施例中,系统初始时在虚拟执行环境中执行。当内部程序代码被加载并且执行时,动态切换到模拟执行环境继续执行,当内部程序代码执行完毕时,再动态切换回虚拟执行环境继续执行。通过在两个执行环境中的按需动态切换,实现只有内部程序的代码才会在模拟环境中执行,而虚拟机中外部代码(比如系统库代码、内核代码、其它进程代码等等)的执行都是在虚拟执行环境中执行,这样既能够实现对内部程序进行指令级别的监控,又能够实现较低的系统整体性能开销。

具体的,以图6作为示例。动态创建的两个执行环境分别为虚拟执行环境和模拟执行环境。虚拟执行环境中包括切换触发模块,模拟执行环境中包括切换模块以及监控模块。有关于图6所示的架构中的硬件请参考图1中对计算机设备100的描述,此处不再赘述。

下面分别对图6所示的切换触发模块、切换模块、监控模块进行详细描述。

(1)切换触发模块

位于虚拟执行环境中的虚拟执行引擎当中,负责在虚拟执行环境中捕获内部代码被执行的时刻。当切换触发模块捕获到被执行的代码是内部代码,通知切换模块进行异构环境的切换,切换到模拟执行环境继续执行。具体的,作为一个示例,切换触发模块判断正在执行的程序代码是否为内部代码,如果是内部代码,切换触发模块通知切换模块进行异构环境的切换。作为另一个示例,切换触发模块还在程序代码中的内部代码即将被执行的时刻,例如,内部代码初始被加载并执行的时候,内部代码调用外部库函数后返回内部代码继续执行的时候等等。切换触发模块通知切换模块进行异构环境的切换。

可选地,页异常是硬件产生的,处理器在执行一个指令(例如前面提及的第一代码或第二代码)的时候,这个指令如果涉及到内存读写的操作,但是这个操作会导致和EPT里面的权限标志冲突,处理器就会产生页异常,然后页异常被发送给Hypervisor(又称为VMM)。换句话说,也就是修改当前处理器的指令寄存器(如EIP寄存器),执行Hypervisor设置的异常处理程序,Hypervisor中的切换触发模块因此能够捕获到这个异常。

可选地,作为示例,本申请实施例中,切换触发模块通过嵌套页表以及页异常来判断正在执行的或即将被执行的程序代码为内部代码。下面分别对嵌套页表以及页异常进行详细描述。

可选地,运行有虚拟机的物理存在的计算机被称为宿主机(Host),宿主机内存的物理地址被称为宿主机物理地址(host physical address,HPA)。运行有虚拟机的操作系统称为客户机(Guest)。在一个客户机上的一个进程的运行期间,能够为该进程分配一个客户虚拟地址(guest virtual address,GVA)。

如图7所示,在本申请实施例中,为了让一个客户机使用一个隔离的、从零开始且连续的内存空间,引入了客户机物理地址(guest physical address,GPA)的概念。这个地址空间并不是真正的物理地址空间。对客户机来说,客户机物理地址空间都是从零开始的连续地址空间,但对于宿主机来说,客户机物理地址空间并不一定是连续的,客户机物理地址空间有可能映射在若干个不连续的宿主机物理地址区间。因此,为了实现一个客户机中的一个进程对宿主机的内存的访问,需要实现从GVA到GPA再到HPA的映射,或者说,地址转换。

可选地,图8示出了上述地址转换的一种实现方式。在本申请实施例中,配置有客户机地址页表(guest page tables,GPT),以及嵌套页表(nested page table,NPT)。嵌套页表在不同的架构中的具体表现形式不同,本申请实施例对平台架构不做进一步限定。例如,在x86架构中,嵌套页表是扩展页表(extended page table,EPT)。又如,在ARM公司的ARM架构中,嵌套页表是Stage-2page-table。

应理解,页表是地址空间的一种管理方式,参照相关文档中的说明,在这里不进行详述。

其中,GPT由客户机维护,嵌套页表(例如,EPT)由宿主机上的虚拟化软件,例如运行在宿主机上的VMM维护。VMM,又称Hypervisor。由样本程序生成的目标进程在虚拟机中运行。监控程序运行于虚拟机外部(例如,在另一个虚拟机当中),监控程序负责监控和记录样本程序(或者说或,目标进程)执行过程中的行为。

具体的,作为示例,当虚拟机中的一个进程(记作进程#X)在需要访问宿主机内存中的宿主物理地址空间(记作宿主机物理空间#X)时,虚拟机分配给该进程#X的虚拟地址(该虚拟地址与宿主机物理空间#X对应)为GVA#X,则客户机基于GPT,确定GVA#X对应的GPA(记作GPA#X)。进而宿主机的内存控制单元MMU,基于EPT,确定该GPA#X对应的HPA(记作HPA#X),进而完成对HPA#X对应的内存空间的访问。宿主机中的VMM能够记录目标进程对内存的访问行为。

在本发实施例中,嵌套页表和传统的主机页表类似,在嵌套页表中不仅记录GPA与HPA之间的映射关系,还能够记录一些访问权限的标志位,用于控制客户虚拟机对特定物理页的访问权限。

作为示例而非限定,在本申请实施例中,访问权限包括三种:读、写以及执行。对应地,在EPT中为HPA所指示的内存空间设置三个字段,分别用于指示三种权限的具体状态。

例如,字段#0用于承载指示读访问权限的比特(记作Bit#0),该Bit#0用于标示该HPA(或者说,GPA)对应的内存空间(具体地说,是内存空间中的数据)是否允许被客户机读。该Bit#0包括一个比特或多个比特,本申请并未特别限定,只要能够使处理单元112与内存控制单元114对于Bit#0的不同取值的解释达成一致即可。例如,当Bit#0为“0”时,表示内存空间不允许被客户机读,再例如,当Bit#0为“1”时,表示内存空间允许被客户机读。

再例如,字段#1用于承载指示写访问权限的比特(记作Bit#1),该Bit#1用于标示HPA(或者说,GPA)对应的内存空间是否允许被客户机写。该Bit#1包括一个比特或多个比特,本申请并未特别限定,只要能够使处理单元112与内存控制单元114对于Bit#1的不同取值的解释达成一致即可。例如,当Bit#1为“0”时,表示内存空间不允许被客户机写,再例如,当Bit#1为“1”时,表示内存空间允许被客户机写。

再例如,字段#2用于承载指示执行访问权限的比特(记作Bit#2),该Bit#2用于标示该HPA(或者说,GPA)对应的内存空间(具体地说,是内存空间中存储的代码或指令)是否允许被客户机执行。该Bit#2包括一个比特或多个比特,本申请并未特别限定,只要能够使处理单元112与内存控制单元114对于Bit#2的不同取值的解释达成一致即可。例如,当Bit#2为“0”时,表示内存空间不允许被客户机执行,再例如,当Bit#2为“1”时,表示内存空间允许被客户机执行。

通过在EPT页表中设置相应的访问权限标志,能够控制客户机对特定物理页的访问。当客户机在执行过程中违反了相应标志位的权限控制,比如读取被设置不可读权限的物理页内容,会触发页异常(EPT violation)。

本申请实施例中,切换触发模块基于上文描述的虚拟执行环境中的嵌套页表和页异常来获取内部代码执行或即将被执行的信息。

具体的,作为示例,将虚拟机的所有物理内存从使用逻辑角度划分为三类并在嵌套页表中分别设置对应的访问权限。

1、物理内存在嵌套页表中的权限被设置为可读、可写、不可执行(read、write、non-execute)。

可以理解,由于虚拟机能够读取物理内存中存储的数据,但是不能执行数据,该物理内存在使用时用于存储数据,虚拟机能够读写该物理内存,但是不能执行该物理内存。

2、物理内存在嵌套页表中的权限被设置为可读、不可写、不可执行(read、non-write、non-execute)。

可以理解,由于虚拟机能读取物理内存中存储的内部代码,但是不能对存储的内部代码进行改写。同时,还由于内部代码属于被监控的目标程序自身代码,虚拟执行环境中不能够执行该内部代码。因此,对于存储内部代码的物理内存,其对应的权限被设置为可读、不可写、不可执行,虚拟机能够读该物理内存,但是不能写该物理内存,也不能执行该物理内存。

3、物理内存在嵌套页表中的权限被设置为可读、不可写、可执行(read、non-write、execute)。

可以理解,由于虚拟机能够读取物理内存中存储的外部代码(比如系统内核代码,库代码等等),但不能够对存储的外部代码进行改写,并且该外部代码不属于被监控的目标程序自身代码,其能够在虚拟执行环境中执行。因此,对于存储外部代码的物理内存,其对应的权限被设置为可读、不可写、可执行,虚拟机能够读该物理内存,执行该物理内存,但是不能够写该物理内存。

虚拟机在访问物理内存时,如果访问请求和该物理内存页在嵌套页表中的权限相冲突时,则会产生页异常进入Hypervisor中,切换触发模块根据页异常信息进行相应的判断和处理,从而准确捕获内部代码即将被执行的时机。下面会结合具体的实施例进行详细描述,此处暂不详述。

(2)切换模块

位于模拟执行环境中的模拟执行引擎当中,负责接收切换触发模块和监控模块发出的异构环境切换的通知,并进行异构环境的动态切换。例如,由虚拟执行环境切换到模拟执行环境以及由模拟执行环境切换回虚拟执行环境。可选地,切换需要保证对于虚拟机中运行的业务透明和连续,即虚拟机感知不到底层执行环境的变化,虚拟机的执行也不会被中断。

(3)监控模块

位于模拟执行环境中的模拟执行引擎当中,负责监控并且记录目标程序的执行行为,包括执行的指令序列、指令序列中携带的数据信息以及语义信息等等。具体的请参考上文中的描述,此处不再赘述。监控模块同时需要判断模拟执行的结束时机,即内部代码执行结束,跳转到外部库函数或者内核代码执行时,通知切换模块进行异构环境切换,切换到虚拟执行环境继续执行。

下面结合图9,对本申请实施例提供程序代码监控的方法进行详细描述。参见图9,该方法包括步骤910-970,下面分别对步骤910-970进行详细说明。

步骤910:分别创建初始的虚拟化执行环境和模拟化执行环境。

在初始化虚拟化执行环境的过程中,在嵌套页表中设置虚拟机的全部物理内存页对应的权限为(可读、可写、不可执行)。即初始时虚拟机的物理内存页都是不可执行。

步骤920:进入虚拟化执行环境。

首先执行虚拟化执行环境。虚拟机在执行的过程中会访问物理内存页,并多次产生页异常进入Hypervisor。页异常包括写冲突、读冲突以及执行冲突。其中,读冲突为虚拟机在读物理内存页,而该物理内存页在嵌套页表中设置的权限为不允许虚拟机读该物理内存页。写冲突为虚拟机在写物理内存页,而该物理内存页在嵌套页表中设置的权限为不允许虚拟机写该物理内存页。执行冲突为虚拟机在执行该物理内存页,而该物理内存页在嵌套页表中设置的权限为不允许虚拟机执行该物理内存页。

步骤930:切换触发模块根据内部代码被执行,通知切换模块。

切换触发模块根据虚拟机在执行的过程中产生的页异常确定内部代码即将被执行,并在内部代码即将被执行时通知切换模块进行异构环境的动态切换。实现从当前的虚拟执行环境切换到模拟执行环境,并在模拟执行环境中执行内部代码。

本申请实施例中页异常主要包括以下三种情况。

1、存储数据的第一物理内存页被执行。

如果第一物理内存页在嵌套页表中设置的权限为(可读、可写、不可执行),虚拟机在执行的过程中向该第一物理内存页发送执行请求,从而产生执行冲突。这种情况能够理解为系统中有程序代码加载到第一物理内存页,并该第一物理内存页中存储的程序代码即将被执行。若切换触发模块确定第一物理内存页中加载的程序代码为内部代码,该切换触发模块通知切换模块进行异构环境的动态切换,在模拟执行环境中执行内部代码,并修改该第一物理内存在嵌套页表中的权限为(可读、不可写、不可执行)。若切换触发模块确定第一物理内存页中加载的程序代码为外部代码,由于外部代码能够在虚拟执行环境中执行,切换触发模块修改该第一物理内存在嵌套页表中的权限为可读、不可写、可执行。

2、存储内部代码或外部代码的第二物理内存页被写入。

如果第二物理内存页在嵌套页表中设置的权限为(可读、不可写、不可执行),或者(可读、不可写、可执行)。虚拟机在执行的过程中向该第二物理内存页发送写请求,从而产生写冲突。这种情况理解为系统中的程序代码,可选地,该程序代码是内部代码,或外部代码被修改。例如,进程执行结束后程序代码被清空并且回收,存储程序代码的第二物理内存页对应的权限恢复到初始化的状态。此时,能够修改该第二物理内存页在嵌套页表中的权限为(可读、可写、不可执行),该第二物理内存页用于存储数据。

3、存储内部代码的第三物理内存页被执行。

如果第三物理内存页在嵌套页表中设置的权限为(可读、不可写、不可执行),理解为该第三物理内存页存储有内部代码。虚拟机在执行的过程中向该第三物理内存页发送执行请求,从而产生执行冲突。这种情况理解为第三物理内存页中存储有内部代码,而虚拟机需要执行该内部代码。此时,内部代码即将被执行,该切换触发模块通知切换模块进行异构环境的动态切换,在模拟执行环境中执行内部代码。

下面会结合图12,对切换触发模块根据当前页异常产生的类型以及嵌套页表中当前物理页的权限设置情况判断内部代码即将被执行的具体实现过程进行详细描述,此处暂不赘述。

步骤940:切换模块将当前执行环境切换到模拟执行环境。

切换触发模块在判断内部代码即将被执行时,向切换模块发送通知。切换模块基于切换触发模块发送的通知,进行执行环境的切换,将当前执行环境切换为模拟执行环境,并在模拟执行环境中执行内部代码。

可选的,切换模块在对当前执行环境进行切换时,需要保证虚拟机中运行的业务的连续性,即虚拟机不会感知到底层的执行环境的变化,虚拟机的执行也不会被中断。切换模块需要切换的内容包括但不限于:对处理器的上下文进行切换、对内存访问的切换。可选地,切换模块还对输入输出(input output,I/O)处理的切换。

下面结合图10,对步骤940中切换模块对处理器的上下文进行切换,以实现将当前执行环境切换到模拟执行环境的过程进行详细描述。

如图10所示,该方法包括步骤1010-1030,下面分别对步骤1010-1030进行详细描述。

步骤1010:切换模块获取和保存虚拟执行环境中处理器的上下文信息。

虚拟执行环境中处理器的上下文信息包括但不限于:通用寄存器、系统状态寄存器、系统控制寄存器、其它处理器体系结构相关的寄存器。其中,通用寄存器用于通用计算保存的寄存器数据(比如x86的rax、rbx等等)。系统状态寄存器用于保存计算过程中的系统状态的寄存器数据(比如x86的rflags)。系统控制寄存器用于保存控制系统配置信息的寄存器数据(比如x86的cr3、cr4、msr、调试寄存器等等)。

步骤1020:切换模块清空模拟执行环境的状态。

本申请实施例中,切换模块能够清空模拟执行环境的代码缓存块、转译后备缓冲器(translation lookaside buffer,TLB)的内容等。

步骤1030:切换模块在模拟执行环境中加载保存的虚拟执行环境的处理器的上下文。

切换模块能够在创建的模拟执行环境中加载步骤1010中保存的虚拟执行环境中处理器的上下文信息。

下面结合图11,对步骤940中切换模块对对内存访问进行切换,以实现将当前执行环境切换到模拟执行环境的过程进行详细描述。

图11所示,该方法包括步骤1110-1130,下面分别对步骤1110-1130进行详细描述。

应理解,虚拟执行环境的内存访问是通过两层的页表映射进行访问,模拟执行环境的内存访问是通过软件模拟的MMU进行访问,需要保证虚拟机由虚拟执行环境切换到模拟执行环境时,内存访问是一致的,不会出现错误。要实现两个执行环境的内存访问操作一致,需要保证虚拟机在两个执行环境执行过程中对GPA的访问操作能够被正确的映射到对应的HPA,因此内存访问切换时,首先需要获取和保存虚拟执行环境GPA->HPA的映射关系,然后在模拟执行环境中加载对应的GPA->HPA映射关系,从而实现内存访问的一致。

步骤1110:切换模块获取和保存虚拟执行环境中GPA->HPA的映射关系。

步骤1120:切换模块清空模拟执行环境中客户虚拟机物理内存映射关系。

步骤1130:切换模块在模拟执行环境中加载保存的虚拟执行环境中GPA->HPA的映射关系。

切换模块能够在创建的模拟执行环境中加载步骤1110中保存的虚拟执行环境中GPA->HPA的映射关系。

可选地,为了实现切换到模拟执行环境时,对于外部设备的I/O操作和在虚拟执行环境中的操作是一致的,不会出现错误,还需要对外部设备的I/O处理进行切换。

目前主流的虚拟化平台(比如基于内核的虚拟机(kernel-based virtualmachine,KVM)、Xen等等),在实现I/O虚拟化的功能时都是复用的模拟执行环境的功能组件(比如KVM、Xen都是基于QEMU模拟器实现I/O虚拟化功能),因此虚拟执行环境和模拟执行环境在I/O处理这块是使用的相同的组件,并不需要额外的切换工作。

可选地,对于少量性能敏感的设备,虚拟化平台是在Hypervisor中单独实现和处理(出于性能考虑),比如时钟设备等等,参考前面描述的处理器和内存的切换方法,先保存设备状态,然后在模拟环境中加载的方式进行切换。

继续参见图9,步骤950:内部代码在模拟执行环境中执行,监控模块负责记录内部代码执行的行为信息。

内部代码在模拟执行环境中执行,监控模块中部署有监控程序,用于对执行的内部代码进行指令级别的监控,包括内部代码执行过的所有指令序列以及指令序列中携带的数据信息和语义信息。

步骤960:内部代码执行跳转到外部函数库或内核代码,监控模块通知切换模块进行异构环境的动态切换。

当内部程序代码在模拟执行环境中执行时,监控模块负责监控并且记录内部代码执行的行为信息。当内部代码执行结束,控制流跳转到外部代码执行时,监控模块能够记录函数调用名,函数调用的参数数据、返回值等等。并且监控模块还会通知切换模块进行异构环境的动态切换,将执行环境由模拟执行环境切换回虚拟执行环境。

下面对监控模块在模拟执行环境中对执行的内部代码进行监控的方法进行详细描述。

监控模块位于模拟器中,比如作为QEMU中的一个模块。当内部代码切换到模拟环境执行时,位于模拟器中的监控模块负责监控内部代码的执行并记录和分析其行为。具体的,模拟器读取当前RIP寄存器的值(保存当前指令地址),根据指令地址,判断即将执行的程序代码是否属于内部代码。

如果模拟器确定即将执行的程序代码属于内部代码,模拟器执行引擎从内存中获取当前指令的内容并进行翻译,监控模块根据当前指令的类型。在指令翻译的过程中添加对应的监控代码,作为一个示例,当前指令为函数调用指令,比如call指令,则表示当前目标内部代码即将进行函数调用。需要记录函数调用的行为信息,比如调用的目标函数地址,调用参数等等。监控模块对应添加相应的监控代码进行函数调用信息的记录。模拟器执行引擎逐条指令进行翻译,直到遇到跳转指令,比如jmp指令,ret指令等,则停止翻译,开始执行翻译过的内部代码块并进行实际的行为监控记录。代码块执行结束后回到模拟器执行引擎。

如果模拟器确定即将执行的程序代码不是内部代码,监控模块通知切换模块进行异构环境的动态切换,将执行环境由模拟执行环境切换回虚拟执行环境。

需要说明的是,不同的沙箱实现平台,模拟器所处的位置也不同,本申请对此不做具体限定。

本申请实施例中切换触发模块确定加载的即将被执行的程序代码是内部代码或外部代码的方法有多种。一种可能的实现方式中,切换触发模块根据“语义还原”的方法确定当前物理内存页中加载的即将被执行的程序代码是内部代码或外部代码。

应理解,切换触发模块根据语义还原的方法在VMM中还原出VM内部的语义信息,并且根据相关的语义信息进行判断。

作为示例,本申请中切换触发模块根据以下语义信息中的一种或多种确定加载的程序代码是否为内部代码:当前执行的进程信息,当前执行的模块信息。

具体的,一方面,切换触发模块根据当前执行的进程信息,比如进程名、进程对应的可执行文件路径等,判断即将被执行的程序代码是否属于内部代码。

另一方面,即将被执行的程序代码中除了包括内部代码外,还会包括外部代码(例如,由操作系统动态映射进来的系统库代码),因此切换触发模块根据当前执行的代码所属的模块信息,比如当前模块名,判断是否属于程序代码自身的代码模块。如果当前执行的代码所属的模块为程序代码自身的代码模块,切换触发模块确定即将被执行的程序代码属于内部代码。

需要说明的是,不同的平台(例如,Intel/ARM、Windows/Linux等等)获取进程语义信息的方法不同。一种可能的实现方式中,比如在Intel x86的服务器中,当前VMM运行的是Windows系统,VMM获取当前CR3寄存器中的值。该寄存器保存的是当前正在执行的进程页表基地址,因为在Windows系统中,所有进程都会分配唯一的页表,因此可以通过该进程页表基地址来唯一标识一个进程。并且Windows在进程链表中记录和维护了所有进程分配的CR3值。然后VMM开始逐项遍历Windows系统内核中的进程链表,该链表中的每一个表项为EPROCESS数据结构。该数据结构是Windows分配用于记录每个进程的相关信息,比如进程名、进程ID、进程镜像基地址等等,其中同时也包括进程页表基地址。因此遍历该链表,匹配当前CR3寄存器的值和EPROCESS中记录的进程页表基地址值,即可确定当前运行的进程所对应的EPROCESS数据结构,进而获取当前运行的进程所有语义信息。

步骤970:切换模块将当前的执行环境切换到虚拟执行环境并继续执行。

切换模块按照监控模块触发的通知,将执行环境由模拟执行环境切换回虚拟执行环境,并继续执行步骤920。

下面结合图12,对步骤930中切换触发模块确定待执行代码(即第二代码)属于内部代码的具体实现方式进行描述。参见图12,该方法包括步骤1210-1297,下面分别对步骤1210-1297进行详细描述。

步骤1210:在嵌套页表中设置虚拟机的全部物理内存页对应的权限为(可读、可写、不可执行)。

步骤1215:虚拟机在访问物理内存的过程中,触发页异常进入VMM。

本申请实施例中触发的页异常包括但不限于:写冲突、读冲突以及执行冲突。具体的有关写冲突、读冲突以及执行冲突的描述,从参见上文中的说明,此处不再赘述。

步骤1220:切换触发模块判断当前页异常是否为写冲突。

如果切换触发模块确定当前页异常为写冲突,可执行步骤1225-1250。

如果切换触发模块确定当前页异常不是写冲突,执行步骤1255。

步骤1225:切换触发模块确定触发写冲突的当前物理内存页中存储的是否为数据。

具体的,切换触发模根据触发写冲突的当前物理内存页在嵌套页表中设置的权限确定其存储的是否为数据。

如果触发写冲突的当前物理内存页在嵌套页表中设置的权限为(可读、可写、不可执行),该物理内存页中存储的是数据。继续执行步骤1230。

如果触发页异常的当前物理内存页在嵌套页表中设置的权限不是(可读、可写、不可执行),该物理内存页中存储的不是数据。继续执行步骤1235。

步骤1230:状态异常,流程结束。

如果切换触发模块确定触发写冲突的当前物理内存页中存储的是数据,该物理内存页被虚拟机写入。而该物理内存页触发写冲突,为状态异常,流程结束。

步骤1235:切换触发模块确定触发写冲突的当前物理内存页中存储的是否为内部代码。

具体的,切换触发模块根据触发写冲突的当前物理内存页在嵌套页表中设置的权限确定其存储的是否为内部代码。

如果触发写冲突的当前物理内存页在嵌套页表中设置的权限为(可读、不可写、不可执行),该物理内存页中存储的是内部代码。继续执行步骤1240。

如果触发写冲突的当前物理内存页在嵌套页表中设置的权限不是(可读、不可写、不可执行),该物理内存页中存储的不是内部代码。继续执行步骤1245。

步骤1240:修改当前物理内存页在嵌套页表中对应的权限,使得该当前物理内存页用于存储数据。

若切换触发模块确定当前物理内存页中加载的程序代码为内部代码或外部代码,该当前物理内存页触发写冲突。这种情况理解为系统中的内部代码或外部代码被修改。例如,进程执行结束后内部代码或外部代码被清空并且回收。此时,将当前物理内存页在嵌套页表中的权限修改为(可读、可写、不可执行),该当前物理内存页用于存储数据。

步骤1245:切换触发模块确定触发写冲突的当前物理内存页中存储的是否为外部代码。

具体的,切换触发模块根据触发写冲突的当前物理内存页在嵌套页表中设置的权限确定其存储的是否为外部代码。

如果触发写冲突的当前物理内存页在嵌套页表中设置的权限为(可读、不可写、可执行),该物理内存页中存储的是外部代码。继续执行步骤1240。

如果触发写冲突的当前物理内存页在嵌套页表中设置的权限不是(可读、不可写、可执行),该物理内存页中存储的不是外部代码。继续执行步骤1250。

步骤1250:状态异常,流程结束。

如果切换触发模块根据当前物理内存页在嵌套页表中设置的权限,确定触发写冲突的当前物理内存页中存储的既不是数据,也不是内部代码,也不是外部代码,能够理解为状态异常,流程结束。

步骤1255:切换触发模块判断当前页异常是否为执行冲突。

如果切换触发模块确定当前页异常不是执行冲突,执行步骤1260。

如果切换触发模块确定当前页异常为执行冲突,执行步骤1265。

步骤1260:其他无关的异常情况,交由VMM处理。

如果切换触发模块确定当前页异常不是写冲突,也不是执行冲突,那可能是其他无关的异常情况,交由VMM进行处理。

步骤1265:切换触发模块确定触发执行冲突的当前物理内存页中存储的是否为数据。

判断的方法与步骤1225类似,具体的请参考步骤1225中的描述,此处不再赘述。

如果触发执行冲突的当前物理内存页中存储的是数据,执行步骤1270-1293。

如果触发执行冲突的当前物理内存页中存储的不是数据,执行步骤1295-1297。

步骤1270:当前物理内存页被执行,切换触发模块确定在当前物理内存页中加载的即将被执行的程序代码是内部代码或外部代码。

应理解,如果当前物理内存页被执行,这种情况理解为系统中有程序代码加载到当前物理内存页中。该程序代码是内部代码,或者外部代码。

步骤1275:切换触发模块确定即将被执行的程序代码是否为内部代码。

切换触发模块确定即将被执行的程序代码是否为内部代码,如果是内部代码,执行步骤1280-1285。如果即将被执行的程序代码不是内部代码,执行步骤1290-1293。具体的有关切换触发模块确定即将被执行的程序代码是否为内部代码的方法,请参考上文中的方法描述,此处不再赘述。

步骤1280:修改当前物理内存页在嵌套页表中的权限为内部代码对应的权限。

如果触发执行冲突的当前物理内存页中加载有内部代码,并且该内部代码即将被执行,此时,切换触发模块将当前物理内存页在嵌套页表中的权限修改为(可读、不可写、不可执行)。

也就是说,如果切换触发模块根据页异常确定当前物理内存页中加载有内部代码,将该当前物理内存页在嵌套页表中的权限修改为内部代码对应的权限,即虚拟机能够读取物理内存中存储的内部代码,但是不能对存储的内部代码进行改写,也不能在虚拟执行环境中执行该内部代码。

步骤1285:切换触发模块通知切换模块。

切换触发模块根据页异常确定当前物理内存页中加载有内部代码,除了将该当前物理内存页在嵌套页表中的权限修改为内部代码对应的权限,还需要通知切换模块进行异构环境的动态切换,在模拟执行环境中执行内部代码。

步骤1290:修改当前物理内存页在嵌套页表中的权限为外部代码对应的权限。

如果触发执行冲突的当前物理内存页中加载有外部代码,并且该外部代码即将被执行,由于外部代码可在虚拟执行环境中执行,此时,切换触发模块将当前物理内存页在嵌套页表中的权限修改为(可读、不可写、可执行)。

也就是说,如果切换触发模块根据页异常确定当前物理内存页中加载有外部代码,将该当前物理内存页在嵌套页表中的权限修改为外部代码对应的权限,即虚拟机能够读取物理内存中存储的外部代码,不能对存储的外部代码进行改写,但是能在虚拟执行环境中执行该外部代码。

步骤1293:返回虚拟机继续执行。

步骤1295:判断当前物理内存页中存储的是否为外部代码?

如果触发执行冲突的当前物理内存页中存储的不是数据,判断当前物理内存页中存储的是否为外部代码。如果确定当前物理内存页中存储的是外部代码,由于存储外部代码的物理内存页在嵌套页表中的权限为可执行,因此,执行步骤1250。

如果确定当前物理内存页中存储的不是外部代码,执行步骤1297。

步骤1297:判断当前物理内存页中存储的是否为内部代码?

如果触发执行冲突的当前物理内存页中存储的是内部代码,说明此时内部代码即将被执行,因此,执行步骤1285,通知切换模块进行执行环境的切换。

如果触发执行冲突的当前物理内存页中存储的既不是内部代码,也不是外部代码,那可能是其他状态异常,执行步骤1250。

上文详细描述了程序的监控方法,既能够实现沙箱系统对目标程序的代码执行的监控能力,又能够实现较低的系统整体性能开销。

下面结合图13,以X86架构,KVM虚拟化平台作为示例,对本申请实施例提供的程序代码监控的方法的具体实现过程进行详细描述。

应注意,图13的例子仅仅是为了帮助本领域技术人员理解本申请实施例,而非要将申请实施例限制于所示例的具体数值或具体场景。本领域技术人员根据文所给出的例子,显然能够进行各种等价的修改或变化,这样的修改和变化也落入本申请实施例的范围内。

图13是本申请实施例提供的一种可能的KVM虚拟化平台的架构图。

参见图13,KVM虚拟化平台由用户态的QEMU进程和内核态的KVM驱动两部分组成。其中,QEMU进程用于创建上文中描述的模拟执行环境,主要负责客户虚拟机的设备模拟,内存管理、启动关闭等功能。KVM驱动用于创建上文中描述的虚拟执行环境,主要负责客户虚拟机的虚拟中央处理器(virtual CPU,VCPU)的执行,处理客户虚拟机的异常和中断陷入等等。

切换触发模块位于KVM驱动中,监控模块和切换模块位于QEMU进程中。

QEMU进程中包括了一个模拟执行引擎,例如,微小的代码生成(tiny codegeneration,TCG)引擎,负责完整模拟执行VCPU的功能。需要说明的是,在KVM虚拟化场景中,该模拟执行引擎并没有被开启,VCPU的执行是由KVM驱动模块负责。

本申请实施例中通过在KVM平台中开启TCG模拟执行引擎,监控模块和切换模块位于TCG模拟执行引擎中。其中,由切换模块负责TCG引擎和KVM驱动之间的引擎切换,从而使得客户虚拟机在模拟执行环境和虚拟执行环境之间进行按需切换。并由监控模块对在模拟执行环境中运行的内部代码的行为进行监控。

(1)初始化

用户态QEMU进程负责创建客户虚拟机的模拟执行环境,初始化系统状态,比如CPU寄存器初始值,客户虚拟机的物理地址空间,设备IO的初始状态等等。KVM驱动负责创建客户虚拟机的虚拟执行环境。

应理解,在初始化阶段,开启QEMU中的TCG执行引擎并初始化,引擎处于已初始化但未执行状态,即实现初始时在KVM虚拟执行环境中运行。

本申请实施例中在初始化阶段,QEMU进程通过IOCTL接口通知KVM驱动模块,设置客户虚拟机的全部物理内存为不可执行权限。也就是说,通知KVM驱动模块设置客户虚拟机的全部物理内存在嵌套页表中的权限为(可读、可写、不可执行)。

初始化完成之后,进入non root模式的客户虚拟机执行。当客户虚拟机在虚拟化执行环境中执行时,由于EPT权限冲突会多次产生页异常陷入到Hypervisor中。KVM驱动中的切换触发模块能够根据页异常以及图10中描述的方法,判断是否需要进行执行环境切换。具体的判断方法请参考图10中的描述,此处不再赘述。

当需要进行执行环境切换时,KVM驱动中的切换触发模块将通过KVM的IO通道返回用户空间的QEMU进程,通知QEMU进程中的切换模块负责具体的切换工作。

(2)执行环境的切换

QEMU进程中的切换模块将基于切换触发模块发送的通知,将当前执行环境切换至模拟执行环境。

具体的,QEMU进程中的切换模块首先通过IOCTL命令获取KVM驱动中的处理器(例如,CPU)上下文信息。例如,通过调用kvm_arch_get_registers函数,将QEMU模拟的VCPU数据结构作为参数传递进去。该函数负责获取并写入QEMU的CPU上下文中,然后调用cpu_exec函数,启动TCG模拟执行引擎负责具体的执行。执行结束之后该函数即返回,然后调用kvm_arch_put_registers函数将QEMU执行之后更新的处理器(例如,CPU)上下文加载回KVM驱动中。

(3)监控模块负责对内部代码的行为进行监控

下面结合图14,以Xen虚拟化平台作为示例,对本申请实施例提供的程序代码监控的方法的具体实现过程进行详细描述。

应注意,图14的例子仅仅是为了帮助本领域技术人员理解本申请实施例,而非要将申请实施例限制于所示例的具体数值或具体场景。本领域技术人员根据文所给出的例子,显然能够进行各种等价的修改或变化,这样的修改和变化也落入本申请实施例的范围内。

图14是本申请实施例提供的一种可能的Xen虚拟化平台的架构图。

参见图14,Xen虚拟化平台由虚拟机监控器Xen VMM、特权域虚拟机Dom0和用户域虚拟机DomU组成。在一台物理服务器中部署的Xen虚拟化环境,Dom0只有一个,负责整个系统中的特权操作。可选的,DomU有多个,负责提供给用户系统资源的虚拟执行环境。

其中,在特权域虚拟机Dom0中创建QEMU进程用于创建上文中描述的模拟执行环境,主要负责客户虚拟机的设备模拟,内存管理、启动关闭等功能。Xen VMM用于创建上文中描述的虚拟执行环境,主要负责客户虚拟机的虚拟中央处理器(virtual CPU,VCPU)的执行,处理客户虚拟机的异常和中断陷入等等。

切换触发模块位于Xen VMM中,监控模块和切换模块位于Dom0创建的QEMU进程中。

QEMU进程中包括了一个模拟执行引擎,例如,微小的代码生成(tiny codegeneration,TCG)引擎,负责完整模拟执行VCPU的功能。需要说明的是,在Xen虚拟化场景中,QEMU主要负责设备的模拟,因此该模拟执行引擎并没有被开启,VCPU的执行是由XenVMM负责。

本申请实施例中通过在Xen平台中开启TCG模拟执行引擎,监控模块和切换模块位于TCG模拟执行引擎中。其中,由切换模块负责TCG引擎和Xen VMM之间的引擎切换,从而使得客户虚拟机在模拟执行环境和虚拟执行环境之间进行按需切换。并由监控模块对在模拟执行环境中运行的内部代码的行为进行监控。

(1)初始化

用户态QEMU进程负责创建客户虚拟机的模拟执行环境,初始化系统状态,比如CPU寄存器初始值,客户虚拟机的物理地址空间,设备IO的初始状态等等。Xen VMM负责创建客户虚拟机的虚拟执行环境。

应理解,在初始化阶段,开启QEMU中的TCG执行引擎并初始化,引擎处于已初始化但未执行状态,即实现初始时在Xen虚拟执行环境中运行。

本申请实施例中在初始化阶段,QEMU进程通过Dom0中的超级调用接口(该接口为Xen平台中,Dom0和Xen VMM进行通信的调用接口,DomU没有权限调用)通知Xen VMM模块,设置客户虚拟机的全部物理内存为不可执行权限。也就是说,通知Xen VMM模块设置客户虚拟机的全部物理内存在嵌套页表中的权限为(可读、可写、不可执行)。

初始化完成之后,进入non root模式的客户虚拟机执行。当客户虚拟机在虚拟化执行环境中执行时,由于EPT权限冲突会不断产生页异常陷入到Xen VMM中。Xen VMM中的切换触发模块能够根据页异常以及图10中描述的方法,判断是否需要进行执行环境切换。具体的判断方法请参考图10中的描述,此处不再赘述。

当需要进行执行环境切换时,Xen VMM中的切换触发模块将通过Xen VMM的IO通道返回用户空间的QEMU进程,通知QEMU进程中的切换模块负责具体的切换工作。

(2)执行环境的切换

QEMU进程中的切换模块将基于切换触发模块发送的通知,将当前执行环境切换至模拟执行环境。

具体的,QEMU进程中的切换模块首先通过超级调用获取Xen VMM中的处理器(例如,CPU)上下文信息,将QEMU模拟的VCPU数据结构作为参数传递进去,从而将虚拟执行环境(Xen VMM)中的上下文信息加载到模拟执行环境中(QEMU),然后调用cpu_exec函数,启动TCG模拟执行引擎负责具体的执行。执行结束之后该函数即返回,然后调用超级调用接口,将QEMU执行之后更新的处理器(例如,CPU)上下文加载回Xen VMM中,从而将模拟执行环境中更新的上下文信息加载回虚拟执行环境。

(3)监控模块负责对内部代码的行为进行监控。

应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。

下面将结合图15,详细描述本申请装置的实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。

图15是本申请实施例提供的一种计算机设备1500的示意性框图。该计算机设备1500可以通过软件、硬件或者两者的结合实现成为装置中的部分或者全部。该计算机设备1500包括:第一执行模块1510,切换模块1520,第二执行模块1530,其中:

第一执行模块1510,用于在虚拟执行环境中执行第一程序代码对应的第一代码,所述第一代码属于外部代码;

其中,所述虚拟执行环境是基于虚拟化技术提供的运行环境,所述外部代码为所述第一程序代码中调用的除所述内部代码之外的代码,所述外部代码包括所述计算设备的操作系统提供的系统代码,所述内部代码为所述第一程序代码产生的进程自身的代码;

切换模块1520,用于在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完所述第二代码之前,将所述第一程序代码的执行环境切换为模拟执行环境。

其中,所述模拟执行环境是基于模拟器提供的运行环境,所述第二代码为待执行的代码;

应理解,切换模块1520对应于上文中的切换模块,用于将第一程序代码的执行环境从虚拟执行环境切换为模拟执行环境。

第二执行模块1530,用于在所述模拟执行环境中执行所述第二代码。

应理解,第二执行环境1530对应于上文中的监控模块,用于在模拟执行环境中对第二代码在执行过程中的行为进行监控。

一种可能的实现方式中,计算机设备1500还包括:

配置模块1540,用于在初始化阶段,在所述虚拟执行环境中配置初始化系统状态,所述初始化系统状态包括以下中的任意一种或多种:

处理器寄存器的初始值,内存空间对应的访问权限均为不可执行,设备输入输出IO的初始状态;

所述配置模块1540还用于:在所述初始化阶段,在所述模拟执行环境中对模拟执行引擎进行初始化,所述模拟执行引擎处于已初始化但未执行的状态。

另一种可能的实现方式中,所述第二执行模块1530还用于:在所述模拟执行环境中监控所述第二代码在执行过程中的行为信息。

另一种可能的实现方式中,计算机设备1500还包括:

确定模块1550,用于根据页异常以及嵌套页表确定所述第二代码属于所述内部代码。

其中,所述嵌套页表中记录有第一内存空间对应的访问权限,所述第二代码存储在所述第一内存空间中,所述页异常表示对所述第一内存空间的访问请求和所述第一内存空间对应的访问权限之间的冲突信息。

应理解,确定模块1550对应于上文中的切换触发模块。

另一种可能的实现方式中,所述页异常为第一冲突异常,所述确定模块1550具体用于:

捕获到第一冲突异常,所述第一冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为不可写,也不可执行的情况下发送的;根据所述第一冲突异常,确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,所述页异常为第二冲突异常,所述确定模块1550具体用于:

捕获到所述第二冲突异常,所述第二冲突异常是在对所述第一内存空间的访问请求为执行请求,且所述嵌套页表中记录的所述第一内存空间对应的访问权限为可写但不可执行的情况下发送的;根据所述第二冲突异常确定所述第二代码属于所述内部代码或所述外部代码二者之一;根据所述第二代码的语义信息确定所述第二代码属于所述内部代码。

另一种可能的实现方式中,计算机设备1500还包括:

创建模块1560,用于通过虚拟化平台构建所述虚拟执行环境;

所述创建模块1560,还用于通过模拟器软件构建所述模拟执行环境。

另一种可能的实现方式中,所述模拟器软件为快速仿真器QEMU。

另一种可能的实现方式中,所述虚拟化平台为基于内核的虚拟机KVM或Xen。

另一种可能的实现方式中,所述切换模块1520还用于:对所述第一程序代码的执行环境中的以下中的任意一种或多种内容进行切换:处理器的上下文,内存访问,输入输出IO处理。

本实施例中,还提供了一种计算机设备,该计算机设备包括至少一个处理器和存储器,该存储器用于存储一个或多个指令,该至少一个处理器用于在虚拟执行环境中执行所述第一程序代码对应的第一代码,所述第一代码属于外部代码,其中,所述虚拟执行环境是基于虚拟化技术提供的运行环境,所述外部代码为所述第一程序代码中调用的除所述内部代码之外的代码,所述外部代码包括所述计算设备的操作系统提供的系统代码,所述内部代码为所述第一程序代码产生的进程自身的代码;在执行所述第一代码的过程中,如果第二代码属于内部代码,在执行完所述第二代码之前,将所述第一程序代码的执行环境切换为模拟执行环境,其中,所述模拟执行环境是基于模拟器提供的运行环境,所述第二代码为待执行的代码;在所述模拟执行环境中执行所述第二代码。

本实施例中,还提供了一种计算机可读存储介质,计算机可读存储介质存储有指令,当计算机可读存储介质中的指令在计算设备上被执行时,使得计算设备执行上述所提供的方法。

本实施例中,还提供了一种包含指令的计算机程序产品,当其在计算设备上运行时,使得计算设备执行上述所提供的方法。

本实施例中,还提供了一种芯片,该芯片包括处理器与数据接口,其中,处理器通过所述数据接口读取存储器上存储的指令,以执行第一方面或第一方面任意一种可能的实现方式中的方法。

在具体实现过程中,该芯片可以以中央处理器(central processing unit,CPU)、微控制器(micro controller unit,MCU)、微处理器(micro processing unit,MPU)、数字信号处理器(digital signal processing,DSP)、片上系统(system on chip,SoC)、专用集成电路(application-specific integrated circuit,ASIC)、现场可编程门阵列(fieldprogrammable gate array,FPGA)或可编辑逻辑器件(programmable logic device,PLD)的形式实现。

可选地,在具体实现中,该处理器的个数不做限制。该处理器是通用处理器,可选地,该通用处理器能够通过硬件来实现或通过软件来实现。当通过硬件实现时,该处理器是逻辑电路、集成电路等;当通过软件来实现时,该处理器是一个通用处理器,通过读取存储器中存储的软件代码来实现,该存储器集成在处理器中,位于该处理器之外,独立存在。

上述实施例,全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令或计算机程序。在计算机上加载或执行所述计算机指令或计算机程序时,全部或部分地产生按照本申请实施例所述的流程或功能。

可选地,所述计算机为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令能够存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令从一个网站站点、计算机、服务器或数据中心通过有线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。

所述计算机可读存储介质是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集合的服务器、数据中心等数据存储设备。所述可用介质是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质。半导体介质是固态硬盘。

应理解,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示存在三种关系,例如,A和/或B,表示:单独存在A,同时存在A和B,单独存在B这三种情况,其中A,B是单数或者复数。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系,但也可能表示的是一种“和/或”的关系,具体可参考前后文进行理解。

本申请中,“至少一个”是指一个或者多个,“多个”是指两个或两个以上。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),表示:a,b,c,a-b,a-c,b-c,或a-b-c,其中a,b,c是单个或者多个。

应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。

本领域普通技术人员能够意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员能够对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

所属领域的技术人员能够清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,请参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,能够通过其它的方式实现。

例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时能够有另外的划分方式,例如多个单元或组件结合或者集成到另一个系统,或一些特征能够被忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接是通过一些接口,装置或单元的间接耦合或通信连接,是电性,机械或其它的形式。

可选地,所述作为分离部件说明的单元是物理上分开的,或者不是物理上分开的,作为单元显示的部件是物理上分开的,或者不是物理单元,即位于一个地方,或者也分布到多个网络单元上。根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元能够集成在一个处理单元中,可选地,是各个单元单独物理存在,或者两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,能够存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分能够以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read-only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种能够存储程序代码的介质。

以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号