X86和x64下ssdt的差异
首先介绍一下SSDT相关的结构体
PVOID无类型指针,x86下32位,x64下64位
结构体
typedef struct _SYSTEM_SERVICE_TABLE{
PVOID ServiceTableBase;
PVOID ServiceCounterTableBase;
ULONGLONG NumberOfServices;
PVOID ParamTableBase;
} SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;
看一下对应关系
在XP 32位下
WIN7 64位下
红黄蓝绿分别代码结构体中的四个成员。第三项为函数个数
这里用dp命令,以指针大小显示数据
dp KeServiceDescriptorTable
XP下
直接是函数的地址
Win7下
计算公式如下:
Ssdt为KeServiceDescriptorTable地址,Index为索引值
FunAddr =ssdt+(ssdt+4 * Index)>>4
以ntdll!NtOpenProcess为例计算验证一下
ntdll!NtOpenProcess 索引值为23h
Uf ntdll!NtOpenProcess 如下:
ntdll!ZwOpenProcess:
00000000`76df1510 4c8bd1 mov r10,rcx
00000000`76df1513 b823000000 mov eax,23h
00000000`76df1518 0f05 syscall
00000000`76df151a c3 ret
索引值为23h,ssdt地址 为fffff800`03ecd800
fffff800`03ecd800 + 4*23h=fffff800`03ECD88C
fffff800`03ECD88C 地址处的值为02d0bd00
右移四位 002d0bd0
加上基址 fffff800`03ecd800+002d0bd0 = fffff800`0419E3D0
看一下u fffff800`0419E3D0
确实是内核函数NtOpenProcess的地址。
总之,x86下的ssdt中的内核函数地址可以直接获得,x64下需要进行计算。