[系統底層] x86和x64下ssdt的差別

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下須要進行計算。

相關文章
相關標籤/搜索