-
-
[求助]Win2003 ShadowSSDT HOOK过程中出现的问题,求解
-
发表于:
2010-8-13 11:07
5689
-
[求助]Win2003 ShadowSSDT HOOK过程中出现的问题,求解
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解题方法汇总!