windows核心分析索引目錄:
gdt表與段描述符
一、介紹
如果之前學習過「實模式」,那很明白「段」的意義,在實模式中採用「段+偏移」的機制定址。
現在,我們使用「保護模式」,記憶體對於我們來說是平坦的。此時,"段"對於我們來說,還有什麼意義呢?
這時,"段"相當於乙個管理者的角色,它有自己的base,但往往從0開始計算,這時,更多的充當自己的許可權功能。
「每個段」可以儲存在暫存器中,比如你訪問區域性變數,其記憶體位址為 [a],其實際訪問是 sp:[a],雖然不同的段base都為0開始,但許可權是不同的,零環的段是不允許被三環的許可權訪問的。
二、段選擇子 與 gdt表
我們在實際使用過程中直觀的看到段?答案是通過段暫存器(fs···)。
段暫存器中儲存的是什麼呢(顯然不是段描述符)?實際上儲存的是 段選擇子。
段選擇子指明了該指明:讀取段申請的許可權、查哪一張表、在表中的索引位置。(注意,不要誤解段選擇子只表明位置)
1. 拆分段選擇子:
我們檢視暫存器時會發現各種段暫存器的值,我們使用如下方式進行拆分:如果想獲取段選擇子,直接右移3位,selector >> 3。
2. 搜尋 gdt 表:
gdt表全程 global descriptor table,段描述符表。
其儲存在 gdtr 暫存器中,我們在windbg中使用 "r gdtr" 即可獲取該位址。
然後我們採用 dq address (乙個段選擇子四字,八字節) 來顯示 gdt 表,如果知道索引想直接檢視其位址,可以使用 dq address + (index * 8) 的公式來進行搜尋。
三、段描述符的拆分
這個我們只挑幾個重點講,後續會補充其細節和有關實驗。
1. 段限長的換算公式
我們注意到,其段限長為 [0,15]、[24,31],但是如何仔細一看,其明顯是24位,少了8位。
這時,我們用到g位(23),顆粒度。
如果 g == 1 , 其顆粒度為 一頁,以4kb為單位,4kb。 4kb = 2 ^ 12 = 0x1000,但是,其是從零開始計數的,則應該後補 0xfff。
如果 g == 0,則直接為原來的數值就好。
2. p位、s位與type位
p位:0 - 無效段 、 1 - 有效段。(檢視該段是否有效,最直接的就是檢視該位)
s位:0 - 系統段、1 - **段或資料段。
type位:如果s位==1,則type位進一步詳解其**段或資料段的有關屬性(可讀可寫可執行等等)。
如下圖,乙個直觀判斷到底是**段還是資料段的方法:type <= 7 資料段 ; type >= 8 **段。
3. d/b位
該位對於資料段和**段有著不同的含義,但大體都是與位數大小有關。比如,如果我們使用32位作業系統,一次操作32位,又如何切換到對16位的操作,根本上就是使用這個位。
1)**段:在32位作業系統下,如果db == 1,則預設運算元是32位,如果操作16位時,其會加上字首指令66。
(66 50 push ax / 50 push eax)
2)資料段:該段作用與不同的資料段其含義不同。
(1)ss段:db == 0 ,使用16位暫存器 sp; db == 1,使用32位暫存器 esp。
(2) ds、es、gs、fs:表示界限(limit),db == 0 ,limit 64kb;db == 1,limit 0xffffffff。
4. 段許可權檢查
1)三個概念:
(1)rpl(request privilege level) 請求特權級別,段選擇子的後兩位。
(2)dpl(descriptor privilege level) 段描述特權級別,13位與14位。
(3)cpl(current privilege level)當前特權級別,當前工作在cs\ss段的rpl。
2)許可權檢查:
簡單解釋下上面的概念就很好理解,像 mov ,eax,3bh ; mov ds,eax 。 這種就會進行有關段許可權檢查,如果不通過賦值會失敗。
首先,cpl表示當前工作的環境(0環或3環),如果cpl為3環,其段選擇子後兩位不可能為0(不用訪問,請求都請求不了)。
而即使你生成請求,其還會和段描述符中的dpl校驗,如果校驗不通過,你依然無法生成。
gdt描述 GDT描述符表
一直以來,在直流電源埠的雷擊保護器件的選型方面,人們會選擇壓敏電阻mov,但是,由於壓敏電阻mov在失效時會引 災,而選擇常規氣體放電管gdt又會帶來續流問題,因此,結合壓敏電阻和氣體放電管兩種器件便成了電源埠的雷擊保護問題的完美解決方案。壓敏電阻器與氣體放電管串聯,在不影響壓敏保護水平的前提下,可...
gdt描述 GDT詳解(全域性描述符表)
gdt詳解 全域性描述符表 字型大小 小 中 大 在protected mode下,乙個重要的必不可少的資料結構就是gdt global descriptor table 為什麼要有gdt?我們首先考慮一下在real mode下的程式設計模型 在real mode下,我們對乙個記憶體位址的訪問是通過...
gdt描述 全域性描述符表(GDT)詳解
在protected mode下,乙個重要的必不可少的資料結構就是gdt global descriptor table 為什麼要有gdt real mode程式設計模型 我們首先考慮一下在real mode下的程式設計模型 在real mode下,我們對乙個記憶體位址的訪問是通過segment o...