实践使用WinDBG从虚拟地址转换到物理地址

来源:互联网 发布:微处理器和单片机 编辑:程序博客网 时间:2024/06/05 16:09

正在逐章学习《调试软件》一书,看到2.7分页机制。仿照书上的例子,试着手工把虚拟地址转换到物理地址。

由于书中的例子是针对未开启PAE的情况,而我的XP SP2默认开启了PAE,所以白白浪费了大半天时间。话说以前还真不知道启动参数里面/noexecute=optin也会开启PAE。

后来在网上找到了作者针对开启PAE后如何转换的文章,重新实验了一下。原文地址:http://advdbg.org/blogs/advdbg_system/articles/627.aspx


1、启动计算器,输入数字“234234”。


2、启动WinDbg,附加到计算器进程。


3、输入命令x calc!gp*,得到如下信息

01014db0 calc!gpszNum = <no type information>


4、输入命令dd 1014db0 l1,查看地址1014db0的内容,得到如下信息

01014db0  000b4130


5、输入命令du b4130,查看地址b4130的字符串信息,得到

000b4130  "234234."

显然计算器把输入的数字的字符信息保存在这个地址里。


6、现在把这个地址000b4130分解一下,看清楚各个部分

位30,31 页目录指针表索引(PDPE)0x0

位21-29 页目录索引 (PDE)0x0

位12-20 页表索引(PTE)0 1011 0100 = 0xb4

位0-11 页内偏移 0001 0011 0000 = 0x130


7、再启动一个WinDbg,进入本地内核调试。


8、输入命令!process 0 0 列出所有进程,找到计算器对应的进程信息。

PROCESS 88269020  SessionId: 0  Cid: 0158    Peb: 7ffde000  ParentCid: 01e0
    DirBase: 0ef40120  ObjectTable: e2c3f7f0  HandleCount:  49.
    Image: calc.exe


9、DirBase就是该进程的页目录指针表的基地址,由于PDPE为0,所以地址ef40120中就是页目录的基地址信息。

输入命令!dd ef40120 l2,查看其中的内容,得到信息

# ef40120 33e45001 00000000

取12-35位,低12位为0(按4KB对齐),得到 0x33e45000。


10、同样由于PDE为0,所以地址33e45000就是页表的基地址信息。

输入命令!dd 33e45000 l2,得到信息

#33e45000 340a4067 00000000

还是取12-35位,低12位为0(按4KB对齐),得到页表基地址0x34a4000。


11、将页表基地址加上页表索引,得到页信息

输入命令!dd 34a4000+b4*8 l2,得到信息

#340a45a0 339df067 80000000

这个就是页地址了。


12、将页地址加上页内偏移,得到最终物理地址

输入命令!du 339df000+130

#339df130 "234234."

这与上面的内容完全一致。


另外WinDbg还提供了指令!vtop,能够直接将虚拟地址转换为物理地址。

lkd> !vtop ef40120 b4130
X86VtoP: Virt 000b4130, pagedir ef40120
X86VtoP: PAE PDPE ef40120 - 0000000033e45001
X86VtoP: PAE PDE 33e45000 - 00000000340a4067
X86VtoP: PAE PTE 340a45a0 - 80000000339df067
X86VtoP: PAE Mapped phys 339df130
Virtual address b4130 translates to physical address 339df130.

原创粉丝点击