Windows核心基礎知識-2-段描述符
比如:
ES 002B 0(FFFFFFFF)
意思就是es段暫存器,段選擇子/段選擇符 為002B,
起始地址base為0,
限制範圍Limit地址最大能尋找的長度為:FFFFFFFF,表示的是一個範圍。從.base到最後最長的地址的相對值。
簡單來說就是偏移地址的範圍。地址=段暫存器基址base+偏移地址,這個limit可以理解為偏移地址的範圍
可以看到所有的段暫存器除了FS別的都是一樣的。
獲取段暫存器的資訊:
如果你正常在除錯,用什麼WinDbg這種工具,就只能看到的是段選擇子,不會有後面的什麼基址,偏移地址範圍這種東西。
段暫存器這麼多資訊存放在了哪裡?
破案了,段暫存器的一堆屬性都存放在了一張表裡,可以理解為是一個數組,一個QWORD型別陣列
通過段選擇子來獲取段暫存器資訊
只有段選擇子是公佈出來了的,所以直接通過它來找資訊了。
段選擇子的結構體:
RPL:請求特權級別(Request Privilege Level),就是請求訪問者所使用的許可權級別。
TI:這個標誌位決定要去什麼表裡查詢資料:0表示GDT表,1表示LDT表
GDT表:可以認為是一個數組,元素為QWORD(64位)大小
Index:資料所在表的索引
例子:
這裡來獲取一下es的內容
es = 23 ==00100 0 11
拆下來就是 :
RPL=11
TI=0
索引值=00100 = (D)4(十進位制的4)
gtd表的首地址儲存在gdtr暫存器裡面,同理ldt也是。gdtr和ldtr並不是真正是暫存器,只是一個虛擬的。
在WinDbg裡面檢視gdtr的內容:
檢視索引為4的內容(索引為4就是第五個):
這個東西對應的內容就是段描述符了,所有的段暫存器內容都在裡面。