Windows保護模式學習筆記(六)—— 10-10-12分頁
-
- 基本概念
-
- 4GB記憶體空間
- 有效位址-線性位址-實體位址
-
- 有效位址與線性位址
- 實體位址
- 控制寄存器:Cr3
- 10-10-12分頁
-
- 實驗:通過線性位址找到實體位址
-
- 第一步:将XP虛拟機設定為10-10-12分頁模式
- 第二步:建立一個記事本,寫入"Hello World"
- 第三步:使用Cheat Engine附加程序
- 第四步:找到"Hello World"的線性位址
- 第五步:将線性位址拆分為10-10-12三組比特組
- 第六步:獲得程序的Cr3
- 第七步:通過Cr3找到字元串的實體位址
-
- 第一層
- 第二層
- 第三層
基本概念
4GB記憶體空間
大家可能都聽說過,每個程式在運作時,作業系統都會為其配置設定一段4GB的記憶體空間。
但是我們的記憶體容量很可能最多隻夠為一個程序配置設定4GB的記憶體空間,如何做到為每個程序都配置設定呢?
實際上,程序被配置設定到的“4GB記憶體空間”隻是虛拟的的記憶體空間,并不是指真正意義上的實體記憶體,虛拟記憶體與實體記憶體之間有一層轉換關系。

有效位址-線性位址-實體位址
有效位址與線性位址
先看如下指令:
MOV eax,dword ptr ds:[0x12345678]
其中,0x12345678 是有效位址
ds.Base + 0x12345678 是線性位址
注意:當段寄存器的Base為0時,有效位址=線性位址,大多數時候都是如此;但也有特殊情況,比如fs段寄存器的Base不為0
實體位址
描述:
我們平時所用到的系統DLL(動态連結庫)存在于實體位址中,當程式想要調用某個DLL時,DLL便會映射一份線性位址給程式,這樣程式就能夠通過線性位址找到DLL的實體位址
控制寄存器:Cr3
描述:
每個程序都有一個Cr3(準确的說是都有一個Cr3的值,Cr3本身是個寄存器,一個核,隻有一套寄存器)
Cr3指向一個實體頁,一共4096位元組
有關Cr3結構部分将在下一篇詳細說明,這裡隻引入基本概念(實驗需要)
10-10-12分頁
實驗:通過線性位址找到實體位址
第一步:将XP虛拟機設定為10-10-12分頁模式
右鍵→我的電腦→屬性→進階
将noexecute改為execute,儲存,重新開機即可
第二步:建立一個記事本,寫入"Hello World"
第三步:使用Cheat Engine附加程序
第四步:找到"Hello World"的線性位址
搜尋字元串的時候别忘了勾上Unicode
可以看到左邊出現了兩個結果,我們可以在記事本中将最後的字元’d’改成’m’來确認哪個才是真正的線性位址
線性位址最終确定為:
06765140
第五步:将線性位址拆分為10-10-12三組比特組
0 6 7 6 5 140
=
0000 0110 0111 0110 0101 140
=
0000011001 // 0x19
1101100101 // 0x365
140 // 12個比特位剛好三個位元組
第六步:獲得程序的Cr3
在WinDbg中輸入指令:
!process 0 0
DirBase的值就是Cr3
第七步:通過Cr3找到字元串的實體位址
注意:
- 找第一層和第二層的時候要将索引* 4(每個位址占4個位元組)
- 每找到一層都要将位址後三位屬性位清零再繼續找下一層
第一層
第二層
第三層
使用db指令以字元形式檢視
實驗成功!