实践使用WinDBG从虚拟地址转换到物理地址
2013-01-26 01:55
645 查看
正在逐章学习《调试软件》一书,看到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.
由于书中的例子是针对未开启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.
相关文章推荐
- 使用windbg在开启PAE的情况下将虚拟地址转化成物理地址
- windbg:虚拟地址转换为物理地址
- windbg调xp的calc(手工虚拟地址到物理地址转换练习)
- 用windbg实现虚拟地址到物理地址转换(Converting Virtual Addresses to Physical Addresses)
- 虚拟地址到物理地址的转换步骤【转】
- 虚拟地址、线性地址和物理地址的转换
- [课上练习]手工将虚拟地址转换为物理地址
- 在用户态进行虚拟空间地址向物理空间地址的转换
- MMU内存管理单元(1)-虚拟地址到物理地址转换
- 【软件安全】PAE下虚拟地址到物理地址的转换
- 在用户态进行虚拟空间地址向物理空间地址的转换
- 在用户态进行虚拟空间地址向物理空间地址的转换
- [Linux内存管理-分页机制]—把一个虚拟地址转换为物理地址
- 0.ring0-PAE-(虚拟地址转换成物理地址详细示例)
- 储存管理 与 虚拟地址如何转换为物理地址
- 虚拟地址转换成物理地址
- 【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题
- 用户虚拟地址转换成物理地址
- 虚拟地址到物理地址的转换步骤
- Linux_虚拟地址、线性地址和物理地址的转换