ULONG GetShadowTableAddress()
{
ULONG dwordatbyte,i;
PUCHAR p = (PUCHAR) KeAddSystemServiceTable;
for(i = 0; i < PAGE_SIZE; i++, p++)// 往下找一页 指针递增1
{
__try
{
dwordatbyte = *(PULONG)p;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return FALSE;
}
if(MmIsAddressValid((PVOID)dwordatbyte))
{
if(memcmp((PVOID)dwordatbyte, KeServiceDescriptorTable, 16) == 0)//对比前16字节 相同则找到
{
if((PVOID)dwordatbyte == KeServiceDescriptorTable)//排除自己
{
continue;
}
return dwordatbyte;
}
}
}
return FALSE;
}
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;函数功能:寻找SSSDT的基地址 :
;原理:KeServiceDescriptorTable和KeServiceDescriptorTableShadow在同页:
;两表前面的ntoskrnl的SYSTEM_SERVICE_TABLE相同,不同的是后面win32k :
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
GetSSSDTAddress proc uses ecx
LOCAL dwordatbyte
call KeAddSystemServiceTable
mov eax ,dwordatbyte
xor ecx,ecx
.while ecx < PAGE_SIZE
invoke MmIsAddressValid ,dwordatbyte
.if eax ;检查连接的指针是否有效
invoke memcmp,dwordatbyte, KeServiceDescriptorTable, sizeof SYSTEM_SERVICE_TABLE
.if eax==0 ;对比前16字节 相同则找到
.if dwordatbyte == KeServiceDescriptorTable ;排除自己
.continue ;跳过本次循环
.endif
mov eax,dwordatbyte
.endif
.endif
add dwordatbyte ,1
inc ecx
.endw
xor eax,eax
ret
GetSSSDTAddress endp
这个是寻找SSSDT的基地址得过程
其中红色标注的部分 是予值操作还是调用操作?
也就是下面这句:
p=(unsigned char *)KeAddSystemServiceTable;
我想是预置操作吧,我用call 直接蓝屏
大家帮我看看,我理解有错吗?谢谢
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)