首页
社区
课程
招聘
[求助]KsBinSword中一段代码的疑惑
发表于: 2009-2-27 10:23 4008

[求助]KsBinSword中一段代码的疑惑

2009-2-27 10:23
4008
IsValidProcess函数中通过PspCidTable搜索进程的代码有一处不能理解
如下

	//对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进行遍历?
另外if(i<=0x800)又是什么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
0x4e1c不知道是为什么,我个人觉得好像不用这么大,以PspCidTable的NextHandleNeedingPool为上界就可以了。0x800是一级表所能表示的最大的句柄值,这需要你对Windows句柄表格式有一定了解
2009-2-27 10:48
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第二个问题我明白了
一级句柄表最多容纳
LOWLEVEL_COUNT * HANDLE_VALUE_INC = 0x800个句柄

但是如下图 是我曾经截过的图



pid = 0x2340c 这个进程岂不搜不到?

另外 这段代码似乎没有处理三层表
上传的附件:
2009-2-27 11:08
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
PspCidTable虽然理论上可以达到三层表,事实上由于系统资源的限制,在PspCidTable膨胀到三级表之前你可能已经耗光了系统资源而无法再创建新的进线程了,所以二级表足矣,不需考虑三级表
2009-2-27 11:15
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
你那个pid确实太BT了,汗一个…你可以观察一下此时PspCidTable的NextHandleNeedingPool域值为多少
2009-2-27 11:21
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
0x4e1c貌似是老外提出来的值 哈哈
2009-2-27 11:26
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
BlackLight里面用到了一个跟这个相近的值。我倒是很想知道0x4e1c这个值是怎么来的,另外我觉得以NextHandleNeedingPool作为句柄表的句柄上界来判断应该是没问题的,M$自己就这么干的
2009-2-27 11:32
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在网上搜索了一下 0x4e1c可能就是BlackLight提出来的
采用所谓的PID爆破检测进程
2009-2-27 11:53
0
游客
登录 | 注册 方可回帖
返回
//