X86和x64下ssdt的差別函數
首先介紹一下SSDT相關的結構體指針
PVOID無類型指針,x86下32位,x64下64位blog
結構體索引
typedef struct _SYSTEM_SERVICE_TABLE{ip
PVOID ServiceTableBase;im
PVOID ServiceCounterTableBase;call
ULONGLONG NumberOfServices;d3
PVOID ParamTableBase;數據
} SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;db
看一下對應關係
在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下須要進行計算。