三.Windows内核保护机制--页保护1

保护模式101012分页机制

 转载https://www.cnblogs.com/onetrainee/p/11721946.html

   在保护模式中,我们都知道,所谓的内存地址是虚拟地址,不是物理地址。

  但是,我们是否想过,虚拟地址是随便产生的吗?当然不是,其实一些数字的组合。

  可这些数字是什么意思呢?答案:序号。

  通过序号查找表,一个序号对应找一张(物理表地址+属性),这样通过连续的序号,我们可以查找最终数据存放的物理地址。

  现在,我们了解一下 10-10-12分页方式,即一个32位地址分别拆分成10-10-12位,每位组成一个新的序号。

  10位2进制数字,表示的最大值为11 1111 1111,0x3FF,也就是1024个序号,每个序号对应的是一个4字节的地址,因此第一张表的寻址范围为:4KB

  通过第一张(PDT)表的1024个地址,每个地址都能链接一张新的(PTT)表,也就是有1024张(PTT)表,每个表的也都是10位2进制,大小为4KB,表内含有1024个地址,每个地址都对应1个物理页,每个物理页包含最大12位的地址(0x1000),所以进程空间大小为:1024*1024*4096=4GB,而寻址能力,取决于物理地址的最大值,0xFFFFFFFF,2^32也是4GB(之前写的有点不严谨!)

  为了增加更大的寻址能力,因此现阶段,分页方式也都放弃了10-10-12,改为2-9-9-12

一、WindowsXp设置以101012分页启动方式

  在C:\boot.init(默认为隐藏文件,工具-文件夹选项-显示隐藏文件),将 "nonexecute-optin" 改为 "execute-optin"。

  修改完之后重启即可。

  

二、利用101012分页算法将线性地址转换为物理地址,并从物理页中读出内容

1. 打开记事本,输入"hello world"这个字符;之后使用CheatEngine工具附加,搜索该字符串,找到线性地址  

  

 

 2. 现在我们得到该字符串的线性地址为 000B0C40,拆分成2进制,并按照10-10-12来分:

  00 0000 0000 | 00 1011 0000 | 1100 0100 0000 -> 0 | B0 | C40

  其相当于三级目录,因此,我们需要获取一级目录的首地址。

  该一级目录地址每个进程都存放于CR3寄存器中。

  

 

  我们通过windbg的 "!process 0 0" 指令,查看每个进程的CR3值(DirBase),如下图。

  DirBase(CR3): 1491c000

 

   

 

 

 

 3. 使用windbg依次查看物理内存

  <1>Windbg中 dd表示查看线性内存,而 !dd 表示查看物理内存。

  <2>内存地址后三个字节为属性,因此我们查出地址后自动将后三个字节变为零即可。

  <3>10-10-12模式表示的是地址序号,我们知道一个地址转换成四字节,前两级都是地址表,因此需要乘以*4。

  1)查看一级地址值
  kd> !dd 1491c000
    #1491c000 14828067 14833067 14883067 00000000
    #1491c010 14807067 00000000 00000000 00000000

  2)查看二级地址值应该为二级地址加上额外偏移。0f2c2000+0x2c0
  kd> !dd 14828000+2c0
    #148282c0 14a05067 14998067 14a09067 149fa067
    #148282d0 1497b067 14a6c067 149ed067 1a57b067

  3)三级地址其实就是物理页地址,并非指向地址表的序号,所以直接+偏移,查找物理页地址存储的字节数据,不需要再进行扩大。

  kd> !db 14a05000+c40
    #14a05c40 68 00 65 00 6c 00 6c 00-6f 00 20 00 77 00 6f 00 h.e.l.l.o. .w.o.
    #14a05c50 72 00 6c 00 64 00 21 00-21 00 21 00 00 00 00 00 r.l.d.!.!.!....

posted @ 2020-03-04 11:13  羽行  阅读(836)  评论(0编辑  收藏  举报