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就是第五個):

這個東西對應的內容就是段描述符了,所有的段暫存器內容都在裡面。