RT: 为什么我从 KeServiceDescriptorTableShadow 表里通过序号获取的函数地址都是KeServiceDescriptorTable表里相同序号的函数
KeServiceDescriptorTableShadow:FFFFF800040AE9C0 //
ShadowSSDT 地址
NtUserGetForegroundWindow:FFFFF800041191C0 //ShadowSSDT 里的60号函数,该地址是错误的。
可以看出来,KeServiceDescriptorTableShadow 表地址获取到了的
1: kd> u FFFFF800040AE9C0
nt!KeServiceDescriptorTableShadow:
fffff800`040ae9c0 003a add byte ptr [rdx],bh
fffff800`040ae9c2 e703 out 3,eax
fffff800`040ae9c4 00f8 add al,bh
fffff800`040ae9c6 ff ???
fffff800`040ae9c7 ff00 inc dword ptr [rax]
fffff800`040ae9c9 0000 add byte ptr [rax],al
fffff800`040ae9cb 0000 add byte ptr [rax],al
fffff800`040ae9cd 0000 add byte ptr [rax],al
1: kd> u FFFFF800041191C0
nt!NtReadVirtualMemory:
//问题就在这里
fffff800`041191c0 488bc4 mov rax,rsp
fffff800`041191c3 48895808 mov qword ptr [rax+8],rbx
fffff800`041191c7 48897010 mov qword ptr [rax+10h],rsi
fffff800`041191cb 48897818 mov qword ptr [rax+18h],rdi
fffff800`041191cf 4c896020 mov qword ptr [rax+20h],r12
fffff800`041191d3 4155 push r13
fffff800`041191d5 4156 push r14
fffff800`041191d7 4157 push r15
//问题就在这里,明明应该获取NtUserGetForegroundWindow 函数 ,怎么就获取到了NtReadVirtualMemory ,后来我发现
NtReadVirtualMemory 函数是ssdt里面的60号函数,并不是sssdt里面的,怎么就窜了频道???
我是通过以下方式获取的:
ULONG64 GetShadowSSDTEntry(ULONG64 KeServiceShadow, ULONG64 Index)
{
ULONG64 W32pServiceTable = 0, qwTemp = 0;
LONG dwTemp = 0;
PSYSTEM_SERVICE_DESCRIPTOR_TABLE pWin32k;
pWin32k = (PSYSTEM_SERVICE_DESCRIPTOR_TABLE)(KeServiceShadow + sizeof(PSYSTEM_SERVICE_DESCRIPTOR_TABLE)); //sizeof(SYSTEM_SERVICE_TABLE)
W32pServiceTable = (ULONG64)(pWin32k->ServiceTableBase);
qwTemp = W32pServiceTable + 4 * (Index - 0x1000);
dwTemp = *(PLONG)qwTemp;
dwTemp = dwTemp >> 4;
qwTemp = W32pServiceTable + (LONG64)dwTemp;
return qwTemp;
}
NtUserGetForegroundWindow
= GetShadowSSDTEntry (
Shadow 表地址,函数序号);
GetShadowSSDTEntry ()
获取到的地址:
FFFFF800041191C0 也就是
nt!NtReadVirtualMemory
KeServiceDescriptorTableShadow 地址绝对是正确的,序号也没错比如60号我用的0x103C
在WIN7 X64下以前还好好的,就是前几天更新了最新补丁就不行了,哪位大神研究下给个方案
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!