windows 核心資料結構 x64

2021-10-11 16:19:57 字數 1683 閱讀 2355

核心物件

分類:dispatcher:   kprocess、ktherad、kevent、ktimer、kqueue、kmutex…

i/o:   driver_object、device_object、file_object、irp、vpb、kprofile….

other :   eprocess、ethread…

eprocess & ethread

存在於系統核心空間

每個程序對應乙個eprocess

每個程序對應乙個ethread

eprocess、ethread通過雙向鍊錶組織管理.

eprocess包含kprocess , kprocess有指向etherad的指標,ethread包含ktherad

r3通過遍歷eprocess鍊錶獲取程序列表

非核心物件

teb & peb

每個程序都有peb

每個執行緒(系統執行緒除外)都有teb

存在於使用者位址空間

tebfs:[0]指向teb

teb結構開頭是nt_tib結構

nt_tib結構0x30偏移指向當前結構,也就是teb結構體的開頭

teb結構0x60偏移指向peb

pebfs:[60] 向peb

eprocess中記錄peb位址

peb結構0x2偏移 -> uchar beingdebugged  為1 程序被除錯,為0 程序未被除錯

windbg

dt _nt_tib -> 檢視nt_tib結構資訊

dt _teb -> 檢視teb結構資訊

dt _peb -> 檢視peb結構資訊

!teb -> 檢視使用者空間teb的資訊

eprocess & ethread & teb & peb

eprocess  ->  ethread \ peb

ethread  -> teb  -> peb

eprocess有指標指向ethread和peb,ethread有指標指向teb,teb有指標指向peb

ssdt (system services descriptor table 系統服務描述符表)

核心名稱 keservicedescriptortable

結構體 servicedescriptorentry

匯入方法 __declspec(dllimport) servciedescriptortableentry_t keservicedescriptortable;

函式位址計算:

x86: funcaddr = keservicedescriptortable + 4 x index

根據索引直接可獲得函式位址

x64: funcaddr = ( [keservicedescriptortable + 4 x index] ) >> 4 + keservicedescriptortable  

根據索引獲得的是 (函式位址對應ssdt表基址的偏移量) x 16 即偏移量左移4位

核心中有兩個ssdt -> keservicedescriptortable(由ntoskrnl.exe匯出)  keservicedescriptortableshadow(沒有匯出)

keservicedescriptortable:僅包含 ntoskrnl

keservicedescriptortableshadow: 包含ntoskrnl 和 win32k

核心資料結構

關於開發驅動重要的核心資料結構,方便自己理解 driver object typedef struct driver object cshort type cshort size 乙個鍊錶,記錄了該驅動建立的所有裝置物件 pdevice object deiceobject ulong flags ...

核心資料結構

核心需要儲存i o元件使用的狀態資訊,可以通過若干核心資料結構比如說檔案開啟表等來完成 unix系統中在讀取乙個使用者檔案的時候,核心需要去檢查下快取,然後再去決定是否執行磁碟i o,在讀乙個程序映象時候,核心只需要從記憶體當中讀取資料,也就是說這些操作都可以呼叫read 函式來完成,但是語義不同 ...

核心資料結構

這部分包含了修改核心模組,所以要使用到核心鏈結表資料結構。首先你得定義乙個包含元素的結構去插入鍊錶。下邊這段 用c語言定義了生日結構 struct birthday 注意struct list head list。結構list head在包含目錄的裡有定義。它的作用就是嵌入包含列表節點的鏈結表。li...