對象管理器:
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)