SSDT表与ShadowSSDT表
實際上內核中存在兩個系統服務描述符表,一個是KeServiceDescriptorTable(由ntoskrnl.exe導出);,一個是KeServieDescriptorTableShadow(沒有導出)。
KeServieDescriptorTableShadow不但包含了ntoskrnel項,而且還包含了win32k項,而KeServiceDescriptorTable僅僅包含一個ntoskrnel項。
內核中有2套函數 ,zw,nt,nt才是真正的執行函數,zw只是一個過渡函數,(可用ida察看ntoskrnl.exe得知)
SSDT:主要處理 Kernel32.dll中的系統調用,如openProcess,ReadFile等,主要在ntoskrnl.exe中實現(微軟有給出 ntoskrnl源代碼)
ShadowSSDT:
1.主要處理,user32.dll,GDI32.dll中調用的函數,如postMessage,SendMessage,FindWindow,主要在win32k.sys中實現.(微軟未給出win32k代碼)
2.需要注意的是shadowSSDT并未導出,可用ida在win32k.sys中的導出表搜索,且結構與ssdt相似,但是不能通過windbg dd命令查看值
3.ShadowSSDT表只能在GUI(即有界面的程序進程)環境下才有值,故我們需要調用KeAttachProcess來切換到GUI線程里。
4.用windbg 命令 .process 861ff020 ?(861ff020 ?是通過 命令 !process 0 0得到的)切換到GUI線程上下文
? ? 過程:1)(輸入windbg命令 ) !process 0 0得到其中一個有 圖形界面的程序
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(數據如下)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PROCESS 861ff020 ?SessionId: 0 ?Cid: 0b58 ? ?Peb: 7ffde000 ?ParentCid: 05e4
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DirBase: 10080380 ?ObjectTable: e1dd2808 ?HandleCount: ?73.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Image: windbg.exe
? ? 2) ?(輸入命令)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?lkd> .process 861ff020 ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Implicit process is now 861ff020
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(切換成功 )
? ? 3) 切換成功后,使用dd KeServiceDescriptorTableShadow即可得到該表數據,否則無法得到,得到數據如下
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lkd> dd KeServiceDescriptorTableShadow
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553f60 ?80502b8c 00000000 0000011c 80503000--〉SSDT
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553f70 ?bf999b80 00000000 0000029b ?bf99a890 --〉ShadowSSDT
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553f80 ?00000000 00000000 00000000 00000000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553f90 ?00000000 00000000 00000000 00000000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553fa0 ?80502b8c 00000000 0000011c 80503000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553fb0 ?00000000 00000000 00000000 00000000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553fc0 ?00000000 00000000 00000000 00000000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?80553fd0 ?00000000 00000000 00000000 00000000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?其實KeServiceDescriptorTableShadow 包含4個系統服務表,但是我們只用前2個(SSDT,ShadowSSDT)
? ? 4) 總結:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1) ShadowSSDT在KeServiceDescriptorTableShadow[1]中,而KeServiceDescriptorTableShadow[0]為ssdt
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)如果要查看win32k服務,必須要切換到GUI線程上下文
5.如何得到ShadowSSDT地址:在insight source中可查詢到wrk中有KeAddSystemServiceTable函數,里面有對KeServiceDescriptorTableShadow 的調用
思路:利用搜索特征碼的方式搜索KeAddSystemServiceTable,取出KeServiceDescriptorTableShadow?
?
總結
以上是生活随笔為你收集整理的SSDT表与ShadowSSDT表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一道暴力枚举题Win32版本示例
- 下一篇: Vim编辑器的基本使用和三种模式