每個程序擁有4G的空間是假的 不是真實存在的 當你使用某個空間的時候 作業系統會把你的資料存儲到實體記憶體中
- 實體位址
指令
Mov eax,dword ptr ds:[0x12345678]
其中 0x12345678是有效位址
Ds.base+0x12345678是線性位址
通常情況下 有效位址 == 線性位址 因為ds.base是0
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHLSlnN1gXa0UTS2IWNzcVW2kkNiVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxSUhxGatJGbwhFT1Y0Mk9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLmZTYwYTM1UmN4kTZ1czNiJGMxQjZiZGNyQ2NzgjN3gzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
當cpu執行如上指令的時候 會把線性位址轉換成實體位址
32位cpu 10 10 12 分頁
從2 9 9 12 轉換成10 10 12 cmd運作
BCDEdit /set PAE ForceDisable
BCDEdit /set NX AlwaysOff
在重新開機電腦
測試程式
拖到虛拟機裡運作 此位址為線性位址 需轉換成實體位址
0x010b7b30 拆分成10-10-12這種形式
頁目錄表索引(第一級):00 0000 0100
頁表索引(第二級):00 1011 0111
頁索引(實體頁):1011 0011 0000
Cr3寄存器 是唯一一個存儲了實體位址的寄存器
找哪個程序的實體位址 就要找哪個程序的CR3 我們使用windbg 加載 符号之後,通過!process指令能夠檢視程序得資訊 DirBase就是cr3的位址
檢視此時的cr3還是系統程序的 需要切換到我們的程序
.process /i 86761d40 可以将目前的環境切換到這個程序
切換進來之後,才能夠看到這個位址中的資料。
此時的cr3才是我們程序的cr3
頁目錄表索引(第一級):0000000100(4)
頁表索引(第二級):00 1011 0111(b7)
頁索引(實體頁):1011 0011 0000(b30)
檢視頁目錄表 查找第四項 公式48c49000(數組首位址) + 4(下标)*4(類型)
而0x4863a867 的前20位才是頁目錄項位址偏移 也就是0x4863a000
0x4863a000+b7*4也就找到了實體頁的偏移的位址
0x5b30b025前20位 0x5b30b000 + b30
Cr3指向頁目錄表(PDT) 大小為4096(4kb)個位元組 每個成員是4位元組 也就是說有1024個成員這1024個成員叫PDE 他又指向頁表(PTT)大小也是4096(4kb)個位元組 也有1024個成員 每個成員叫PTE 他又指向一個實體頁 大小也是4096(4kb)位元組 才是真正存儲資料的
為什麼虛拟位址要分成10-10-12????
是因為頁目錄表和頁表大小為4kb(4096位元組) 1024個成員 需要2的10次方二進制位才能表示(因為有下标即可) 實體頁4096大小則需要2的12次方
- PTE可以沒有實體頁,且隻能對應一個實體頁
- 多個PTE頁可指向同一個實體頁
PDE 和 PTE的屬性
實體頁的屬性=PDE屬性& PTE屬性
P位:是否有效位
注意:當PDE或PTE中有一個的屬性P=0時,實體頁就是無效的
R/W位:讀寫位
R/W=0:隻讀
R/W=1:可讀可寫
U/S位:權限位
U/S=0:特權使用者
U/S=1:普通使用者
PS位:PDE特有
PS == PageSize
PS=1:PDE直接指向實體頁,低22位=頁内偏移,偏移最大值為4MB,俗稱"大頁"
PS=0:PDE指向PTE
A位:通路位
A=1:該PDE/PTE被通路過
A=0:該PDE/PTE未被通路過
D 位 – 是否被寫入,CPU 會在寫入頁面時将該位置 1,但不會清除,隻有軟體可以将 D 位複位
PWT – 頁表緩沖寫入機制,為 0 表示 write-back 模式,更新頁表緩沖區時,隻标記為已更新,不同步寫記憶體,隻有被新進入的資料取代時才更新到記憶體,為 1 表示 write-through 模式,更新頁表緩沖區時,同步寫記憶體,保證緩沖區與記憶體一緻
32位cpu 2 9 9 12 分頁
10-10-12分頁方式實體位址最多可達4GB,無法滿足要求,是以設計了新的分頁方式也就是2-9-9-12分頁方式 又稱PAE(實體位址擴充)分頁
10-10-12 改為 2-9-9-12
BCDEdit /set PAE ForceEnable
BCDEdit /set NX AlwaysOn
PDPTE
結構圖:
P位:第0位,有效位 永遠為1
Avail:這部分供作業系統軟體随意使用,CPU不使用
第一部分:高四位元組32~35位
第二部分:低4位元組12~31位
這兩部分加起來共24位,後12位補0
灰色部分:保留位
PDE
結構圖:
PAT位:頁屬性表
隻有當PS=1時,PAT位才是有意義的(頁屬性表隻針對頁)
具體含義這裡不作介紹,感興趣的同學可以查閱資料
PTE
結構圖:
注意:
- PTE中12~35位是實體頁基址,低12位補0
- 實體頁基址+12位頁内偏移指向具體資料
找到字元串
A17BD8 拆分二進制
00 0 0000 0101 0 0001 0111 1011 1101 1000
PDPTE:0
PDE:5
PTE:17
實體頁:BD8
使用!process 0 0周遊程序
指令 .process /i 0x87d0f030切換到我們的程序 直接運作 再檢視cr3是否相等
通過指令!dq cr3+8*0檢視PDPTE
通過指令!dq 5ed38000+8*5檢視PDE
通過指令!db 45cfc000+BD8檢視實體頁