我是靠谱客的博主 鲜艳西装,最近开发中收集的这篇文章主要介绍记一次WIN7 64位的内核对象类型分析(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

记一次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位 内核对象之 类型对象
每一个内核对象都有仅有一个属于自己的类型,操作系统将他们进行分类,把相同的类型存放在内存中的某一块区域,多种类型就存放多种区域,这些区域是以数组(或者理解成表)的形式存放内存中。
所以我们首先要得到这个数组在内存中的起始地址

  1. ①起始地址的获取
    通过内核函数ObGetObjectType:
    Windbg结果如下:
    在这里插入图片描述
    可以看到 nt!ObTypeIndexTable (fffff80005642100)这就是数组的起始地址 ②进入数组起始地址(fffff80005642100)
    在这里插入图片描述
    数组总有44项,而类型对象从第三个开始(fffffa80`05485210)
    每一个数组元素都是一个内存地址,在这个内存地址里面存放的是数据结构_OBJECT_TYPE用来解释类型对象的具体信息
    在这里插入图片描述

以(fffffa80`05485210 )地址为例:
在这里插入图片描述
可以看到+010位置就是这个类型对象的类型名称。

在举一例(用数组的第九个元素 fffffa80`054fd720)
在这里插入图片描述

最后

以上就是鲜艳西装为你收集整理的记一次WIN7 64位的内核对象类型分析(一)的全部内容,希望文章能够帮你解决记一次WIN7 64位的内核对象类型分析(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部