網上關於ssdt的有很多的部落格可以參考,我就不囉嗦了直接上碼
#include //ssdt服務表中,各項對應的函式名稱,@num 代表引數*4的大小
char* funcname = ;
typedef struct _ksystem_service_tableksystem_service_table, *pksystem_service_table;
typedef struct _kservice_table_descriptorkservice_table_descriptor, *pkservice_table_descriptor;
//核心匯出keservicedescriptortable指標,結構如上,
extern pkservice_table_descriptor keservicedescriptortable;
//用於列舉核心模組所用的結構體
typedef struct _ldr_data_table_entryldr_data_table_entry, *pldr_data_table_entry;
//顯示給定位址所在的核心模組,返回該模組的punicode_string形式的 名稱
punicode_string findkernelmodule(pdriver_object pdriverobj, ulong funcaddr)
} plist = plist->flink;
} while (plist != pstartlist);
return null;
}void driverunload(pdriver_object pdriverobj)
//dbgview中列印ssdt系統服務表中資料
void showntoskrnlssdtfunc(pdriver_object pdriverobj)
為什麼還有這篇的存在呢?只為總結下一些資料容易忽略掉的2個方面,方便今後查閱:
typedef struct _ksystem_service_tableksystem_service_table, *pksystem_service_table;
typedef struct _kservice_table_descriptorkservice_table_descriptor, *pkservice_table_descriptor;
//核心匯出keservicedescriptortable指標,結構如上,
extern pkservice_table_descriptor keservicedescriptortable;
如上 keservicedescriptortable是 指向64 byte 大小的結構體 ,而不是 4*4,16byte大小的結構體,明白這個,對shaddowssdt的認識,也有很大的作用
因為keservicedescriptortableshaddow也是同樣 64byte 大小的結構體的指標,只不過,它沒有被匯出,而keservicedescriptortable被ntoskrnl.exe匯出了
servicetablebase指向的位址是傳說中的ssdt服務函式的位址,那麼,位址和服務函式名稱是如何做到的呢?
這個是本篇的關鍵
【正文】
ntdll.dll 中有這些服務函式的樁函式,形式如下
mov eax, index
mov edx, 7ffe0300h
call dword ptr [edx]
下兩句都是重複的,用ida byte序列搜尋 對應的 16進製制 ba 00 03 fe 7f ff 12
pchunter上的資料
經過對比發現,搜尋得到的樁函式,是一句 index 從小到大 逐一增加 排布的,這樣就可以直接在ida 上覆制貼上了,而不用苦逼的手打了。。。
附加:shaddow ssdt中的名稱如何得到?
如此,上述搜尋,ssdt只有284專案,(32bit-xp sp3),而有 shaddow ssdt 上667專案(pchunter上顯示),你可能聽說過kernel32.dll的函式走ntdll.dll,而user32.dll, gdi32.dll 直接與win32k.sys通訊,那麼按照之前的序列搜尋,user32.dll 和 gdi32.dll 你可能 發現數量對不上,而且,都錯號的,難不成要我,乙個乙個的手打?還要忍受數量不齊(約差 3,40個 ),有什麼辦法,得到,這些服務的名稱呢?
用ida 載入 win32.sys並 鏈結到 微軟符號伺服器上,文字搜尋 w32pservicetable
根據偏移算算個數 (c6ec-bc80)/4 = 667 ,專案和pchunter中一樣
ssdt函式索引號 乙個獲取系統服務索引號的小工具
好久沒寫部落格了,最近想抽點時間補上之前的東西,有些東西要記錄下來,以後看了會覺得很有意思。這個小工具沒有什麼可以說的,直接vc編譯連線就可以用了。下面附上 include stdio.h include int main printf 請輸入要獲得索引號的函式的名稱 n char apiname ...
Windows系統呼叫中的系統服務表
windows核心分析索引目錄 windows系統呼叫中的系統服務表 如果這部分不理解,可以檢視 windows核心分析索引目錄依次閱讀。我們在之前講過系統呼叫過程中,給予eax乙個編號,作業系統通過這個編號來執行某個核心函式。這個函式是通過作業系統的系統服務表來查詢的。現在,我們來 一下nt ki...
Linux中的系統服務系統服務
系統服務的控制 1.systemd 系統初始化程式,系統開始的第乙個程序,pid為1 2.systemctl 命令 systemctl list units 列出當前系統服務的狀態 systemctl list unit files 列出服務的開機狀態 systemctl status sshd 檢...