原理
PspCidTable:地址是一个结构体 HANDLE_TABLE—>TableCode指向一张全局句柄表。
TableCode:地址的低2位记录这个表是一级句柄表,还是二级或者三级;00表示一级,01表示二级,10表示3急;
如果是一级:那么TableCode指向的表直接是内核地址;
如果是二级:那么TableCode指向的是一个一个的句柄表地址,再由句柄表地址指向–>内核地址.
如果是三级:则一层一层下去。一般不会不存在三级。
示例
第一:用WINDBG先看下当前TableCode后二位来确定为几级句柄表
第二:利用PspCidTable来查找一下某进程的EPROCESS内核对象
Registry pid = 72;
先进行换算:72/4 = (10进制)18 =0x12(16进制)
第一:18/512 = 一级句柄表的索引;1页=4096字节/8 = 512项。
第二:拿到索引取一级句柄表下面地址;指向二级句柄表
第三:二级句柄表地址 + 0x12*0x10;每一项16字节
找到EPROCESS ->5a8处为进程名:
至此找到了该进程的EPROCESS内核对象
总结
下次用驱动程序来实现一遍。