句柄表结构
HANDLE_TABLE
EPROCESS结构包含一个名为ObjectTable的字段,该字段指向了HANDLE_TABLE结构,HANDLE_TABLE描述了该进程的句柄表信息。
nt!_HANDLE_TABLE
+0x000 TableCode : Uint4B
+0x004 QuotaProcess : Ptr32 _EPROCESS
+0x008 UniqueProcessId : Ptr32 Void
+0x00c HandleTableLock : [4] _EX_PUSH_LOCK
+0x01c HandleTableList : _LIST_ENTRY
+0x024 HandleContentionEvent : _EX_PUSH_LOCK
+0x028 DebugInfo : Ptr32 _HANDLE_TRACE_DEBUG_INFO
+0x02c ExtraInfoPages : Int4B
+0x030 FirstFree : Uint4B
+0x034 LastFree : Uint4B
+0x038 NextHandleNeedingPool : Uint4B
+0x03c HandleCount : Int4B
+0x040 Flags : Uint4B
+0x040 StrictFIFO : Pos 0, 1 Bit
TableCode的bit2~bit31是一个指针,指向了句柄表。TableCode的bit0~bit1这两位表示了句柄表的层数,0表示句柄表只有一层,最多可以容纳512个句柄;1表示句柄表有两层,可容纳1024*512个句柄;3表示句柄表为3层,可容纳1024*1024*512(229)个句柄。实际使用根本用不到这么多句柄,并且Windows还规定了句柄最大数量为224=16777216个。句柄表的层数的默认为0,在Windows加入新句柄时,动态调整层数。
句柄表结构
(截取于《Windows内核原理与实现》)
句柄类型
WinDbg遍历句柄表
WinDbg提供了遍历句柄表的指令: !handle [Handle [KMFlags [Process [TypeName]]]]
Handle : 句柄索引(默认值-1),-1表示列出范围内所有的句柄。
KMFlags : 展示内容标记(默认0x3),详细内容参数WinDbg参考指南。
Process : 限定句柄表查找范围(默认-1),进程ID 或 进程结构EPROCESS地址,-1表示当前进程,0表示遍历所有进程的句柄表(慎用,卡卡卡)
TypeName : 过滤句柄类型,例如Thread、Process、Event。。。
示例:遍历进程ID为0x440的句柄表
kd> !handle -1 1 0440
Handle table at e1c0a218 with 15 entries in use
0004: Object: e10096d0 GrantedAccess: 000f0003
0008: Object: e153a4f0 GrantedAccess: 00000003
000c: Object: 81d6ec20 GrantedAccess: 00100020 (Inherit)
0014: Object: e154c6c0 GrantedAccess: 000f000f
0018: Object: e14386d0 GrantedAccess: 001f0001 (Protected)
0020: Object: 81ce2140 GrantedAccess: 001f0003
0024: Object: 82165980 GrantedAccess: 000f037f
0028: Object: e1543e50 GrantedAccess: 0002000f
002c: Object: 81f9f460 GrantedAccess: 00120001
0030: Object: e13cc7c0 GrantedAccess: 00000002
0034: Object: 82181020 GrantedAccess: 001f0fff
0038: Object: 81fc38b0 GrantedAccess: 00100003
003c: Object: 81f750f8 GrantedAccess: 00100003
0040: Object: e1ded578 GrantedAccess: 000f003f (Protected)
0044: Object: 81d9c510 GrantedAccess: 001f03ff
!object查看内核对象
当获得一个内核对象地址,想查看这是什么类型的内核对象,可以用!object指令查看,例如:
kd> !object e10096d0
Object: e10096d0 Type: (821b3e70) KeyedEvent
ObjectHeader: e10096b8 (old version)
HandleCount: 22 PointerCount: 23
Directory Object: e10001e0 Name: CritSecOutOfMemoryEvent
原文:https://www.cnblogs.com/joneyyana/p/12595525.html