-
-
[求助]KiFastCallEntry计算入口处疑惑
-
发表于:
2013-8-10 18:59
4184
-
[求助]KiFastCallEntry计算入口处疑惑
原本是想挖掘进r0的bug,分析KiFastCallEntry到这处有些不懂了。
/* eax=Service Number
esi=Current_KThread */
KiSystemServiceRepeat: mov edi,eax
804de934 c1ef08 shr edi,8
804de937 83e730 and edi,30h
804de93a 8bcf mov ecx,edi
lkd>
nt!KiFastCallEntry+0x99:
804de93c 03bee0000000 add edi,dword ptr [esi+0E0h]
804de942 8bd8 mov ebx,eax
804de944 25ff0f0000 and eax,0FFFh
804de949 3b4708 cmp eax,dword ptr [edi+8]
804de94c 0f8330fdffff jae nt!KiBBTUnexpectedRange (804de682) //jmp if cf=0
804de952 83f910 cmp ecx,10h
804de955 751b jne nt!KiFastCallEntry+0xcf (804de972)
804de957 648b0d18000000 mov ecx,dword ptr fs:[18h]
typedef struct _SYSTEM_SERVICE_TABLE
{
PVOID ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfService;
ULONG ParamTableBase;
}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
SYSTEM_SERVICE_TABLE ntoskrnel;
SYSTEM_SERVICE_TABLE win32k;
SYSTEM_SERVICE_TABLE Unknown1;
SYSTEM_SERVICE_TABLE Unknown2;
}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE
这个函数在wrk虽是份asm,但根据它的的表述,猜想思路大概是:
1.eax/256(右移8位),位于后获得需要的SERVICE_TABLE偏移(30h限制了最大得到4)
2.edi = KThread->ServiceTable+得到的偏移 = 所需SYSTEM_SERVICE_TABLE
3.将ax最高位清除,说是分离出序号,每1000h为一个SERVICE_TABLE( 1000h / 256 / sizeof(SYSTEM_SERVICE_TABLE) )
4.cmp eax,[Service_MaxNumber],不小于或负数则尝试转为GUI线程,仍不符合就过掉。
现问题有:
1.转换到GUI线程执行除了因为ServiceTable不同,还有什么原因?貌似不存在恢复线程的代码。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)