目前正在阅读毛老师的《windows内核情景分析》一书对象管理章节,作此笔记。

Win内核中是使用对象概念来描述管理内核中使用到的数据结构。此对象(Object)均是由对象头(Object Header)组成,实际上由于对象头概念的特殊结构,还有些可选成分。于是一个对象实际上是分为三部分。

OBJECT_HEADER对象头.

数据本体(比如文件对象File Object、Event等)

附加信息(比如Object Header Name Info等)

结构如下:

//摘录自 Reactos代码
// Object Header
//
typedef struct _OBJECT_HEADER
{
LONG PointerCount;
union
{
LONG HandleCount;
volatile PVOID NextToFree;
};
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
UCHAR Flags;
union
{
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
PVOID QuotaBlockCharged;
};
PSECURITY_DESCRIPTOR SecurityDescriptor;
QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;
使用windbg调试windows XP时候 得到结构如下。
lkd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0×000 PointerCount : Int4B
+0×004 HandleCount : Int4B
+0×004 NextToFree : Ptr32 Void
+0×008 Type : Ptr32 _OBJECT_TYPE
+0x00c NameInfoOffset : UChar
+0x00d HandleInfoOffset : UChar
+0x00e QuotaInfoOffset : UChar
+0x00f Flags : UChar
+0×010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : Ptr32 Void
+0×014 SecurityDescriptor : Ptr32 Void
+0×018 Body : _QUAD

看上去应该差不多,REACTOS对于对象头的描述基本与windows一致.其中Body便是对象本体,由于本体结构的多样性,长度是未确定的。所以《windows内核情景分析》中提到,”OBJECT_HEADER_NAME_INFO等放在OBJECT_HEADER下面,用8位字节表示位移量。” 结构如图:

在XP系统下使用WINDBG调试验证时候,略有一些不同的小发现. XP系统中开启windbg。开启菜单File->Kernel Dbug.选择Local本地调试。 使用!handle 可出windbg可获取的句柄列表,我们从句柄转移到对象头结构分析。

句柄很多,我们选择一个TYPE为FILE的句柄,方便下文分析。

000c: Object: 81c53b70 GrantedAccess: 00100020 (Inherit) Entry: e10d7018
Object: 81c53b70 Type: (81feb040) File
ObjectHeader: 81c53b58 (old version)
HandleCount: 1 PointerCount: 1
Directory Object: 00000000 Name: \Program Files\Debugging Tools for Windows (x86) {HarddiskVolume1}
ld> dt _OBJECT_HEADER 81c53b58
nt!_OBJECT_HEADER
+0×000 PointerCount : 1
+0×004 HandleCount : 1
+0×004 NextToFree : 0×00000001
+0×008 Type : 0x81feb040 _OBJECT_TYPE
+0x00c NameInfoOffset : 0 ”
+0x00d HandleInfoOffset : 0×8 ”
+0x00e QuotaInfoOffset : 0 ”
+0x00f Flags : 0×40 ‘@’
+0×010 ObjectCreateInfo : 0x81e900e8 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : 0x81e900e8
+0×014 SecurityDescriptor : (null)
+0×018 Body : _QUAD

结构中得+0×018 Body : _QUAD就是对象主体,我们已知该对象时文件对象,于是在windbg中以文件对象FileObject解析该地址

lkd> dt _FILE_OBJECT 81c53b58+0×18
ntdll!_FILE_OBJECT
+0×000 Type : 5
+0×002 Size : 112
+0×004 DeviceObject : 0x81b2c900 _DEVICE_OBJECT
+0×008 Vpb : 0x81fe67c8 _VPB
+0x00c FsContext : 0xe1201510
+0×010 FsContext2 : 0xe12016a8
+0×014 SectionObjectPointer : (null)
+0×018 PrivateCacheMap : (null)
+0x01c FinalStatus : 0
+0×020 RelatedFileObject : (null)
+0×024 LockOperation : 0 ”
+0×025 DeletePending : 0 ”
+0×026 ReadAccess : 0×1 ”
+0×027 WriteAccess : 0 ”
+0×028 DeleteAccess : 0 ”
+0×029 SharedRead : 0×1 ”
+0x02a SharedWrite : 0×1 ”
+0x02b SharedDelete : 0 ”
+0x02c Flags : 0×40002
+0×030 FileName : _UNICODE_STRING “\Program Files\Debugging Tools for Windows (x86)”
+0×038 CurrentByteOffset : _LARGE_INTEGER 0×0
+0×040 Waiters : 0
+0×044 Busy : 0
+0×048 LastLock : (null)
+0x04c Lock : _KEVENT
+0x05c Event : _KEVENT
+0x06c CompletionContext : (null)

那么我们查找下那些附加信息。在对象头结构中我们可以看到

+0x00d HandleInfoOffset : 0×8 ”

说明_object_handle_information这个结构是存在的,且相对对象头的偏移是0×8。那么这个结构是在对象头之前还是对象头之后呢? 我们来尝试下。

lkd> dt _object_handle_information 81c53b58-0×8 ntdll!_OBJECT_HANDLE_INFORMATION +0×000 HandleAttributes : 0x81f33908 +0×004 GrantedAccess : 1

lkd> dt _object_handle_information 81c53b58+0×8+0×18 错误 ntdll!_OBJECT_HANDLE_INFORMATION +0×000 HandleAttributes : 0x81fe67c8 +0×004 GrantedAccess : 0xe1201510

lkd> dt _object_handle_information 81c53b58+0×8 错误 ntdll!_OBJECT_HANDLE_INFORMATION +0×000 HandleAttributes : 0x81feb040 +0×004 GrantedAccess : 0×40000800

很明显,附加信息是在对象头之前,在XP系统中实际调试与毛老师对REACTOS的分析略有不同,应该两个系统的实现还是存在些许差别。

本文总结了对象头,对象本体,附加信息的实际分布,并且从句柄获取句柄对应的对象的各种信息的调试方法。

windows内核对象管理学习笔记的更多相关文章

  1. ucore lab4 内核线程管理 学习笔记

    越学越简单,真是越学越简单啊 看视频的时候着实被那复杂的函数调用图吓到了.看代码的时候发现条理还是很清晰的,远没有没想象的那么复杂. 这节创建了俩内核线程,然后运行第一个线程,再由第一个切换到第二个. ...

  2. ERROR: Symbol file could not be found 寒江孤钓<<windows 内核安全编程>> 学习笔记

    手动下载了Symbols,设置好了Symbols File Path,串口连接上了以后,出现ERROR: Symbol file could not be found, 并且会一直不停的出现windb ...

  3. 发生系统错误 1275.此驱动程序被阻止加载 寒江孤钓<<windows 内核安全编程>> 学习笔记

    安装书中第一章成功安装first服务之后,在cmd窗口使用命令行 "net start first" 时, 出现 "发生系统错误 1275.此驱动程序被阻止加载" ...

  4. 无法编译出.sys文件 寒江孤钓<<windows 内核安全编程>> 学习笔记

    系统环境:win7 编译环境:Windows Win7 IA-64 Checked Build Environment 按照书中所说的步骤,出现如下问题 后来直接使用光盘源码,编译成功,于是对照源文件 ...

  5. Debuggee not connected 寒江孤钓<<windows 内核安全编程>> 学习笔记

    双机联调出现的问题 真机系统win7 虚拟机系统xp 安装书中的配置一步一步走,发现最后启动系统后,windbg一直显示 Opened \\.\pipe\com_1Waiting to reconne ...

  6. 指定的服务已标记为删除 寒江孤钓<<windows 内核安全编程>> 学习笔记

    运行cmd:"sc delete first" 删除我们的服务之后, 再次创建这个服务的时候出现 "指定的服务已标记为删除"的错误, 原因是我们删除服务之前没有 ...

  7. 删除自定义服务 寒江孤钓<<windows 内核安全编程>> 学习笔记

    书中第一章 成功启动first服务之后, 发现书中并没有介绍删除服务的方式, SRVINSTW工具中的移除服务功能,也无法找到我们要删除的服务, 于是,搜素了下,发现解决方法如下: 在cmd中输入 & ...

  8. C++内存管理学习笔记(7)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  9. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

随机推荐

  1. 黄聪:详解申请微信h5支付方法,开通微信h5网页支付接口(转)

    版权声明:图文并茂的微信小程序教程!欢迎转载,请保留作者名字和链接:商业合作请联系子恒老师助理 QQ : 2334512685 https://blog.csdn.net/towtotow/artic ...

  2. googletest--Death Test和Exception Test

    Death Test验证某个状态会使进程以某个错误码和错误消息离开 #include <gtest\gtest.h> #include "MyStack.h" // D ...

  3. windows下apache httpd2.4.26集群完整搭建例子:下载、启动、tomcat集群例子

    第一部分——下载 1.1: 百度搜索apache httpd关键字,第一个链接既是官方下载地址.如果这一步不会,此篇文章不适合你阅读,请自行停止. 1.2:进入官网http://httpd.apach ...

  4. python读取指定字节长度的文本

    软件版本 Python 2.7.13;   Win 10 场景描述 1.使用python读取指定长度的文本: 2.使用python读取某一范围内的文本. Python代码 test.txt文本内包含的 ...

  5. 并发之lock的condition接口

    13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...

  6. Linux背背背(4)vim操作

    目录 1.打开文件 2.vim的三种模式 3.扩展 (关于vi 和 vim 的区别,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.) 1 ...

  7. 性能测试day06_需求设计的学习(性能重中之重,思维方向永远重于工具)

    今天接着来学习下性能知识,本来是应该先学习一下LR的用法的,不过听完云层大大的课之后,我感觉工具没有这一篇来的重要,我们知道性能有三大步骤:负载->监控->调优,但是在这个之前我们首先要搞 ...

  8. zabbix4.0下zabbix-agentd安装

    转:http://www.safecdn.cn/monitor/2018/12/zabbix4-0-zabbix-agentd-install/316.html 一 安装源和Zabbix的依赖包: 1 ...

  9. python大法好——递归、内置函数、函数进阶

    1.递归(自己干自己) def fun(n): n=n/2 print(n) if(n>2) fun(n) #函数调用 fun(10) 结果是5 2 1 0 递归的执行过程:递归执行到最里面一层 ...

  10. 剑指offer例题——用两个栈实现队列

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 首先是概念理解,栈和对列存取的区别 栈(stack)是一种后进先出(last in first out, LI ...