列舉SSDT 系統服務表中的函式位址

2021-07-25 18:37:34 字數 2623 閱讀 7593

網上關於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 檢...