首页> 中国专利> 基于KPCR结构的Windows系统物理内存分析方法

基于KPCR结构的Windows系统物理内存分析方法

摘要

本发明公开了一种Windows系统物理内存的分析方法。本发明基于KPCR结构体和CR3寄存器内容,在内存镜像文件文件中搜索KPCR结构体,以该结构体为基础查找到CR3寄存器内容,以CR3寄存器内容确定内存页模式,然后转换内存虚拟地址为物理地址;根据内存镜像文件中的系统版本信息确定所获得KPCR和CR3的正确性,若正确,即可相应得到内核信息中的进程信息和驱动信息。本发明提供了一种能够准确地实现虚拟地址到物理内存地址转换,且能够准确查找系统进程、系统模块信息的Windows系统物理内存分析方法。

著录项

  • 公开/公告号CN101414304A

    专利类型发明专利

  • 公开/公告日2009-04-22

    原文格式PDF

  • 申请/专利权人 山东省计算中心;

    申请/专利号CN200810159260.8

  • 发明设计人 王连海;张淑慧;

    申请日2008-11-27

  • 分类号G06F17/30;G06F21/00;

  • 代理机构济南泉城专利商标事务所;

  • 代理人李桂存

  • 地址 250014 山东省济南市历下区科院路19号

  • 入库时间 2023-12-17 21:49:12

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-01-07

    未缴年费专利权终止 IPC(主分类):G06F17/30 授权公告日:20101215 终止日期:20131127 申请日:20081127

    专利权的终止

  • 2010-12-15

    授权

    授权

  • 2009-06-17

    实质审查的生效

    实质审查的生效

  • 2009-04-22

    公开

    公开

说明书

(一)技术领域

本发明涉及一种Windows系统物理内存的分析方法,其通过对Windows系统物理内存的分析以找到Windows运行过的线程、系统模块和进程等信息,从而获得信息安全事件和各类计算机犯罪案件的证据。KPCR指控制器处理区。

(二)背景技术

2005年之前,对物理内存镜像文件的分析,基本上只是停留在字符串查找上。为推进物理内存分析技术的发展,DFRWS(Digital ForensicResearch Workshop)于2005年推出了名为“Forensics Challenge”的活动,活动的主题就是物理内存分析。从此,对于物理内存的分析和获取成为计算机取证的研究热点。

Andreas Schuster于2006年在DFRWS年会中提出了Windows内存镜像文件中进程和线程的查找方法,并使用Perl语言开发了PTfinder.pl,该工具可以找到Windows内存文件的线程和进程,不过其开发所针对的Windows版本仅限于Microsoft Windows2000,适用范围受到很大限制。

Mariusz Burdach通过对linux内存的研究,开发了分析windows内存的工具WMFT(Windows Memory Forensic Toolkit),该工具可以列出所有的Windows进程信息。Mariusz Burdach所使用的内存分析方法主要是通过字符串查找来实现的,现将其方法具体描述如下:

通过查找“smss.exe”、“csrss.exe”字符串来查找eproccess结构的进程块。字符串“smss.exe”对应的是eprocess结构成员ImageFileName,ImageFileName在eprocess结构的偏移地址是0x154。ActiveProcessLinks是_LIST_ENTRY结构,在eprocess结构体重偏移位置为0x88,_LIST_ENTRY的结构是:

+0x000Flink:Ptr32_LIST_ENTRY

+0x004Blink:Ptr32_LIST_ENTRY

字符串“smss.exe”所在的物理地址减去0x154就是smss进程的起始物理地址,这个起始物理地址加上0x88就是ActiveProcessLinks的物理地址。ActiveProcessLinks中flink的内容指向csrss进程的ActiveProcessLinks地址。同样,字符串csrss.exe所在的物理地址-0 x 154+0 x 88为csrss进程ActiveProcessLinks的物理地址,两者之差为内核内存空间虚拟地址与物理地址的偏移量(Rva),即Rva等于smss的ActiveProcessLinks结构中flink的指针地址,减去0 x 800000,再减去csrss进程ActiveProcessLinks的物理地址。说明书附图1示出了Eprocess结构的进程间的连接关系,图中,1为smss进程,2为csrss进程。

smss进程的ActiveProcessLinks结构blink指向系统进程的ActiveProcessLinks地址,该地址-o x 80000000-Rva-0 X 88为系统进程的物理内存起始地址。同样上述过程,可以得到每个进程在物理内存的起始地址,进而可以得到每个进程的详细信息。

上述字符串查找的办法,在实际的物理内存分析办法中存在着一定的问题,主要表现在以下几个方面:

1)在不同的操作系统版本中,使用“smss.exe”和“crcss.exe”查找定位存在一定的不确定性,在实际的编程实现查找过程存在编程繁琐的问题:

在不同的操作系统版本中,eprocess结构是有差异的:ImageFileName的偏移不一定就是0x154,在Windows Xp SP2系统中,它的偏移是0 x 174,在Windows 2003sp2下它的偏移是0 x 164。在偏移地址不能确定的情况下,由于在内存文件中存在多个字符串“smss.exe”和“crcss.exe”,编程实现这种方法比较繁琐。

2)虚拟地址到物理地址的转换问题:

上述的方法只对Windows系统的空间管理使用是大页模式的情况下适用。事实上,在实际的Windows系统的内存管理中,大页模式和小页模式是混合使用的。在这种情况下,利用这种方法就会出现问题。

3)系统内核基地址和PsLoadedModuleList地址的查找办法也不是很实用:

例如在操作系统Windows Xp sp2中,大约在查到第4个”ntos“字符串时,才是所需要的地址。而查到这个的地址,验证这个地址是否正确也比较困难。

基于上述原因,导致了使用WMFT工具前,需要手工配置系统的rva、offset、initproc,使得WMFT工具的使用存在很大的局限性。。

(三)发明内容

因此,基于上述原因,本发明意在提供一种能够准确地实现虚拟地址到物理内存地址转换,且能够准确查找系统进程、系统模块信息的Windows系统物理内存分析方法。

本发明采用以下技术方案:

其包括以下步骤:

1)在Windows内存镜像文件中按照KPCR结构体的结构特征搜索KPCR结构体;

2)根据所获得KPCR结构体确定KPCR的物理地址和用于定位系统版本信息的KdVersionBlock指针地址;

3)根据所述KPCR物理地址查找CR3寄存器中的内容,确定其指向的物理地址;

4)依据上述CR3寄存器物理地址第一字节内容判断内存页模式;

5)根据所得内存页模式按照Intel处理器地址转换方式获取内存分页虚拟地址所对应的物理地址和所述KdVersionBlock指针的物理地址;

6)依据所述KdVersionBlock指针物理地址查找内存镜像位置在此地址处的系统版本信息的系统子版本号;

7)验证上述系统子版本号与微软所发布的系统子版本号是否一致,若一致则所获得的KPCR结构体和CR3寄存器的地址正确,根据KdVersionBlock后的内核变量获取系统驱动信息和进程信息;若错误,且KdVersionBlock指针未到文件尾,文件指针后移0x100后在Windows内存镜像文件中继续搜索KPCR结构体。

所述搜索KPCR结构体的方法优选通过在内存镜像文件中寻找两个大于0 x 80000000的邻近值,且这两个值满足相差0 x 120,此地址减去0 x 1c即为KPCR地址。

上述的基于KPCR结构的Windows系统物理内存分析方法,所述获取CR3寄存器内容的方法为优选取KPCR地址加上0 x 410所得地址指向的内容。

本发明相对于现有分析系统物理内存的方法依赖于单一操作系统的缺陷,开辟新途径。由于需要支持多个CPU,Windows内核中为此定义了一套以处理器控制区KPCR为枢纽的数据结构,使每个CPU都对应一个KPCR结构,用于保存与线程切换有关的全局信息,KPCR在线性空间中的位置不会随Windows版本变动而改变。本发明基于KPCR结构对系统物理内存进行分析,不受Windows操作系统版本的影响,适用范围广。且由于在具体的操作系统中,KPCR是一个固定的值,从而可以准确的验证某一字符串的值,使本方法的可靠性比较高;在内存镜像文件中查找KPCR结构体比较容易,通过编程也比较容易实现,工作效率相对也比较高。现在系统物理内存分析方法由于需要在传统的用户态下获得信息安全事件和各类计算机犯罪案件的证据,容易受木马或者恶意程序攻击或干扰的缺陷,相对地,本发明只需要打开某一内存的镜像文件,即可获取系统进程信息以及驱动信息,不容易受到病毒或者恶意程序攻击和干扰。

由于不同的操作系统对应的内存分页方式不一样,通常是大小页混用的,现有的物理内存分析方法不能准确的区分大小页,更无法准确的确定各页的物理地址,从而,无法完成虚拟地址到物理地址的转换。而本发明借助于CR3寄存器来确定所搜索内存分页的模式,由于CR3寄存器地址的首字节可以用来区分内存页的模式,因此,本发明可以准确查找系统进程、系统模块信息。

(四)附图说明

下面结合说明书附图来具体说明一下本发明的原理,以使本领域的技术人员更好的理解本发明,其中:

图1为_Eprocess结构的进程间的连接关系具体实施方式。

图2为本发明实施例的流程图。

图3为Intel处理器页大小4KB的地址转换方式示意图。

图4为Intel处理器页大小4MB的地址转换方式示意图。

图5为PAE机制下,页大小为4KB的地址转换方式示意图。

图6为PAE机制下,页大小为2MB的地址转换方式示意图。

图7为PSE-36机制下的地址转换示意图。

PAE为Physical Address Extension的缩写,指物理内存扩展;PSE为Page Size Extension的缩写,指页面尺寸扩展。

图中:1为smss的_Eprocess结构,2为csrss的_Eprocess结构。

(五)具体实时方式

以下为本发明结合说明书附图的具体实施方式,对本发明技术方案的示例性描述,其技术特征的所有等同替代方式和明显变形方式均属于本发明的保护范围。

首先,KPCR结构不会随着Windows版本的变动而改变,其结构如下:

nt!_KPCR

+0 x 000 NtTib                                 :_NT_TIB

+0 x 01c SelfPcr                               :Ptr32_KPCR

+0 x 020 Prcb                                  :Ptr32_KPRCB

+0 x 024 Irq1                                  :UChar

+0 x 028 IRR                                   :Uint4B

+0 x 02c IrrActive                             :Uint4B

+0 x 030 IDR                                   :Uint4B

+0 x 034 KdVersionBlock                        :Ptr32Void

+0 x 038 IDT                                   :Ptr32_KIDTENTRY

+0 x 03c GDT                                   :Ptr32_KGDTENTRY

+0 x 040 TSS                                   :Ptr32_KTSS

+0 x 044 MajorVersion                          :Uint2B

+0 x 046 MinorVersion                          :Uint2B

+0 x 048 SetMember                             :Uint4B

+0 x 04c StallScaleFactor                       :Uint4B

+0 x 050 DebugActive                           :UChar

+0 x 051 Number                                :UChar

+0 x 052 Spare0                                :UChar

+0 x 053 SecondLevelCacheAssociativity         :UChar

+0 x 054 VdmAlert                              :Uint4B

+0 x 058 KernelReserved                        :[14]Uint4B

+0 x 090 SecondLevelCacheSize                  :Uint4B

+0 x 094 HalReserved                           :[16]Uint4B

+0 x 0d4 InterruptMode                         :Uint4B

+0 x 0d8 Spare1                                :UChar

+0 x 0dc KernelReserved2                       :[17]Uint4B

+0 x 120 PrcbData                              :_KPRCB

从KPCR结构体中可以看到,在0 x 1c处为指向自身的指针,0 x 20处为指向KPRCB的指针,这两个指针的差值为0 x 120,可以根据此特征来寻找KPCR。因此,参照说明书附图2,本实施例采用具有以下步骤的方案:

步骤S100,搜索KPCR结构体:在内存镜像文件中根据KPCR结构体的上述特征进行搜索,由于其地址特征是准确的,以此为基础进行搜索快捷、准确。搜索KPCR结构体的目的是获取KPCR结构体,从而

步骤S120,从KPCR结构体中获取_DBGKD_GET-VERSION64结构体的虚拟地址,以对操作系统版本信息进行验证;

步骤S110,获取KPCRB结构体,从上面对KPCR结构体的描述可知,KPCRB在本方法中的重要性,也可以反推得知,内存镜像文件中寻找两个大于0 x 80000000的邻近值,且满足这两个值差为0 x 120的条件,此地址减去0 x 1c为KPCR的值,因此,

步骤S111进一步的在_KPCRB结构体中查找_KPROCESSOR_STATE结构,该结构体中0 x 2cc处为SpecialRegister成员,在SpecialRegister偏移地址为0 x 08处为CR3寄存器。通过分析该处保存的总是系统进程的页目录信息,当禁用物理地址拓展,保存的就是系统进程页目录的基地址。综上分析,KPCR的物理地址加上0 x 410后所得的地址指向的内容即为CR3寄存器中的内容。因此,就此可进行

步骤S200,获取CR3寄存器内容:在内存中存储的地址一般都是虚拟地址,而物理内存中地址定位的是物理地址,因此计算虚拟地址(线形地址)到物理地址的映射关系是内存分析的关键。如图3至7可知,现有Intel内存虚拟地址到物理地址的转换方式需要明确知道内存页面的页面模式,才能按照其方式进行转换,而CR3寄存器物理地址的第一个字节存储了页面模式信息的标志位,其中,该字节信息若是0 x 01,则表明页面使用的是PAE模式,从而可以完全按照Intel处理器地址转换方式获取内存分页虚拟地址所对应的物理地址和所述KdVersionBlock指针的物理地址,即图3至7,或图2中所述流程中S220-S202、S210-S202的内容。

从而,依据上述方式,步骤S102获取_DBGKD_GET-VERSION64结构的物理地址,KdVersionBlock的结构体如下:

1kd>dt_DBGKD_GET_VERSION64

nt!_DBGKD_GET_VERSION64

+0 x 000 MajorVersion           :Uint2B

+0 x 002 MinorVersion           :Uint2B

+0 x 004 ProtocolVersion        :Uint2B

+0 x 006 Flags                           :Uint2B

+0 x 008 MachineType                     :Uint2B

+0 x 00a MaxPacketType                   :UChar

+0 x 00b MaxStateChange                  :UChar

+0 x 00c MaxManipulate                   :UChar

+0 x 00d Simulation                      :UChar

+0 x 00e Unused                          :[1]Uint2B

+0 x 010 KernBase                        :Uint8B

+0 x 018 PsLoadedModuleList              :Uint8B

+0 x 020 DebuggerDataList                :Uint8B

依据该结构体,通过步骤S103获取系统版本信息,将KdVersionBlock的指针地址按照上述方法转换为物理地址,定位到镜像位置此地址处即可获取系统版本信息。然后

根据总结,发行的Windows Vista的子版本号为6000或者6001,Windows Xp的子版本号为2600,Windows 2003的子版本号为3790,Windows 2000的小版本号为2195。如果上述方法获取的子版本号为上述小版本号之一,说明求得的为正确的KPCR和CR3。所以

步骤S104,判断版本是否合理,用来验证所获的物理地址是否正确,若正确,则表明获得了正确的KPCR和CR3,从而

执行步骤S105’,获取内核变量,在内核变量中查找进程信息和系统驱动信息:得dVersionBlock在_DBGKD_GET_VERSION64之后,对应的内核变量分别是:

ULONG64 KernBase;

ULONG64 BreakpointWithStatus;

ULONG64 SavedContext;

USHORT ThCallbackStack;

USHORT NextCallback;

USHORT FramePointer;

USHORT PaeEnabled:1;

ULONG64 KiCallUserMode;

ULONG64 KeUserCallbackDispatcher;

ULONG64 PsLoadedModuleList;

ULONG64 PsActiveProcessHead;

...\

这些内核变量在内存分析中将起到非常重要的作用,根据psLoadedModuleList可以找到所有加载的驱动程序,根据变量PsActiveProcessHead可以找到所有的活动进程。

对于系统版本信息的验证,如果和所得系统版本信息与微软发布的系统响应版本信息不一致,则表明版本信息不合理。为了进一步的搜索KPCR结构体,需要首先确定系统内存镜像文件是否搜索完毕,因此执行步骤S106,即判断文件指针是否指像文件结尾,若已到文件尾,退出本查找;如果没有到文件尾,则执行

步骤S107,将文件指针后移0 x 100位继续按照KPCR结构特征进行检索,即执行步骤S100,进行下一搜索循环。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号