antidetection中出现一个小问题,导致驱动加载时蓝屏。
还是FindPsModuleList的问题。源码使用了Edgar Barbosa的文章Finding some non-exported kernel variables in Windows XP中提到的方法,对代码做了如下填充:
#if (_WIN32_WINNT == 0x0500) //windows 2000 ~by C0KE
pModuleListStart = *((PMODULE_ENTRY*)((DWORD)pDriverObject + PSLOADEDMODULE_OFFSET));
#else //windows XP and so on~ by C0KE
__asm {
mov eax, fs:[0x34]; // KdVersionBlock
mov eax, [eax+0x70]; // PsLoadedModuleList
mov pModuleListStart, eax;
}
#endif
通过debug发现, mov eax, [eax+0x70]是导致蓝屏的罪魁祸首。
由于函数是undocumente的,所以要准确定位函数的内核地址。由于是驱动做这件事情,所以可以采用tombkeeper (t0mbkeeper_at_hotmail.com)文章里曾提到fuzen_op(fuzen_op@yahoo.com)的方法,利用FU rootkit获取内核地址。通过_DRIVER_OBJECT找到DriverSection(偏移0x14)结构,向后遍历,找出PsLoadedModuleList.
PMODULE_ENTRY gul_PsLoadedModuleList = NULL;
#if (_WIN32_WINNT == 0x0500) //windows 2000 ~by C0KE
pModuleListStart = *((PMODULE_ENTRY*)((DWORD)pDriverObject + PSLOADEDMODULE_OFFSET));
#else //windows XP and so on~ by C0KE
pModuleListStart= *((PMODULE_ENTRY*)((DWORD)pDriverObject + 0x14));
if(pModuleListStart == NULL)
return 0;
gul_PsLoadedModuleList = pModuleListStart;
while((PMODULE_ENTRY)pModuleListStart->le_mod.Flink != gul_PsLoadedModuleList)
{
if((pModuleListStart->unkl == 0x00000000) &&
pModuleListStart->driver_Path.Length == 0)
return pModuleListStart;
}
#endif
貌似还是有一点点问题的,待以后再看看。