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