📄 jiurl玩玩win2k进程线程篇 handle_table.htm
字号:
00000028<BR>e3073940 00000000 0000001f 613c75c8 00020019<BR>e3073950
61325c28 00020019 630657e8 00020019<BR>e3073960 00000000 0000002d 00000000
0000002e<BR>...<BR>e3073fe0 00000000 000000fd 00000000
000000fe<BR>e3073ff0 00000000 000000ff 00000000
ffffffff<BR><BR><B>HANDLE_TABLE 链</B><BR><BR>在 Win2k Build 2195 中,所有进程(包括
Idle 进程 )的 HANDLE_TABLE 结构通过 HANDLE_TABLE 结构偏移 +54 处的 LIST_ENTRY
HandleTableList 链在一起。<BR><BR>+54 struct _LIST_ENTRY HandleTableList<BR>+54
struct _LIST_ENTRY *Flink<BR>+58 struct _LIST_ENTRY *Blink<BR><BR>通过全局变量
HandleTableListHead 可以找到这个链。<BR>对于 Win2k Build 2195 ,HandleTableListHead
地址为 8046a140,该地址开始处为一个 LIST_ENTRY 结构。<BR><BR>Win2k 中还有一个特殊的 HANDLE_TABLE
,可以叫做 KernelHandleTable 。它不属于任何进程,也通过 HANDLE_TABLE 结构偏移 +54 处的 LIST_ENTRY
HandleTableList 链在 HANDLE_TABLE 链上。可以通过全局变量 ObpKernelHandleTable 找到它。对于
Win2k Build 2195 ,ObpKernelHandleTable 地址为 8046a694 ,是一个 HANDLE_TABLE
结构的指针。<BR><BR><BR><B>进程线程 HANDLE_TABLE</B>
<P> Win2k 中还有一个特殊的 HANDLE_TABLE,可以叫做 PspCidTable 。这个
HANDLE_TABLE 的句柄表中,保存着所有进程和线程对象的指针。PID(进程ID)和
ThreadID(线程ID)就是在这个句柄表中的索引。这个 HANDLE_TABLE 不属于任何进程,也没有链在 HANDLE_TABLE
链上。全局变量 PspCidTable 中是指向这个 HANDLE_TABLE 的指针。这个 HANDLE_TABLE 还有一点和别的
HANDLE_TABLE 都不同,就是它的 HANDLE_TABLE_ENTRY 中的第一个32bit
放着的是对象体指针(当然需要转换)而不是对象头指针(对象指针就是对象体指针)。<BR><BR>下面我们看实际的例子<BR><BR>//
PspCidTable 中是 HANDLE_TABLE 的地址<BR>kd> dd PspCidTable l 1<BR>dd
PspCidTable l 1<BR>80469a28 81452228<BR><BR>kd> !strct HANDLE_TABLE
81452228<BR>!strct HANDLE_TABLE 81452228<BR>struct _HANDLE_TABLE
(sizeof=108)<BR>+00 uint32 Flags = 00000000<BR>+04 int32 HandleCount =
000000d1<BR>+08 struct _HANDLE_TABLE_ENTRY ***Table = E1004000<BR>+0c
struct _EPROCESS *QuotaProcess = 00000000<BR>+10 void *UniqueProcessId =
00000000<BR>+14 int32 FirstFreeTableEntry = 0000008a<BR>+18 int32
NextIndexNeedingPool = 00000100<BR>+1c struct _ERESOURCE
HandleTableLock<BR>+1c struct _LIST_ENTRY SystemResourcesList<BR>+1c
struct _LIST_ENTRY *Flink = 80480020<BR>+20 struct _LIST_ENTRY *Blink =
814522E0<BR>+24 struct _OWNER_ENTRY *OwnerTable = 00000000<BR>+28 int16
ActiveCount = 0000<BR>+2a uint16 Flag = 0000<BR>+2c struct _KSEMAPHORE
*SharedWaiters = 00000000<BR>+30 struct _KEVENT *ExclusiveWaiters =
00000000<BR>+34 struct _OWNER_ENTRY OwnerThreads[2]<BR>+34
OwnerThreads[0]<BR>+34 uint32 OwnerThread = 00000000<BR>+38 int32
OwnerCount = 00000000<BR>+38 uint32 TableSize = 00000000<BR>+3c
OwnerThreads[1]<BR>+3c uint32 OwnerThread = 00000000<BR>+40 int32
OwnerCount = 00000000<BR>+40 uint32 TableSize = 00000000<BR>+44 uint32
ContentionCount = 00000000<BR>+48 uint16 NumberOfSharedWaiters =
0000<BR>+4a uint16 NumberOfExclusiveWaiters = 0000<BR>+4c void *Address =
00000000<BR>+4c uint32 CreatorBackTraceIndex = 00000000<BR>+50 uint32
SpinLock = 00000000<BR>+54 struct _LIST_ENTRY HandleTableList<BR>+54
struct _LIST_ENTRY *Flink = 8145227C<BR>+58 struct _LIST_ENTRY *Blink =
8145227C<BR>+5c struct _KEVENT HandleContentionEvent<BR>+5c struct
_DISPATCHER_HEADER Header<BR>+5c byte Type = 00 .<BR>+5d byte Absolute =
00 .<BR>+5e byte Size = 04 .<BR>+5f byte Inserted = 00 .<BR>+60 int32
SignalState = 00000000<BR>+64 struct _LIST_ENTRY WaitListHead<BR>+64
struct _LIST_ENTRY *Flink = 8145228C<BR>+68 struct _LIST_ENTRY *Blink =
8145228C<BR>// 句柄表的上层表地址为 E1004000<BR><BR>// 第0个中层表地址为 e1004400<BR>kd>
dd E1004000 l 4<BR>dd E1004000 l 4<BR>e1004000 e1004400 00000000 00000000
00000000<BR>// 第0个中层表的第0个下层表地址为 e1004800<BR>kd> dd E1004400 l 4<BR>dd
E1004400 l 4<BR>e1004400 e1004800 00000000 00000000 00000000<BR><BR>//
第0个中层表的第0个下层表的内容<BR>kd> dd E1004800 l 200<BR>dd E1004800 l
200<BR>e1004800 00000000 00000001 0141eda0 00000000<BR>e1004810 0141e020
00000000 0141e7c0 00000000<BR>e1004820 0141e540 00000000 0141d020
00000000<BR>e1004830 0141dda0 00000000 0141db20 00000000<BR>e1004840
0141d8a0 00000000 0141d620 00000000<BR>e1004850 0141d3a0 00000000 0141c020
00000000<BR>e1004860 0141cda0 00000000 0141b4c0 00000000<BR>e1004870
0141b240 00000000 0141a020 00000000<BR>e1004880 0141ada0 00000000 0141a660
00000000<BR>e1004890 0141a3e0 00000000 01411020 00000000<BR>e10048a0
013f7240 00000000 013d1b80 00000000<BR>e10048b0 01421660 00000000 01350c20
00000000<BR>e10048c0 012a7b20 00000000 011017c0 00000000<BR>e10048d0
012a78a0 00000000 012663a0 00000000<BR>e10048e0 0114cda0 00000000 01101540
00000000<BR>e10048f0 011012c0 00000000 010fc020 00000000<BR>e1004900
02000000 00000000 010f7a60 00000000<BR>e1004910 010f7340 00000000 010f7760
00000000<BR>e1004920 010f6c00 00000000 010f6960 00000000<BR>e1004930
010e9860 00000000 010e9b00 00000000<BR>e1004940 010e9520 00000000 010cb020
00000000<BR>e1004950 010e8020 00000000 010ce220 00000000<BR>e1004960
010cc020 00000000 010ccce0 00000000<BR>e1004970 010cc9a0 00000000 010cc660
00000000<BR>e1004980 010ca020 00000000 010c2020 00000000<BR>e1004990
010c2b00 00000000 010c3340 00000000<BR>e10049a0 010c1020 00000000 01089700
00000000<BR>e10049b0 010c19c0 00000000 010c12c0 00000000<BR>e10049c0
02000000 00000000 010bf020 00000000<BR>e10049d0 010bd580 00000000 010bb980
00000000<BR>e10049e0 010bb2c0 00000000 010ba420 00000000<BR>e10049f0
010b9020 00000000 010b9d60 00000000<BR>e1004a00 039beae0 00000000 010b8c00
00000000<BR>e1004a10 01099020 00000000 010ae180 00000000<BR>e1004a20
010ac020 00000000 010acda0 00000000<BR>e1004a30 00000000 000000b5 043c2da0
00000000<BR>e1004a40 01090d80 00000000 010ab420 00000000<BR>e1004a50
03518a80 00000000 02fac920 00000000<BR>e1004a60 010aa020 00000000 010a9d40
00000000<BR>e1004a70 010a8740 00000000 06b02020 00000000<BR>e1004a80
02000000 00000000 00000000 000000b0<BR>e1004a90 010a5da0 00000000 010a4020
00000000<BR>e1004aa0 010a7b20 00000000 010a5b20 00000000<BR>e1004ab0
010a46e0 00000000 010a2d00 00000000<BR>e1004ac0 010a2a80 00000000 04859da0
00000000<BR>e1004ad0 0109f020 00000000 010a3900 00000000<BR>e1004ae0
0109e020 00000000 010a6d20 00000000<BR>e1004af0 0109c360 00000000 03518580
00000000<BR>e1004b00 01099da0 00000000 01097020 00000000<BR>e1004b10
010926c0 00000000 01092940 00000000<BR>e1004b20 03425c20 00000000 010915c0
00000000<BR>e1004b30 0108dc00 00000000 034aa860 00000000<BR>e1004b40
0108a020 00000000 0108cd00 00000000<BR>e1004b50 0108c020 00000000 0108b6c0
00000000<BR>e1004b60 01089020 00000000 0484e020 00000000<BR>e1004b70
047d6480 00000000 07b3f700 00000000<BR>e1004b80 01086020 00000000 05b1b020
00000000<BR>e1004b90 039bed60 00000000 05938cc0 00000000<BR>e1004ba0
01065940 00000000 01063580 00000000<BR>e1004bb0 0105cca0 00000000 0105a980
00000000<BR>e1004bc0 01059580 00000000 0105a320 00000000<BR>e1004bd0
043c2020 00000000 01056280 00000000<BR>e1004be0 047f8560 00000000 0639c1c0
00000000<BR>e1004bf0 03555340 00000000 02151940 00000000<BR>e1004c00
010555a0 00000000 01055820 00000000<BR>e1004c10 0104a700 00000000 01052b80
00000000<BR>e1004c20 05b9b480 00000000 0689f020 00000000<BR>e1004c30
01045a20 00000000 01042c20 00000000<BR>e1004c40 0767d800 00000000 069c3020
00000000<BR>e1004c50 0767d020 00000000 035007e0 00000000<BR>e1004c60
021a2680 00000000 022d6ac0 00000000<BR>e1004c70 01fac020 00000000 01089da0
00000000<BR>e1004c80 022fd020 00000000 022fdda0 00000000<BR>e1004c90
022fd320 00000000 022fd6e0 00000000<BR>e1004ca0 0243bda0 00000000 02000000
00000000<BR>e1004cb0 05938a40 00000000 027e4460 00000000<BR>e1004cc0
0104cb00 00000000 01c15860 00000000<BR>e1004cd0 0786d020 00000000 02b83560
00000000<BR>e1004ce0 02c305e0 00000000 0349e3e0 00000000<BR>e1004cf0
02daf020 00000000 02e0c740 00000000<BR>e1004d00 02def020 00000000 02ded760
00000000<BR>e1004d10 02eb9b20 00000000 02eb98a0 00000000<BR>e1004d20
010a3120 00000000 03309020 00000000<BR>e1004d30 06d00020 00000000 047fb7e0
00000000<BR>e1004d40 010cdaa0 00000000 0323c400 00000000<BR>e1004d50
019a5900 00000000 048217a0 00000000<BR>e1004d60 0489e2e0 00000000 02000000
00000000<BR>e1004d70 038fada0 00000000 01c153c0 00000000<BR>e1004d80
00000000 000000b8 0639cda0 00000000<BR>e1004d90 008bcda0 00000000 07a5d740
00000000<BR>e1004da0 0344c020 00000000 00000000 000000de<BR>e1004db0
02389380 00000000 0108a8e0 00000000<BR>e1004dc0 00000000 000000d0 03375020
00000000<BR>e1004dd0 034aace0 00000000 0767d300 00000000<BR>e1004de0
04029900 00000000 0712fda0 00000000<BR>e1004df0 06a594c0 00000000 01079da0
00000000<BR>e1004e00 035a4d60 00000000 04977340 00000000<BR>e1004e10
0786d600 00000000 009c46c0 00000000<BR>e1004e20 01eefbc0 00000000 03210520
00000000<BR>e1004e30 0788c020 00000000 035c3da0 00000000<BR>e1004e40
02000000 00000000 06b8db60 00000000<BR>e1004e50 0492dc80 00000000 063eada0
00000000<BR>e1004e60 00000000 000000da 035a43e0 00000000<BR>e1004e70
034e0020 00000000 019a5020 00000000<BR>e1004e80 00000000 000000cc 02eb9620
00000000<BR>e1004e90 034e03a0 00000000 04fdf4a0 00000000<BR>e1004ea0
0349f980 00000000 04a4ec20 00000000<BR>e1004eb0 00000000 000000e0 049e9020
00000000<BR>e1004ec0 00000000 000000d6 01055020 00000000<BR>e1004ed0
00000000 00000046 04029b80 00000000<BR>e1004ee0 00000000 000000df 00000000
000000dc<BR>e1004ef0 00000000 000000d8 00000000 000000e1<BR>e1004f00
00000000 000000dd 00000000 000000e2<BR>e1004f10 00000000 000000e3 00000000
000000e4<BR>e1004f20 00000000 000000e5 00000000 000000e6<BR>e1004f30
00000000 000000e7 00000000 000000e8<BR>e1004f40 00000000 000000e9 00000000
000000ea<BR>e1004f50 00000000 000000eb 00000000 000000ec<BR>e1004f60
00000000 000000ed 00000000 000000ee<BR>e1004f70 00000000 000000ef 00000000
000000f0<BR>e1004f80 00000000 000000f1 00000000 000000f2<BR>e1004f90
00000000 000000f3 00000000 000000f4<BR>e1004fa0 00000000 000000f5 00000000
000000f6<BR>e1004fb0 00000000 000000f7 00000000 000000f8<BR>e1004fc0
00000000 000000f9 00000000 000000fa<BR>e1004fd0 00000000 000000fb 00000000
000000fc<BR>e1004fe0 00000000 000000fd 00000000 000000fe<BR>e1004ff0
00000000 000000ff 00000000 ffffffff<BR><BR>//
PID为0x8的进程是System进程<BR>kd> !process 8 0<BR>!process 8 0<BR>Searching
for Process with Cid == 8<BR>PROCESS 8141e020 SessionId: 0 Cid: 0008 Peb:
00000000 ParentCid: 0000<BR>DirBase: 00030000 ObjectTable: 81452a68
TableSize: 108.<BR>Image: System<BR><BR>下面我们要找 0x8 对应的对象<BR><BR>//
PID为0x8。0x8对应的上层表索引为0,中层表索引为0<BR>// 下层表中的偏移为 0x8*2。所以0x8对应的
HANDLE_TABLE_ENTRY 地址为 e1004800+8*2。<BR>kd> dd e1004800+8*2 l 2<BR>dd
e1004800+8*2 l 2<BR>e1004810 0141e020 00000000<BR>// HANDLE_TABLE_ENTRY
中第一个32bit不空。<BR><BR>// 把 HANDLE_TABLE_ENTRY 第一个32bit转换成对象指针。<BR>//
低3bit本身是0,把最高位设为1。<BR>kd> ? 0141e020+80000000<BR>?
0141e020+80000000<BR>Evaluate expression: -2126389216 = 8141e020<BR>//
注意这里转换得到的直接是对象指针(对象体指针)。<BR><BR>// 用 !object 命令获得这个对象的信息<BR>kd> !object
8141e020<BR>!object 8141e020<BR>Object: 8141e020 Type: (814524e0)
Process<BR>ObjectHeader: 8141e008<BR>HandleCount: 2 PointerCount: 36<BR>//
是进程类型的对象,我们可以用 !process 命令获得这个进程的信息<BR><BR>kd> !process 8141e020
0<BR>!process 8141e020 0<BR>PROCESS 8141e020 SessionId: 0 Cid: 0008 Peb:
00000000 ParentCid: 0000<BR>DirBase: 00030000 ObjectTable: 81452a68
TableSize: 108.<BR>Image: System<BR><BR>进程信息显示是 PID 为 8 的 System
进程。<BR>我们通过PID在 PspCidTable 中,找到了该PID的进程对象。<BR><BR>我们可以算出地址 e1004808 处的
HANDLE_TABLE_ENTRY 对应的句柄值为 0x4。<BR>我们看看 e1004808 处的 HANDLE_TABLE_ENTRY
找到的对象的句柄值(PID 或者 ThreadID)是否为0x4。<BR><BR>// 转换成对象指针<BR>kd> ?
0141eda0+80000000<BR>? 0141eda0+80000000<BR>Evaluate expression:
-2126385760 = 8141eda0<BR><BR>// 用 !object 命令分析<BR>kd> !object
8141eda0<BR>!object 8141eda0<BR>Object: 8141eda0 Type: (814523e0)
Thread<BR>ObjectHeader: 8141ed88<BR>HandleCount: 0 PointerCount: 3<BR>//
是一个 Thread 类型对象<BR><BR>// 用 !thread 命令分析<BR>kd> !thread 8141eda0
0<BR>!thread 8141eda0 0<BR>THREAD 8141eda0 Cid 8.4 Teb: 00000000
Win32Thread: 00000000 WAIT<BR>// Cid 8.4 说明 ThreadID 为 0x4 。线程所在进程 PID 为
0x8 。
<P>
<P>欢迎交流,欢迎交朋友,<BR>欢迎访问 <A
href="http://jiurl.yeah.net/">http://jiurl.yeah.net/</A> <A
href="http://jiurl.cosoft.org.cn/forum">http://jiurl.cosoft.org.cn/forum</A>
<P>
<P>
<P>
<P>
<P> </P></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -