一:启动一个计算器程序calc.exe,输入一个字符串123456789
二:启动WinDBG,并附加到计算器程序上开始调试(选择File>Attach to a process…..)
三:在WinDBG的命令区输入xcalc!g*命令列出计算器程序中以g开头的所有符号(先要设置好XP系统的符号路径)
四:在WinDBG的命令区输入ddcalc!gpszNum l1命令,查看该符号地址的内容
五:继续查看地址000ac3f0
六:看来000ac3f0指向的很想我们前面输入的数字,使用显示字符串命令再进一步验证
七:先将这个虚拟地址转换成二进制格式,一边了解它的各个位域的值,这可以使.formats命令
根据上图的虚拟地址:页目录索引为0(高10位) & 页表索引为ac (中间10位) & 物理页内偏移为3F0
八:再启动一个WinDBG的实例,并开始本地内核调试以便观察计算器进程的页目录基地址。(以下所有操作都在这个WinDBG实例中进行的)
九:先通过!process 0 0命令列出所有进程,并在其中找到关于calc.exe的内容
十:上面的DirBase项描述的就是calc进程的页目录基地址的物理地址(CR3寄存器的内容)。也就是说该进程的页目录的及地址是02cc01c0。
十一:使用!dd02cc01c0命令(显示物理内存,注意有!号)显示页目录表的内容 (02cc01c0指向了一片内存空间,这片内存空间是就有1024个PDE的页目录)
十二:页目录的每一项都是4个字节,因为我们要转换的地址的页目录索引为0,也就是页目录中的第一个表项,就是 02cc01c0指向的4字节的内存单元内容,其内容为8b1801,每个页目录表项的高20位是页表的起始地址的高20位,即我们需要的页表基地址就是8b1,低12位801是这个页表的属性 (结合一个操作系统的实现,看页表的属性)
十三:继续使用!dd 命令观察页表,因为页表索引是ac(最上方的虚拟地址ac3f0),每个页表项占4个字节,所以物理页面的基地址应该是8b1000 + ac*4所指向的内存单元中的4个字节的内容,就是PTE的内容(即内容的高20位)
(8b1000指向了一片内存空间,这片内存空间是就有1024个PTE的页表)