引子:
?一直在研究惡意代碼方向與逆向軟件方向,面試聊了windows內(nèi)核與保護(hù)模式相關(guān)知識(shí),有很多沒(méi)有回答上來(lái),確實(shí)研究過(guò)相關(guān)資料,但是沒(méi)有深入研究,加上長(zhǎng)時(shí)間沒(méi)有復(fù)習(xí),有些遺忘了
?基本功不扎實(shí),畢竟好久沒(méi)寫(xiě)過(guò)驅(qū)動(dòng)編程與復(fù)習(xí)內(nèi)核/保護(hù)模式相關(guān)的知識(shí),所以靜下心來(lái)復(fù)習(xí)一下吧。
?
4GB的虛擬內(nèi)存結(jié)構(gòu):
淮上ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!
虛擬內(nèi)存地址范圍 | 描述 |
---|---|
0x00000000~0x0000FFFF | 64kb大小的空指針區(qū)域,當(dāng)然就不可以訪問(wèn)了 |
0x00001000~0x7FFFFFFF | 加上上述的空指針區(qū)域,低2GB的用戶態(tài)空間 |
0x80000000~0xFFFFFFFF | 高2GB的內(nèi)核態(tài)空間 |
更多的詳細(xì)劃分請(qǐng)參考這篇博客:https://blog.csdn.net/wang010366/article/details/52730052
?
一個(gè)進(jìn)程地址如何映射到物理地址的?
???????????????????圖片一:映射關(guān)系
?上述圖片只是片面的闡釋,一個(gè)虛擬內(nèi)存地址通過(guò)頁(yè)表轉(zhuǎn)換,映射到物理內(nèi)存地址,多個(gè)進(jìn)程其實(shí)都是通過(guò)這種機(jī)制映射到物理內(nèi)存。
???????????????????圖片二:地址映射過(guò)程
?圖片二是虛擬地址映射,注意:缺少了分頁(yè)的層級(jí),頁(yè)表中每一項(xiàng)都是一個(gè)分頁(yè)。映射的物理地址過(guò)程如何實(shí)現(xiàn)的?先介紹Cr0系列的控制寄存器,面試的時(shí)候忘的一干二凈,那就在學(xué)一遍:
寄存器名稱 | 描述 |
---|---|
CR0 | 包含處理器標(biāo)志控制位,如PE,PG,WP等 |
CR1 | 保留 |
CR2 | 專門(mén)用于保存缺頁(yè)異常時(shí)的線性地址 |
CR3 | 保存進(jìn)程頁(yè)目錄地址 |
CR4 | 擴(kuò)展功能(如判斷物理地址擴(kuò)展模式等),Pentium系列(包括486的后期版本)處理器中才實(shí)現(xiàn) |
?
????????????????????圖片三:控制寄存器
?什么是PE,PG,WP呢?
?1、PE:CR0寄存器的第0位,Protection Enable,啟用保護(hù)標(biāo)志。如果該位為1,開(kāi)啟了保護(hù)模式,反之關(guān)閉,當(dāng)開(kāi)啟保護(hù)模式的時(shí)候PE\PG都會(huì)置位。
2、PG:CR0寄存器的第31位,Paging,分頁(yè)標(biāo)志位。如果為1則開(kāi)啟分頁(yè)機(jī)制,禁止分頁(yè)的話線性地址等同于物理地址,若開(kāi)啟標(biāo)志位意味著需要開(kāi)啟保護(hù)模式。
3、WP:CR0寄存器的第16位,Write Proctect,寫(xiě)保護(hù)標(biāo)志。WP==1的時(shí)候意味著只讀頁(yè)面不可執(zhí)行寫(xiě)操作,wp==0的時(shí)候意味著只讀頁(yè)面可執(zhí)行寫(xiě)操作。
?CR3寄存器保存了每個(gè)進(jìn)程的頁(yè)目錄地址,什么叫做頁(yè)目錄呢?
?Windows下開(kāi)啟保護(hù)模式與分頁(yè)機(jī)制后,當(dāng)前CR0寄存器的屬性PE == 1 AND PG == 1,意味著進(jìn)程中的虛擬地址將通過(guò)頁(yè)表轉(zhuǎn)換映射相對(duì)應(yīng)的物理地址上,如圖二所示,我們手工的獲取來(lái)學(xué)習(xí):
首先介紹一下分頁(yè)機(jī)制其中一種記錄方式:
非物理地址擴(kuò)展模式 | 物理地址擴(kuò)展模式 |
---|---|
??非PAE模式 | ??PAE模式 |
?
?PAE模式:Physical address extension,物理擴(kuò)展模式。能夠在32位操作系統(tǒng)訪問(wèn)超過(guò)4GB尋址大小的模式,允許將最多64GB 的物理內(nèi)存用作常規(guī)的4 KB 頁(yè)面,并擴(kuò)展內(nèi)核能使用的位數(shù)以將物理內(nèi)存地址從32擴(kuò)展到36。
非PAE模式:在非物理擴(kuò)展模式下,32位最大只能4GB所以,即使你有8G的內(nèi)存條,也是白費(fèi)。
那么在非PAE模式下,操作系統(tǒng)分頁(yè)機(jī)制如何實(shí)現(xiàn)的?每個(gè)分頁(yè)4kb,一共4GB的內(nèi)存,4194304KB大小也就是一共1048576個(gè)分頁(yè),那么如何高效的管理這些分頁(yè)呢?
?1024(PDT) × 1024(PTT) × 4096 = 4GB
1024(PTT) × 1024(PTE) × 4 = 4MB
1024(PDT) ×1024(PTE) = 1MB
如上述公式所示,就是通過(guò)這種方式來(lái)管理4GB的內(nèi)存分頁(yè),PDT,PTT,PTE又是什么,如下所示
名稱 | 描述 |
---|---|
頁(yè)目錄索引表(PDT) | 一級(jí)索引 |
頁(yè)表索引表(PTT) | 二級(jí)索引 |
頁(yè)表項(xiàng)(PTE) | 頁(yè)表項(xiàng) PDT(1024項(xiàng)PDE),PTT(1024項(xiàng)PTE) |
??????????????????圖片四:地址解析
?需要配合圖二一起理解,操作系統(tǒng)會(huì)通過(guò)CR3寄存器獲取當(dāng)前進(jìn)程的頁(yè)表目錄地址,然后根據(jù)虛擬地址拆分為10,10,12比例,找到頁(yè)目錄,找到頁(yè)表,然后找到分頁(yè)加上對(duì)應(yīng)的偏移(物理內(nèi)存),為了方便理解,當(dāng)然也是動(dòng)手寫(xiě)個(gè)小程序,在windbg下一探究竟。
?
?編寫(xiě)測(cè)試代碼,如下所示:
int main()
{
printf("虛擬地址:0x%X\n", "hello world");
cout << "hello world" << endl;
system("pause");
}
??編譯后拖入虛擬機(jī),開(kāi)啟雙擊調(diào)試(測(cè)試環(huán)境win7 32位),運(yùn)行測(cè)試程序(不要關(guān)閉回車),windbg下輸入!process 0 0查看全部進(jìn)程及各部分說(shuō)明,如下所示:
?????????????????圖片五:雙擊調(diào)試
??上述進(jìn)程說(shuō)明中我們看到DirBase地址,這個(gè)就是當(dāng)前進(jìn)程指向的頁(yè)目錄,我們看看到底對(duì)不對(duì)?需要明確的字段PROCESS 0x86ca5c18是EPROCESS的地址,輸入指令dt 0x86ca5c18 _EPROCESS來(lái)看一看,如下所示:
?????????????????圖片六:EPROCESS
??一個(gè)進(jìn)程的頁(yè)目錄怎樣找?在CreateProcess的第二個(gè)階段,會(huì)初始化進(jìn)程的執(zhí)行體層EPROCESS數(shù)據(jù)結(jié)構(gòu)與微內(nèi)核層KPROCESS數(shù)據(jù)結(jié)構(gòu),系統(tǒng)DLL映像目標(biāo)用戶空間且初始化PEB操等等,來(lái)看_KPROCESS結(jié)構(gòu)+0x18字段是什么?如下所示:
?????????????????圖片七:DirectoryTableBase
??通過(guò)上述_KPROCESS獲取了PDT的地址,與解析出來(lái)PDT數(shù)據(jù)一樣的。每當(dāng)CPU切片執(zhí)行進(jìn)程時(shí)候,CR3就會(huì)被系統(tǒng)切換,CR3是不是讀取當(dāng)前進(jìn)程DirectoryTableBase字段作為切換數(shù)值有待研究,看一看PDT也就是頁(yè)表轉(zhuǎn)換的第一層結(jié)構(gòu),如下所示:
?????????????????圖片八:虛擬地址
??解釋兩個(gè)dd,因?yàn)檫@個(gè)以前也總是被同學(xué)問(wèn)起,dd怎么啥東西都找不到,在windbg命令下,d系列命令只能查看虛擬地址, 查看物理地址需要使用!d系列命令,PDT是物理地址,如下所示:
?????????????????圖片九:物理地址
??根據(jù)上述一些理論性知識(shí),如圖九中所展示的每項(xiàng)便是頁(yè)表地址(物理地址),根據(jù)虛擬地址,測(cè)試是否能通過(guò)頁(yè)表轉(zhuǎn)換找到映射的物理存儲(chǔ)數(shù)據(jù),所以第二步中沒(méi)輸出字符串虛擬地址(圖是昨天的),重新來(lái)一下(已經(jīng)關(guān)閉了隨機(jī)基址),如下所示:
?????????????????圖片十:輸出字符串在虛擬內(nèi)存地址
?根據(jù)圖片四把上述的虛擬地址進(jìn)行分割,如下所示:
?????????????????圖片十一:虛擬地址轉(zhuǎn)換
??對(duì)應(yīng)的二進(jìn)制換算16進(jìn)制 (1 <--> 19 <--> B30),其中1代表是頁(yè)目錄表中的第一項(xiàng),查看頁(yè)目錄表之前需要對(duì)地址頁(yè)目錄的PTE了解,如下所示:
??如上圖所示,低12位是屬性,高位是地址, 然后頁(yè)表索引是19,數(shù)組元素是保存的指針,需要乘以4字節(jié),如下所示:
?????????????????圖片十二:頁(yè)表查找
??怎么什么都沒(méi)有,還記著我們上述說(shuō)過(guò),這一臺(tái)記錄方式PAE與非PAE,我們現(xiàn)在所處的環(huán)境究竟是怎樣,我們打開(kāi)cmd,利用bcdedit命令,先做了解如下所示:
?????????????????圖片十三:bcdedit
??修改當(dāng)前pae模式以及nx模式,pae我們知道是物理擴(kuò)展模式,nx是緩解機(jī)制,使某些內(nèi)存區(qū)域不可執(zhí)行,并使可執(zhí)行區(qū)域不可寫(xiě)DEP,我們也要改為Always Off模式,如下所示:
修改指令如下:
名稱 | 關(guān)閉指令 | 開(kāi)啟指令 |
---|---|---|
PAE | bcdedit /set pae ForceDisable | bcdedir /set forceEnable |
NX | bcdedit /set nx AlwaysOff | bcdedit /set nx OptIn |
修改后屬性如下:
?????????????????圖片十四:屬性調(diào)整
?重啟系統(tǒng)后,再次按照上述步驟查找具體的分頁(yè)數(shù)據(jù),如下所示:
?????????????????圖片十五:非PAE下目錄表
??那么解析虛擬地址之后,如何通過(guò)也目錄找到具體頁(yè)表呢?我們需要了解一下頁(yè)目錄中的每一項(xiàng)PDE數(shù)據(jù),也就是指針如何分解的,如下所示:
?????????????????圖片十六:頁(yè)表地址解析
??通過(guò)上圖所示,我們知道低位12位是屬性,高位才是地址,意味著我們只需要BaseAddress + 第幾項(xiàng)PTT × 4(指針大小)就可以找到相對(duì)的頁(yè)表指針,如下所示:
?????????????????圖片十七:頁(yè)表
??找到了具體的頁(yè)表地址,也就是0x342f6025,加上具體的偏移(虛擬地址分解出的低12位)就可以找到映射的物理內(nèi)存數(shù)據(jù)保存,當(dāng)然地址還是要把地位屬性去掉,用地址+偏移即可,如下所示:
?????????????????圖片十八:物理內(nèi)存
?
?整個(gè)過(guò)程解析了虛擬地址將一個(gè)地址如何映射到物理內(nèi)存,他們之間的存在的轉(zhuǎn)換映射關(guān)系,當(dāng)然省略很多機(jī)制內(nèi)部機(jī)制。片面的理解保護(hù)模式下分頁(yè)的重要性,我們跟多層面去學(xué)習(xí)研究虛擬內(nèi)存與物理內(nèi)存關(guān)系。
本文名稱:windows下分頁(yè)機(jī)制淺談
當(dāng)前網(wǎng)址:http://jinyejixie.com/article0/pdcioo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)、微信小程序、虛擬主機(jī)、軟件開(kāi)發(fā)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)