0x00背景
在寫一個查看windows 內核資源的程式時,發現10號索引項既不是段描述符也不是門描述符且內容一直在改變,故想知道其中保存了什么內容,
環境說明:windows10 x64 1903

上圖中標紅線的項即為10號索引項,
0x01 程序

在gdt表10號索引項所在地址設定硬體寫斷點

經過多次運行測驗,發現一直中斷在nt!SwapContext+0x3cb附近,

中斷時環境

觸發硬體中斷時,執行的指令在中斷位置的上一條指令,
mov rcx,qword ptr [rbx-180h]
分析這條指令可知,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位保存在目標位置,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/233.html
標籤:Windows
