1. 程式人生 > 實用技巧 >FSD HOOK與SSDT HOOK恢復簡單思路

FSD HOOK與SSDT HOOK恢復簡單思路

FSD 解釋:
File System Driver檔案系統驅動程式,分為本地FSD和遠端FSD。 (1) 本地FSD:允許使用者訪問本地計算機上的資料 ——本地FSD負責向I/O管理器註冊自己,當開始訪問某個卷時,I/O管理器呼叫FSD來進行卷識別。 ——完成卷識別後,本地FSD建立一個裝置物件以表示所裝載的檔案系統。 ——I/O管理器通過卷引數塊(VPB)在儲存管理器建立的卷裝置物件和FSD建立的卷裝置物件之間建立連線。此連線將I/O管理器的I/O請求轉交給FSD裝置物件。 (2) 遠端FSD:允許使用者通過網路訪問遠端計算機上的資料。 由兩部分組成:客戶端FSD和伺服器端FSD。 ——客戶端FSD首先接收來自應用程式的I/O請求,並轉換為網路檔案系統
協議命令,然後通過網路傳送給伺服器端FSD。 ——伺服器端FSD監聽網路命令,接收網路檔案系統協議命令並轉交給本地FSD去執行。 (3) FSD與檔案系統操作 Windows檔案系統的有關操作都是通過FSD完成的: ——顯示檔案I/O:應用程式通過I/O介面函式如CreateFile,ReadFile,WriteFile等來訪問檔案。 ——快取記憶體延遲寫:此執行緒定期對快取記憶體中已被修改的頁面進行寫操作。 ——快取記憶體提前讀:此執行緒負責提前讀資料。 ——記憶體髒頁寫:此執行緒定期清洗緩衝區。 ——記憶體缺頁處理

-----------------------------------------------------------------------------------------

首先是FSDHOOK。

網上比較容易找到的是sudami對360superkiller的逆向,對映大小計算上好像有些錯誤。

這裡貼出我的想法,備忘:)

1.向ZwQuerySystemInformation傳遞11號引數,獲得SYSTEM_MODULE_INFORMATION結構,通過結構查詢ntfs和fastfat的基地址(lpModuleBase)。

2.通過指定路徑開啟ntfs.sys和fastfat.sys對應的磁碟檔案
L”\\SystemRoot\\system32\\drivers\\ntfs.sys”
L”\\SystemRoot\\system32\\drivers\\fastfat.sys”

3.根據PE格式獲得檔案中映象基地址(imageBase)

4.使用特徵碼搜尋ntfs.sys和fastfat.sys設定派遣路徑的指令。

用IDA反彙編ntfs.sys(fastfat.sys類似)見指令和對應的機器碼如下:
名稱:  fcbda6d3ccc66519960a16cd.jpg檢視次數: 1508檔案大小:  70.6 KB
esi指向DriverObject結構,指令字結構分別為

c746XXYYYYYYYY

c786XXXXXXXXYYYYYYYY(XX為esi的相對偏移,YY為真正的函式地址)

因此可以通過特徵搜尋此段指令:

名稱:  2.jpg檢視次數: 1499檔案大小:  39.3 KB

獲得指令後,根據上述結構分別獲取IRP派遣序號index和原始派遣函式地址addr。

在這裡真正index的計算方法如下:

名稱:  3.jpg檢視次數: 1493檔案大小:  12.5 KB
同時由於ntfs.sys實際載入的位置和pe檔案中儲存的位置不同,所以需要重定位:
名稱:  4.jpg檢視次數: 1494檔案大小:  5.8 KB

至此獲得了派遣函式的原始路徑。

5.使用ObReferenceObjectByName分別獲得

L”\\FileSystem\\Ntfs”

L”\\FileSystem\\Fastfat”

對應的驅動物件(DriverObject)。

將驅動物件中的派遣函式地址與從pe檔案讀取的地址進行比對,如果發現不同和進行修復。

-----------------------------------------------------------------------------------------

SSDTHOOK
1.確定windows所使用核心檔案時ntoskrnl.exe還是ntkrnlpa.exe。
當電腦記憶體大於512MB時windows開啟PAE使用ntkrnlpa.exe否則使用ntoskrnl.exe這裡並沒有考慮支援多核處理器的核心。
所以我們只要檢測PAE是否開啟就能確定核心檔名了。
當cr4暫存器的5bit置為時說明開啟了PAE。
名稱:  5.jpg檢視次數: 1506檔案大小:  39.1 KB

2.將核心檔案對映如記憶體,首地址為krnlImgBase。
3.向ZwQuerySystemInformation傳遞11號引數,得到SYSTEM_MODULE_INFORMATION結構陣列,遍歷陣列得到系統核心在記憶體中的基地址krnlBase。
4.根據PE格式解析對映到記憶體中的檔案,獲得原始SSDT。
方法是:首先獲得系統匯出的SSDT表地址,減去基地址後得到SSDT的RVA
名稱:  6.jpg檢視次數: 1494檔案大小:  20.1 KB

找出記憶體對映的核心檔案的節表。
搜尋SSDT的RVA處在檔案那哪個節中。
記憶體對映檔案的SSDT=SSDTRVA–所在節RVA+所在節RawOffset+krnlImgBase
名稱:  7.jpg檢視次數: 1494檔案大小:  55.8 KB

5.對比原始SSDT與當前SSDT內容,不同則替換。
這裡存在一個重定位問題需要注意。
程式碼如下:

名稱:  8.jpg檢視次數: 1498檔案大小:  40.1 KB


轉載於:https://blog.51cto.com/whatday/1382310