Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.html
保護模式中的PDE與PTE
1. PDE與PTE的認知
我們在上一節,10-10-12模式中已經見過下表。
PDT(Page Direcotry Table)y頁目錄表,其中每一個成員被稱為頁目錄表成員。
PTT(Page Table)頁表,其中每一個成員被稱為頁表成員。
頁目錄表、頁表與物理頁,本質上都是頁。
10-10-12模式遵循4KB大小的機制,即每一個頁大小為4KB。
頁目錄表與頁表存內存,所以可以一共有 1KB = 2^10個;而物理頁存儲字節,共存2^12個;因此10-10-12分頁就是這么來的。
二、向零地址讀寫內存
我們有編程經驗的人知道,零地址其實不可以讀寫的。
其本質原因是因為 00000000h 這個線性地址對應的物理地址沒有掛靠物理頁,也即對應的PTE=0,自然物理頁索引就不存在。
但是,我們可以通過windbg往0地址中掛靠物理頁,這樣就很容易實現對零地址的內存讀寫。
測試代碼
1 #include "stdafx.h" 2 3 int main(int argc, char* argv[]) 4 { 5 // 將X的物理頁掛靠0地址上 6 int x = 1; 7 printf("x address: %x\n",&x); 8 getchar(); 9 10 *(int*)0 = 123; 11 printf("0 address data: %x\n",*(int*)0); 12 return 0; 13 }
對應操作(如果看不懂操作,完成上一節10-10-12分頁中后面的實驗)
我們找到變量x的地址,拆分其內存地址找到掛靠的物理頁PTE地址(0-12f*4-f7c),之后將其掛靠在0000000h對應的PTE中。