[系统底层] x86和x64下ssdt的差异
2019獨角獸企業重金招聘Python工程師標準>>>
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下需要進行計算。
轉載于:https://my.oschina.net/u/1777508/blog/1930801
總結
以上是生活随笔為你收集整理的[系统底层] x86和x64下ssdt的差异的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 德国科技公司 Sono 放弃生产太阳能汽
- 下一篇: 延江股份主要经营什么