關於對windows10 x64環境下gdt表10號索引項內容的探究

0x00背景

 

在寫一個查看windows 內核資源的程序時,發現10號索引項既不是段描述符也不是門描述符且內容一直在改變,故想知道其中保存了什麼內容。windows

環境說明:windows10 x64 1903函數

上圖中標紅線的項即爲10號索引項。測試

 

 0x01 過程

在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 中的結論。

0x03結論

在ida pro 中將相關結構補齊,分析相關邏輯可知 若是用戶層是32位程序,則將teb的低32地址加0x2000後保存在gdt 目標位置。,若是是64位程序,則將_EPROCESS.UserFsBase的低32位保存在目標位置。

相關文章
相關標籤/搜索