核心物件
分類: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...