windows内核对象管理学习笔记

目前正在阅读毛老师的《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内核对象管理学习笔记,布布扣,bubuko.com

时间: 2024-10-05 23:58:51

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

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

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:[email protected] /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9178099 /************************

windows下scrapy框架学习笔记—'scrapy' 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令

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

Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码):另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便. 本文主要分为三部分:第一部分讲述namke工具使用makefile的用法:第二部分讲述makefile的主要语法:

C++内存管理学习笔记(6)

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:[email protected] /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9120635 /************************

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

C++内存管理学习笔记(5)

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:[email protected] /*  转载请注明本文出处: *   http://blog.csdn.net/wdzxl198/article/details/9112123 /************************

(转)WINDOWS内核对象

WINDOWS内核对象 原文地址:http://blog.csdn.net/misterliwei/article/details/976988  支持原创 一.前言 Windows中有很多像进程对象.线程对象.文件对象等等这样的对象,我们称之为Windows内核对象.内核对象是系统地址空间中的一个内存块,由系统创建并维护.内核对象为内核所拥有,而不为进程所拥有,所以不同进程可以访问同一个内核对象. 二.内核对象结构 每个对象都有对象头和对象体组成.所有类型的对象头结构都是相同的,而结构体部分却

124第六章——在图形化界面下对磁盘进行常规管理 学习笔记

MBR:主引导扇区,在驱动器最前端的一段引导扇区,大小为512B(字节),由三部分组成,第一部分为主引导程序(boot loader),大小为446B,第二部分为分区表(partition table区),大小为64B,第三部分为magic number,大小为2B,固定为55AA.因为在分区表上记录一个主分区需要使用16B,所以整个硬盘的主分区和扩展分区最多只能是4个,不过在扩展分区上可以创建逻辑分区.Windows的系统文件必选安装在主分区上. 应用程序→系统工具→磁盘实用工具 124第六章

白话windows内核对象共享之复制对象句柄

引子:话说老王的果园大丰收,老王心花怒放,带着全家去美国阿拉斯加度假.阿拉斯加有很多东西琳琅满目,都是中国没有的,老王及家人都过了一把购物瘾.但是有一次却遇到了比较尴尬的事.怎么回事呢?原来老王第一次出国,在买地摊上的东西时讨价还价100元,但是给人家的却是100元人民币,人家自然不干撒,你100元才多少美元呀,老王只好忍痛割爱给了600元人民币. 为什么会出现这样的尴尬呢?因为两个国家的货币换算不是一样的.中国的100元和美国的100元不是等价的,如何才能等价呢?必须根据当前汇率来换算.今天要