概述
记一次WIN7 64位的内核对象类型分析(一)
一.前言
windows内核对象:比如进程对象,线程对象。文件对象,驱动对象
内核对象是系统地址空间中的一个内存块,由系统创建并维护,内存对象是一个数据结构存放的,维护着与对象相关的信息(如计数器)。内核对象为内核所拥有,而不为进程所拥有,所以不同进程可以访问同一个内核对象
每一种内核对象的结构都分为对象头和对象实体(不同的内核对象拥有相同的对象头结构只是对象体结构不同)。
example:
图中灰色部分是可能出现的。
每个对象中是否存在这些部分主要由OBJECT_HEADER结构中的相关标志来指定。
lkd> dt _object_header
nt!_OBJECT_HEADER
+0x000 PointerCount : Int8B
+0x008 HandleCount : Int8B
+0x008 NextToFree : Ptr64 Void
+0x010 Lock : _EX_PUSH_LOCK
+0x018 TypeIndex : UChar
+0x019 TraceFlags : UChar
+0x01a InfoMask : UChar
+0x01b Flags : UChar
+0x020 ObjectCreateInfo : Ptr64 _OBJECT_CREATE_INFORMATION
+0x020 QuotaBlockCharged : Ptr64 Void
+0x028 SecurityDescriptor : Ptr64 Void
+0x030 Body : _QUAD
上面的5个结构的格式是固定的;而OBJECT结构体部分却是各个对象各不同的。需要注意的是:指向对象的指针POBJECT是指向对象体部分,而不是指向对象头的。所以,若需要访问OBJECT_HEADER,需要将POBJCECT减去0x28而获得。
二 . win7 64位 内核对象之 类型对象
每一个内核对象都有仅有一个属于自己的类型,操作系统将他们进行分类,把相同的类型存放在内存中的某一块区域,多种类型就存放多种区域,这些区域是以数组(或者理解成表)的形式存放内存中。
所以我们首先要得到这个数组在内存中的起始地址
- ①起始地址的获取
通过内核函数ObGetObjectType:
Windbg结果如下:
可以看到 nt!ObTypeIndexTable (fffff80005642100)这就是数组的起始地址 ②进入数组起始地址(fffff800
05642100)
数组总有44项,而类型对象从第三个开始(fffffa80`05485210)
每一个数组元素都是一个内存地址,在这个内存地址里面存放的是数据结构_OBJECT_TYPE用来解释类型对象的具体信息
以(fffffa80`05485210 )地址为例:
可以看到+010位置就是这个类型对象的类型名称。
在举一例(用数组的第九个元素 fffffa80`054fd720)
最后
以上就是鲜艳西装为你收集整理的记一次WIN7 64位的内核对象类型分析(一)的全部内容,希望文章能够帮你解决记一次WIN7 64位的内核对象类型分析(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复