句柄表

   

句柄表结构

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内核原理与实现》)

句柄类型

  1. -1 表示当前进程
  2. -2 表示当前线程
  3. 负值 表示为全局句柄表的索引
  4. 当前进程的句柄表中的索引

   

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

   

posted @ 2020-03-29 22:29  Joney_Yana  阅读(273)  评论(0编辑  收藏  举报