首页
社区
课程
招聘
[求助]为什么我从 KeServiceDescriptorTableShadow 表里通过序号获取的函数地址都是KeServiceDescriptorTable表里的函数
发表于: 2018-11-3 14:36 3125

[求助]为什么我从 KeServiceDescriptorTableShadow 表里通过序号获取的函数地址都是KeServiceDescriptorTable表里的函数

2018-11-3 14:36
3125
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下以前还好好的,就是前几天更新了最新补丁就不行了,哪位大神研究下给个方案



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 914
活跃值: (2433)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
2
你在说什么?
2018-11-3 16:36
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
[2][2] { [KeServiceDescriptorTable], [0] }, { [KeServiceDescriptorTable], [KeServiceDescriptorTableShadow] }
2018-11-3 18:25
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
问题已经找到了
2018-11-4 11:22
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢
2018-11-4 11:23
0
游客
登录 | 注册 方可回帖
返回
//