王艳玲 发表于 2017-6-24 22:15:18

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,所以这里同样也是我们虚拟地址对应的物理地址
  查看内容:

  至此,整个查表过程就完成了。
页: [1]
查看完整版本: windbg遍历进程页表查看内存