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下需要进行计算。
|