您的位置:首页 > 其它

Microsoft windows internals 学习笔记(4)

2008-04-30 12:30 337 查看
对象管理器:

windows内部有两种类型的对象:执行体对象和内核对象。执行体对象是指由执行体的各种组件所实现的对象。内核对象是指由windows内核实现的一组更为基本的对象,对用户模式代码不可见。执行体对象包含了一个或多个内核对象。

对象的结构:每个对象都有一个对象头和对象体。对象管理器控制了对象头,而执行体组件控制了由他们创建的对象类型的对象体。每个对象头指向一个进程列表,列表每个进程都打开了此对象。每个对象头也指向了一个被称为类型对象的(type object)特殊对象,该对象包含的信息对于每个实例都是公共的。

实验:查看对象头和类型对象

lkd> !process 0 0 //找到进程对象
**** NT ACTIVE PROCESS DUMP ****
PROCESS 89d53830 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
DirBase: 0a400020 ObjectTable: e1002e40 HandleCount: 1571.
Image: System

PROCESS 89454a20 SessionId: none Cid: 048c Peb: 7ffd4000 ParentCid: 0004
DirBase: 0a400040 ObjectTable: e1473348 HandleCount: 19.
Image: smss.exe

PROCESS 893f1da0 SessionId: 0 Cid: 04d0 Peb: 7ffd6000 ParentCid: 048c
DirBase: 0a400060 ObjectTable: e10102a8 HandleCount: 779.
Image: csrss.exe

PROCESS 8943eb28 SessionId: 0 Cid: 04ec Peb: 7ffde000 ParentCid: 048c
DirBase: 0a400080 ObjectTable: e1538268 HandleCount: 466.
Image: winlogon.exe

用进程对象地址作参数执行!object
lkd> !object 865ad020
Object: 865ad020 Type: (89d53e70) Process
ObjectHeader: 865ad008 (old version) //对象头
HandleCount: 1 PointerCount: 2

查看对象头:

lkd> dt _Object_Header 865ad008
nt!_OBJECT_HEADER
+0x000 PointerCount : 2
+0x004 HandleCount : 1
+0x004 NextToFree : 0x00000001
+0x008 Type : 0x89d53e70 _OBJECT_TYPE
+0x00c NameInfoOffset : 0 ''
+0x00d HandleInfoOffset : 0 ''
+0x00e QuotaInfoOffset : 0 ''
+0x00f Flags : 0x20 ' '
+0x010 ObjectCreateInfo : 0x88d54678 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : 0x88d54678
+0x014 SecurityDescriptor : 0xe25fe9e5
+0x018 Body : _QUAD

查看对象类型数据结构:

lkd> dt _OBJECT_TYPE 89d53e70
nt!_OBJECT_TYPE
+0x000 Mutex : _ERESOURCE
+0x038 TypeList : _LIST_ENTRY [ 0x89d53ea8 - 0x89d53ea8 ]
+0x040 Name : _UNICODE_STRING "Process"
+0x048 DefaultObject : (null)
+0x04c Index : 5
+0x050 TotalNumberOfObjects : 0x47
+0x054 TotalNumberOfHandles : 0xaf
+0x058 HighWaterNumberOfObjects : 0x47
+0x05c HighWaterNumberOfHandles : 0xb1
+0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER
+0x0ac Key : 0x636f7250
+0x0b0 ObjectLocks : [4] _ERESOURCE

TypeInfo 域保存了一个指针,指向的数据结构对于该对象类型的所有对象都公共的属性以及一组指向该对象类型的方法的指针:

lkd> dt _OBJECT_TYPE_INITIALIZER 89d53e70+60
nt!_OBJECT_TYPE_INITIALIZER
+0x000 Length : 0x4c
+0x002 UseDefaultObject : 0 ''
+0x003 CaseInsensitive : 0 ''
+0x004 InvalidAttributes : 0xb0
+0x008 GenericMapping : _GENERIC_MAPPING
+0x018 ValidAccessMask : 0x1f0fff
+0x01c SecurityRequired : 0x1 ''
+0x01d MaintainHandleCount : 0 ''
+0x01e MaintainTypeList : 0 ''
+0x020 PoolType : 0 ( NonPagedPool )
+0x024 DefaultPagedPoolCharge : 0x1000
+0x028 DefaultNonPagedPoolCharge : 0x290
+0x02c DumpProcedure : (null)
+0x030 OpenProcedure : (null)
+0x034 CloseProcedure : (null)
+0x038 DeleteProcedure : 0x805d1774 void nt!PspProcessDelete+0
+0x03c ParseProcedure : (null)
+0x040 SecurityProcedure : 0x805f7bbc long nt!SeDefaultObjectMethod+0
+0x044 QueryNameProcedure : (null)
+0x048 OkayToCloseProcedure : (null)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: