一种KVM虚拟机的物理内存取证方法.pdf

上传人:62****3 文档编号:468931 上传时间:2018-02-18 格式:PDF 页数:25 大小:996.57KB
返回 下载 相关 举报
摘要
申请专利号:

CN201410394479.1

申请日:

2014.08.12

公开号:

CN104182269A

公开日:

2014.12.03

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 9/455申请日:20140812|||公开

IPC分类号:

G06F9/455; G06F12/06

主分类号:

G06F9/455

申请人:

山东省计算中心(国家超级计算济南中心)

发明人:

王连海; 张淑慧

地址:

250014 山东省济南市历下区科院路19号山东省计算中心(国家超级计算济南中心)

优先权:

专利代理机构:

济南泉城专利商标事务所 37218

代理人:

褚庆森

PDF下载: PDF下载
内容摘要

本发明的KVM虚拟机的物理内存取证方法,包括a)宿主机物理内存的获取;d)虚拟机的VMCS版本号检测;e)VMX退出原因指示器的检测;f)宿主机CR3寄存器的检测和获取;g)虚拟机CR3寄存器的检测和获取;h)两个连续0xffffffff的判断;i)扩展页的检测和获取;j)判断Host_CR3寄存器的正确性;k)判断Guest_CR3寄存器的正确性;l)判断是否检测完毕;m)虚拟机物理内存的获取;n)虚拟机物理内存的分析。本发明的KVM虚拟机的物理内存取证方法,首先初步判断页中是否存在潜在的VMCS结构体,然后再判断VMCS结构体的正确性,以便获取虚拟机的物理内存,这种获取方法不会对虚拟机的状态产生任何影响,适于信息安全事件和各类计算机犯罪案件的调查取证。

权利要求书

1.  一种KVM虚拟机的物理内存取证方法,其特征在于,通过以下步骤来实现:
a).宿主机物理内存的获取,借助内存获取工具获取宿主机从0开始的全部物理内存信息;
b).在编译内核时产生的存放内核符号表的文件中,查找出内核符号init_task、结构体vmcs config的值,init_task的值为swapper进程结构体的虚拟地址,vmcs config的值指向vmcs config结构体的虚拟地址,vmcs config结构体中定义了VMCS结构体的大小和版本号;
c).操作系统版本和位数的获取,获取宿主机的操作系统版本和操作系统位数;对于32位系统,在编译内核时产生的存放内核符号表的文件中,获取页目录指针swapper_pg_dir的值,swapper_pg_dir的值即为宿主机寄存器CR3的虚拟地址,减去0xc0000000即为宿主机寄存器CR3的物理地址;对于64位系统,则获取目录指针init_level4_pgt的值,init_level4_pgt为64位系统下宿主机寄存器CR3的值,减去0xffffffff80000000即为宿主机寄存器CR3的物理地址;结合vmcs_config结构体虚拟地址和宿主机寄存器CR3的值进行地址转换获取vmcs_config结构体的物理地址,从而获取到VMCS结构体大小和版本号信息;
d).虚拟机的VMCS版本号检测,VMCS结构体大小和版本号信息定义在vmcs_config结构体中,大小不大于4096个字节,从某一页的开始位置进行存储,前四个字节为与CPU类型有关的VMCS版本号;对于获取的宿主机物理内存,判断每页的前四个字节是否为VMCS版本号,如果判断结果为是,则表明该页可能是VMCS结构体,执行步骤e);如果判断结果为否,则表明该页不可能为VMCS结构体,执行步骤l),以进行下一个页的判断;
e).VMX退出原因指示器的检测,判断页从第四个字节开始的4个字节的值是否为零,如果为零,则表明该页可能是VMCS结构体,执行步骤f);如果不为零,则表明该页不可能是VMCS结构体,执行步骤l);
f).宿主机CR3寄存器的检测和获取,判断在该页偏移量为0x340处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为宿主机CR3寄存器的值,将其取出,记为Host_CR3,执行步骤g);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);
g).虚拟机CR3寄存器的检测和获取,判断在页偏移量为0x2e0处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为虚拟机CR3寄存器的值,将其取出,记为Guest_CR3,执行步骤h);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);
h).两个连续0xffffffff的判断,通过遍历整个结构体,判断是否存在两个连续的0xffffffff,如果存在,则表明该页可能是VMCS结构体,执行步骤i);如果不存在,则表明该页不可能是VMCS结构体,执行步骤l);
i).扩展页的检测和获取,判断在该页偏移量为0Xe8位置处的8个字节是否为零,如果不为零,则表明偏移量0Xe8位置处的8个字节可能为扩展页指针的数值,将其取出,记为EPTP,执行步骤j);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);
j).判断Host_CR3寄存器的正确性,内核符号init_task的值指向swapper进程结构体,swapper进程以一个task_struck结构体的形式存在,进程名称“swapper”存在于task_struck结构体中与操作系统版本有关的偏移量处,设偏移量为                                               ;通过以下步骤来判断:
j-1).根据操作系统位数是64位操作系统小页模式、64位操作系统大页模式、32位操作系统开启PAE小页模式、32位操作系统开启PAE大页模式、32位操作系统不开启PAE小页模式还是32位操作系统不开启PAE大页模式,将swapper进程结构体的虚拟地址init_task转化为物理地址,执行步骤j-2);
j-2).将init_task转化后的物理地址加上偏移量,判断所获取的进程名称是否为swapper,如果为swapper,则证明所获取的Host_CR3为正确的宿主机CR3寄存器,执行步骤k);如果不为swapper,则表明所获取的Host_CR3不是宿主机CR3寄存器,判断出的VMCS结构体不正确,执行步骤l);
k).判断Guest_CR3寄存器的正确性,借助EPT页结构,将步骤g)中获取的Guest_CR3寄存器的值转化为宿主机物理地址,判断转化后的宿主机物理地址是否为零,如果不为零,则表明获取的Guest_CR3寄存器为正确的虚拟机CR3寄存器,该页中所检测出结构体为正确的VMCS结构体;如果为零,则表明Guest_CR3寄存器不是正确的虚拟机CR3寄存器,所判断出的VMCS结构体不正确;执行步骤l);
l).判断是否检测完毕,判断所有页是否均已判断完毕,如果判断完毕则执行步骤m);如果没有判断完毕,则对下一页进行判断,跳转执行步骤d);
m).虚拟机物理内存的获取,对于给定的虚拟机物理地址和虚拟地址,首先将其转化为宿主机的物理地址,即可进行虚拟机内存信息的获取;
n).虚拟机物理内存的分析,通过对步骤m)中获取的虚拟机内存信息的分析,即可对虚拟机的行为作出判断。

2.
  根据权利要求1所述的KVM虚拟机的物理内存取证方法,其特征在于:步骤a)中宿主机物理内存的获取方法为:采用开源软件LiME加载内核模块获得Linux和Linux设备中的完整内存信息,以padded格式来获取从0开始的宿主机的全部内存信息;步骤b)和步骤c)中:通过获取/proc/kallsyms文件来获取内核符号表,并从中获取内核符号init_task、结构体vmcs_config、swapper_pg_dir或者init_level4_pgt的值;步骤c)中操作系统版本和位数的获取方法为:通过在宿主机终端执行“uname  -r”来获取。

3.
  根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于:步骤j-1)中所述的宿主机的虚拟地址转化为物理地址的方法为:
待转化的宿主机虚拟地址的21至29位记为Directory、30至31位记为Directory Pointer、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended,小页模式下0至11位记为Offset、12至20位记为Table,大页模式下0至20位记为Offset;
如果操作系统位数是64位操作系统小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如果操作系统位数是64位操作系统大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至51位、低21位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如果操作系统位数是32位操作系统开启PAE小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至35位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如果操作系统位数是32位操作系统开启PAE大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至35位、低21位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
在32位操作系统不开启PAE模式下:待转化的宿主机虚拟地址小页模式下的0至11位记为Offset 、12至21位记为Table、22至31位记为Directory;大页模式下:0至21位记为Offset 、22至31位记为Directory;
如果操作系统位数是32位操作系统不开启PAE小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至31位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如果操作系统位数是32位操作系统不开启PAE大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至30位、低22位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值。

4.
  根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于:
步骤m)中所述的虚拟机的物理地址到宿主机的物理地址通过以下方法来实现:
待转化的虚拟机的物理地址的0至11位记为Offset、12至20位记为Table,21至29位记为Directory、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended;
m-1).取扩展页表指针EPTP的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为虚拟机的物理地址转化为宿主机的物理地址之后的数值;
在操作系统位数是64位操作系统小页模式下,虚拟机的虚拟地址到宿主机的物理地址通过以下方法来实现:
待转化的虚拟机的虚拟地址的0至11位记为Offset、12至20位记为Table,21至29位记为Directory、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended;
m-2).将虚拟机的CR3寄存器的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Directory Ptr乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Directory 乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Table 乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为虚拟机的虚拟地址转化为宿主机的物理地址之后的数值。

5.
  根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于:将步骤m)中所获取的内存信息依照不同系统的物理内存分析方法获取虚拟机动态信息,包括虚拟机的进程信息、驱动信息、网络信息、注册表信息、日志信息。

6.
  根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于:步骤j)中所述的偏移量为具有以下取值关系:64位fc15的偏移量为0x460,32位fc16的偏移量为0x2e4,64位fc16的偏移量为0x460,32位fc18的偏移量为0x2e4,Ubuntu11.04的偏移量为0x2DC。

说明书

一种KVM虚拟机的物理内存取证方法
技术领域
本发明涉及一种KVM虚拟机的物理内存取证方法,更具体的说,尤其涉及一种适于现有主流操作系统和CUP型号的KVM虚拟机的物理内存取证方法。 
背景技术
涉及的概念和专业术语主要包括虚拟机、KVM、VMCS和EPT。
虚拟机(Virtual Machine,VM)是指在一个硬件平台上模拟多个独立的、ISA架构和实际硬件相同的虚拟硬件系统,在每个虚拟硬件系统上都可以运行不同的操作系统,即客户操作系统(Guest OS)。这些客户操作系统通过虚拟机监视器(Virtual Machine Monitor,VMM)访问实际的物理资源。
在本文中,为了方便描述,物理主机称之为宿主机,宿主机的物理地址简称为HPA(Host PhysicalAddress),宿主机的虚拟地址简称为HVA(Host VirtualAddress),虚拟机的物理地址简称为GPA(Guest PhysicalAddress),虚拟机的虚拟地址简称为GVA(Guest VirtualAddress)。虚拟机的物理地址仍然是一个虚拟地址,宿主机的物理地址才是真实的机器地址。
KVM(Kernel-based Virtual Machine),是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案,目前已经成为主流VMM之一。
为了更好的支持虚拟化,VT-x扩展了传统的x86处理器架构,引入了两种操作模式:VMX root operation(根虚拟化操作)和VMX non-root operation(非虚拟化操作),统称为VMX操作模式。为了建立这种两个操作模式的架构,VT-x设计了VMCS(Virtual-Machine Control Structure)虚拟机控制数据结构,每个VMCS对应一个虚拟CPU(VCPU)。VMCS包括三个组成部分,VMCS版本标志(Revision Identifier)、VMX退出原因指示器(VMX-abort indicator)以及VMCS数据区。在VMCS数据区中,包括了Guest-State Area(客户机状态区)和Host-State Area(宿主机状态区)等六个逻辑区域(如图1所示),用以保存虚拟机以及主机的各种状态参数,当VMEntry(处理器控制从vMX根状态进入vMX非根状态),处理器状态被保存在VMCS中(Host状态),同时客户机状态从VMCS中装入。相反当VMExit时(从VMX非根状态进入VMX根状态),处理器状态被保存在VMCS的中(客户机状态),而Host状态则从VMCS中装入。VMM可以对不同虚拟处理器的VMCS分别设置不同虚拟机退出条件,从而实现对不同客户机的不同虚拟化策略。
EPT(Extended Page Table)是Intel在VT-x技术基础上增加的一种硬件辅助内存虚拟化技术。和影子页表技术相比,影子页表技术为虚拟机的每个页表维护一个“影子页表”,并将合成后的映射关系写入到“影子”中,虚拟机的页表内容保持不变,宿主机将影子页表交给内存管理模块进行地址转换。而EPT机制通过硬件支持内存虚拟化技术,使其能在原有的页表上增加一个EPT页表,通过这个页表能过将虚拟机的物理地址直接翻译为宿主机的物理地址,从而减少整个内存虚拟化所需要的代价。EPT页表的基地址是由VMCS结构体中“VM-Execution”控制域的Extended page table pointer字段指定。
为推进物理内存分析技术的发展,DFRWS(Digital Forensic Research Workshop)于2005年推出了名为“Forensics Challenge”的活动,活动的主题就是物理内存分析。从此,对于物理内存的分析和获取成为计算机取证的研究热点。
在计算机物理内存获取方面,目前主要有两类方法,一类是软件方法,另一类是硬件方法。软件方法主要有微软提供的Crash Dump方法、DD(data dumper)工具、虚拟机(Virtualization)、Bradley Schatz构建的BodySnatcher工具。硬件方法主要有Brian Carrier提出的基于PCI扩展卡的方法和Becher、BOILEAU A等人提出的基于FireWire的方法,都是基于直接存储存取方式(DMA)的,到目前还没有成熟的硬件产品推出。这些软硬件方法在适用范围上有各自的局限性,最主要的问题还在于它们都不可避免地改变了目标系统内存的内容。
在物理内存分析方面,代表性的成果包括: 1)A.Schuster(DFRWS)于2006年提出了Windows内存镜像文件中进程和线程的查找方法;2)A. Walters开发了Volatility工具,可以分析出当前运行的进程、打开的网络接口等信息;3)2007年,Seokhee Lee等人研究了虚拟内存文件Pagefile.sys的获取和分析问题;4)王连海在2008年提出了基于KPCR定位进程控制块的方法,适用于windows 2000以后的所有版本。5)2010年Matthieu Suiche深入研究了MAC OS的物理内存分析问题。
可以看到,对宿主机的物理内存获取和分析方面,已经有较多的研究,也取得了一定的成果,通过获取和分析宿主机的物理内存,可以获得宿主机大量的在线数据。
目前,虚拟化技术已经广泛地融入了我们的生活,并具有巨大的市场前景。虚拟化技术改变了系统软件与底层软件紧耦合的方式,可以更加灵活地配置与管理计算系统,降低硬件成本。但是,也给取证人员带来了一些机遇和挑战:一方面,虚拟化技术作为一种新技术可以给计算机取证带来新的变革,推动和促进计算机取证技术自身的发展;另一方面,相关的虚拟机产品可能变成犯罪分子利用的工具或者攻击的受害者,犯罪嫌疑人可以利用虚拟机来执行他们的活动。如何对虚拟机进行取证是一个全新而且重要的问题。
目前,以虚拟机为取证对象的计算机取证技术多以对宿主机文件系统中的相关虚拟机文件(主要指配置文件和存储文件)进行深入分析。以VMware Workstation下的虚拟机为例,虚拟机的“虚拟磁盘”上的文件存储在一个或多个以“vmdk”为后缀名的文件中,以“vmem”为后缀名的文件则保存了虚拟机物理内存中的所有数据,配置信息则保存在以“vmx”为后缀的文件中。如钟琳、许榕生提出了对虚拟机文件进行取证的方法。Mariano Graziano于2013年首次提出了一种在虚拟机在宿主机物理内存中检测虚拟机的方法,该方法通过在宿主机物理内存中搜索VMCS结构体,然后结合volatility工具对虚拟机进行物理内存分析,具体过程如下:
1)内存扫描
VMCS结构体包含了140多个键值,大小约4k,结构体及其取值受CPU型号、虚拟化工具等因素影响,其中前四个字节为VMCS版本标志,不同的处理器型号对应的版本号不同,接下来是VMX退出原因指示器,一般值为0。在VMCS数据区中包含了一个变量为VmcsLinkPointerCheck,此变量的值一般设置为两个连续的0xffffffff,但是此变量位置不固定。在宿主机状态域中存储了宿主机的CR4控制寄存器的值,其中第十三位表明是否开启了虚拟扩展。基于以上特征在宿主机物理内存中进行搜索VMCS结构体。
2)VMCS结构体确认
从扫描到的VMCS结构体中解析出HOST_CR3的值,即宿主机的CR3寄存器的值,CR3寄存器保存了系统进程的页目录信息,当禁用物理地址拓展,保存的是系统进程页目录的基地址。根据CR3的值找到页目录的地址,然后依次找下去,如图2所示,根据页目录找到页表,以此找到物理地址。
根据此思想,扫描到的VMCS结构体地址为VMCS的物理地址,那么CR3指向的页中应该包含了VMCS物理地址。依照此方法来验证这个VMCS结构体是否有效。
3)虚拟机自省
从VMCS结构体中获取到EPT页表的基地址,EPT页表结构由PML4 table(page map level 4 table),PDPT (page-directory-pointer table),PD(page-directory)和PT(page table)共4 级页表构成。每张页表大小4KB,共有512个页表项,每个页表项占用8个字节。通过模拟EPT地址转换,遍历所有地址转换中需要的PML4、PDPT、PD和PT表。
4)结合volatility工具进行虚拟机物理内存分析
将上述技术实现为一个volatility插件,分析时,按照volatility提供的命令行,指定虚拟机操作系统版本后实现volatility能够提供的分析功能。
在实际的对虚拟机的物理内存分析过程中,我们发现,以上这种分析方法存在一定的局限性,主要表现在以下几个方面:(1)适应于CPU为一定型号且所安装的操作系统为32位的宿主机。经过测试,此方法可以检测到CPU为Intel(R) Core(TM) i5-2500、操作系统为32位fedora 18的宿主机中安装的虚拟机,但是对于CPU为Intel(R) Xeon(R) CPU E5-2620、操作系统为64位fedora 16的宿主机无法检测其中安装的虚拟机;(2)检测到虚拟机后,结合volatility只能分析操作系统为32位Windows系统的虚拟机物理内存;(3)在分析时,操作比较复杂,需要附加虚拟机操作系统版本信息方能够进行。 
发明内容
本发明为了克服上述技术问题的缺点,提供了一种适于现有主流操作系统和CUP型号的KVM虚拟机的物理内存取证方法。
本发明的KVM虚拟机的物理内存取证方法,其特征在于,通过以下步骤来实现:a).宿主机物理内存的获取,借助内存获取工具获取宿主机从0开始的全部物理内存信息;b).在编译内核时产生的存放内核符号表的文件中,查找出内核符号init_task、结构体vmcs config的值,init_task的值为swapper进程结构体的虚拟地址,vmcs config的值指向vmcs config结构体的虚拟地址,vmcs config结构体中定义了VMCS结构体的大小和版本号;c).操作系统版本和位数的获取,获取宿主机的操作系统版本和操作系统位数;对于32位系统,在编译内核时产生的存放内核符号表的文件中,获取页目录指针swapper_pg_dir的值,swapper_pg_dir的值即为宿主机寄存器CR3的虚拟地址,减去0xc0000000即为宿主机寄存器CR3的物理地址;对于64位系统,则获取目录指针init_level4_pgt的值,init_level4_pgt为64位系统下宿主机寄存器CR3的值,减去0xffffffff80000000即为宿主机寄存器CR3的物理地址;结合vmcs_config结构体虚拟地址和宿主机寄存器CR3的值进行地址转换获取vmcs_config结构体的物理地址,从而获取到VMCS结构体大小和版本号信息;d).虚拟机的VMCS版本号检测,VMCS结构体大小和版本号信息定义在vmcs_config结构体中,大小不大于4096个字节,从某一页的开始位置进行存储,前四个字节为与CPU类型有关的VMCS版本号;对于获取的宿主机物理内存,判断每页的前四个字节是否为VMCS版本号,如果判断结果为是,则表明该页可能是VMCS结构体,执行步骤e);如果判断结果为否,则表明该页不可能为VMCS结构体,执行步骤l),以进行下一个页的判断;e).VMX退出原因指示器的检测,判断页从第四个字节开始的4个字节的值是否为零,如果为零,则表明该页可能是VMCS结构体,执行步骤f);如果不为零,则表明该页不可能是VMCS结构体,执行步骤l);f).宿主机CR3寄存器的检测和获取,判断在该页偏移量为0x340处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为宿主机CR3寄存器的值,将其取出,记为Host_CR3,执行步骤g);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);g).虚拟机CR3寄存器的检测和获取,判断在页偏移量为0x2e0处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为虚拟机CR3寄存器的值,将其取出,记为Guest_CR3,执行步骤h);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);h).两个连续0xffffffff的判断,通过遍历整个结构体,判断是否存在两个连续的0xffffffff,如果存在,则表明该页可能是VMCS结构体,执行步骤i);如果不存在,则表明该页不可能是VMCS结构体,执行步骤l);i).扩展页的检测和获取,判断在该页偏移量为0Xe8位置处的8个字节是否为零,如果不为零,则表明偏移量0Xe8位置处的8个字节可能为扩展页指针的数值,将其取出,记为EPTP,执行步骤j);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);j).判断Host_CR3寄存器的正确性,内核符号init_task的值指向swapper进程结构体,swapper进程以一个task_struck结构体的形式存在,进程名称“swapper”存在于task_struck结构体中与操作系统版本有关的偏移量处,设偏移量为                                               ;通过以下步骤来判断:j-1).根据操作系统位数是64位操作系统小页模式、64位操作系统大页模式、32位操作系统开启PAE小页模式、32位操作系统开启PAE大页模式、32位操作系统不开启PAE小页模式还是32位操作系统不开启PAE大页模式,将swapper进程结构体的虚拟地址init_task转化为物理地址,执行步骤j-2);j-2).将init_task转化后的物理地址加上偏移量,判断所获取的进程名称是否为swapper,如果为swapper,则证明所获取的Host_CR3为正确的宿主机CR3寄存器,执行步骤k);如果不为swapper,则表明所获取的Host_CR3不是宿主机CR3寄存器,判断出的VMCS结构体不正确,执行步骤l);k).判断Guest_CR3寄存器的正确性,借助EPT页结构,将步骤g)中获取的Guest_CR3寄存器的值转化为宿主机物理地址,判断转化后的宿主机物理地址是否为零,如果不为零,则表明获取的Guest_CR3寄存器为正确的虚拟机CR3寄存器,该页中所检测出结构体为正确的VMCS结构体;如果为零,则表明Guest_CR3寄存器不是正确的虚拟机CR3寄存器,所判断出的VMCS结构体不正确;执行步骤l);l).判断是否检测完毕,判断所有页是否均已判断完毕,如果判断完毕则执行步骤m);如果没有判断完毕,则对下一页进行判断,跳转执行步骤d);m).虚拟机物理内存的获取,对于给定的虚拟机物理地址和虚拟地址,首先将其转化为宿主机的物理地址,即可进行虚拟机内存信息的获取;n).虚拟机物理内存的分析,通过对步骤m)中获取的虚拟机内存信息的分析,即可对虚拟机的行为作出判断。
本发明的KVM虚拟机的物理内存取证方法,步骤a)中宿主机物理内存的获取方法为:采用开源软件LiME加载内核模块获得Linux和Linux设备中的完整内存信息,以padded格式来获取从0开始的宿主机的全部内存信息;步骤b)和步骤c)中:通过获取/proc/kallsyms文件来获取内核符号表,并从中获取内核符号init_task、结构体vmcs_config、swapper_pg_dir或者init_level4_pgt的值;步骤c)中操作系统版本和位数的获取方法为:通过在宿主机终端执行“uname  -r”来获取。
本发明的KVM虚拟机的物理内存取证方法,步骤j-1)中所述的宿主机的虚拟地址转化为物理地址的方法为:待转化的宿主机虚拟地址的21至29位记为Directory、30至31位记为Directory Pointer、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended,小页模式下0至11位记为Offset、12至20位记为Table,大页模式下0至20位记为Offset;如果操作系统位数是64位操作系统小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是64位操作系统大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至51位、低21位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统开启PAE小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至35位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统开启PAE大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至35位、低21位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;在32位操作系统不开启PAE模式下:待转化的宿主机虚拟地址小页模式下的0至11位记为Offset 、12至21位记为Table、22至31位记为Directory;大页模式下:0至21位记为Offset 、22至31位记为Directory;如果操作系统位数是32位操作系统不开启PAE小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至31位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统不开启PAE大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至30位、低22位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值。
本发明的KVM虚拟机的物理内存取证方法,步骤m)中所述的虚拟机的物理地址到宿主机的物理地址通过以下方法来实现:待转化的虚拟机的物理地址的0至11位记为Offset、12至20位记为Table,21至29位记为Directory、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended;m-1).取扩展页表指针EPTP的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为虚拟机的物理地址转化为宿主机的物理地址之后的数值;在操作系统位数是64位操作系统小页模式下,虚拟机的虚拟地址到宿主机的物理地址通过以下方法来实现:待转化的虚拟机的虚拟地址的0至11位记为Offset、12至20位记为Table,21至29位记为Directory、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended;m-2).将虚拟机的CR3寄存器的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Directory Ptr乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Directory 乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Table 乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为虚拟机的虚拟地址转化为宿主机的物理地址之后的数值。
本发明的KVM虚拟机的物理内存取证方法,将步骤m)中所获取的内存信息依照不同系统的物理内存分析方法获取虚拟机动态信息,包括虚拟机的进程信息、驱动信息、网络信息、注册表信息、日志信息。
本发明的KVM虚拟机的物理内存取证方法,步骤j)中所述的偏移量为具有以下取值关系:64位fc15的偏移量为0x460,32位fc16的偏移量为0x2e4,64位fc16的偏移量为0x460,32位fc18的偏移量为0x2e4,Ubuntu11.04的偏移量为0x2DC。
本发明的有益效果是:本发明的KVM虚拟机的物理内存取证方法,获取宿主机的全部物理内存信息,首先根据页中是否具备含有VMCS版本号、VMX推出原因指示器是否不为零、宿主机和虚拟机的CR3寄存器不为零、两个连续的0xffffffff、扩展页表指针不为零,初步判断页中是否存在潜在的VMCS结构体;然后将内核符号init_task转化为宿主机的物理地址并加上偏移量,判断是否存在swapper的进程名称,来初步判断所获取的潜在VMCS结构体的正确性,再判断将Guest_CR3寄存器的值转化为宿主机物理地址是否不为零,最终确定出所获取的潜在VMCS结构体为正确的VMCS结构体。发明的的VMCS结构体的查找和验证过程,最终可在宿主机的内存信息中查找出所有的VMCS结构体。
本发明的KVM下虚拟机物理内存取证方法,通过对安装有KVM的物理主机进行物理内存镜像,对物理主机的物理内存镜像文件进行分析,从中获取虚拟机的物理内存,这种获取方法不会对虚拟机的状态产生任何影响;获取到虚拟机物理内存后进行分析,从中找到虚拟机运行的进程、驱动、网络信息、注册表信息以及日志信息等大量系统信息,从而获得利用虚拟机进行犯罪的证据。本技术将应用于计算机取证领域,主要用于信息安全事件和各类计算机犯罪案件的调查取证。
本发明的KVM虚拟机的物理内存取证方法的有点体现在:
1、本发明通过获取和分析虚拟机的物理内存,和目前大多以获取和分析虚拟机文件系统相比,将提取大量的在线证据,如进程信息、驱动信息、网络信息、注册表信息等系统信息以及文本数据、邮箱账户信息等用户数据,这些信息在进行恶意代码分析及了解用户行为时更加具有现实意义。
2、本发明描述的物理内存获取方法是通过分析宿主机物理内存并从中抽取出的,这种获取方式不会在虚拟机中加载任何软硬件,不运行任何程序,不影响虚拟机运行状态,获取到的内存信息更加真实,不会被恶意代码所修改。
3、本发明所描述的虚拟机检测和验证方法更加可靠和高效,在检测时借助于对关键值(包括Revision Identifier、VMX-abort indicator、Host CR3、Guest CR3、VMCS link pointer、EPT)的判断来进行,在验证时借助于对swapper结构体进行判断,无需遍历所有的PML4 table、PDPT、PD和PT4 级页表。
4、适用范围广,适用于Intel Core、Xeon等主流CPU型号的宿主机中的虚拟机内存取证,支持的虚拟机操作系统版本也更加的广泛,对于32位及64位的Windows XP、Windows Vista、Windows 7以及Windows 8系统均可以进行内存获取和分析。
5、据此开发的系统操作简单,无需指定操作系统版本以及相关的系统配置即可进行。
附图说明
图1为虚拟机控制结构的数据区分布图;
图2为现有根据宿主机的CR3寄存器的值查找物理地址的示意图;
图3为本发明的KVM虚拟机的物理内存取证方法的流程图;
图4为64位操作系统小页模式下宿主机的虚拟地址转化为物理地址的示意图;
图5为64位操作系统大页模式下宿主机的虚拟地址转化为物理地址的示意图;
图6为32位操作系统开启PAE小页模式下宿主机的虚拟地址转化为物理地址的示意图;
图7为32位操作系统开启PAE大页模式下宿主机的虚拟地址转化为物理地址的示意图;
图8为32位操作系统不开启PAE小页模式下宿主机的虚拟地址转化为物理地址的示意图;
图9为32位操作系统不开启PAE大页模式下宿主机的虚拟地址转化为物理地址的示意图;
图10为虚拟机的物理地址转化为宿主机的物理地址的示意图;
图11为64位操作系统小页模式下虚拟机的虚拟地址转换为宿主机的物理地址的示意图。
具体实施方式
下面结合附图与实施例对本发明作进一步说明。
如图3所示,给出了本发明的KVM虚拟机的物理内存取证方法的流程图,其通过一下步骤来实现:
a).宿主机物理内存的获取,借助内存获取工具获取宿主机从0开始的全部物理内存信息;
    该步骤中宿主机物理内存的获取方法为:采用开源软件LiME加载内核模块获得Linux和Linux设备中的完整内存信息,以padded格式来获取从0开始的宿主机的全部内存信息。
b).在编译内核时产生的存放内核符号表的文件中,查找出内核符号init_task、结构体vmcs config的值,init_task的值为swapper进程结构体的虚拟地址,vmcs config的值指向vmcs config结构体的虚拟地址,vmcs config结构体中定义了VMCS结构体的大小和版本号;
该步骤中内核符号表的获取方法为:通过获取/boot/System.map文件来获取内核符号表,并从中获取内核符号init_task的值;步骤c)中操作系统版本和位数的获取方法为:通过在宿主机终端执行“uname -r”来获取。
c).操作系统版本和位数的获取,获取宿主机的操作系统版本和操作系统位数;对于32位系统,在编译内核时产生的存放内核符号表的文件中,获取页目录指针swapper_pg_dir的值,swapper_pg_dir的值即为宿主机寄存器CR3的虚拟地址,减去0xc0000000即为宿主机寄存器CR3的物理地址;对于64位系统,则获取目录指针init_level4_pgt的值,init_level4_pgt为64位系统下宿主机寄存器CR3的值,减去0xffffffff80000000即为宿主机寄存器CR3的物理地址;结合vmcs_config结构体虚拟地址和宿主机寄存器CR3的值进行地址转换获取vmcs_config结构体的物理地址,从而获取到VMCS结构体大小和版本号信息;
d).虚拟机的VMCS版本号检测,VMCS结构体大小和版本号信息定义在vmcs_config结构体中,大小不大于4096个字节,从某一页的开始位置进行存储,前四个字节为与CPU类型有关的VMCS版本号;对于获取的宿主机物理内存,判断每页的前四个字节是否为VMCS版本号,如果判断结果为是,则表明该页可能是VMCS结构体,执行步骤e);如果判断结果为否,则表明该页不可能为VMCS结构体,执行步骤l),以进行下一个页的判断;
e).VMX退出原因指示器的检测,判断页从第四个字节开始的4个字节的值是否为零,如果为零,则表明该页可能是VMCS结构体,执行步骤f);如果不为零,则表明该页不可能是VMCS结构体,执行步骤l);
f).宿主机CR3寄存器的检测和获取,判断在该页偏移量为0x340处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为宿主机CR3寄存器的值,将其取出,记为Host_CR3,执行步骤g);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);
g).虚拟机CR3寄存器的检测和获取,判断在页偏移量为0x2e0处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为虚拟机CR3寄存器的值,将其取出,记为Guest_CR3,执行步骤h);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);
h).两个连续0xffffffff的判断,通过遍历整个结构体,判断是否存在两个连续的0xffffffff,如果存在,则表明该页可能是VMCS结构体,执行步骤i);如果不存在,则表明该页不可能是VMCS结构体,执行步骤l);
i).扩展页的检测和获取,判断在该页偏移量为0Xe8位置处的8个字节是否为零,如果不为零,则表明偏移量0Xe8位置处的8个字节可能为扩展页指针的数值,将其取出,记为EPTP,执行步骤j);如果为零,则表明该页不可能是VMCS结构体,执行步骤l);
j).判断Host_CR3寄存器的正确性,内核符号init_task的值指向swapper进程结构体,swapper进程以一个task_struck结构体的形式存在,进程名称“swapper”存在于task_struck结构体中与操作系统版本有关的偏移量处,设偏移量为;通过以下步骤来判断:
init_task的值指向swapper进程结构体,在Linux系统中,进程以一个task_struct结构体的形式存在,进程结构体为:
struct task_struct {
          volatile long state; 
          unsigned long flags; 
          int sigpending;
          mm_segment_t addr_limit; 
          struct exec_domain *exec_domain;  
          volatile long need_resched;
          unsigned long ptrace; 
          int lock_depth; 
          long counter;   
          long nice;  
          unsigned long policy;      
          struct mm_struct *mm;  
          int processor;  
          unsigned long cpus_runnable, cpus_allowed;  
          struct list_head run_list;  
          unsigned long sleep_time;    
          struct mm_struct *active_mm;  
          struct list_head local_pages;  
          unsigned int allocation_order, nr_local_pages;    
          struct linux_binfmt *binfmt;  
          int exit_code, exit_signal;  
          int pdeath_signal;
          unsigned long personality; 
          int did_exec:1;  
          unsigned task_dumpable:1;  
          pid_t pid; //进程号  
          pid_t pgrp;  
          pid_t tty_old_pgrp;  
          pid_t session;  
          pid_t tgid;  
          int leader;       
          struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr; 
          struct list_head thread_group;    
          struct task_struct *pidhash_next;  
          struct task_struct **pidhash_pprev; 
          wait_queue_head_t wait_chldexit;    
          struct completion *vfork_done;    
          unsigned long rt_priority;    
          unsigned long it_real_value, it_prof_value, it_virt_value;  
          unsigned long it_real_incr, it_prof_incr, it_virt_incr;  
          struct timer_list real_timer;  
          struct tms times;
          unsigned long start_time;  
          long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; 
          unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
          int swappable:1;  
          uid_t uid,euid,suid,fsuid; 
          gid_t gid,egid,sgid,fsgid; 
          int ngroups;  
          gid_t    groups[NGROUPS];  
          kernel_cap_t   cap_effective, cap_inheritable, cap_permitted;  
          int keep_capabilities:1;  
          struct user_struct *user;  
          struct rlimit rlim[RLIM_NLIMITS]; 
          unsigned short used_math;  
          char comm[16];  
          int link_count, total_link_count;  
          struct tty_struct *tty;
          unsigned int locks; 
          struct sem_undo *semundo;  
          struct sem_queue *semsleeping;  
          struct thread_struct thread;  
          struct fs_struct *fs;  
          struct files_struct *files;  
          struct namespace *namespace;  
          spinlock_t sigmask_lock; 
          struct signal_struct *sig;  
     sigset_t blocked;  
          struct sigpending pending;  
     unsigned long sas_ss_sp;  
          size_t sas_ss_size;  
          int (*notifier)(void *priv);  
          void *notifier_data;  
          sigset_t *notifier_mask;  
     u32 parent_exec_id;  
     u32 self_exec_id;  
          spinlock_t alloc_lock;  
     void *journal_info;  
};  
  其中char comm[16] 字段为进程名称,操作系统版本不同,此字段中结构体中的偏移量不同,如对于64位fedora 16系统,task_struct结构体中0x640处为进程名称。在获取前,首先需要地址转换,将第一步获取的init_task的虚拟地址转换为物理地址。根据操作系统位数不同,地址转换方法不同。将虚拟地址转换为物理地址后,加上偏移量,根据获得到的是否为swapper来判断cr3是否为正确的宿主机cr3寄存器的值。
j-1).根据操作系统位数是64位操作系统小页模式、64位操作系统大页模式、32位操作系统开启PAE小页模式、32位操作系统开启PAE大页模式、32位操作系统不开启PAE小页模式还是32位操作系统不开启PAE大页模式,将swapper进程结构体的虚拟地址init_task转化为物理地址,执行步骤j-2);
该步骤中所述的宿主机的虚拟地址转化为物理地址的方法为:
待转化的宿主机虚拟地址的21至29位记为Directory、30至31位记为Directory Pointer、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended,小页模式下0至11位记为Offset、12至20位记为Table,大页模式下0至20位记为Offset;
如图4所示,给出了64位操作系统小页模式下宿主机的虚拟地址转化为物理地址的示意图,如果操作系统位数是64位操作系统小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如图5所示,给出了64位操作系统大页模式下宿主机的虚拟地址转化为物理地址的示意图,如果操作系统位数是64位操作系统大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至51位、低21位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如图6所示,给出了32位操作系统开启PAE小页模式下宿主机的虚拟地址转化为物理地址的示意图,如果操作系统位数是32位操作系统开启PAE小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至35位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如图7所示,给出了32位操作系统开启PAE大页模式下宿主机的虚拟地址转化为物理地址的示意图,如果操作系统位数是32位操作系统开启PAE大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的12位至44位、低5位均取为0,将其与Directory Pointer乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至35位、低21位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
在32位操作系统不开启PAE模式下:待转化的宿主机虚拟地址小页模式下的0至11位记为Offset 、12至21位记为Table、22至31位记为Directory;大页模式下:0至21位记为Offset 、22至31位记为Directory;
如图8所示,给出了32位操作系统不开启PAE小页模式下宿主机的虚拟地址转化为物理地址的示意图,如果操作系统位数是32位操作系统不开启PAE小页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至31位、低12位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;
如图8所示,给出了32位操作系统不开启PAE大页模式下宿主机的虚拟地址转化为物理地址的示意图,如果操作系统位数是32位操作系统不开启PAE大页模式,则通过以下方法进行地址转换:取Host_CR3寄存器的0位至31位、低13位均取为0,将其与Directory乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至30位、低22位均取为0,将其与Offset相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值。
j-2).将init_task转化后的物理地址加上偏移量,判断所获取的进程名称是否为swapper,如果为swapper,则证明所获取的Host_CR3为正确的宿主机CR3寄存器,执行步骤k);如果不为swapper,则表明所获取的Host_CR3不是宿主机CR3寄存器,判断出的VMCS结构体不正确,执行步骤l);
k).判断Guest_CR3寄存器的正确性,借助EPT页结构,将步骤g)中获取的Guest_CR3寄存器的值转化为宿主机物理地址,判断转化后的宿主机物理地址是否为零,如果不为零,则表明获取的Guest_CR3寄存器为正确的虚拟机CR3寄存器,该页中所检测出结构体为正确的VMCS结构体;如果为零,则表明Guest_CR3寄存器不是正确的虚拟机CR3寄存器,所判断出的VMCS结构体不正确;执行步骤l);
l).判断是否检测完毕,判断所有页是否均已判断完毕,如果判断完毕则执行步骤m);如果没有判断完毕,则对下一页进行判断,跳转执行步骤d);
m).虚拟机物理内存的获取,对于给定的虚拟机物理地址和虚拟地址,首先将其转化为宿主机的物理地址,即可进行虚拟机内存信息的获取;
如图10所示,给出了虚拟机的物理地址转化为宿主机的物理地址的示意图,该步骤中所述的虚拟机的物理地址到宿主机的物理地址通过以下方法来实现:
待转化的虚拟机的物理地址的0至11位记为Offset、12至20位记为Table,21至29位记为Directory、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended;
m-1).取扩展页表指针EPTP的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory Ptr乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Directory乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Table乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为虚拟机的物理地址转化为宿主机的物理地址之后的数值;
如图11所示,给出了64位操作系统小页模式下虚拟机的虚拟地址转化为宿主机的物理地址的示意图,在操作系统位数是64位操作系统小页模式下,虚拟机的虚拟地址到宿主机的物理地址通过以下方法来实现:
待转化的虚拟机的虚拟地址的0至11位记为Offset、12至20位记为Table,21至29位记为Directory、30至38位记为Directory Ptr、39至47位记为PML4、48至63位记为Sing Extended;
m-2).将虚拟机的CR3寄存器的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Directory Ptr乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Directory 乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与Table 乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤m-1)转化为宿主机的物理地址,记为,取的12位至51位、低12位均取为0,将其与Offset相加,得到的数据即为虚拟机的虚拟地址转化为宿主机的物理地址之后的数值。
所获取的虚拟机内存信息包括进程信息、驱动信息、网络信息、注册表信息等系统信息以及文本数据、邮箱账户信息等用户数据,这些信息在进行恶意代码分析及了解用户行为时更加具有现实意义。
n).虚拟机物理内存的分析,通过对步骤m)中获取的虚拟机内存信息的分析,即可对虚拟机的行为作出判断。
根据不同的系统,采用不同的物理内存分析方法。如果虚拟机操作系统为Windows系统,则采用基于KPCR的物理内存分析方法(具体方法描述可以参考专利“基于KPCR结构的windows系统物理内存分析方法”)。 

一种KVM虚拟机的物理内存取证方法.pdf_第1页
第1页 / 共25页
一种KVM虚拟机的物理内存取证方法.pdf_第2页
第2页 / 共25页
一种KVM虚拟机的物理内存取证方法.pdf_第3页
第3页 / 共25页
点击查看更多>>
资源描述

《一种KVM虚拟机的物理内存取证方法.pdf》由会员分享,可在线阅读,更多相关《一种KVM虚拟机的物理内存取证方法.pdf(25页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN104182269A43申请公布日20141203CN104182269A21申请号201410394479122申请日20140812G06F9/455200601G06F12/0620060171申请人山东省计算中心国家超级计算济南中心地址250014山东省济南市历下区科院路19号山东省计算中心国家超级计算济南中心72发明人王连海张淑慧74专利代理机构济南泉城专利商标事务所37218代理人褚庆森54发明名称一种KVM虚拟机的物理内存取证方法57摘要本发明的KVM虚拟机的物理内存取证方法,包括A宿主机物理内存的获取;D虚拟机的VMCS版本号检测;EVMX退出原因指示器的检测。

2、;F宿主机CR3寄存器的检测和获取;G虚拟机CR3寄存器的检测和获取;H两个连续0XFFFFFFFF的判断;I扩展页的检测和获取;J判断HOST_CR3寄存器的正确性;K判断GUEST_CR3寄存器的正确性;L判断是否检测完毕;M虚拟机物理内存的获取;N虚拟机物理内存的分析。本发明的KVM虚拟机的物理内存取证方法,首先初步判断页中是否存在潜在的VMCS结构体,然后再判断VMCS结构体的正确性,以便获取虚拟机的物理内存,这种获取方法不会对虚拟机的状态产生任何影响,适于信息安全事件和各类计算机犯罪案件的调查取证。51INTCL权利要求书4页说明书14页附图6页19中华人民共和国国家知识产权局12发。

3、明专利申请权利要求书4页说明书14页附图6页10申请公布号CN104182269ACN104182269A1/4页21一种KVM虚拟机的物理内存取证方法,其特征在于,通过以下步骤来实现A宿主机物理内存的获取,借助内存获取工具获取宿主机从0开始的全部物理内存信息;B在编译内核时产生的存放内核符号表的文件中,查找出内核符号INIT_TASK、结构体VMCSCONG的值,INIT_TASK的值为SWAPPER进程结构体的虚拟地址,VMCSCONG的值指向VMCSCONG结构体的虚拟地址,VMCSCONG结构体中定义了VMCS结构体的大小和版本号;C操作系统版本和位数的获取,获取宿主机的操作系统版本和。

4、操作系统位数;对于32位系统,在编译内核时产生的存放内核符号表的文件中,获取页目录指针SWAPPER_PG_DIR的值,SWAPPER_PG_DIR的值即为宿主机寄存器CR3的虚拟地址,减去0XC0000000即为宿主机寄存器CR3的物理地址;对于64位系统,则获取目录指针INIT_LEVEL4_PGT的值,INIT_LEVEL4_PGT为64位系统下宿主机寄存器CR3的值,减去0XFFFFFFFF80000000即为宿主机寄存器CR3的物理地址;结合VMCS_CONG结构体虚拟地址和宿主机寄存器CR3的值进行地址转换获取VMCS_CONG结构体的物理地址,从而获取到VMCS结构体大小和版本号。

5、信息;D虚拟机的VMCS版本号检测,VMCS结构体大小和版本号信息定义在VMCS_CONG结构体中,大小不大于4096个字节,从某一页的开始位置进行存储,前四个字节为与CPU类型有关的VMCS版本号;对于获取的宿主机物理内存,判断每页的前四个字节是否为VMCS版本号,如果判断结果为是,则表明该页可能是VMCS结构体,执行步骤E;如果判断结果为否,则表明该页不可能为VMCS结构体,执行步骤L),以进行下一个页的判断;EVMX退出原因指示器的检测,判断页从第四个字节开始的4个字节的值是否为零,如果为零,则表明该页可能是VMCS结构体,执行步骤F;如果不为零,则表明该页不可能是VMCS结构体,执行步。

6、骤L;F宿主机CR3寄存器的检测和获取,判断在该页偏移量为0X340处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为宿主机CR3寄存器的值,将其取出,记为HOST_CR3,执行步骤G;如果为零,则表明该页不可能是VMCS结构体,执行步骤L;G虚拟机CR3寄存器的检测和获取,判断在页偏移量为0X2E0处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为虚拟机CR3寄存器的值,将其取出,记为GUEST_CR3,执行步骤H;如果为零,则表明该页不可能是VMCS结构体,执行步骤L;H两个连续0XFFFFFFFF的判断,通过遍历整个结构体,判断是否存在两个连续的0XF。

7、FFFFFFF,如果存在,则表明该页可能是VMCS结构体,执行步骤I;如果不存在,则表明该页不可能是VMCS结构体,执行步骤L);I扩展页的检测和获取,判断在该页偏移量为0XE8位置处的8个字节是否为零,如果不为零,则表明偏移量0XE8位置处的8个字节可能为扩展页指针的数值,将其取出,记为EPTP,执行步骤J;如果为零,则表明该页不可能是VMCS结构体,执行步骤L;J判断HOST_CR3寄存器的正确性,内核符号INIT_TASK的值指向SWAPPER进程结构体,SWAPPER进程以一个TASK_STRUCK结构体的形式存在,进程名称“SWAPPER”存在于TASK_STRUCK结构体中与操作系。

8、统版本有关的偏移量处,设偏移量为;通过以下步骤来判断权利要求书CN104182269A2/4页3J1根据操作系统位数是64位操作系统小页模式、64位操作系统大页模式、32位操作系统开启PAE小页模式、32位操作系统开启PAE大页模式、32位操作系统不开启PAE小页模式还是32位操作系统不开启PAE大页模式,将SWAPPER进程结构体的虚拟地址INIT_TASK转化为物理地址,执行步骤J2;J2将INIT_TASK转化后的物理地址加上偏移量,判断所获取的进程名称是否为SWAPPER,如果为SWAPPER,则证明所获取的HOST_CR3为正确的宿主机CR3寄存器,执行步骤K;如果不为SWAPPER。

9、,则表明所获取的HOST_CR3不是宿主机CR3寄存器,判断出的VMCS结构体不正确,执行步骤L;K判断GUEST_CR3寄存器的正确性,借助EPT页结构,将步骤G中获取的GUEST_CR3寄存器的值转化为宿主机物理地址,判断转化后的宿主机物理地址是否为零,如果不为零,则表明获取的GUEST_CR3寄存器为正确的虚拟机CR3寄存器,该页中所检测出结构体为正确的VMCS结构体;如果为零,则表明GUEST_CR3寄存器不是正确的虚拟机CR3寄存器,所判断出的VMCS结构体不正确;执行步骤L;L判断是否检测完毕,判断所有页是否均已判断完毕,如果判断完毕则执行步骤M;如果没有判断完毕,则对下一页进行判。

10、断,跳转执行步骤D;M虚拟机物理内存的获取,对于给定的虚拟机物理地址和虚拟地址,首先将其转化为宿主机的物理地址,即可进行虚拟机内存信息的获取;N虚拟机物理内存的分析,通过对步骤M中获取的虚拟机内存信息的分析,即可对虚拟机的行为作出判断。2根据权利要求1所述的KVM虚拟机的物理内存取证方法,其特征在于步骤A中宿主机物理内存的获取方法为采用开源软件LIME加载内核模块获得LINUX和LINUX设备中的完整内存信息,以PADDED格式来获取从0开始的宿主机的全部内存信息;步骤B和步骤C中通过获取/PROC/KALLSYMS文件来获取内核符号表,并从中获取内核符号INIT_TASK、结构体VMCS_C。

11、ONG、SWAPPER_PG_DIR或者INIT_LEVEL4_PGT的值;步骤C中操作系统版本和位数的获取方法为通过在宿主机终端执行“UNAMER”来获取。3根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于步骤J1中所述的宿主机的虚拟地址转化为物理地址的方法为待转化的宿主机虚拟地址的21至29位记为DIRECTORY、30至31位记为DIRECTORYPOINTER、30至38位记为DIRECTORYPTR、39至47位记为PML4、48至63位记为SINGEXTENDED,小页模式下0至11位记为OFFSET、12至20位记为TABLE,大页模式下0至20位记为OFFSE。

12、T;如果操作系统位数是64位操作系统小页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORYPTR乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低1。

13、2位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟权利要求书CN104182269A3/4页4地址转化为物理地址之后的数值;如果操作系统位数是64位操作系统大页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORYPTR乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的2。

14、1位至51位、低21位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统开启PAE小页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至44位、低5位均取为0,将其与DIRECTORYPOINTER乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至3。

15、5位、低12位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统开启PAE大页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至44位、低5位均取为0,将其与DIRECTORYPOINTER乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至35位、低21位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;在32位操作系统不开。

16、启PAE模式下待转化的宿主机虚拟地址小页模式下的0至11位记为OFFSET、12至21位记为TABLE、22至31位记为DIRECTORY;大页模式下0至21位记为OFFSET、22至31位记为DIRECTORY;如果操作系统位数是32位操作系统不开启PAE小页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的0位至31位、低13位均取为0,将其与DIRECTORY乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至31位、低12位均取为0,将其与OF。

17、FSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统不开启PAE大页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的0位至31位、低13位均取为0,将其与DIRECTORY乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至30位、低22位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值。4根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于步骤M中所述的虚拟机的物理地址到宿主机的物理地址通过以下方法来实现待转化的虚拟机的物理地址的0至11位记为OFFSET、1。

18、2至20位记为TABLE,21至29权利要求书CN104182269A4/4页5位记为DIRECTORY、30至38位记为DIRECTORYPTR、39至47位记为PML4、48至63位记为SINGEXTENDED;M1取扩展页表指针EPTP的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORYPTR乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容。

19、记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与OFFSET相加,得到的数据即为虚拟机的物理地址转化为宿主机的物理地址之后的数值;在操作系统位数是64位操作系统小页模式下,虚拟机的虚拟地址到宿主机的物理地址通过以下方法来实现待转化的虚拟机的虚拟地址的0至11位记为OFFSET、12至20位记为TABLE,21至29位记为DIRECTORY、30至38位记为DIRECTORYPTR、39至47位记为PML4、48至63位记为SINGEXTENDED;M2将虚拟机的CR3寄存器的值。

20、按照步骤M1转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤M1转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与DIRECTORYPTR乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤M1转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与DIRECTORY乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤M1转化为宿主机的物理地址,记为,取的12位至51位、低11位均取为0,将其与TABL。

21、E乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;将的值按照步骤M1转化为宿主机的物理地址,记为,取的12位至51位、低12位均取为0,将其与OFFSET相加,得到的数据即为虚拟机的虚拟地址转化为宿主机的物理地址之后的数值。5根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于将步骤M中所获取的内存信息依照不同系统的物理内存分析方法获取虚拟机动态信息,包括虚拟机的进程信息、驱动信息、网络信息、注册表信息、日志信息。6根据权利要求1或2所述的KVM虚拟机的物理内存取证方法,其特征在于步骤J中所述的偏移量为具有以下取值关系64位FC15的偏移量为0X460,32位FC16。

22、的偏移量为0X2E4,64位FC16的偏移量为0X460,32位FC18的偏移量为0X2E4,UBUNTU1104的偏移量为0X2DC。权利要求书CN104182269A1/14页6一种KVM虚拟机的物理内存取证方法技术领域0001本发明涉及一种KVM虚拟机的物理内存取证方法,更具体的说,尤其涉及一种适于现有主流操作系统和CUP型号的KVM虚拟机的物理内存取证方法。背景技术0002涉及的概念和专业术语主要包括虚拟机、KVM、VMCS和EPT。0003虚拟机(VIRTUALMACHINE,VM)是指在一个硬件平台上模拟多个独立的、ISA架构和实际硬件相同的虚拟硬件系统,在每个虚拟硬件系统上都可以。

23、运行不同的操作系统,即客户操作系统(GUESTOS)。这些客户操作系统通过虚拟机监视器(VIRTUALMACHINEMONITOR,VMM)访问实际的物理资源。0004在本文中,为了方便描述,物理主机称之为宿主机,宿主机的物理地址简称为HPA(HOSTPHYSICALADDRESS),宿主机的虚拟地址简称为HVA(HOSTVIRTUALADDRESS),虚拟机的物理地址简称为GPA(GUESTPHYSICALADDRESS),虚拟机的虚拟地址简称为GVA(GUESTVIRTUALADDRESS)。虚拟机的物理地址仍然是一个虚拟地址,宿主机的物理地址才是真实的机器地址。0005KVM(KERNE。

24、LBASEDVIRTUALMACHINE),是X86架构且硬件支持虚拟化技术(如INTELVT或AMDV)的LINUX全虚拟化解决方案,目前已经成为主流VMM之一。0006为了更好的支持虚拟化,VTX扩展了传统的X86处理器架构,引入了两种操作模式VMXROOTOPERATION(根虚拟化操作)和VMXNONROOTOPERATION(非虚拟化操作),统称为VMX操作模式。为了建立这种两个操作模式的架构,VTX设计了VMCS(VIRTUALMACHINECONTROLSTRUCTURE)虚拟机控制数据结构,每个VMCS对应一个虚拟CPU(VCPU)。VMCS包括三个组成部分,VMCS版本标志(。

25、REVISIONIDENTIER)、VMX退出原因指示器(VMXABORTINDICATOR)以及VMCS数据区。在VMCS数据区中,包括了GUESTSTATEAREA(客户机状态区)和HOSTSTATEAREA(宿主机状态区)等六个逻辑区域(如图1所示),用以保存虚拟机以及主机的各种状态参数,当VMENTRY处理器控制从VMX根状态进入VMX非根状态,处理器状态被保存在VMCS中HOST状态,同时客户机状态从VMCS中装入。相反当VMEXIT时从VMX非根状态进入VMX根状态,处理器状态被保存在VMCS的中客户机状态,而HOST状态则从VMCS中装入。VMM可以对不同虚拟处理器的VMCS分别。

26、设置不同虚拟机退出条件,从而实现对不同客户机的不同虚拟化策略。0007EPT(EXTENDEDPAGETABLE)是INTEL在VTX技术基础上增加的一种硬件辅助内存虚拟化技术。和影子页表技术相比,影子页表技术为虚拟机的每个页表维护一个“影子页表”,并将合成后的映射关系写入到“影子”中,虚拟机的页表内容保持不变,宿主机将影子页表交给内存管理模块进行地址转换。而EPT机制通过硬件支持内存虚拟化技术,使其能在原有的页表上增加一个EPT页表,通过这个页表能过将虚拟机的物理地址直接翻译为宿主机的物理地址,从而减少整个内存虚拟化所需要的代价。EPT页表的基地址是由VMCS结构体中“VMEXECUTION。

27、”控制域的EXTENDEDPAGETABLEPOINTER字段指定。说明书CN104182269A2/14页70008为推进物理内存分析技术的发展,DFRWS(DIGITALFORENSICRESEARCHWORKSHOP)于2005年推出了名为“FORENSICSCHALLENGE”的活动,活动的主题就是物理内存分析。从此,对于物理内存的分析和获取成为计算机取证的研究热点。0009在计算机物理内存获取方面,目前主要有两类方法,一类是软件方法,另一类是硬件方法。软件方法主要有微软提供的CRASHDUMP方法、DD(DATADUMPER)工具、虚拟机(VIRTUALIZATION)、BRADLE。

28、YSCHATZ构建的BODYSNATCHER工具。硬件方法主要有BRIANCARRIER提出的基于PCI扩展卡的方法和BECHER、BOILEAUA等人提出的基于FIREWIRE的方法,都是基于直接存储存取方式(DMA)的,到目前还没有成熟的硬件产品推出。这些软硬件方法在适用范围上有各自的局限性,最主要的问题还在于它们都不可避免地改变了目标系统内存的内容。0010在物理内存分析方面,代表性的成果包括1)ASCHUSTERDFRWS于2006年提出了WINDOWS内存镜像文件中进程和线程的查找方法;2)AWALTERS开发了VOLATILITY工具,可以分析出当前运行的进程、打开的网络接口等信息。

29、;3)2007年,SEOKHEELEE等人研究了虚拟内存文件PAGELESYS的获取和分析问题;4)王连海在2008年提出了基于KPCR定位进程控制块的方法,适用于WINDOWS2000以后的所有版本。5)2010年MATTHIEUSUICHE深入研究了MACOS的物理内存分析问题。0011可以看到,对宿主机的物理内存获取和分析方面,已经有较多的研究,也取得了一定的成果,通过获取和分析宿主机的物理内存,可以获得宿主机大量的在线数据。0012目前,虚拟化技术已经广泛地融入了我们的生活,并具有巨大的市场前景。虚拟化技术改变了系统软件与底层软件紧耦合的方式,可以更加灵活地配置与管理计算系统,降低硬件。

30、成本。但是,也给取证人员带来了一些机遇和挑战一方面,虚拟化技术作为一种新技术可以给计算机取证带来新的变革,推动和促进计算机取证技术自身的发展;另一方面,相关的虚拟机产品可能变成犯罪分子利用的工具或者攻击的受害者,犯罪嫌疑人可以利用虚拟机来执行他们的活动。如何对虚拟机进行取证是一个全新而且重要的问题。0013目前,以虚拟机为取证对象的计算机取证技术多以对宿主机文件系统中的相关虚拟机文件(主要指配置文件和存储文件)进行深入分析。以VMWAREWORKSTATION下的虚拟机为例,虚拟机的“虚拟磁盘”上的文件存储在一个或多个以“VMDK”为后缀名的文件中,以“VMEM”为后缀名的文件则保存了虚拟机物。

31、理内存中的所有数据,配置信息则保存在以“VMX”为后缀的文件中。如钟琳、许榕生提出了对虚拟机文件进行取证的方法。MARIANOGRAZIANO于2013年首次提出了一种在虚拟机在宿主机物理内存中检测虚拟机的方法,该方法通过在宿主机物理内存中搜索VMCS结构体,然后结合VOLATILITY工具对虚拟机进行物理内存分析,具体过程如下1)内存扫描VMCS结构体包含了140多个键值,大小约4K,结构体及其取值受CPU型号、虚拟化工具等因素影响,其中前四个字节为VMCS版本标志,不同的处理器型号对应的版本号不同,接下来是VMX退出原因指示器,一般值为0。在VMCS数据区中包含了一个变量为VMCSLINK。

32、POINTERCHECK,此变量的值一般设置为两个连续的0XFFFFFFFF,但是此变量位置不固定。在宿主机状态域中存储了宿主机的CR4控制寄存器的值,其中第十三位表明是否开启了虚拟扩展。基于以上特征在宿主机物理内存中进行搜索VMCS结构体。说明书CN104182269A3/14页800142)VMCS结构体确认从扫描到的VMCS结构体中解析出HOST_CR3的值,即宿主机的CR3寄存器的值,CR3寄存器保存了系统进程的页目录信息,当禁用物理地址拓展,保存的是系统进程页目录的基地址。根据CR3的值找到页目录的地址,然后依次找下去,如图2所示,根据页目录找到页表,以此找到物理地址。0015根据此。

33、思想,扫描到的VMCS结构体地址为VMCS的物理地址,那么CR3指向的页中应该包含了VMCS物理地址。依照此方法来验证这个VMCS结构体是否有效。00163)虚拟机自省从VMCS结构体中获取到EPT页表的基地址,EPT页表结构由PML4TABLEPAGEMAPLEVEL4TABLE,PDPTPAGEDIRECTORYPOINTERTABLE,PDPAGEDIRECTORY和PTPAGETABLE共4级页表构成。每张页表大小4KB,共有512个页表项,每个页表项占用8个字节。通过模拟EPT地址转换,遍历所有地址转换中需要的PML4、PDPT、PD和PT表。00174)结合VOLATILITY工具。

34、进行虚拟机物理内存分析将上述技术实现为一个VOLATILITY插件,分析时,按照VOLATILITY提供的命令行,指定虚拟机操作系统版本后实现VOLATILITY能够提供的分析功能。0018在实际的对虚拟机的物理内存分析过程中,我们发现,以上这种分析方法存在一定的局限性,主要表现在以下几个方面(1)适应于CPU为一定型号且所安装的操作系统为32位的宿主机。经过测试,此方法可以检测到CPU为INTELRCORETMI52500、操作系统为32位FEDORA18的宿主机中安装的虚拟机,但是对于CPU为INTELRXEONRCPUE52620、操作系统为64位FEDORA16的宿主机无法检测其中安装。

35、的虚拟机;(2)检测到虚拟机后,结合VOLATILITY只能分析操作系统为32位WINDOWS系统的虚拟机物理内存;(3)在分析时,操作比较复杂,需要附加虚拟机操作系统版本信息方能够进行。发明内容0019本发明为了克服上述技术问题的缺点,提供了一种适于现有主流操作系统和CUP型号的KVM虚拟机的物理内存取证方法。0020本发明的KVM虚拟机的物理内存取证方法,其特征在于,通过以下步骤来实现A宿主机物理内存的获取,借助内存获取工具获取宿主机从0开始的全部物理内存信息;B在编译内核时产生的存放内核符号表的文件中,查找出内核符号INIT_TASK、结构体VMCSCONG的值,INIT_TASK的值为。

36、SWAPPER进程结构体的虚拟地址,VMCSCONG的值指向VMCSCONG结构体的虚拟地址,VMCSCONG结构体中定义了VMCS结构体的大小和版本号;C操作系统版本和位数的获取,获取宿主机的操作系统版本和操作系统位数;对于32位系统,在编译内核时产生的存放内核符号表的文件中,获取页目录指针SWAPPER_PG_DIR的值,SWAPPER_PG_DIR的值即为宿主机寄存器CR3的虚拟地址,减去0XC0000000即为宿主机寄存器CR3的物理地址;对于64位系统,则获取目录指针INIT_LEVEL4_PGT的值,INIT_LEVEL4_PGT为64位系统下宿主机寄存器CR3的值,减去0XFFF。

37、FFFFF80000000即为宿主机寄存器CR3的物理地址;结合VMCS_CONG结构体虚拟地址和宿主机寄存器CR3的值进行地址转换获取VMCS_CONG结构体的物理地址,从而获取到VMCS结构体大小和版本号信息;D虚拟机的VMCS版本号检测,VMCS结构体大小和版本号信息定义在VMCS_CONG结说明书CN104182269A4/14页9构体中,大小不大于4096个字节,从某一页的开始位置进行存储,前四个字节为与CPU类型有关的VMCS版本号;对于获取的宿主机物理内存,判断每页的前四个字节是否为VMCS版本号,如果判断结果为是,则表明该页可能是VMCS结构体,执行步骤E;如果判断结果为否,则。

38、表明该页不可能为VMCS结构体,执行步骤L),以进行下一个页的判断;EVMX退出原因指示器的检测,判断页从第四个字节开始的4个字节的值是否为零,如果为零,则表明该页可能是VMCS结构体,执行步骤F;如果不为零,则表明该页不可能是VMCS结构体,执行步骤L;F宿主机CR3寄存器的检测和获取,判断在该页偏移量为0X340处的8个字节是否为零,如果不为零,则这8个字节构成的64位数据可能为宿主机CR3寄存器的值,将其取出,记为HOST_CR3,执行步骤G;如果为零,则表明该页不可能是VMCS结构体,执行步骤L;G虚拟机CR3寄存器的检测和获取,判断在页偏移量为0X2E0处的8个字节是否为零,如果不为。

39、零,则这8个字节构成的64位数据可能为虚拟机CR3寄存器的值,将其取出,记为GUEST_CR3,执行步骤H;如果为零,则表明该页不可能是VMCS结构体,执行步骤L;H两个连续0XFFFFFFFF的判断,通过遍历整个结构体,判断是否存在两个连续的0XFFFFFFFF,如果存在,则表明该页可能是VMCS结构体,执行步骤I;如果不存在,则表明该页不可能是VMCS结构体,执行步骤L);I扩展页的检测和获取,判断在该页偏移量为0XE8位置处的8个字节是否为零,如果不为零,则表明偏移量0XE8位置处的8个字节可能为扩展页指针的数值,将其取出,记为EPTP,执行步骤J;如果为零,则表明该页不可能是VMCS结。

40、构体,执行步骤L;J判断HOST_CR3寄存器的正确性,内核符号INIT_TASK的值指向SWAPPER进程结构体,SWAPPER进程以一个TASK_STRUCK结构体的形式存在,进程名称“SWAPPER”存在于TASK_STRUCK结构体中与操作系统版本有关的偏移量处,设偏移量为;通过以下步骤来判断J1根据操作系统位数是64位操作系统小页模式、64位操作系统大页模式、32位操作系统开启PAE小页模式、32位操作系统开启PAE大页模式、32位操作系统不开启PAE小页模式还是32位操作系统不开启PAE大页模式,将SWAPPER进程结构体的虚拟地址INIT_TASK转化为物理地址,执行步骤J2;J。

41、2将INIT_TASK转化后的物理地址加上偏移量,判断所获取的进程名称是否为SWAPPER,如果为SWAPPER,则证明所获取的HOST_CR3为正确的宿主机CR3寄存器,执行步骤K;如果不为SWAPPER,则表明所获取的HOST_CR3不是宿主机CR3寄存器,判断出的VMCS结构体不正确,执行步骤L;K判断GUEST_CR3寄存器的正确性,借助EPT页结构,将步骤G中获取的GUEST_CR3寄存器的值转化为宿主机物理地址,判断转化后的宿主机物理地址是否为零,如果不为零,则表明获取的GUEST_CR3寄存器为正确的虚拟机CR3寄存器,该页中所检测出结构体为正确的VMCS结构体;如果为零,则表明。

42、GUEST_CR3寄存器不是正确的虚拟机CR3寄存器,所判断出的VMCS结构体不正确;执行步骤L;L判断是否检测完毕,判断所有页是否均已判断完毕,如果判断完毕则执行步骤M;如果没有判断完毕,则对下一页进行判断,跳转执行步骤D;M虚拟机物理内存的获取,对于给定的虚拟机物理地址和虚拟地址,首先将其转化为宿主机的物理地址,即可进行虚拟机内存信息的获取;N虚拟机物理内存的分析,通过对步骤M中获取的虚拟机内存信息的分析,即可对虚拟机的行为作出判断。0021本发明的KVM虚拟机的物理内存取证方法,步骤A中宿主机物理内存的获取方法为采用开源软件LIME加载内核模块获得LINUX和LINUX设备中的完整内存信。

43、息,以PADDED格式来获取从0开始的宿主机的全部内存信息;步骤B和步骤C中通过获取/说明书CN104182269A5/14页10PROC/KALLSYMS文件来获取内核符号表,并从中获取内核符号INIT_TASK、结构体VMCS_CONG、SWAPPER_PG_DIR或者INIT_LEVEL4_PGT的值;步骤C中操作系统版本和位数的获取方法为通过在宿主机终端执行“UNAMER”来获取。0022本发明的KVM虚拟机的物理内存取证方法,步骤J1中所述的宿主机的虚拟地址转化为物理地址的方法为待转化的宿主机虚拟地址的21至29位记为DIRECTORY、30至31位记为DIRECTORYPOINTE。

44、R、30至38位记为DIRECTORYPTR、39至47位记为PML4、48至63位记为SINGEXTENDED,小页模式下0至11位记为OFFSET、12至20位记为TABLE,大页模式下0至20位记为OFFSET;如果操作系统位数是64位操作系统小页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORYPTR乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIR。

45、ECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是64位操作系统大页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORYPTR乘以8之后的数值相加,。

46、获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至51位、低21位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统开启PAE小页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至44位、低5位均取为0,将其与DIRECTORYPOINTER乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,。

47、获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至35位、低12位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统开启PAE大页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的12位至44位、低5位均取为0,将其与DIRECTORYPOINTER乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTORY乘以8之后的数值相加,获取此地。

48、址在物理内存镜像对应的内容记为;取的21位至35位、低21位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;在32位操作系统不开启PAE模式下待转化的宿主机虚拟地址小页模式下的0至11位记为OFFSET、12至21位记为TABLE、22至31位记为DIRECTORY;大页模式下0至21位记为OFFSET、说明书CN104182269A106/14页1122至31位记为DIRECTORY;如果操作系统位数是32位操作系统不开启PAE小页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的0位至31位、低13位均取为0,将其与DIRECTORY乘以8。

49、后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与TABLE乘以8之后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至31位、低12位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值;如果操作系统位数是32位操作系统不开启PAE大页模式,则通过以下方法进行地址转换取HOST_CR3寄存器的0位至31位、低13位均取为0,将其与DIRECTORY乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的21位至30位、低22位均取为0,将其与OFFSET相加,得到的数据即为宿主机的虚拟地址转化为物理地址之后的数值。0023本发明的KVM虚拟机的物理内存取证方法,步骤M中所述的虚拟机的物理地址到宿主机的物理地址通过以下方法来实现待转化的虚拟机的物理地址的0至11位记为OFFSET、12至20位记为TABLE,21至29位记为DIRECTORY、30至38位记为DIRECTORYPTR、39至47位记为PML4、48至63位记为SINGEXTENDED;M1取扩展页表指针EPTP的12位至51位、低11位均取为0,将其与PML4乘以8后的数值相加,获取此地址在物理内存镜像对应的内容记为;取的12位至51位、低12位均取为0,将其与DIRECTO。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1