资源描述:
《直接内存搜索枚举内存的原理和实现.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、个人收集整理勿做商业用途直接内存搜索枚举内存的原理和实现在5.x的内核中,进程的EPROCESS往往存放于MmSystemRangeStart 至System所属PROCESS地址之间。 其中 MmSystemRangeStart 是一个内核导出的常量,在32位标准内存模式下,他的值为x80000000,而在PAE 模式的系统中,这个值为0xC0000000。对于System所属EPROCESS地址,可以通过驱动加载时 PsGetCurrentProcess()获取,因为驱动的加载任务是在 system进ﻩ中完成的。 在上述区间的具体取值确定下来后, 接着就是要确定是否某一块内存片断
2、是一个有效的PROCESS结构。 在此首先需要确定 EPROCESS在当前系统的表示。可以使用WinDbg 的如下命令获取: kd>dt _eprocess下面摘录winXP环境中EPROCESS 的定义片断1: t!_EPROCESS +0x000 Pcb :_KPROCESS +0x06c ProcessLock :_EX_PUSH_LOCK +0x070CreateTime :_LARGE_INTEGER +0x078ExitTime :_LARGE_INTEGER +0x080RundownProtect:_EX_RUNDOWN_REF +0x084UniqueProc
3、essId : Ptr32Void +0x088ActiveProcessLinks :_LIST_ENTRY +0x090QuotaUsage : [3]Uint4B+0x09cQuotaPeak:[3]Uint4B/…结构片断:EPROCESS的定义 这个结构在WinXP中的大小是 0x25C,可以从上面的代码片断中看出,许多信息,比如创建等都可以直接在这个结构体中获取。 为了验证一个 EPROCESS 是否合法,需要考虑下面几个字段的数据: 0x078ExitTime : _LARGE_INTEGER 0x1b0Peb :Ptr32_PEB 中,ExitTime记
4、录了该进程的退出时间。对于正在运行的进程,该项属性将永远为 0。peb指向进程环境块的指针,在所有EPROCESS中,该数据区的高16 位应该相同。 除了这2项判断依据外, 还可以根据包装EPROCESS的OBJECT_HEADER结构来作出判断。OBJECT_HEADER结构的定义如下: t!_OBJECT_HEADER+0x000PointerCount : Int4B +0x004HandleCount : Int4B个人收集整理勿做商业用途 +0x004NextToFree : Ptr32 Void+0x008 Type : Ptr32_OBJECT_TYPE +0x00cN
5、ameInfoOffset :UChar +0x00dHandleInfoOffset:UChar +0x00eQuotaInfoOffset :UChar +0x00fFlags :UChar +0x010ObjectCreateInfo: Ptr32_OBJECT_CREATE_INFORMATION +0x010QuotaBlockCharged:Ptr32Void +0x014SecurityDescriptor:Ptr32Void+0x018Body :_QUAD结构定义:OBJECT_HEADER 这个结构表示了一个内核对象,他出现于任何内核对象结构的头部
6、,也包括了EPROCESS头部。其中我们感兴趣的数据域是: +0x008Type : Ptr32 _OBJECT_TYPE 该指针指向了一个标示对象类别的结构体,所有EPROCESS结构外层的 OBJECT_HEADER结构中,这项属性值应该相同。 通过上述分析,通过搜索内存枚举进程的流程如下: 1)从MmSystemRangeStart至SYSTEM进程EPROCESS地址依次搜索 2)将当前地址赋值给一个EPROCESS对象,将其中相关的数据域加以验证 3) 如果是合法EPROCESS,则将其地址填入结果,同时控制搜索从当前位置+sizeof(EPROCESS)开始 4)
7、继续下一次循环 以上方法还需要做的处理是: z获取一个标准的PEB指针,作为对照 z获取一个标准的OBJECT_TYPE指针,作为对照 z 由于 MmSystemRangeStart 开始的内存并非连续的未分页内存,也就是说其地址空间并不是连续的,因而直接循环扫描将出现缺页错误,导致系统蓝屏崩溃。 由于目前system 的eprocess地址是已知的,很自然的想法便是通过system eprocess中的数据作为对照数据。其中,OBJECT_TY