直接内存搜索枚举内存的原理和实现.doc_第1页
直接内存搜索枚举内存的原理和实现.doc_第2页
直接内存搜索枚举内存的原理和实现.doc_第3页
直接内存搜索枚举内存的原理和实现.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

直接内存搜索枚举内存的原理和实现 在 5.x 的内核中,进程的 EPROCESS 往往存放于 MmSystemRangeStart 至 System 所属PROCESS 地址之间。其中 MmSystemRangeStart 是一个内核导出的常量,在 32 位标准内存模式下,他的值为x80000000,而在 PAE 模式的系统中,这个值为 0xC0000000。对于 System 所属 EPROCESS地址,可以通过驱动加载时 PsGetCurrentProcess()获取,因为驱动的加载任务是在 system 进中完成的。在上述区间的具体取值确定下来后, 接着就是要确定是否某一块内存片断是一个有效的PROCESS 结构。在此首先需要确定 EPROCESS 在当前系统的表示。可以使用 WinDbg 的如下命令获取:kddt _eprocess 下面摘录 winXP环境中 EPROCESS 的定义片断1:t!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER +0x078 ExitTime : _LARGE_INTEGER +0x080 RundownProtect : _EX_RUNDOWN_REF +0x084 UniqueProcessId : Ptr32 Void +0x088 ActiveProcessLinks : _LIST_ENTRY +0x090 QuotaUsage : 3 Uint4B +0x09c QuotaPeak : 3 Uint4B / 结构片断:EPROCESS的定义这个结构在 WinXP中的大小是 0x25C,可以从上面的代码片断中看出,许多信息,比如创建等都可以直接在这个结构体中获取。为了验证一个 EPROCESS 是否合法,需要考虑下面几个字段的数据:0x078 ExitTime : _LARGE_INTEGER 0x1b0 Peb : Ptr32 _PEB 中,ExitTime 记录了该进程的退出时间。对于正在运行的进程,该项属性将永远为 0。peb 指向进程环境块的指针,在所有 EPROCESS 中,该数据区的高 16 位应该相同。除了这2项判断依据外, 还可以根据包装EPROCESS的OBJECT_HEADER结构来作出判断。OBJECT_HEADER 结构的定义如下:t!_OBJECT_HEADER+0x000 PointerCount : Int4B +0x004 HandleCount : Int4B +0x004 NextToFree : Ptr32 Void +0x008 Type : Ptr32 _OBJECT_TYPE +0x00c NameInfoOffset : UChar +0x00d HandleInfoOffset : UChar +0x00e QuotaInfoOffset : UChar +0x00f Flags : UChar +0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION +0x010 QuotaBlockCharged : Ptr32 Void +0x014 SecurityDescriptor : Ptr32 Void +0x018 Body : _QUAD 结构定义:OBJECT_HEADER 这个结构表示了一个内核对象, 他出现于任何内核对象结构的头部, 也包括了 EPROCESS头部。其中我们感兴趣的数据域是:+0x008 Type : Ptr32 _OBJECT_TYPE 该指针指向了一个标示对象类别的结构体,所有 EPROCESS 结构外层的 OBJECT_HEADER结构中,这项属性值应该相同。 通过上述分析,通过搜索内存枚举进程的流程如下:1) 从 MmSystemRangeStart至 SYSTEM 进程 EPROCESS 地址依次搜索2) 将当前地址赋值给一个 EPROCESS 对象,将其中相关的数据域加以验证3) 如果是合法 EPROCESS,则将其地址填入结果,同时控制搜索从当前位置+sizeof(EPROCESS)开始4) 继续下一次循环 以上方法还需要做的处理是:z 获取一个标准的 PEB 指针,作为对照z 获取一个标准的 OBJECT_TYPE指针,作为对照z 由于 MmSystemRangeStart 开始的内存并非连续的未分页内存,也就是说其地址空间并不是连续的,因而直接循环扫描将出现缺页错误,导致系统蓝屏崩溃。 由于目前 system 的 eprocess地址是已知的,很自然的想法便是通过 systemeprocess中的数据作为对照数据。其中,OBJECT_TYPE指针的确可以如此获取,然后对于 PEB 指针,在systemeprocess中却为空值。 解决办法是通过 eprocess中的 ActiveProcessLinks 数据域得到由 system eprocess指向的第一个 eprocess地址,然后获取其中的 PEB 数据。 对于第三个问题,解决办法是通过查找页表方式,尝试对当前虚拟地址查找其对应的PGDE和 PTE 表,如果找到,则表示该内存地址有效。如果无效,则跳过一定的长度搜索。 对于标准的内存模式,PGDE和 PTE 如下图所示: 图中的 PageDirectory 表存放于虚拟地址 0xc0300000 处,而每个 PageTable 紧跟于 PageDirectory 表后存储。因而可以通过上述布局查找页表。 然而对于 PAE模式,页表的表示方式以及存储方位均不同于标准模式,因而需要用其他方法获取,具体见下一节。 在解决上述问题后, 进程枚举便可以工作了, 但通过该算法仅能获得除了SYSTEM和IDLE外的进程,对于 PID 为 0和 4(win2000 中为 8)的这 2 个核心进程,需要用其他方法获取。 对于 SYSTEM 进程,上文给出获取方法,而 IdleProcess进程需要用下面给出的办法:获取 Idle Process 的 EPROCESS地址在5.x内核虚拟地址0xFFDFF000位置存放的称为ProcessorControlRegion(KPCR)的结构,通过 WinDbg获取他的结构描述为: nt!_KPCR +0x000 NtTib : _NT_TIB +0x01c SelfPcr : Ptr32 _KPCR +0x020 Prcb : Ptr32 _KPRCB +0x024 Irql : UChar +0x028 IRR : Uint4B +0x02c IrrActive : Uint4B +0x030 IDR : Uint4B 结构片段:KPCR 其中,Prcb 指向的 KPRCB结构片段如下:nt!_KPRCB +0x000 MinorVersion : Uint2B +0x002 MajorVersion : Uint2B +0x004 CurrentThread : Ptr32 _KTHREAD +0x008 NextThread : Ptr32 _KTHREAD +0x00c IdleThread : Ptr32 _KTHREAD +0x010 Number : Char +0x011 Reserved : Char 结构片段:KPRCB 其中的 CurrentThread 指向了 Idle Process 线程的地址。分析 KTHREAD 结构,如下数据域是我们感兴趣的:+0x034 ApcState : _KAPC_STATE 他指向了 KAPC_STATE结构,分析该结构,发现其中有如下数据域:+0x010 Process : Ptr32 _KPROCESS 这是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论