• windbg遍历进程页表查看内存


    2016-12-09

    近期想查看下系统分配了的页的页表项的标志位,但是发现资料较少,所以还是记录下,希望可以对某些朋友有所帮助!

    系统:win7 32位虚拟机

    平台:KVM虚拟化平台


    win7 32位默认是开启了PAE分页模式的,PAE分页模式本质上和普通的32位分页并无区别,只是页表结构和虚拟地址的划分有所不同,这点就不单独讲述,感兴趣可参考另一篇博文:PAE 分页模式详解

    首先写了一件简单的内核NT驱动,分配了一个页的内存,然后写入数据0xa1b2c3d4

    加载驱动:

    看到申请的内存的地址是0x85d55000,我们直接看下这块内存:

    确实是我们写入的数据,然后开始查看页表,首先获取的是页表基地址,我们通过当前进程查看:

    可以看到页基址是7ee47400,这正是当前CR3寄存器保存的页基址,该地址指向一个页目录指针表(page-directory-pointer-table),需要注意的是该表一共有4个表项,每个表项八个字节,并且在PAE模式下,地址转换不直接使用CR3寄存器,而是第一级的页目录指针分配了四个PDPTE寄存器,每个保存一个页目录指针,但是也目录指针寄存器的值却是来源于CR3指向的页目录指针表。所以我们仍然可以直接利用CR3来寻址。

    我们先分解下目标虚拟地址:

    按照 结构分成四部分:10    000101110      101010101     000000000000,对应16进制:0x2      0x2e       0x155        0x0

    查看7ee47400内容,由于表项是8字节,所以使用dq(大小端模式问题)

     

    根据虚拟地址,知道该地址对应表中第三项,即图中标记的表项,取物理页框号+偏移得:4595b000+0x2e*8=4595b170

    查看该地址:

    对应的表项内容为05e07863,同样取物理页框号+偏移得:05e07000+0x155*8=05e07aa8

    查看地址内容:

    得到表项内容为7fe95963 ,这个就是这个就是最终的PTE了,即指向一个4KB 页面,物理页框号为7fe95000,而由于我们是申请的就是一个页,即页内偏移为0,所以这里同样也是我们虚拟地址对应的物理地址

    查看内容:

    至此,整个查表过程就完成了。

  • 相关阅读:
    @FeignClient同一个name使用多个配置类报错,解决方案【转+改进】
    spring cloud 与spring boot 版本不匹配引发的问题总结
    无聊系列
    基于redis+lua实现的分布式限流
    elasticsearch 优化笔记
    redis+lua库存扣减和冲正
    es-dsl笔记
    wiki—-Confluence搭建
    Linux常用命令
    SQLSERVER|CDC 日志变更捕获机制
  • 原文地址:https://www.cnblogs.com/ck1020/p/6148399.html
Copyright © 2020-2023  润新知