windbg查看SSDT表
SSDT,System Services Descriptor Table,系統服務描述符表。
見此
? ? https://blog.csdn.net/bcbobo21cn/article/details/52083557
這個表就是一個把ring3的Win32 API和ring0的內核函數聯系起來。SSDT包含一個龐大的地址索引表,它還包含著一些其它有用的信息,諸如地址索引的基地址、服務函數個數等。
SSDT定義為下面結構體;
? ? typedef struct _SYSTEM_SERVICE_TABLE{};
?
進入Windbg,使用如下的命令,即可查看到SSDT表;
? ? lkd> dd KeServiceDescriptorTable
? ? 8055ab80 ?804e3d20 00000000 0000011c 804d9f48
? ? 8055ab90 ?00000000 00000000 00000000 00000000
? ? 8055aba0 ?00000000 00000000 00000000 00000000
? ? 8055abb0 ?00000000 00000000 00000000 00000000?
?
為什么輸入 dd KeServiceDescriptorTable 可以查看到SSDT表?
d命令是查看某地址所儲存的數據;
db/dw/dd/dq/dD/df
不同在于所顯示的數據長度;
db顯示一字節的長度;
dw顯示兩字節的長度;
dd顯示四字節的長度;
dq顯示八字節的長度;
dD 顯示double實數(8字節的長度);
df 顯示float實數(4字節的長度);
dd后面跟的應該是個地址;此處跟的是 KeServiceDescriptorTable ,那么就是Windbg自己轉換了;
在windbg.exe中就看得比較清楚,KeServiceDescriptorTable中就只有第一項有數據,其他都是0。
其中804e3d20是KeServiceDescriptorTable.ntoskrnel.ServiceTableBase,服務函數個數為0x11c個。
再看804e3d20地址里是什么東西:
? ? lkd> dd 804e3d20
? ? 804e3d20 ?80587691 805716ef 8057ab71 80581b5c
? ? 804e3d30 ?80599ff7 80637b80 80639d05 80639d4e
? ? 804e3d40 ?8057741c 8064855b 80637347 80599539
? ? 804e3d50 ?8062f4ec 8057a98c 8059155e 8062661f
? ? 如上,80587691 805716ef 8057ab71 80581b5c 這些就是系統服務函數的地址了。
?
Win32 進程4GB的虛擬地址空間結構如下;00000000-7FFFFFFF為用戶空間,80000000-FFFFFFFF為系統空間;
顯示的系統服務函數地址在80000000之上,這就對了;
那么目前看來,dd KeServiceDescriptorTable 此命令,并非直接看到內核中的SSDT,看到的是映射到進程虛擬地址空間中的SSDT;
總結
以上是生活随笔為你收集整理的windbg查看SSDT表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ const成员Demo - Wi
- 下一篇: 一道暴力枚举题Win32版本示例