Iverson333 发表于 2017-6-1 13:34:05

进程句柄

时隔2个月 发现下面有部分理论是错的 句柄表是有三层 在WRK中已有明确定义


EPROCESS下有一个ObjectType保存的这个进程的句柄表
ObjectType的值为_HANDER_TABLE
这个结构中有一个TableCode成员 如果TableCode里的成员值最后三位不为0 则表示是多维数组,我们只需要第一层 第一层直接指向了Object_header 结构 得到的方法是将TableCode后三个位置0 这个TableCode保存的就不是Object_header了 而是一个指向Object_header的地址了 如果tablecode的后三位原本就为0 那么tableCode保存的值就是Object_header的地址
这个成员的值指向这个进程的所有句柄


PROCESS fffffa800f4fab30
    SessionId: 1Cid: 0f0c    Peb: 7efdf000ParentCid: 16b8
    DirBase: 85482000ObjectTable: fffff8a01a5dbcd0HandleCount: 102.
    Image: NT6LKD.exe
lkd> dq 0xfffff8a0`1a6b0000
fffff8a0`1a6b000000000000`00000000 00000000`fffffffe
fffff8a0`1a6b0010fffff8a0`1a3b39e1 00000000`00000009
fffff8a0`1a6b0020fffff8a0`0a01bdb1 00000000`00000003
fffff8a0`1a6b0030fffff8a0`044cfa91 00000000`00000003
fffff8a0`1a6b0040fffffa80`0f513041 00000000`00100020
fffff8a0`1a6b0050fffff8a0`1a369de1 00000000`00000009
fffff8a0`1a6b0060fffff8a0`044cfa91 00000000`00000003
fffff8a0`1a6b0070fffffa80`0f45def1 00000000`00100020
lkd> dt _object_header fffff8a0`1a3b39e0
nt!_OBJECT_HEADER
   +0x000 PointerCount   : 0n1
   +0x008 HandleCount      : 0n1
   +0x008 NextToFree       : 0x00000000`00000001 Void
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex      : 0x23 '#'
   +0x019 TraceFlags       : 0 ''
   +0x01a InfoMask         : 0x8 ''
   +0x01b Flags            : 0 ''
   +0x020 ObjectCreateInfo : 0xfffffa80`0afa0440 _OBJECT_CREATE_INFORMATION
   +0x020 QuotaBlockCharged : 0xfffffa80`0afa0440 Void
   +0x028 SecurityDescriptor : (null)
   +0x030 Body             : _QUAD
lkd> !object fffff8a0`1a3b39e0 +0x30
Object: fffff8a01a3b3a10Type: (fffffa80069e2300) Key
    ObjectHeader: fffff8a01a3b39e0 (new version)
    HandleCount: 1PointerCount: 1
    Directory Object: 00000000Name: \REGISTRY\MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\IMAGE FILE EXECUTION OPTIONS
lkd> dt _object_header fffff8a0`0a01bdb0
nt!_OBJECT_HEADER
   +0x000 PointerCount   : 0n116
   +0x008 HandleCount      : 0n71
   +0x008 NextToFree       : 0x00000000`00000047 Void
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex      : 0x3 ''
   +0x019 TraceFlags       : 0 ''
   +0x01a InfoMask         : 0xa ''
   +0x01b Flags            : 0x10 ''
   +0x020 ObjectCreateInfo : 0xfffff800`03a0e900 _OBJECT_CREATE_INFORMATION
   +0x020 QuotaBlockCharged : 0xfffff800`03a0e900 Void
   +0x028 SecurityDescriptor : 0xfffff8a0`0a01b94c Void
   +0x030 Body             : _QUAD
lkd> !object fffff8a0`0a01bdb0+0x30
Object: fffff8a00a01bde0Type: (fffffa80069a1900) Directory
    ObjectHeader: fffff8a00a01bdb0 (new version)
    HandleCount: 72PointerCount: 117
    Directory Object: fffff8a000006d30Name: Known


TableCode成员是一个HEADER_TABLE_ENTRY结构


tablecode每加0x10保存着一个Object_header结构
同样的保存的值最后三位用于判断 也要置0


在Object_header结构后面跟着这个对象的结构
比如这个对象是文件对象
那么跟着的就是FILE_OBJECT结构


分析下_HANDER_TABLE结构
win7 x64
lkd> dt _handle_table
nt!_HANDLE_TABLE
   +0x000 TableCode      : Uint8B
   +0x008 QuotaProcess   : Ptr64 _EPROCESS
   +0x010 UniqueProcessId: Ptr64 Void
   +0x018 HandleLock       : _EX_PUSH_LOCK
   +0x020 HandleTableList: _LIST_ENTRY
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 DebugInfo      : Ptr64 _HANDLE_TRACE_DEBUG_INFO
   +0x040 ExtraInfoPages   : Int4B
   +0x044 Flags            : Uint4B
   +0x044 StrictFIFO       : Pos 0, 1 Bit
   +0x048 FirstFreeHandle: Uint4B
   +0x050 LastFreeHandleEntry : Ptr64 _HANDLE_TABLE_ENTRY
   +0x058 HandleCount      : Uint4B
   +0x05c NextHandleNeedingPool : Uint4B
   +0x060 HandleCountHighWatermark : Uint4B

成员TableCode可能是_HANDLE_TABLE_ENTRY数组开始地址 也有可能是一个指向第一个数组的指针
具体看TableCode的最低位,为0则是数组开始地址 为1置0后则是一个指向第一个数组开始地址的指针
我是这么理解的 如果TableCode最低位为1 则说明两件事
1.有多个数组
2.此时TableCode的值不是数组开始地址,而是指向数组开始地址的指针.
那怎么知道有多少个数组呢?
_HANDER_TABLE下的HandleCount说明了一个有多少个句柄 一个数组最多只能保存255个HANDLE_TABLE_ENTRY (一页是4096K ,而一个HANDLE_TABLE_ENTRY的大小是16字节)
如果HandleCount的值<0xff 则一个数组 <0xff*2 则两个数组 以此类推


找一个小于255个句柄的进程实验下:
PROCESS fffffa801058f160
    SessionId: 1Cid: 11c8    Peb: 7efdf000ParentCid: 114c
    DirBase: 0aeb4000ObjectTable: fffff8a01c1ed770HandleCount: 118.
    Image: NT6LKD.exe


lkd> dt _handle_table fffff8a01c1ed770
ntdll!_HANDLE_TABLE
   +0x000 TableCode      : 0xfffff8a0`25581000
   +0x008 QuotaProcess   : 0xfffffa80`1058f160 _EPROCESS
   +0x010 UniqueProcessId: 0x00000000`000011c8 Void
   +0x018 HandleLock       : _EX_PUSH_LOCK
   +0x020 HandleTableList: _LIST_ENTRY [ 0xfffff8a0`2153e4e0 - 0xfffff8a0`16e87710 ]
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 DebugInfo      : (null)
   +0x040 ExtraInfoPages   : 0n0
   +0x044 Flags            : 0
   +0x044 StrictFIFO       : 0y0
   +0x048 FirstFreeHandle: 0x1dc
   +0x050 LastFreeHandleEntry : 0xfffff8a0`25581ff0 _HANDLE_TABLE_ENTRY
   +0x058 HandleCount      : 0x76
   +0x05c NextHandleNeedingPool : 0x400
   +0x060 HandleCountHighWatermark : 0x77



HandleCount小于255 说明只有一个数组,那么TableCode的值就是数组开始地址
lkd> dq 0xfffff8a0`25581000
fffff8a0`2558100000000000`00000000 00000000`fffffffe
fffff8a0`25581010fffff8a0`17f00911 00000000`00000009
fffff8a0`25581020fffff8a0`025ecb81 00000000`00000003
fffff8a0`25581030fffff8a0`03b12d71 00000000`00000003
fffff8a0`25581040fffffa80`107e6041 00000000`00100020
fffff8a0`25581050fffff8a0`255499a1 00000000`00000009
fffff8a0`25581060fffff8a0`03b12d71 00000000`00000003
fffff8a0`25581070fffffa80`075f6311 00000000`00100020

前16字节是无关的值 忽略
看看fffff8a0`25581010 它是第二个元素 这个第二个元素应该说是句柄 句柄都是4的倍数 第一个元素是无效的 忽略 handle/4*0x10 + 数组开始地址
lkd> dt _handle_table_entry fffff8a0`25581010
ntdll!_HANDLE_TABLE_ENTRY
   +0x000 Object         : 0xfffff8a0`17f00911 Void
   +0x000 ObAttributes   : 0x17f00911
   +0x000 InfoTable      : 0xfffff8a0`17f00911 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : 0xfffff8a0`17f00911
   +0x008 GrantedAccess    : 9
   +0x008 GrantedAccessIndex : 9
   +0x00a CreatorBackTraceIndex : 0
   +0x008 NextFreeTableEntry : 9

只关心Object
这个Object是一个_OBJECT_HEADER 最后三位需要置0 貌似跟继承性有关什么的..
lkd> dt _object_header fffff8a0`17f00910
nt!_OBJECT_HEADER
   +0x000 PointerCount   : 0n1
   +0x008 HandleCount      : 0n1
   +0x008 NextToFree       : 0x00000000`00000001 Void
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex      : 0x23 '#'
   +0x019 TraceFlags       : 0 ''
   +0x01a InfoMask         : 0x8 ''
   +0x01b Flags            : 0 ''
   +0x020 ObjectCreateInfo : 0xfffffa80`0dd64600 _OBJECT_CREATE_INFORMATION
   +0x020 QuotaBlockCharged : 0xfffffa80`0dd64600 Void
   +0x028 SecurityDescriptor : (null)
   +0x030 Body             : _QUAD

Type 0x23 那应该是Key对象
lkd> !object fffff8a0`17f00910+0x30
Object: fffff8a017f00940Type: (fffffa8006a39300) Key
    ObjectHeader: fffff8a017f00910 (new version)
    HandleCount: 1PointerCount: 1
    Directory Object: 00000000Name: \REGISTRY\MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\IMAGE FILE EXECUTION OPTIONS

没错 这个就是这个进程的第一个句柄 句柄为4 Key对象

_OBJECT_HEADER 后是这个对象的具体数据(身体) 是个KEY对象 那么这个身体就是_CM_KEY_BODY
lkd> dt _CM_KEY_BODY fffff8a0`17f00910+0x30
nt!_CM_KEY_BODY
   +0x000 Type             : 0x6b793032
   +0x008 KeyControlBlock: 0xfffff8a0`0040c4a8 _CM_KEY_CONTROL_BLOCK
   +0x010 NotifyBlock      : (null)
   +0x018 ProcessID      : 0x00000000`000011c8 Void
   +0x020 KeyBodyList      : _LIST_ENTRY [ 0xfffff8a0`255499f0 - 0xfffff8a0`22d90e00 ]
   +0x030 Flags            : 0y0000000000000000 (0)
   +0x030 HandleTags       : 0y0000000000000000 (0)
   +0x038 KtmTrans         : (null)
   +0x040 KtmUow         : (null)
   +0x048 ContextListHead: _LIST_ENTRY [ 0xfffff8a0`17f00988 - 0xfffff8a0`17f00988 ]
lkd> dt _CM_KEY_CONTROL_BLOCK 0xfffff8a0`0040c4a8
nt!_CM_KEY_CONTROL_BLOCK
   +0x000 RefCount         : 0x5e
   +0x004 ExtFlags         : 0y0000000000000000 (0)
   +0x004 PrivateAlloc   : 0y1
   +0x004 Delete         : 0y0
   +0x004 HiveUnloaded   : 0y0
   +0x004 Decommissioned   : 0y0
   +0x004 LockTablePresent : 0y0
   +0x004 TotalLevels      : 0y0000000111 (0x7)
   +0x008 DelayedDeref   : 0y0
   +0x008 DelayedClose   : 0y0
   +0x008 Parking          : 0y0
   +0x010 KeyHash          : _CM_KEY_HASH
   +0x010 ConvKey          : 0x984c4bc
   +0x018 NextHash         : (null)
   +0x020 KeyHive          : 0xfffff8a0`02b7d010 _HHIVE
   +0x028 KeyCell          : 0x2d90020
   +0x030 KcbPushlock      : _EX_PUSH_LOCK
   +0x038 Owner            : (null)
   +0x038 SharedCount      : 0n0
   +0x040 SlotHint         : 0
   +0x048 ParentKcb      : 0xfffff8a0`0040cde8 _CM_KEY_CONTROL_BLOCK
   +0x050 NameBlock      : 0xfffff8a0`0a683260 _CM_NAME_CONTROL_BLOCK
   +0x058 CachedSecurity   : 0xfffff8a0`0a667600 _CM_KEY_SECURITY_CACHE
   +0x060 ValueCache       : _CACHED_CHILD_LIST
   +0x070 IndexHint      : 0x00000000`00000012 _CM_INDEX_HINT_BLOCK
   +0x070 HashKey          : 0x12
   +0x070 SubKeyCount      : 0x12
   +0x078 KeyBodyListHead: _LIST_ENTRY [ 0xfffff8a0`037cc9a0 - 0xfffff8a0`1bbf7550 ]
   +0x078 FreeListEntry    : _LIST_ENTRY [ 0xfffff8a0`037cc9a0 - 0xfffff8a0`1bbf7550 ]
   +0x088 KeyBodyArray   : 0xfffff8a0`0a67a710 _CM_KEY_BODY
   +0x0a8 KcbLastWriteTime : _LARGE_INTEGER 0x01d11893`9eb89f9c
   +0x0b0 KcbMaxNameLen    : 0x48
   +0x0b2 KcbMaxValueNameLen : 0
   +0x0b4 KcbMaxValueDataLen : 0
   +0x0b8 KcbUserFlags   : 0y0001
   +0x0b8 KcbVirtControlFlags : 0y1010
   +0x0b8 KcbDebug         : 0y00000000 (0)
   +0x0b8 Flags            : 0y0000000000100000 (0x20)
   +0x0c0 RealKeyName      : 0xfffff8a0`0380d310"Image File Execution Options"
   +0x0c8 KCBUoWListHead   : _LIST_ENTRY [ 0xfffff8a0`0040c570 - 0xfffff8a0`0040c570 ]
   +0x0d8 DelayQueueEntry: _LIST_ENTRY [ 0xfffff8a0`0040c580 - 0xfffff8a0`0040c580 ]
   +0x0d8 Stolen         : 0xfffff8a0`0040c580"???"
   +0x0e8 TransKCBOwner    : (null)
   +0x0f0 KCBLock          : _CM_INTENT_LOCK
   +0x100 KeyLock          : _CM_INTENT_LOCK
   +0x110 TransValueCache: _CHILD_LIST
   +0x118 TransValueListOwner : (null)
   +0x120 FullKCBName      : (null)



在_CM_KEY_CONTROL_BLOCK 偏移0x0c0 RealKeyName给出了名字 跟上面的相比,后面是对的 说明正确

找一个句柄大于255小于512的实验下:
lkd> dt _HANDLE_TABLE 0xfffff8a0`1742d090
nt!_HANDLE_TABLE
   +0x000 TableCode      : 0xfffff8a0`17ed4001
   +0x008 QuotaProcess   : 0xfffffa80`09ebf4d0 _EPROCESS
   +0x010 UniqueProcessId: 0x00000000`00000c60 Void
   +0x018 HandleLock       : _EX_PUSH_LOCK
   +0x020 HandleTableList: _LIST_ENTRY [ 0xfffff8a0`00d06a00 - 0xfffff8a0`1555fa60 ]
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 DebugInfo      : (null)
   +0x040 ExtraInfoPages   : 0n0
   +0x044 Flags            : 0
   +0x044 StrictFIFO       : 0y0
   +0x048 FirstFreeHandle: 0x174
   +0x050 LastFreeHandleEntry : 0xfffff8a0`17ed5ff0 _HANDLE_TABLE_ENTRY
   +0x058 HandleCount      : 0x185
   +0x05c NextHandleNeedingPool : 0x800
   +0x060 HandleCountHighWatermark : 0x1a2
HandleCount>255h
此时TableCode最低位为1 置0后指向第一个数组
lkd> dq 0xfffff8a0`17ed4000
fffff8a0`17ed4000fffff8a0`17d8d000 fffff8a0`17ed5000
fffff8a0`17ed401000000000`00000000 00000000`00000000
fffff8a0`17ed402000000000`00000000 00000000`00000000
fffff8a0`17ed403000000000`00000000 00000000`00000000
fffff8a0`17ed404000000000`00000000 00000000`00000000
fffff8a0`17ed405000000000`00000000 00000000`00000000
fffff8a0`17ed406000000000`00000000 00000000`00000000
fffff8a0`17ed407000000000`00000000 00000000`00000000

可以看到有两个数组
看下第一个数组
lkd> dq 0xfffff8a0`17d8d000
fffff8a0`17d8d00000000000`00000000 00000000`fffffffe
fffff8a0`17d8d010fffff8a0`16aeff71 00000000`00000009
fffff8a0`17d8d020fffff8a0`0cc2b961 00000000`00000003
fffff8a0`17d8d030fffff8a0`05bb4a71 00000000`00000003
fffff8a0`17d8d040fffffa80`09f45371 00000000`00100020
fffff8a0`17d8d050fffff8a0`174a26c1 00000000`00000009
fffff8a0`17d8d060fffff8a0`05bb4a71 00000000`00000003
fffff8a0`17d8d070fffffa80`09e8bef1 00000000`00100020

看下第二个数组
lkd> dq 0xfffff8a0`17ed5000
fffff8a0`17ed500000000000`00000000 00000000`fffffffe
fffff8a0`17ed5010fffffa80`06f841e1 00000000`00000804
fffff8a0`17ed5020fffffa80`0746d7f1 00000000`00000804
fffff8a0`17ed5030fffffa80`0758b4b1 00000000`00000804
fffff8a0`17ed5040fffffa80`074f0041 00000000`00000804
fffff8a0`17ed5050fffffa80`06daabe1 00000000`00100003
fffff8a0`17ed5060fffffa80`09ec5511 00000000`00100003
fffff8a0`17ed5070fffffa80`06db4601 00000000`001f0003



看下第一个数组的最后一个元素
lkd>
fffff8a0`17d8df80fffff8a0`17bc66c1 00000000`000f0003
fffff8a0`17d8df90fffffa80`0e958df1 00000000`00100002
fffff8a0`17d8dfa0fffffa80`0e889c21 00000000`001f0003
fffff8a0`17d8dfb0fffffa80`07505031 00000000`001fffff
fffff8a0`17d8dfc0fffffa80`07505031 00000000`001fffff
fffff8a0`17d8dfd0fffffa80`09f4cd71 00000000`00100002
fffff8a0`17d8dfe0fffffa80`09ffae31 00000000`00000804
fffff8a0`17d8dff0fffffa80`09f92491 00000000`00000804   <-----这个
跟基地址相差ff0 0xff0/0x10=0xff=255h 再加上它本身的16字节为0x1000 刚好是4096K一页的大小


找个>512<768的 没有找到,那就找个<768的吧
PROCESS fffffa800e651b30
    SessionId: 1Cid: 06e8    Peb: 7fffffda000ParentCid: 0684
    DirBase: 1e5325000ObjectTable: fffff8a005f89be0HandleCount: 835.
    Image: explorer.exe
    lkd> dt _handle_table fffff8a005f89be0
nt!_HANDLE_TABLE
   +0x000 TableCode      : 0xfffff8a0`056dc001
   +0x008 QuotaProcess   : 0xfffffa80`0e651b30 _EPROCESS
   +0x010 UniqueProcessId: 0x00000000`000006e8 Void
   +0x018 HandleLock       : _EX_PUSH_LOCK
   +0x020 HandleTableList: _LIST_ENTRY [ 0xfffff8a0`04b8b530 - 0xfffff8a0`05ea03a0 ]
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 DebugInfo      : (null)
   +0x040 ExtraInfoPages   : 0n0
   +0x044 Flags            : 0
   +0x044 StrictFIFO       : 0y0
   +0x048 FirstFreeHandle: 0xc24
   +0x050 LastFreeHandleEntry : 0xfffff8a0`08f29ff0 _HANDLE_TABLE_ENTRY
   +0x058 HandleCount      : 0x344
   +0x05c NextHandleNeedingPool : 0x1000
   +0x060 HandleCountHighWatermark : 0x386

835/255 > 3 也就是说有4个数组
lkd> dq 0xfffff8a0`056dc000
fffff8a0`056dc000fffff8a0`05f7c000 fffff8a0`056e0000
fffff8a0`056dc010fffff8a0`055d7000 fffff8a0`08f29000
fffff8a0`056dc02000000000`00000000 00000000`00000000
fffff8a0`056dc03000000000`00000000 00000000`00000000
fffff8a0`056dc04000000000`00000000 00000000`00000000
fffff8a0`056dc05000000000`00000000 00000000`00000000
fffff8a0`056dc06000000000`00000000 00000000`00000000
fffff8a0`056dc07000000000`00000000 00000000`00000000
刚好4个地址


至于网上很多说什么TableCode低三位 低两位决定几级表 看不懂 有人还说分级是怕装不下句柄 那好吧 一级就说是TableCode就是数组开始地址 二级说明什么? 三级呢?不过就是想告诉你TableCode不是开始地址了
可能是实验中没出现TableCode低两位为10 才得出此结论
怕装不下句柄 那好办,看看呗 最大的HANDLE_TABLE 莫过于PspCidTable了 查看之后发现低两位也只有1
以实验说话..反正我没看见低两位为10 也就是所谓的三级表 可能是太年轻了,以后遇到看看.
写到这里的时候突然发现好像懂了那些人说的表的分级,二级是指向一级的指针,那三级就是指向一级的指针的指针.
额,实验没发现三级表,我还是先按我自己的理论来理解吧
TableCode最低位为1 则告诉使用者这个TableCode不是数组开始地址了 而是保存数组开始地址的数组 这个数组大小由句柄数决定 句柄数/255 取整+1


如果低两位为0 TableCode的值就是直接就是HANDLE_TABLE_ENTRY
如果低两位为1 TableCode的值低两位置0后的地址保存着指向第一个句柄表的指针
如果低两位为10 TableCode的值低两位置0后的地址保存着指向第二个句柄表的指针(待定,在实验中我没发现超过拥有510个句柄的进程)
为什么是510个句柄 一个表最多只能保存255个大小为16字节的数据,因为一页是4096K 而保存一个Object地址和一个GrantedAccess需要16字节
所以你懂得~
以这条为例
fffff8a0`198eb010fffff8a0`1859e1a1 00000000`00000009
fffff8a0`1859e1a1低三位置0后就是Object 00000000`00000009则是GrantedAccess占用了16字节


lkd> dt _handle_table fffff8a0183737e0
nt!_HANDLE_TABLE
   +0x000 TableCode      : 0xfffff8a0`198ea001
   +0x008 QuotaProcess   : 0xfffffa80`0f134b30 _EPROCESS
   +0x010 UniqueProcessId: 0x00000000`00001614 Void
   +0x018 HandleLock       : _EX_PUSH_LOCK
   +0x020 HandleTableList: _LIST_ENTRY [ 0xfffff800`03a6f4b0 - 0xfffff8a0`17380c70 ]
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 DebugInfo      : (null)
   +0x040 ExtraInfoPages   : 0n0
   +0x044 Flags            : 0
   +0x044 StrictFIFO       : 0y0
   +0x048 FirstFreeHandle: 0x4fc
   +0x050 LastFreeHandleEntry : 0xfffff8a0`197eaff0 _HANDLE_TABLE_ENTRY
   +0x058 HandleCount      : 0x12b
   +0x05c NextHandleNeedingPool : 0x800
   +0x060 HandleCountHighWatermark : 0x141

   
lkd> dq 0xfffff8a0`198ea000 这里可以看到有2个句柄表
fffff8a0`198ea000fffff8a0`198eb000 fffff8a0`197ea000
fffff8a0`198ea01000000000`00000000 00000000`00000000
fffff8a0`198ea02000000000`00000000 00000000`00000000
fffff8a0`198ea03000000000`00000000 00000000`00000000
fffff8a0`198ea04000000000`00000000 00000000`00000000
fffff8a0`198ea05000000000`00000000 00000000`00000000
fffff8a0`198ea06000000000`00000000 00000000`00000000
fffff8a0`198ea07000000000`00000000 00000000`00000000



//句柄表1
lkd> dq fffff8a0`198eb000
fffff8a0`198eb00000000000`00000000 00000000`fffffffe
fffff8a0`198eb010fffff8a0`1859e1a1 00000000`00000009
fffff8a0`198eb020fffff8a0`0cc2b961 00000000`00000003
fffff8a0`198eb030fffffa80`0e774361 00000000`00100020
fffff8a0`198eb040fffffa80`0e71e5b1 00000000`00100020
fffff8a0`198eb050fffffa80`0f16ca81 00000000`00100020
fffff8a0`198eb060fffffa80`0e7ec511 00000000`001f0001
fffff8a0`198eb070fffff8a0`180a4721 00000000`00020019


//句柄表2
lkd> dq fffff8a0`197ea000
fffff8a0`197ea00000000000`00000000 02020001`fffffffe
fffff8a0`197ea010fffffa80`09e884c1 00000000`001f0003
fffff8a0`197ea020fffffa80`0b7d5a01 00000000`001f0003
fffff8a0`197ea030fffffa80`0f158271 00000000`001f0003
fffff8a0`197ea040fffffa80`0e1ab991 00000000`001f0001
fffff8a0`197ea050fffffa80`0e23dd61 00000000`001f0003
fffff8a0`197ea060fffffa80`0ef299e1 00000000`001fffff
fffff8a0`197ea070fffff8a0`17350481 00000000`00020019



HandleTableList不多说了


HandleCount 不用多说


NextHandleNeedingPool 下一个句柄池容量
页: [1]
查看完整版本: 进程句柄