windows下分頁機(jī)制淺談-創(chuàng)新互聯(lián)

引子:
一直在研究惡意代碼方向與逆向軟件方向,面試聊了windows內(nèi)核與保護(hù)模式相關(guān)知識,有很多沒有回答上來,確實研究過相關(guān)資料,但是沒有深入研究,加上長時間沒有復(fù)習(xí),有些遺忘了
基本功不扎實,畢竟好久沒寫過驅(qū)動編程與復(fù)習(xí)內(nèi)核/保護(hù)模式相關(guān)的知識,所以靜下心來復(fù)習(xí)一下吧。

4GB的虛擬內(nèi)存結(jié)構(gòu):

創(chuàng)新互聯(lián)公司專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,聯(lián)通機(jī)房服務(wù)器托管,聯(lián)通機(jī)房服務(wù)器托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。
虛擬內(nèi)存地址范圍 描述
0x00000000~0x0000FFFF64kb大小的空指針區(qū)域,當(dāng)然就不可以訪問了
0x00001000~0x7FFFFFFF加上上述的空指針區(qū)域,低2GB的用戶態(tài)空間
0x80000000~0xFFFFFFFF高2GB的內(nèi)核態(tài)空間

更多的詳細(xì)劃分請參考這篇博客:https://blog.csdn.net/wang010366/article/details/52730052


一個進(jìn)程地址如何映射到物理地址的?
windows下分頁機(jī)制淺談
圖片一:映射關(guān)系
上述圖片只是片面的闡釋,一個虛擬內(nèi)存地址通過頁表轉(zhuǎn)換,映射到物理內(nèi)存地址,多個進(jìn)程其實都是通過這種機(jī)制映射到物理內(nèi)存。
windows下分頁機(jī)制淺談
圖片二:地址映射過程

圖片二是虛擬地址映射,注意:缺少了分頁的層級,頁表中每一項都是一個分頁。映射的物理地址過程如何實現(xiàn)的?先介紹Cr0系列的控制寄存器,面試的時候忘的一干二凈,那就在學(xué)一遍:

寄存器名稱 描述
CR0包含處理器標(biāo)志控制位,如PE,PG,WP等
CR1保留
CR2專門用于保存缺頁異常時的線性地址
CR3保存進(jìn)程頁目錄地址
CR4擴(kuò)展功能(如判斷物理地址擴(kuò)展模式等),Pentium系列(包括486的后期版本)處理器中才實現(xiàn)

windows下分頁機(jī)制淺談

圖片三:控制寄存器

?什么是PE,PG,WP呢?
1、PE:CR0寄存器的第0位,Protection Enable,啟用保護(hù)標(biāo)志。如果該位為1,開啟了保護(hù)模式,反之關(guān)閉,當(dāng)開啟保護(hù)模式的時候PE\PG都會置位。
2、PG:CR0寄存器的第31位,Paging,分頁標(biāo)志位。如果為1則開啟分頁機(jī)制,禁止分頁的話線性地址等同于物理地址,若開啟標(biāo)志位意味著需要開啟保護(hù)模式。
3、WP:CR0寄存器的第16位,Write Proctect,寫保護(hù)標(biāo)志。WP==1的時候意味著只讀頁面不可執(zhí)行寫操作,wp==0的時候意味著只讀頁面可執(zhí)行寫操作。


?CR3寄存器保存了每個進(jìn)程的頁目錄地址,什么叫做頁目錄呢?
Windows下開啟保護(hù)模式與分頁機(jī)制后,當(dāng)前CR0寄存器的屬性PE == 1 AND PG == 1,意味著進(jìn)程中的虛擬地址將通過頁表轉(zhuǎn)換映射相對應(yīng)的物理地址上,如圖二所示,我們手工的獲取來學(xué)習(xí):
首先介紹一下分頁機(jī)制其中一種記錄方式:

非物理地址擴(kuò)展模式 物理地址擴(kuò)展模式
非PAE模式PAE模式


PAE模式:Physical address extension,物理擴(kuò)展模式。能夠在32位操作系統(tǒng)訪問超過4GB尋址大小的模式,允許將最多64GB 的物理內(nèi)存用作常規(guī)的4 KB 頁面,并擴(kuò)展內(nèi)核能使用的位數(shù)以將物理內(nèi)存地址從32擴(kuò)展到36。
非PAE模式:在非物理擴(kuò)展模式下,32位大只能4GB所以,即使你有8G的內(nèi)存條,也是白費(fèi)。
那么在非PAE模式下,操作系統(tǒng)分頁機(jī)制如何實現(xiàn)的?每個分頁4kb,一共4GB的內(nèi)存,4194304KB大小也就是一共1048576個分頁,那么如何高效的管理這些分頁呢?

1024(PDT) × 1024(PTT) × 4096 = 4GB
1024(PTT) × 1024(PTE) × 4 = 4MB
1024(PDT) ×1024(PTE) = 1MB

如上述公式所示,就是通過這種方式來管理4GB的內(nèi)存分頁,PDT,PTT,PTE又是什么,如下所示

名稱 描述
頁目錄索引表(PDT)一級索引
頁表索引表(PTT)二級索引
頁表項(PTE)頁表項 PDT(1024項PDE),PTT(1024項PTE)

windows下分頁機(jī)制淺談
圖片四:地址解析

需要配合圖二一起理解,操作系統(tǒng)會通過CR3寄存器獲取當(dāng)前進(jìn)程的頁表目錄地址,然后根據(jù)虛擬地址拆分為10,10,12比例,找到頁目錄,找到頁表,然后找到分頁加上對應(yīng)的偏移(物理內(nèi)存),為了方便理解,當(dāng)然也是動手寫個小程序,在windbg下一探究竟。


?編寫測試代碼,如下所示:

int main()
{
    printf("虛擬地址:0x%X\n", "hello world");
    cout << "hello world" << endl;
    system("pause");
}

?編譯后拖入虛擬機(jī),開啟雙擊調(diào)試(測試環(huán)境win7 32位),運(yùn)行測試程序(不要關(guān)閉回車),windbg下輸入!process 0 0查看全部進(jìn)程及各部分說明,如下所示:
windows下分頁機(jī)制淺談
圖片五:雙擊調(diào)試
?上述進(jìn)程說明中我們看到DirBase地址,這個就是當(dāng)前進(jìn)程指向的頁目錄,我們看看到底對不對?需要明確的字段PROCESS 0x86ca5c18是EPROCESS的地址,輸入指令dt 0x86ca5c18 _EPROCESS來看一看,如下所示:
windows下分頁機(jī)制淺談

圖片六:EPROCESS
?一個進(jìn)程的頁目錄怎樣找?在CreateProcess的第二個階段,會初始化進(jìn)程的執(zhí)行體層EPROCESS數(shù)據(jù)結(jié)構(gòu)與微內(nèi)核層KPROCESS數(shù)據(jù)結(jié)構(gòu),系統(tǒng)DLL映像目標(biāo)用戶空間且初始化PEB操等等,來看_KPROCESS結(jié)構(gòu)+0x18字段是什么?如下所示:
windows下分頁機(jī)制淺談

圖片七:DirectoryTableBase

?通過上述_KPROCESS獲取了PDT的地址,與解析出來PDT數(shù)據(jù)一樣的。每當(dāng)CPU切片執(zhí)行進(jìn)程時候,CR3就會被系統(tǒng)切換,CR3是不是讀取當(dāng)前進(jìn)程DirectoryTableBase字段作為切換數(shù)值有待研究,看一看PDT也就是頁表轉(zhuǎn)換的第一層結(jié)構(gòu),如下所示:
windows下分頁機(jī)制淺談

圖片八:虛擬地址

?解釋兩個dd,因為這個以前也總是被同學(xué)問起,dd怎么啥東西都找不到,在windbg命令下,d系列命令只能查看虛擬地址, 查看物理地址需要使用!d系列命令,PDT是物理地址,如下所示:
windows下分頁機(jī)制淺談
windows下分頁機(jī)制淺談
圖片九:物理地址
?根據(jù)上述一些理論性知識,如圖九中所展示的每項便是頁表地址(物理地址),根據(jù)虛擬地址,測試是否能通過頁表轉(zhuǎn)換找到映射的物理存儲數(shù)據(jù),所以第二步中沒輸出字符串虛擬地址(圖是昨天的),重新來一下(已經(jīng)關(guān)閉了隨機(jī)基址),如下所示:
windows下分頁機(jī)制淺談
圖片十:輸出字符串在虛擬內(nèi)存地址
?根據(jù)圖片四把上述的虛擬地址進(jìn)行分割,如下所示:
windows下分頁機(jī)制淺談
圖片十一:虛擬地址轉(zhuǎn)換
?對應(yīng)的二進(jìn)制換算16進(jìn)制 (1 <--> 19 <--> B30),其中1代表是頁目錄表中的第一項,查看頁目錄表之前需要對地址頁目錄的PTE了解,如下所示:

?如上圖所示,低12位是屬性,高位是地址, 然后頁表索引是19,數(shù)組元素是保存的指針,需要乘以4字節(jié),如下所示:
windows下分頁機(jī)制淺談
圖片十二:頁表查找
?怎么什么都沒有,還記著我們上述說過,這一臺記錄方式PAE與非PAE,我們現(xiàn)在所處的環(huán)境究竟是怎樣,我們打開cmd,利用bcdedit命令,先做了解如下所示:
windows下分頁機(jī)制淺談
圖片十三:bcdedit

?修改當(dāng)前pae模式以及nx模式,pae我們知道是物理擴(kuò)展模式,nx是緩解機(jī)制,使某些內(nèi)存區(qū)域不可執(zhí)行,并使可執(zhí)行區(qū)域不可寫DEP,我們也要改為Always Off模式,如下所示:
windows下分頁機(jī)制淺談
修改指令如下:

名稱 關(guān)閉指令 開啟指令
PAEbcdedit /set pae ForceDisablebcdedir /set forceEnable
NXbcdedit /set nx AlwaysOffbcdedit /set nx OptIn

修改后屬性如下:
windows下分頁機(jī)制淺談
圖片十四:屬性調(diào)整
?重啟系統(tǒng)后,再次按照上述步驟查找具體的分頁數(shù)據(jù),如下所示:
windows下分頁機(jī)制淺談
圖片十五:非PAE下目錄表
?那么解析虛擬地址之后,如何通過也目錄找到具體頁表呢?我們需要了解一下頁目錄中的每一項PDE數(shù)據(jù),也就是指針如何分解的,如下所示:

windows下分頁機(jī)制淺談
圖片十六:頁表地址解析

?通過上圖所示,我們知道低位12位是屬性,高位才是地址,意味著我們只需要BaseAddress + 第幾項PTT × 4(指針大?。┚涂梢哉业较鄬Φ捻摫碇羔?,如下所示:
windows下分頁機(jī)制淺談
圖片十七:頁表

?找到了具體的頁表地址,也就是0x342f6025,加上具體的偏移(虛擬地址分解出的低12位)就可以找到映射的物理內(nèi)存數(shù)據(jù)保存,當(dāng)然地址還是要把地位屬性去掉,用地址+偏移即可,如下所示:
windows下分頁機(jī)制淺談
圖片十八:物理內(nèi)存


整個過程解析了虛擬地址將一個地址如何映射到物理內(nèi)存,他們之間的存在的轉(zhuǎn)換映射關(guān)系,當(dāng)然省略很多機(jī)制內(nèi)部機(jī)制。片面的理解保護(hù)模式下分頁的重要性,我們跟多層面去學(xué)習(xí)研究虛擬內(nèi)存與物理內(nèi)存關(guān)系。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文題目:windows下分頁機(jī)制淺談-創(chuàng)新互聯(lián)
標(biāo)題來源:http://bm7419.com/article48/gegep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)搜索引擎優(yōu)化、網(wǎng)站設(shè)計公司云服務(wù)器、網(wǎng)站內(nèi)鏈、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司