首页
社区
课程
招聘
[求助]怎么找不到pspcidtable?
发表于: 2009-2-26 18:17 4480

[求助]怎么找不到pspcidtable?

2009-2-26 18:17
4480
lkd> dd pspcidtable
805649c0  e1000c90 00000002 00000000 00000000
805649d0  00000000 00000000 00000000 00000000
805649e0  00000000 00000000 00000000 00000000
805649f0  00000000 00000000 00000000 00000000
80564a00  e2ab022f 00000000 00000000 00000000
80564a10  00000000 00000000 00000000 00000000
80564a20  00000001 00000000 00000000 00000000
80564a30  00000000 00000000 00000000 00000000
lkd> dt _handle_table e1000c90
nt!_HANDLE_TABLE
   +0x000 TableCode        : 0xe1031001
   +0x004 QuotaProcess     : (null)
   +0x008 UniqueProcessId  : (null)
   +0x00c HandleTableLock  : [4] _EX_PUSH_LOCK
   +0x01c HandleTableList  : _LIST_ENTRY [ 0xe1000cac - 0xe1000cac ]
   +0x024 HandleContentionEvent : _EX_PUSH_LOCK
   +0x028 DebugInfo        : (null)
   +0x02c ExtraInfoPages   : 0
   +0x030 FirstFree        : 0xe38
   +0x034 LastFree         : 0xba8
   +0x038 NextHandleNeedingPool : 0x1000
   +0x03c HandleCount      : 545
   +0x040 Flags            : 1
   +0x040 StrictFIFO       : 0y1
lkd> dd e1031001
e1031001  00e10050 00e103e0 00000000 00000000
e1031011  00000000 00000000 00000000 00000000
e1031021  00000000 00000000 00000000 00000000
e1031031  00000000 00000000 00000000 00000000
e1031041  00000000 00000000 00000000 00000000
e1031051  00000000 00000000 00000000 00000000
e1031061  00000000 00000000 00000000 00000000
e1031071  00000000 00000000 00000000 00000000

dd e1031001怎么没有所有进程和线程对象的地址啊?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
你先了解一下句柄表的结构再来研究PspCidTable吧。在你显示的数据中,现在是二级表,所以TableCode掩去低两位之后得到的地址里放的是一级表的指针,每个一级表里才放的是进线程对象。建议你先补一下基础知识,可以参考sudami的1文章,网上资料也很多
2009-2-26 18:42
0
雪    币: 252
活跃值: (13)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢教主。看了sudami的文章,但是我不懂if (i <= 0x800) { // 第一张表中  是什么得到的?

VOID
IsValidProcess ()
/*++

Author : 第8个男人
Leaner : sudami [xiao_rui_119@163.com]
Time : 08/02/15

参数 : NULL

返回 : NULL

功能 :
给出PspCidTable的地址,结合_EXHANDLE、HANDLE_TABLE、HANDLE_TABLE_ENTRY
搜索到每个进程对象,纪录之.
前提条件: 假设暂且PspCidTable没有被抹掉

--*/

{
ULONG PspCidTable;
ULONG TableCode;
ULONG table1,table2;
ULONG object,objectheader;
ULONG NextFreeTableEntry;
ULONG processtype,type;
ULONG flags;
ULONG i;

PspCidTable = GetCidAddr(); // 搜索PsLookupProcessByProcessId函中的特征串即可
processtype = GetProcessType();

if (PspCidTable == 0) {
return ;
} else { //TableCode的低2位决定句柄表的级数

TableCode = *(PULONG) ( *(PULONG) PspCidTable );

if ( (TableCode & 3) == 0 ) { // 0级
table1 = TableCode;
table2 = 0;
} else if ( (TableCode & 3 ) == 1 ) { // 1级
TableCode = TableCode & 0xfffffffc;
table1 = *(PULONG)TableCode;
table2 = *(PULONG)( TableCode + 4 );
}

// 对cid从0x0到0x4e1c进行遍历
for (i = 0; i < 0x4e1c; i++) {
if (i <= 0x800) { // 第一张表中
if (MmIsAddressValid( (PULONG)(table1 + i*2) )) {

// HANDLE_TABLE_ENTRY地址 + PID * 2 ---> 对象的地址
object = *(PULONG)( table1 + i*2 );
if (MmIsAddressValid( (PULONG)(table1 + i*2 + NEXTFREETABLEENTRY) )) {

// 验证HANDLE_TABLE_ENTRY的合法性,这在ExEnumHandleTable函数的代码中也有
// 正常的_HANDLE_TABLE_ENTRY中NextFreeTableEntry应该为0
NextFreeTableEntry = *(PULONG)(table1 + i*2 + NEXTFREETABLEENTRY);
if (NextFreeTableEntry == 0) {
// 去掉低3位掩码标志
object = ((object | 0x80000000) & 0xfffffff8); // 转换为对象(体)指针
objectheader = (ULONG) \
OBJECT_TO_OBJECT_HEADER(object); // 获取对象(头)指针

if (MmIsAddressValid( (PULONG)(objectheader + TYPE) )) {
type = *(PULONG)(objectheader + TYPE);
if (type == processtype) { // 是否为进程对象

flags = *(PULONG)( (ULONG)object + \
GetPlantformDependentInfo(OFFSET_EPROCESS_FLAGS) );
if ((flags&0xc) != 0xc)
RecordInfo( object ); //flags显示进程没有退出
}
}
}
}
}
} else { // 第2张表

if (table2 != 0) {
// 步骤同上,只是object的获取为: HANDLE_TABLE_ENTRY地址 + (PID- 0x800)*2
if (MmIsAddressValid( (PULONG)(table2 + (i - 0x800)*2) )) {
object = *(PULONG)(table2 + (i - 0x800)*2);
if (MmIsAddressValid((PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY))) {
NextFreeTableEntry=*(PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY);
if (NextFreeTableEntry==0x0) {
object = ((object | 0x80000000) & 0xfffffff8);
objectheader = (ULONG) OBJECT_TO_OBJECT_HEADER(object);
if (MmIsAddressValid( (PULONG)(objectheader + TYPE) )) {
type = *(PULONG)(objectheader + TYPE);

if(type == processtype) {
flags = *(PULONG) ((ULONG)object + \
GetPlantformDependentInfo(OFFSET_EPROCESS_FLAGS));
if ((flags&0xc) != 0xc)
RecordInfo(object);
}
}
}
}
}
}
}
}
}
}
2009-2-28 15:00
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
一个一级表的大小是一页即0x1000字节,而HANDLE_TABLE_ENTRY的大小为8字节,因此可存放的ENTRY个数为0x1000/8=0x200个,而句柄从0开始以4为步长递增,因此一级表的最大句柄为0x200*4=0x800
2009-2-28 15:55
0
雪    币: 2522
活跃值: (667)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
对这个不也不懂!!
在第一次遍历时还好理解!基址是table1
第二次时成了table1 + 2,遍历的结构不是Handle_Table_entry么,是8个字节,为什么不是
table+8呢??? 不懂!!!!!
2009-2-28 17:01
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
如果是二级表的话,表里放的就不是HANDLE_TABLE_ENTRY了,而是指向一级表的指针,当然不一样了
2009-2-28 17:35
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
建议把基础搞清除
句柄三级表
2009-6-1 11:52
0
游客
登录 | 注册 方可回帖
返回
//