保护模式101012分页机制

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

保护模式101012分页机制

 

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

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

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

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

  现在,我们了解一下 10-10-12分页方式,即一个32位地址分别拆分成10-10-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 0010 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。

    0 | B0 | C3B -> 0 | 2C0(B0*4) | C40

  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 @ 2019-10-22 19:28  OneTrainee  阅读(1479)  评论(0编辑  收藏  举报