https://www.cnblogs.com/kuangke/p/5761615.html
一、PspCidTable概述
PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同:
1.PspCidTable中存放的对象是系统中所有的进程线程对象,其索引就是PID和TID。
2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER)。
3.PspCidTable是一个独立的句柄表,而每个进程私有的句柄表以一个双链连接起来。
注意访问对象时要掩掉低三位,每个进程私有的句柄表是双链连接起来的,实际上ZwQuerySystemInformation枚举系统句柄时就是走的这条双链,隐藏进程的话,这条链也是要断掉的~~在遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程时,还要把隐藏进程的句柄表从链表中摘去。
二、寻找一个进程句柄
接下来找下全局句柄表PspCidTable
目标进程ID是6108
换算成索引号:6108/4=0x5F7
已知一张表存放的数据是0x1000/0x10=0x100个
这个索引明显大于0x100,故算出在第几张表:
在0x5F7/0x100=5,所以在第五张表里(第一个表是0)的0xF7项,每一项的大小是0x10字节
也就是ffffc886`b10fd000+F7*0X10
1: kd> DQ ffffc886`b10fd000+F7*0X10
ffffc886`b10fdf70 85096a16`5080f1d3 00000000`00000000
ffffc886`b10fdf80 85096ac4`7080ffe1 00000000`00000000
ffffc886`b10fdf90 85096941`e0800001 00000000`00000000
ffffc886`b10fdfa0 00000000`00000000 ffffc886`af1f9aa0
ffffc886`b10fdfb0 85096973`80800001 00000000`00000000
ffffc886`b10fdfc0 00000000`00000000 ffffc886`aacb6750
ffffc886`b10fdfd0 00000000`00000000 ffffc886`affff870
ffffc886`b10fdfe0 8509699b`d080fff9 00000000`00000000
win10需要换算才能得到真正的对象地址
(85096a165080f1d3>>16)&FFFF000000000000=FFFF85096A165080(全局句柄表直接指向对象,
和程序句柄表不一样,不需要加上_object_header的大小)
kd> dt _eprocess FFFF85096A165080
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x438 ProcessLock : _EX_PUSH_LOCK
+0x440 UniqueProcessId : 0x00000000`000017dc Void ***和截图PID一致***
+0x448 ActiveProcessLinks : _LIST_ENTRY [ 0xffff8509`6ac4a6c8 - 0xffff8509`6a18b4c8 ]
+0x458 RundownProtect : _EX_RUNDOWN_REF
+0x460 Flags2 : 0xd094
+0x460 JobNotReallyActive : 0y0
+0x460 AccountingFolded : 0y0
+0x460 NewProcessReported : 0y1
+0x460 ExitProcessReported : 0y0
+0x460 ReportCommitChanges : 0y1
+0x460 LastReportMemory : 0y0
+0x460 ForceWakeCharge : 0y0
+0x460 CrossSessionCreate : 0y1
+0x460 NeedsHandleRundown : 0y0
+0x460 RefTraceEnabled : 0y0
....
+0x5a8 ImageFileName : [15] "RuntimeBroker." ***只能显示十五字节的进程名***
+0x5b7 PriorityClass : 0x2 ''
+0x5b8 SecurityPort : (null)