Windows保护模式学习笔记(九)—— 2-9-9-12分页

  • 要点回顾
  • 10-10-12分页
    • 原理
    • 环境配置
  • 2-9-9-12分页
    • 原理
    • PDPTE
    • PDE
    • PTE
    • XD/NX标志位
    • 环境配置
    • 实验:通过线性地址找到物理地址
      • 第一步:新建一个记事本,写入"Hello World"
      • 第二步:使用Cheat Engine附加进程
      • 第三步:找到"Hello World"的线性地址
      • 第五步:将线性地址拆分为2-9-9-12四组比特组
      • 第六步:获得进程的Cr3
      • 第六步:通过Cr3找到字符串的物理地址
        • 第一层:PDPT表
        • 第二层:PDT表
        • 第三层:PTT表
        • 第四层:物理页

要点回顾

在之前的笔记中我们已经讲解了10-10-12分页方式,在这种分页方式下物理地址最多可达4GB。但随着硬件的发展,4GB的物理地址范围已经无法满足要求
Intel在1996年就已经意识到这个问题了,所以设计了新的分页方式,也就是我们本节课要讲的2-9-9-12分页,又称为PAE(物理地址扩展)分页

10-10-12分页

原理

  1. Intel认为一张页的大小为4K是比较合理的,所以先确定页的大小为4K,4KB等于4096个字节,也就是2的12次方,所以32位的最后一部分就确定为了12位
  2. 当初的物理内存比较小,所以4个字节的PTE就够了,加上页的尺寸是4K,所以一个页能存储1024个 PTE,也就是2的10次方,第二个10也就确定了
  3. 同理,PDT也需要10个比特位,10+10+12刚好32位

环境配置

若想将操作系统设置为10-10-12分页,只要将C:\boot.ini文件中的 noexecute 改为 execute,重启即可。具体步骤在学习10-10-12分页时已经介绍,这里不再详述。

2-9-9-12分页

描述:2-9-9-12分页(PAE,物理地址扩展)

原理

  1. 页的大小是确定的,4KB不能随便改,所以32位的最后一部分就确定为了12位
  2. 如果想增大物理内存的访问范围,就需要增大PTE,增大了多少呢?考虑对齐的因素,增加到8个字节
    由于PTE增大了,而PTT表的大小没变,依然是4KB,所以每张PTT表能放的PTE个数由原来的1024个减少到512个,512等于2的9次方,因此PTI=9
  3. 由于2的9次方个PDE就能找到所有的PTT表,因此PDI=9
  4. 分配到这里时,还剩下前2位未分配
    与10-10-12不同,CR3不直接指向PDT表,而是指向一张新的表,叫做PDPT表(页目录指针表)
    PDPT表中的每一个成员叫做PDPTE(Page-Directory-Point-Table Entry,页目录指针表项),每项占8个字节
    PDPT表只有4个成员,因为2位比特位只能满足四种情况:00 01 10 11

PDPTE

结构图:

P位:第0位,有效位
Avail:这部分供操作系统软件随意使用,CPU不使用
Base Addr:指向PDT表地址,由两部分组成
第一部分:高四字节32~35位
第二部分:低4字节12~31位
这两部分加起来共24位,后12位补0
灰色部分:保留位

注意:PWT位PCD位在本篇不作描述

PDE

结构图:

PAT位:页属性表
只有当PS=1时,PAT位才是有意义的(页属性表只针对页)
具体含义这里不作介绍,感兴趣的同学可以查阅资料

注意:

  1. G位PCD位PWT位可以暂且不管。
  2. 其他属性位的含义在上面学习PDPTE时或在学习10-10-12分页的PDE与PTE时已经介绍,这里不再详述

PTE

结构图:

注意:

  1. PTE中12~35位是物理页基址,低12位补0
  2. 物理页基址+12位页内偏移指向具体数据

XD/NX标志位

描述:

  • Intel中称为XD,AMD中称为NX,即No Excetion
  • 段的属性有可读、可写和可执行
  • 页的属性有可读、可写
  • 当RET执行返回的时候,如果把堆栈里面的数据指向一段提前准备好的数据(把数据当作代码来执行,漏洞都是依赖这点,比如SQL注入也是),那么就会产生任意代码执行的后果
  • 所以,Intel就在这方面做了硬件保护,设置了一个不可执行位 – XD/NX位
  • 当XD=1时,软件产生了溢出也没有关系,即使EIP蹦到了危险的“数据区”,也是不可以执行的
  • PAE分页模式下,PDE与PTE的最高位为XD/NX位.

环境配置

若想将操作系统设置为2-9-9-12分页,只要将C:\boot.ini文件中的 execute 改为 noexecute,重启即可。具体步骤在学习10-10-12分页时已经介绍,这里不再详述。

实验:通过线性地址找到物理地址

第一步:新建一个记事本,写入"Hello World"

第二步:使用Cheat Engine附加进程

第三步:找到"Hello World"的线性地址



注意:这里搜索到三个结果,需要判断哪个是缓存,哪个才是真正的线性地址

将Hello World的最后一个字符’d’改为’m’,保存

线性地址最终确定为:0104FE58

第五步:将线性地址拆分为2-9-9-12四组比特组

0    1   0   4   F   E58
=
0000 0001 0000  0100 1111 E58
=
00              // 0x0
000001000       // 0x8
001001111       // 0x4F
E58             // 12个比特位刚好三个字节

第六步:获得进程的Cr3

在WinDbg中输入命令:!process 0 0

DirBase的值就是进程的Cr3

第六步:通过Cr3找到字符串的物理地址

第一层:PDPT表


线性地址前两位比特位为0,所以找下标为0的PDPTE

第二层:PDT表


乘8是因为每一个PDE占8个字节

第三层:PTT表


乘8是因为每一个PTE占8个字节

第四层:物理页


寻找物理页时就不用再乘8了

使用db命令以字符形式查看数据

实验成功!

Windows保护模式学习笔记(九)—— 2-9-9-12分页相关推荐

  1. Windows保护模式学习笔记(十四)—— 阶段测试

    Windows保护模式学习笔记(十四)-- 阶段测试 题目一 解题步骤 题目二 解题步骤 题目一 描述:给定一个线性地址,和长度,读取内容 int ReadMemory(OUT BYTE* buffe ...

  2. Windows保护模式学习笔记(十三)—— PWTPCD

    Windows保护模式学习笔记(十三)-- PWT&PCD 要点回顾 CPU缓存 CPU缓存与TLB的区别 PWT(Page Write Through) PCD(Page Cache Dis ...

  3. Windows保护模式学习笔记(十二)—— 控制寄存器

    Windows保护模式学习笔记(十二)-- 控制寄存器 控制寄存器 Cr0寄存器 Cr2寄存器 Cr4寄存器 控制寄存器 描述: 控制寄存器有五个,分别是:Cr0 Cr1 Cr2 Cr3 Cr4 Cr ...

  4. Windows保护模式学习笔记(十)—— TLB

    Windows保护模式学习笔记(十)-- TLB 地址解析 10-10-12分页 2-9-9-12分页 TLB TLB结构 TLB种类 练习1:体验TLB的存在 第一步:运行代码 第二步:设置中断门描 ...

  5. Windows保护模式学习笔记(八)—— 页目录表基址/页表基址

    Windows保护模式学习笔记(八)-- 页目录表基址/页表基址 要点回顾 一.页目录表基址 实验:拆分线性地址C0300000,并查看其对应的物理页 第一步:打开一个进程,获得它的Cr3 第二步:查 ...

  6. Windows保护模式学习笔记(七)—— PDEPTE

    Windows保护模式学习笔记(七)-- PDE&PTE Cr3 PDE(页目录表项) PTE(页表项) 物理页的属性 10-10-12分页的补充 实验1:证明PTE的特征1 第一步:选择一个 ...

  7. Windows保护模式学习笔记(六)—— 10-10-12分页

    Windows保护模式学习笔记(六)-- 10-10-12分页 基本概念 4GB内存空间 有效地址-线性地址-物理地址 有效地址与线性地址 物理地址 控制寄存器:Cr3 10-10-12分页 实验:通 ...

  8. Windows保护模式学习笔记(五)—— 任务段任务门

    Windows保护模式学习笔记(五)-- 任务段&任务门 要点回顾 任务段 TSS (Task-state segment ) TR段寄存器 TR段寄存器的读写 TSS段描述符 实验:加载自定 ...

  9. Windows保护模式学习笔记(四)—— 中断门陷阱门

    Windows保护模式学习笔记(四)-- 中断门&陷阱门 要点回顾 中断描述符表(IDT) 一.中断门 实验:构造一个中断门 第一步:初步构造参数 第二步:确定 Offset in Segme ...

最新文章

  1. linux(armv7/8)下gdb的安装及查看方法
  2. Python 连接 redis 模块
  3. 编译安装PHP 时遇到问题解决方法.
  4. JS转换HTML转义符
  5. 【BZOJ 1266】 [AHOI2006]上学路线route
  6. JavaSE----基础语法(方法)
  7. POJ - Til the Cows Come Home(Dijkstra)
  8. think in java i o_《Thinking in Java》学习——18章Java I/O系统(三)
  9. 【详细教程】教你如何使用Node + Express + Typescript开发一个应用
  10. (王道408考研数据结构)第五章树-第四节3:哈夫曼树基本概念、构造和哈夫曼编码
  11. 服务器安装虚拟声卡,虚拟声卡安装使用 虚拟声卡注意事项
  12. 有屋(东莞)搬家啦~ Sketchup草图大师设计拆单 有屋拆单 全屋定制拆单 衣柜橱柜拆单
  13. Windows 文件系统格式 Raw格式转换NTFS
  14. 超分辨率重建 matlab,图像超分辨率重建软件
  15. 计算机 蓝牙鼠标卡顿,Win10使用蓝牙鼠标老是卡顿的原因及解决方法
  16. 26设计模式之建造者模式
  17. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.6 异构建模的方法...
  18. airpods二代降噪吗_小白初次入手AirPods,究竟有怎样的体验呢?
  19. CreatorPrimer | 飞机大战(一)
  20. Profiler分析内存抖动,Memory Analyzer(mat)分析内存泄漏(不懂砍我)

热门文章

  1. SQL Server如何查看存储过程的执行计划
  2. python记录_day14 内置函数二 迭代 二分法
  3. cdh5.13.1 升/降级SPARK2 (parcel安装的同理)
  4. 明天参加GDG devfest
  5. 自己写的thinkphp自动生成类
  6. 椭圆曲线加密算法(ECC)原理和C++实现源码(摘录)
  7. (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...
  8. 基于visual c++之windows核心编程代码分析(64)现有的exe文件中添加自己的代码
  9. 收藏:Asp.net中基于Forms验证的角色验证授权
  10. Hyperledger Besu(4)身份许可