首页
社区
课程
招聘
[求助]Win2003 ShadowSSDT HOOK过程中出现的问题,求解
发表于: 2010-8-13 11:07 5689

[求助]Win2003 ShadowSSDT HOOK过程中出现的问题,求解

2010-8-13 11:07
5689
ShadowSSDT HOOK。

代码在XP系统下测试,没有出现任何问题。
可是,Win2003 Server下,问题多多。

未开始Attach CSRSS前,用ProbeForRead&ProbeForWrite判断表的可读写性,返回信息:的确不可读写。
后面开始出现问题。。。
问题一:KeAttachProcess在Win2003的虚拟机下,返回失败!在Win2003的实系统下,返回成功。(测试结果:貌似这个失败信息是假的。为什么呢?OK,我们忽略它的返回值)。
问题二:虚拟机在KeAttachProcess返回失败的情况下,再用ProbeForRead&ProbeForWrite判断表的可读写性,还是不可读写。但是,如果直接返回,而不KeDetachProcess的话,在操作系统关闭时,会蓝屏!(这好像证明了,Attach已经成功了。经测试,其实目标已经可读写了。为什么ProbeForRead&ProbeForWrite还是抛出异常呢?)
问题三:在Win2003 Server的真实系统下,我已经使用了MmMapLockedPages等来锁定目标,但是,依然不行,蓝屏。非得设置CR0才行。可是虚拟机里却不用设置CR0。怎么解释?
(注:虚拟机干净无任何杀软等)

求牛人解释!

inline	bool	Crackit(void* mem,unsigned char* crackcode,size_t len)
	{
#ifdef	_RING0
	PMDL pMDL = MmCreateMdl(NULL,mem,len);
	if (pMDL == NULL)	return	false;
	MmBuildMdlForNonPagedPool(pMDL);
	pMDL->MdlFlags = pMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA | MDL_WRITE_OPERATION;
	void* Mem = MmMapLockedPages(pMDL,KernelMode);
	if (Mem == NULL)	return	false;

	RtlCopyMemory(mem,crackcode,len);

	MmUnmapLockedPages(Mem,pMDL);
	IoFreeMdl(pMDL);
#else
	if(!WriteProcessMemory((HANDLE)-1,(LPVOID)mem,(LPCVOID)crackcode,len,0))	return	false;
#endif
	return true;
	}

unsigned long	SSDT_HOOK(size_t SerNo,unsigned long Function)
	{
	if(Function==0)return 0;
	bool NeedAttach = (SerNo>0x1000);

	PSERVICE_DESCRIPTOR_TABLE	SSDT = (PSERVICE_DESCRIPTOR_TABLE)&KeServiceDescriptorTable;
	if(SerNo>0x1000)
		{
		SSDT = (PSERVICE_DESCRIPTOR_TABLE)GetAddressOfShadowTable();
		++SSDT;
		SerNo-=0x1000;
		}

	DbgPrint("SSDT:%x\n",SSDT);
	unsigned long* lpstb = (unsigned long*)SSDT->ServiceTableBase;

	DbgPrint("lpstb:%x\n",lpstb);
	DbgPrint("SerNo:%x\n",SerNo);

	if(SerNo > SSDT->NumberOfService)
		return 0;
	if(NeedAttach)
		{
		NeedAttach = false;
		__try
			{
			ProbeForRead(lpstb,SSDT->NumberOfService*sizeUL,sizeUL);
			}
		__except(EXCEPTION_EXECUTE_HANDLER)
			{
			DbgPrint("SSDT表不可读!");
			NeedAttach = true;
			}
		__try
			{
			ProbeForWrite(lpstb,SSDT->NumberOfService*sizeUL,sizeUL);
			}
		__except(EXCEPTION_EXECUTE_HANDLER)
			{
			DbgPrint("SSDT表不可写!");
			NeedAttach = true;
			}
		}

	if(NeedAttach)
		{
		DbgPrint("Attach csrss!");
		PEPROCESS crsEProc;
		NTSTATUS status;
		status = PsLookupProcessByProcessId((ULONG)GetProcessPid("csrss.exe"),&crsEProc);
		if (!NT_SUCCESS(status))
			{
			DbgPrint("PsLookupProcessByProcessId失败!");
			return 0;
			}
		KeAttachProcess(crsEProc);
		__try
			{
			unsigned long rets = lpstb[SerNo];
			lpstb[SerNo] = rets;
			}
		__except(EXCEPTION_EXECUTE_HANDLER)
			{
			DbgPrint("SSDT表依然不可读写!");
			KeDetachProcess();
			return 0;
			}
		}

	DbgPrint("rets:%x\n",lpstb[SerNo]);
	unsigned long rets = lpstb[SerNo];
	if(!Crackit(&lpstb[SerNo],(unsigned char*)&Function,sizeUL))
		return 0;
	if(NeedAttach)	KeDetachProcess();
	return rets;
	}

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
一天过去了,无人作答
好心人请为我答疑解惑罢
2010-8-14 09:22
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
弄懂probeforxx的用处再用把。。。。这个不是用来检查R0 内存的
2010-8-15 14:25
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
同楼上~~~
2010-8-15 14:47
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
学习。。。

另外,楼上两位还未解答我问题一 与 问题三 呢。还望再次答疑。。。
2010-8-15 22:42
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
同样关注!
2010-8-17 04:58
0
游客
登录 | 注册 方可回帖
返回
//