在 windows 中 保護模式 有兩種模式: 段保護 和 頁保護web
段保護 主要體如今 段選擇子上;可是數據段、代碼段、棧段等採用的都是4GB平坦模式,段的特徵並無那樣展示。因此具體的保護機制 採用的是頁保護。windows
頁保護 有兩種:ide
非 PAE測試
PAEspa
在 boot.ini 中 設置:爲 noexcute -- 即不可執行 ;激活 DEP 的功能 -在這個時候 使用的是 PAE(由於早期的非PAE 並不支持數據執行保護);3d
選擇 爲 execute -optin 後 這裏的 數據執行保護 是灰色的 根本就不能設置。這時候 就是 非 PAE 模式下。相反 就是 PAE 模式下。orm
注意: 內核地址中 專門有一塊卻與用來存放 pte表、pde 表的 非pae 是 4MB , pae 因爲每項是8byte 因此變爲 8MB;blog
這裏 假設一個虛擬地址 0x403018 則:進程
獲取測試進程的cr3ci
> !process 0 0 // 獲取當前進程列表,找到測試進程的 dirbase = cr3
解析虛擬地址 0x403018
> .formats 0x403018 // 查看二進制
而後手動分解 pdpte pde pte offset :
---// 00 000000010 000000011 000000011000
---// 0 2 3 18
結合windbg 找對應的物理地址:
找 pdpte 中的項 pde 的地址
cr3 + 8*0
找 pde 中的項 pte 的地址
pde + 2*8
找 pte 中 頁的地址
pte + 3*8
頁的 地址 + offset 即 是 目標物理地址
p + 18
如圖:
/i 進程調度的時候 切換 進程到指定進程:
g 運行起來 激活 調度;以致於到目標進程的時候停下來
查看 當前進程 的 cr3
使用 db 查看這時候進程空間 虛擬地址 數據
使用 windbg 解析 虛擬地址對應的物理地址:
!vtop 有兩個參數
第一個對應的是 cr3
第二個參數 是 對應進程的虛擬地址。
使用 !pte 0xaddr 查看對應addr 中的頁屬性(前提:必須切換到當前進程,cr3也須要切換到,即 !process 0 0; .process /i xxxxx;g;)
經過下面這兩個公式 解析出所在的 pde 、pte
修改pte 屬性,關閉dep