法律状态公告日
法律状态信息
法律状态
2015-10-21
授权
授权
2013-05-29
实质审查的生效 IPC(主分类):G06F21/53 申请日:20121227
实质审查的生效
2013-04-24
公开
公开
技术领域
本发明涉及一种windows隐藏进程检测方法,尤其是涉及在虚拟机外部机进行的windows隐藏进程检测方法。
背景技术
为减少相关开销和支持更广泛的操作系统,虚拟化架构出现在越来越多的场合。虚拟化的实质就是计算元件在虚拟的基础上而不是真实的基础上运行。资源的虚拟部份不受现有资源的架设方式,地域或物理组态所限制。图1表明了虚拟化的基本结构,其中最下面一层x86 Architecture(x86结构)为物理机的硬件设备,包括处理器(CPU)、内存(Memory)、网络适配器(NIC)、硬盘(Disk)等设备。第二层为虚拟化层(Virtualization Layer),负责对物理机上的物理设备进行虚拟化,以便各虚拟机使用。各虚拟机中包括操作系统(Operating System)和应用程序(App),同时专门有一台虚拟机作为服务控制台(Service Console)。传统计算机的使用,每个用户都有自己的一套硬件设备,包括显示器、内存、硬盘、CPU、网卡等,而在虚拟化平台下,每个用户不再需要拥有整套设备,只需一个终端显示设备即可。虚拟机运行在虚拟机服务器上,由服务器分发给要使用虚拟机的用户。图2表明用虚拟机(VM)代替物理机的工作方式,服务器上设置多个虚拟机,企业内部的客户端A、B、C可以直接连接服务器使用虚拟机,企业外部的客户端D、E也可以通过防火墙后连接到服务器使用虚拟机。虚拟化在各种应用中,包括服务器虚拟化、桌面虚拟化,以及当下最流行的云计算中担当着举足轻重的地位。面对这些应用,数据中心少则部署几台虚拟机,多则几十上百台。
随着虚拟化技术的发展,虚拟化环境所面临的安全问题也日趋凸显。作为虚拟化环境的运行实体,虚拟机和其中的客户操作系统的安全问题占据着支撑地位。如今广泛使用的操作系统在系统安全性方面均存在着不同程度的安全缺陷。由于操作系统普遍存在着结构复杂和内部进程不易监控等问题,拥有特权的进程可以轻易地对操作系统进行破坏。因此,为提高系统的安全性,有必要对系统内的进程进行监控。
随着虚拟化的推进,国内外对于虚拟化平台上安全系统的研究也呈现多元化、专业化的趋势。国防科技大学的温研等人,提出了一种新的基于硬件虚拟化技术的隐藏进程检测技术——Libra,通过构造一个轻量级的虚拟机监视器,实现了从虚拟层隐式获取真实进程列表的新技术,但是由于重新构造了虚拟机监视器,可用范围不广。VMwatcher在虚拟机外部构建进程控制块链表,并通过交叉视图的方式比较外部重构的进程列表和内部汇报的进程列表的差异,但该方法可能会出现漏检的现象。Lycosid利用假设检验的方法判定被检测的系统中是否存在隐藏进程,但由于其采用概率的方式来识别隐藏进程,同样也会出现漏检或者是误警的现象。
发明内容
本发明主要是解决现有技术所存在的技术问题;提供了一种能够在不改变虚拟机内部结构,也不在其中安装任何插件的情况下,在虚拟机外部对虚拟机内的Windows操作系统进行隐藏进程检测的在虚拟机外部机进行的windows隐藏进程检测方法。
本发明的上述技术问题主要是通过下述技术方案得以解决的:
一种在虚拟机外部机进行的windows隐藏进程检测方法,其特征在于,包括以下步骤:
步骤1:通过虚拟机内客户机的FS寄存器找到Windows加载的所有内核模块构成的链表,从链表中找到内核模块ntoskrnl.exe;
步骤2:找出Windows操作系统内核空间维护的所有活动进程,根据所有活动进程寻找内核维护的活动进程EPROCESS链表上的所有活动进程;
步骤3:结合步骤2得到的活动进程EPROCESS链表上的所有活动进程检测系统中EPROCESS链中脱链的隐藏进程。
在上述的在虚拟机外部机进行的windows隐藏进程检测方法,所述的步骤2中,对于Windows下的每一个进程,系统都会给它分配一个excutive process block对其进行管理,所述excutive process 即EPROCESS,该结构包含和指向一系列其他相关的数据结构;所有的进程EPROCESS相互之间使用一对指针ActiveProcessLinks连接起来形成了一个循环双向链表。
在上述的在虚拟机外部机进行的windows隐藏进程检测方法,所述的步骤1找出内核模块的具体方法包括以下子步骤:
步骤1.1,,通过Windows系统中的段寄存器FS寄存器找到KdVersionBlock 结构体指针,所述FS寄存器中存储的地址指向Windows操作系统的内核控制区域结构;
步骤1.2,在内核控制区域结构中偏移为34处,找到KdVersionBlock 结构体,其对应的结构是_DBGKD_GET_VERSION64,所述结构体里面包含了Windows加载的所有内核模块构成的链表的表头PsLoadedModuleList;
步骤1.3,通过PsLoadedModuleList访问链表第一个结点,得到操作系统内核文件ntoskrnl.exe以及其加载到内存中的基地址。
在上述的在虚拟机外部机进行的windows隐藏进程检测方法,所述步骤2中,寻找内核维护的活动进程EPROCESS链的具体方法包括以下子步骤:
步骤2.1,分析ntoskrnl.exe的PE文件,在其.edata节的导出地址表中,得到PsInitialSystemProcess的相对虚拟地址,其中PsInitialSystemProcess 是一个指向系统中system进程EPROCESS的指针;
步骤2.2,根据规定的PE文件加载到内存中的公式,符号PsInitialSystemProcess在内存中所处的虚拟地址VA = RVA + BaseAddress;通过上述计算,在获得内核中的PsInitialSystemProcess符号的虚拟地址后,得到系统中的system进程;
步骤2.3,基于EPROCESS链是一个双向循环链表,找到了其中一个进程,顺着这条链即得到找到整条内核空间维护的EPROCESS进程链表上的所有活动进程。
在上述的在虚拟机外部机进行的windows隐藏进程检测方法,所述的步骤3中,检测系统中EPROCESS链中脱链的隐藏进程是基于遍历线程的方法来检测,具体包括以下子步骤:
步骤3.1,遍历Windows系统中的三条链表:WaitList,QueueListEntry和ThreadListEntry,找到所有活动的线程;
步骤3.2,通过这些枚举出的线程,反向确定它们所属的进程队列。
步骤3.3,最后通过多视图的方式比较步骤2中找到的EPROCESS链和本步骤找到的进程队列之间的差异,从而确定了隐藏进程;即通过比对不同的方式检测出的结果来判断是否有异常。
在上述的在虚拟机外部机进行的windows隐藏进程检测方法,所述的步骤3.1中,在每次遍历过程中,根据某一时刻的进程id使用了位图的方式记录。
因此,本发明具有如下优点:能够在不改变虚拟机内部结构,也不在其中安装任何插件的情况下,在虚拟机外部对虚拟机内的Windows操作系统进行隐藏进程检测。
附图说明
图1为虚拟化的基本结构框架。
图2为用虚拟机代替物理机的工作方式。
图3为本发明的基本结构框架图。
图4为本发明的基本流程图。
图5为寻找Windows内核的ntoskrnl.exe程序的示意图。
图6为Windows进程EROCESS的双链表结构。
图7为Xen虚拟机中32位线性地址转换成物理地址的示意图。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:
本发明在虚拟机外部对Windows进程进行监视,是利用虚拟机监视器VMM具有比虚拟机里的操作系统内核更高执行权限这一优势,直接读取目标客户操作系统的FS寄存器里的内容。
当进程运行在Ring0下时, FS寄存器里的地址指向全局描述符表(Global Descriptor Table, GDT)中某一段,该段存储的地址经过转换后指向系统的处理器控制区域(Processor Control Region,KPCR)。这个控制区域中保存着处理器相关的一些重要数据值,如全局描述符表GDT的信息等等。确定了KPCR的位置后,即可找到偏移为34处的类型为_DBGKD_GET_VERSION64的变量KdVersionBlock。这个结构体里面包含了一些重要信息,如Windows加载的所有内核模块构成的链表的表头PsLoadedModuleList。每个内核模块在内存中对应一个_LDR_DATA_TABLE_ENTRY类型的数据块。这些数据块之间通过双向循环链表连接,即构成了模块链表,而模块链表的第一项就是ntoskrnl.exe。所以通过表头PsLoadedModuleList访问内核模块链表的第一个结点,我们就找到了操作系统内核文件ntoskrnl.exe(如图5)以及其加载到内存中的基地址(BaseAddress),该地址在操作系统运行周期内一般不会改变。
可执行文件在windows操作系统内是以PE(Portable Executable,可移植,可执行)文件形式存在的,在PE文件中存放着该文件的许多重要信息。接下来分析内核文件ntoskrnl.exe的PE文件,在其.edata节的导出地址表中,我们可以得到PsInitialSystemProcess的相对虚拟地址(Relative Virtual Addresses,RVA),其中PsInitialSystemProcess是一个指向系统中system进程EPROCESS的指针。然后,根据规定的PE文件加载到内存中的公式,符号PsInitialSystemProcess在内存中所处的虚拟地址VA = RVA + BaseAddress。通过上述计算,在获得内核中的PsInitialSystemProcess符号的虚拟地址后,我们也就找到了系统中的system进程,而由于EPROCESS链是一个双向循环链表(如图6),找到了其中一个进程,顺着这条链便能找到整条内核空间维护的EPROCESS进程链表上的所有活动进程。
当操作系统中的某个进程,它的EPROCESS结构从内核维护的进程链表中被去掉,该进程即被隐藏掉。在这种情况下,我们在上面找到的EPROCESS链上找不到这个进程。但是该进程仍然能够在系统中正常的运行,因为Windows操作系统是通过线程调度,而不是通过进程调度的。所以,本发明针对脱链的隐藏进程,使用遍历线程的方法来检测,通过这些枚举出的线程,可以反过来确定它们所属的进程队列,核心算法如下:
/*由于每个线程如果被CPU调度,必定会出现在下面三条链表中,所以通过遍历此三条链表可以找到所有脱链的进程。*/
for each process p on PsActiveProcessList do {
for each thread t which belongs to process p {
findAllThreadsFromList (t, WaitList);
findAllThreadsFromList (t, QueueListEntry);
findAllThreadsFromList (t, ThreadListEntry);
}
}
findAllThreadsFromList (KTHREAD t, intlistOffset) {
for each element e on list (t+listOffset)
if (isKTHREAD(e)) then addThreadToFoundList (e);
}
在找到进程队列后,采用多视图的技术比较之前找到的EPROCESS链和这一步找到的进程队列之间的差异,从而确定了隐藏进程。多视图技术分别从可信视图和非可信视图获取进程列表,两个列表集合的差集即为被隐藏进程。对应到本发明中,可信视图为此步获得的进程队列,非可信视图是上一步找到的EPROCESS链表。
与此同时,由于在每次遍历的过程中,同一个线程可能被多次访问,所以为了提高遍历效率,在实现中根据某一时刻的进程id使用了位图(Bitmap)的方式记录,保证了不会重复分析线程。
最后,在整个技术中,每一次需要读取某一地址内存的值时,都需要做内存地址转换。这是因为我们得到的地址是虚拟机内的虚拟地址,而我们需要在虚拟机外的宿主机上读,所以需要将虚拟机内的虚拟地址转换为宿主机上的物理地址。我们的发明主要建立在目前流行的三类虚拟机软件上:Vmware,Xen,KVM,所以,要分别根据这三个平台有差别地分析地址映射的方法。
在Vmware中,我们直接用Vmware提供的Vprobe工具对虚拟地址进行探测,得到宿主机的物理地址。
在Xen中,虚拟机监视器(Virtual machine monitor,VMM)为每个虚拟机内的客户操作系统维护了一个影子页表。影子页表的作用是完成了客户虚拟机的虚拟地址(Virtual Address)直接到机器地址(Machine Address)的地址翻译,而Xen将影子页表的页目录项首地址填入处理器的CR3寄存器。操作系统通过寄存器CR3找到页目录(Page Directory)项地址,然后通过加上线性地址的高10位,即得到页表(Page Table)项地址,然后再加上线性地址中间的10位,即可得到线性地址所对应的物理页,最后加上线性地址低12位作为页内偏移即可定位到该线性地址对应的物理地址,示意图如图7。
在KVM中, KVM内核模块提供了下面的函数,它实现了虚拟机虚拟地址、虚拟机物理地址和宿主机物理地址的地址转换,我们可以直接调用,获得虚拟机内存中的具体内容,算法如下:
intkvm_read_guest_virt_system( //读取虚拟机内存的内容
gva_taddr,
void *val,
unsignedintbytes,
structkvm_vcpu *vcpu,
struct x86_exception *exception);
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
机译: 在Windows环境中启用来宾虚拟机以进行基于策略的网格计算参与
机译: 通过根据进程状态选择性地重用或终止虚拟机来进行应用程序安装管理
机译: 用于在Java虚拟机(JVM)上托管的不同编程语言之间进行通信的系统,进程和计算机程序产品