0x00背景
在寫一個檢視windows 核心資源的程式時,發現10号索引項既不是段描述符也不是門描述符且内容一直在改變,故想知道其中儲存了什麼内容。
環境說明:windows10 x64 1903

上圖中标紅線的項即為10号索引項。
0x01 過程
在gdt表10号索引項所在位址設定硬體寫斷點
經過多次運作測試,發現一直中斷在nt!SwapContext+0x3cb附近。
中斷時環境
觸發硬體中斷時,執行的指令在中斷位置的上一條指令。
分析這條指令可知,rcx指向GDTBase。rax中儲存着要設定的值。隻要找到rax中的值,就可以知道此位置設定了什麼值。
搜尋rbx所在記憶體區間以及rbx-180h,懷疑可能是指向prcb的位址
通過!prcb指令可以發現猜想正确。
根據邏輯發現,隻要找到rsi指向什麼地方,就可以知道在rax設定了什麼值
在ida pro 中 檢視SwapContext函數定義
檢視交叉引用,發現KiSwapContext調用此函數。
從SwapContext函數的第四個參數,發現rsi指向ethread結構
動态調試rsi和ethread的值相等也驗證了ida pro 中的結論。
0x03結論
在ida pro 中将相關結構補齊,分析相關邏輯可知 如果使用者層是32位程式,則将teb的低32位址加0x2000後儲存在gdt 目标位置。,如果是64位程式,則将_EPROCESS.UserFsBase的低32位儲存在目标位置。