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中。