标题: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)
没有评论:
发表评论