标题:X64的虚拟地址到物理地址的手工分析。
前言:虚拟地址到物理地址的转换这大部分是CPU的事,偶尔OS也做下,程序员一般不接触这,最多是了解下。
这里的实验环境是Windows 10 + windbg + vmware.
这里说下注意事项:
1.确保进程的上下文,就是CR3的值和进程对象的DirBase值一样。
2.加载符号文件,这是基本的也是重要的。
3.选取虚拟地址,如果实在不知道就用lm vm 看看某个模块的基地址。
--------------------------------------------------------------------------------------------------
0: kd> vertarget
Windows 10 Kernel Version 14393 MP (6 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 14393.1593.amd64fre.rs1_release.170731-1934
Machine Name:
Kernel base = 0xfffff800`8f091000 PsLoadedModuleList = 0xfffff800`8f38f040
Debug session time: Sun Oct 1 13:57:58.216 2017 (UTC + 8:00)
System Uptime: 0 days 0:01:27.925
选定一个虚拟内存,这个内存的信息如下:
0: kd> db 0x00007ff7`ceb8df10 L5
00007ff7`ceb8df10 74 65 73 74 00 test.
看看系统命令对这个地址的转换:
0: kd> !vtop 0 00007ff7ceb8df10
Amd64VtoP: Virt 00007ff7`ceb8df10, pagedir 3a4d8000
Amd64VtoP: PML4E 3a4d87f8
Amd64VtoP: PDPE 303b5ef8
Amd64VtoP: PDE 34e363a8
Amd64VtoP: PTE 354b7c68
Amd64VtoP: Mapped phys 371def10
Virtual address 7ff7ceb8df10 translates to physical address 371def10.
可以以这个命令的信息为参考进行分析。
查看CR3的值:
0: kd> r cr3
cr3=000000003a4d8000
自己手动分析虚拟地址的格式:
0: kd> .formats 00007ff7ceb8df10
Evaluate expression:
Hex: 00007ff7`ceb8df10
Decimal: 140702301871888
Octal: 0000003777371656157420
Binary: 0000000000000000 011111111 111011111 001110101 110001101 111100010000 这里自己格式化下。
ff 1df 75 18d f10 这个是自己的手工分析,具体的见intel的资料。
Chars: .......
Time: Wed Jun 13 04:23:50.187 1601 (UTC + 8:00)
Float: low -1.55081e+009 high 4.59051e-041
Double: 6.95162e-310
最终的物理地址的内容是:
0: kd> !db 371def10 L5
#371def10 74 65 73 74 00 test.....E......
!vtop命令已经实现了,但是它是如何实现的呢?
这个命令显示的信息太简单了,下面就是自己的分析。
--------------------------------------------------------------------------------------------------
PML4E 3a4d87f8,这个数是怎么来的呢?
0: kd> ? cr3 + ff * 8
Evaluate expression: 978159608 = 00000000`3a4d87f8
PDPE 303b5ef8,这个数是怎么来的呢?
0: kd> !dq 3a4d87f8 L1
#3a4d87f8 01000000`303b5867
0: kd> ? 303b5000 + 8 * 1df
Evaluate expression: 809197304 = 00000000`303b5ef8
PDE 34e363a8,这个数是怎么来的呢?
0: kd> !dq 303b5ef8 L1
#303b5ef8 01100000`34e36867
0: kd> ? 34e36000 + 8 * 75
Evaluate expression: 887317416 = 00000000`34e363a8
PTE 354b7c68,这个数是怎么来的呢?
0: kd> !dq 34e363a8 L1
#34e363a8 01200000`354b7867
0: kd> ? 354b7000 + 8 * 18d
Evaluate expression: 894139496 = 00000000`354b7c68
最后就是那个物理地址了。
0: kd> !dq 354b7c68 L1
#354b7c68 a0600000`371de025
0: kd> ? 371de000 + f10
Evaluate expression: 924708624 = 00000000`371def10
--------------------------------------------------------------------------------------------------
made by correy
made at 2017/10/1
http://correy.webs.com
2017年10月1日星期日
!vtop命令的X64分析
订阅:
评论 (Atom)