天天看點

核心-分頁

每個程序擁有4G的空間是假的 不是真實存在的 當你使用某個空間的時候 作業系統會把你的資料存儲到實體記憶體中

  1. 實體位址

指令

Mov eax,dword ptr ds:[0x12345678]

其中 0x12345678是有效位址

Ds.base+0x12345678是線性位址

通常情況下 有效位址 == 線性位址 因為ds.base是0

核心-分頁

 當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次方

  1. PTE可以沒有實體頁,且隻能對應一個實體頁
  2. 多個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

結構圖:

核心-分頁

注意:

  1. PTE中12~35位是實體頁基址,低12位補0
  2. 實體頁基址+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檢視實體頁

核心-分頁

繼續閱讀