2020年9月3日 星期四

Windows SSDT(System Service Descriptor Table)簡單介紹

SSDT(System Service Descriptor Table)是Windows kernel非常重要的結構,一般應用層(Application layer)在調用API時,會透過DLL(Dynamic-link library)來完成它,不過最後還是必須要讓核心層(Kernel layer)的API來實作,因此會使用INT 0x2E中斷指令來調用SSDT裡面的API,所以這樣就能不讓應用層接觸到核心層的記憶體又能告訴核心層來完成此功能的運作,接下來我們就來分析SSDT的架構。


一、尋找SSDT起始位址

使用指令dd nt!KeServiceDescriptorTable來查看SSDT起始位址,其中0x83e7b6f0就是它的起始位址,0x191是SSDT裡所有API的數量。


二、Kernel API

這些API是運行在核心層,因此我們稱它為Kernel API,利用dps 83e7b6f0 L191來檢視Kernel API所在的位址和對應的名稱,例如nt!NtAdjustPrivilegesToken的起始運行位址為0x84010875。



另外我們也可以使用u nt!NtAdjustPrivilegesToken,這樣也能顯示它運行的起始位址。



三、利用IDA分析

在分析大量的程式碼,通常會搭配IDA來使用,因此我們如果要分析核心層的程式碼,可以在路徑C:\Windows\System32\ntoskrnl.exe,將ntoskrnl.exe拖曳到IDA。

打開IDA後,點擊Exports尋找要分析的Kernel API (NtAdjustPrivilegesToken)。



在Exports找到的Kernel API (NtAdjustPrivilegesToken),然後按滑鼠左鍵2下,就能快速找到要分析的程式碼。