特别地,我希望能够在虚拟CPU运行来宾OS的指令之前查看它们。此外,我还希望能够在某些来宾OS的CPU寄存器上设置监视器,因此如果对其进行了修改(例如,在使用MOV指令进行写操作时),来宾的状态将被挂起在发生写操作的位置(并且rip / eip会指向该指令)。 >
有人知道解决这种问题的最佳方法是什么吗?我应该在虚拟机监控程序上使用任何建议? (我猜Xen是开源的,所以Xen可能最容易修改和调试)
非常感谢。
编辑:我会尽力向自己解释。我正在尝试调试以内核模式(x86-64)运行的代码。现在,我正在使用WinDbg调试虚拟机(VMware)中的ring0代码。
如果可以的话,我会很高兴在存储位置上设置硬件断点(ba)并查看对其进行读/写操作。问题是我的硬件断点被在ring0中运行的代码禁用。基本上,这段代码将关闭dr7寄存器的内容,将其清除,访问正在查看的内存(将硬件断点设置为打开的内存),最后在访问后恢复dr7寄存器。因此,我的硬件断点永远不会被击中。这意味着我从不知道从哪里操纵内存。可以说软件断点不是可接受的替代方法。另外,我还尝试过修改dr7中的通用检测位,并安装了自己的陷阱处理程序,以了解是否有人在破坏我的硬件断点。但是,这段代码非常聪明,可以很好地处理该尝试(re:在访问任何调试寄存器之前恢复旧的钩子)。我需要在比ring0更低的级别上运行,以处理在ring0上运行的这段代码。唯一的方法是在管理程序中。
我想监视一下dr7寄存器的内容,并查看正在访问什么(读/写)。如果我找到了错误代码的RIP,就可以逐步解决它,并了解它的作用。
#1 楼
VMware专门为此目的公开了一个GDB存根。使用此存根,可以连接GDB(或任何GDB前端)来操纵来宾OS,就好像它是一个进程一样。VMware-OSDev Wiki
使用
IDA的GDB调试器在VMWare下调试Windows内核-HexRays
评论
谢谢(你的)信息。我最终使用VirtualBox的内置调试器实现了我的目标。但是,很高兴知道VMWare也支持这些东西!
– KeBugCheck
2014年3月27日在21:55
评论
你的目标是什么?没有VMM公开它的原因是因为那些具有硬件辅助虚拟化的软件没有您所要求的功能。但是,在完全仿真模式下,诸如Qemu之类的东西可能会起作用。另外,请检查CXPInspector论文中描述的方法是否不是您想要的。我编辑了帖子以反映目标。我肯定现在正在调查Qemu。我会看一下那篇论文。谢谢!