在寫一個查看windows 內核資源的程序時,發現10號索引項既不是段描述符也不是門描述符且內容一直在改變,故想知道其中保存了什麼內容。windows
環境說明:windows10 x64 1903函數
上圖中標紅線的項即爲10號索引項。測試
在gdt表10號索引項所在地址設置硬件寫斷點spa
通過屢次運行測試,發現一直中斷在nt!SwapContext+0x3cb附近。3d
中斷時環境調試
觸發硬件中斷時,執行的指令在中斷位置的上一條指令。code
mov rcx,qword ptr [rbx-180h]
分析這條指令可知,rcx指向GDTBase。rax中保存着要設置的值。只要找到rax中的值,就能夠知道此位置設置了什麼值。blog
搜索rbx所在內存區間以及rbx-180h,懷疑多是指向prcb的地址索引
經過!prcb指令能夠發現猜測正確。內存
根據邏輯發現,只要找到rsi指向什麼地方,就能夠知道在rax設置了什麼值
在ida pro 中 查看SwapContext函數定義
查看交叉引用,發現KiSwapContext調用此函數。
從SwapContext函數的第四個參數,發現rsi指向ethread結構
動態調試rsi和ethread的值相等也驗證了ida pro 中的結論。
在ida pro 中將相關結構補齊,分析相關邏輯可知 若是用戶層是32位程序,則將teb的低32地址加0x2000後保存在gdt 目標位置。,若是是64位程序,則將_EPROCESS.UserFsBase的低32位保存在目標位置。