lkd> !process
PROCESS 87cec960 SessionId: 0 Cid: 0bf8 Peb: 7ffd6000 ParentCid: 0c7c
DirBase: 0ab405e0 ObjectTable: e2a94618 HandleCount: 353.
Image: windbg.exe
lkd> !object 87cec960
Object: 87cec960 Type: (8a5f8e70) Process
ObjectHeader: 87cec948 (old version)
HandleCount: 3 PointerCount: 55
lkd> dt _object_header 87cec948
nt!_OBJECT_HEADER
+0x000 PointerCount : 55
+0x004 HandleCount : 3
+0x004 NextToFree : 0x00000003
+0x008 Type : 0x8a5f8e70 _OBJECT_TYPE
+0x00c NameInfoOffset : 0 ''
+0x00d HandleInfoOffset : 0 ''
+0x00e QuotaInfoOffset : 0 ''
+0x00f Flags : 0x20 ' '
+0x010 ObjectCreateInfo : 0x899c2b40 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : 0x899c2b40
+0x014 SecurityDescriptor : 0xe2bcc349
+0x018 Body : _QUAD
lkd> dt 0x8a5f8e70 _OBJECT_TYPE
nt!_OBJECT_TYPE
+0x000 Mutex : _ERESOURCE
+0x038 TypeList : _LIST_ENTRY [ 0x8a5f8ea8 - 0x8a5f8ea8 ]
+0x040 Name : _UNICODE_STRING "Process"
+0x048 DefaultObject : (null)
+0x04c Index : 5
+0x050 TotalNumberOfObjects : 0x4b
+0x054 TotalNumberOfHandles : 0xca
+0x058 HighWaterNumberOfObjects : 0x51
+0x05c HighWaterNumberOfHandles : 0xd3
+0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER
+0x0ac Key : 0x636f7250
+0x0b0 ObjectLocks : [4] _ERESOURCE
lkd> dt _OBJECT_TYPE_INITIALIZER 0x8a5f8e70 +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 : 0x805d2cdc void nt!PspProcessDelete+0
+0x03c ParseProcedure : (null)
+0x040 SecurityProcedure : 0x805f9150 long nt!SeDefaultObjectMethod+0
+0x044 QueryNameProcedure : (null)
+0x048 OkayToCloseProcedure : (null)
看到最后几个XXXXProcedure了吧,在操作EPROCESS的时候会调用相应的函数,具体是哪个函数由操作的种类决定,调用的时候先检查是否为null,不为空就call,为null就算了。
有些函数的返回值不会对操作产生影响,而有些则会直接影响操作是否成功,而且Win2000和XP Vista系统还不一样。
在Win2000和XP Vista系统下各个函数的参数有可能不一样,比如OpenProcedure 在2000下是8个参数,XP和Vista下是9个参数。
通过Hook这些可以实现许多猥琐的事,不仅仅进程的EPROCESS了,每一个object都有这样函数。