我有一个问题,我们如何翻译虚拟地址并获取该地址到物理内存位置的映射。
我在Qemu上运行了一个Windows VM,它托管在我的Ubuntu Linux系统上。我想知道如何将在Windows VM上运行的程序映射到主机/ Linux机器上的物理内存位置。
我们如何进行虚拟到物理映射?
谢谢并提前。
答案 0 :(得分:1)
我们如何转换虚拟地址并获取该地址到物理内存位置的映射。
在Windows中,您可以使用内核调试器“KD”( Windows SDK的一部分:https://msdn.microsoft.com/en-us/library/windows/hardware/ff539310(v=vs.85).aspx“将虚拟地址转换为物理地址”或http://resources.infosecinstitute.com/translating-virtual-to-physical-address-on-windows-physical-addresses/找到虚拟物理地址:
使用
!vtop
进行地址转换。假设您正在调试运行MyApp.exe进程的目标计算机,并且您要调查虚拟地址0x0012F980。以下是使用!vtop扩展名来确定相应物理地址的过程。
在linux中有/proc/pid/pagemap
文件(其中pid是目标进程的进程ip - 你应该知道每个进程都有自己的虚拟到物理映射),并且有关于页面映射解析的帖子:{{3 }}
我在Qemu上运行了一个Windows VM,它托管在我的Ubuntu Linux系统上。
在您的情况下,有两个嵌套的操作系统。 Windows操作系统中有一些Windows应用程序。 Windows操作系统认为它有一些物理内存;但实际上它是由Qemu模拟器模拟物理内存。
Qemu(在最简单的非加速情况下)只是Linux中的一个用户应用程序;它只有Linux的虚拟内存。因此,作为物理(客户 - 物理)模拟Windows的内存实际上是主机虚拟的(但它不是一对一的映射,还有一些带有“内存后端”的qemu转换,它可能映射了大的区域guest-physical to host-virtual - http://fivelinesofcode.blogspot.ru/2014/03/how-to-translate-virtual-to-physical.html;同时检查http://blog.vmsplice.net/2016/01/qemu-internals-how-guest-physical-ram.html)。
我想知道如何将在Windows VM上运行的程序映射到主机/ Linux计算机上的物理内存位置。
使用Windows KD调试器将来宾虚拟地址从内部程序转换为来宾 - 物理地址。然后使用qemu命令行查找Print range of memory addresses in qemu(对于host-virtual)如何获取主机虚拟地址并使用pagemap
特殊文件将其转换为主机 - 物理
/proc/`pidof qemu-system-x86_64`/pagemap