Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.htmlhtml
保护模式中的PDE与PTE编程
1. PDE与PTE的认知测试
咱们在上一节,10-10-12模式中已经见过下表。spa
PDT(Page Direcotry Table)y页目录表,其中每个成员被称为页目录表成员。code
PTT(Page Table)页表,其中每个成员被称为页表成员。
htm
页目录表、页表与物理页,本质上都是页。 blog
10-10-12模式遵循4KB大小的机制,即每个页大小为4KB。 索引
页目录表与页表存内存,因此能够一共有 1KB = 2^10个;而物理页存储字节,共存2^12个;所以10-10-12分页就是这么来的。内存
2、向零地址读写内存get
咱们有编程经验的人知道,零地址其实不能够读写的。
其本质缘由是由于 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中。