首页
社区
课程
招聘
[求助]关于PspCidTable遍历进程
发表于: 2010-8-16 17:03 5320

[求助]关于PspCidTable遍历进程

2010-8-16 17:03
5320
近日学习PspCidTable,结合KsBinSword的代码
VOID IsValidProcess()
{
	ULONG PspCidTable;
	ULONG TableCode;
	ULONG table1,table2;
	ULONG object,objectheader;
	ULONG NextFreeTableEntry;
	ULONG processtype,type;
	ULONG flags;
	ULONG i;
	PspCidTable=GetCidAddr();
	processtype=GetProcessType();
	if(PspCidTable==0)
	{
		return ;
	}
	else
	{
		//TableCode的最后两位在XP中决定了句柄表的层数
		TableCode=*(PULONG)(*(PULONG)PspCidTable);
		if((TableCode&0x3)==0x0)
		{
			table1=TableCode;
			table2=0x0;
		}
		if((TableCode&0x3)==0x1)
		{
			TableCode=TableCode&0xfffffffc;
			table1=*(PULONG)TableCode;
			table2=*(PULONG)(TableCode+0x4);
		}
		//对cid从0x0到0x4e1c进行遍历
		for(i=0x0;i<0x4e1c;i++)
		{
			if(i<=0x800)
			{	
				if(MmIsAddressValid((PULONG)(table1+i*2)))
				{
					object=*(PULONG)(table1+i*2);
					if(MmIsAddressValid((PULONG)(table1+i*2+NEXTFREETABLEENTRY)))
					{
						NextFreeTableEntry=*(PULONG)(table1+i*2+NEXTFREETABLEENTRY);
				    	if(NextFreeTableEntry==0x0)//正常的_HANDLE_TABLE_ENTRY中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+FLAGS);
						    		if((flags&0xc)!=0xc)
						    		RecordInfo(object);//flags显示进程没有退出
								}
							}
						}
					}
				}
			}
			else
			{
				if(table2!=0)
				{
					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+FLAGS);
							    	    if((flags&0xc)!=0xc)
							        	RecordInfo(object);
									}
								}
							}
						}
					}
				}
			}
		}
	}
}


其中的
		//对cid从0x0到0x4e1c进行遍历
		for(i=0x0;i<0x4e1c;i++)
		{
			if(i<=0x800)

这个地方遍历方法我认为有些问题。

例如,如果句柄表只有一个,进程pid=0x5B8,那么它在表中的位置应该就是ulPspcidtableAddress + pid*2;
而pid*2 = 0xB70;
那么if语句将i与0x800比较的话不就跳过了这个进程么?

实在想不通,而且我windbg输入也没有输出这个进程。
望高手解答。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
使用ExEnumHandleTable就可以了,这样通用性强……
2010-8-16 19:21
0
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢大牛回复。。我就是想知道代码中那么做是不是漏掉了好多?
2010-8-16 21:30
0
雪    币: 410
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
4
一张句柄表大小为4k,每个句柄项为8字节。------》一张句柄表的句柄项=4k/8=512项,句柄号/进程id以4递增,所以一张句柄表的做大进程id=512*4=2048=0x800,超过0x800就在第二张表了。怎么会跳过呢??
2010-8-17 13:00
0
游客
登录 | 注册 方可回帖
返回
//