能力值:
( LV5,RANK:60 )
|
-
-
2 楼
lkd> u KiFastCallEntry
nt!KiFastCallEntry:
804de88f b923000000 mov ecx,23h
804de894 6a30 push 30h
804de896 0fa1 pop fs
804de898 8ed9 mov ds,cx
804de89a 8ec1 mov es,cx
804de89c 648b0d40000000 mov ecx,dword ptr fs:[40h]
804de8a3 8b6104 mov esp,dword ptr [ecx+4]
804de8a6 6a23 push 23h
lkd> dd KiFastCallEntry
804de88f 000023b9 0f306a00 8ed98ea1 0d8b64c1
804de89f 00000040 6a04618b 6a9c5223 08c28302
804de8af 244c809d 1b6a0201 030435ff 006affdf
804de8bf 57565355 1c1d8b64 6a000000 24b38b3b
804de8cf ff000001 ff03c733 8bffffff 016a186e
804de8df 8148ec83 00029ced 4086c600 01000001
804de8ef 850fec3b ffffff65 002c6583 ff2c46f6
804de8ff 0134ae89 850f0000 fffffe35 8b605d8b
搜索特征码,或者找找看看有什么导出的函数调用KiFastCallEntry
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
搜索特征码的方法示例如下:
ULONG ntosknlBase;
ULONG ntosknlEndAddr;
//获取模块开始和结束地址
void GetKernelModuleBaseEnd()
{
NTSTATUS ntStatus;
ULONG size;
PULONG buf;
PSYSTEM_MODULE_INFORMATION pSystemModule;
ZwQuerySystemInformation(SystemModuleInformation, &size, 0, &size);
if( NULL == (buf = (PULONG)ExAllocatePool(PagedPool, size)) )
{
DbgPrint("failed alloc memory failed \n");
return ;
}
ntStatus = ZwQuerySystemInformation( SystemModuleInformation, buf, size , 0 );
if( !NT_SUCCESS(ntStatus) )
{
DbgPrint("failed query\n");
return ;
}
pSystemModule = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);
ntosknlBase = (ULONG)pSystemModule->Base;
ntosknlEndAddr = (ULONG)pSystemModule->Base + (ULONG)pSystemModule->Size;
ExFreePool(buf);
}
//通过内存搜索定位未导出的PspTerminateProcess地址
PVOID XPGetPspTerminateProcess()
{
ULONG i;
ULONG retAddr;
for( i=ntosknlBase; i<=ntosknlEndAddr; i++ )
{
if ( (*((ULONG *)(i+ 0)) == 0x8b55ff8b ) &&
(*((ULONG *)(i+ 4)) == 0xa16456ec ) &&
(*((ULONG *)(i+ 8)) == 0x00000124 ) &&
(*((ULONG *)(i+12)) == 0x3b08758b ) )
{
retAddr = i;
DbgPrint("PspTerminateProcess() adress is (805c88e6):%x", retAddr);
return (PVOID)retAddr;
}
}
return NULL;
}
PHANDLE_TABLE pPspCidTable = NULL;
第二种方法的示例:
//通过搜索PsLookupProces**yProcessId函数,获取PspCidTable的地址
ULONG GetPspCidTable()
{
PUCHAR Buff;
PUCHAR p;
UNICODE_STRING usPsLookup;
ULONG pPspCidTable;
RtlInitUnicodeString (&usPsLookup,
L"PsLookupProces**yProcessId");
Buff = (PUCHAR)MmGetSystemRoutineAddress(&usPsLookup);
for( p=Buff; p < Buff+PAGE_SIZE; p++ )
{
if( MmIsAddressValid( (PVOID)p ) )
{
if((*(PUSHORT)p == 0x35ff ) && (*(p+6) == 0xe8 ))
{
pPspCidTable = *(PULONG)( p + 2 );
break;
}
}
}
DbgPrint("PspCidTable(XPSP2:8055a560) = 0x%08X\n", pPspCidTable);
return pPspCidTable ? pPspCidTable : 0;
}
|
能力值:
( LV12,RANK:600 )
|
-
-
4 楼
特征码搜索整个内核空间不好用。。。移植性不好。。。最好由导出的搜没导出的。。因为一般这些接口不变。。搜索相对稳定。。另外PspCidTable不用搜就可以直接获取。。好像是那个PSOBJECTYPE一个偏移获得。。。
|
能力值:
( LV8,RANK:130 )
|
-
-
5 楼
嗯~0xffdff034
好像是一个叫Opc0de的发现的。
|
|
|