如何从virtualbox vm中检索BSOD文本?
由于BSOD是文本,它应该存储在某个地方的VM的内存空间中,并且可能存在于定义良好的地方。
我有几个配置为在蓝屏上停止而不是重新启动的虚拟机,并且代码可以定期拍摄屏幕截图。
此时我的计划是区分两个图像,如果没有差异(即屏幕上没有变化)并且4个角落的像素都是蓝色(和右边的蓝色)那么我们尝试提取在BSOD文本中,在文本中搜索“ * STOP:”序列以将其确认为BSOD。
我最初计划使用快速而肮脏的OCR解决方案从图像本身中提取文本,但是如果我们可以相对容易地从内存中提取文本,我们就会消除OCR错误的可能性。
我已经仔细阅读了手册和API参考资料,但没有看到任何似乎立即适用的内容。
是否可以从Virtual Box主机访问guest虚拟机内存并直接从内存中检索BSOD文本?
更新
为了澄清,我此时已经考虑了4种不同的选择
1)对Windows调试协议进行逆向工程,并至少构建一个基本调试器来监听vm的串口
2)反向设计Virtualbox保存状态文件,并在将BS保存到BSOD后,从我怀疑存储在该文件中的VESA内存区域中提取文本
3)在使用API检索的输出图像上运行OCR
4)使用API调用或通过创建扩展来以某种方式访问/公开来直接访问来宾内存
这是在Solaris主机上运行的,有些可能只有一个可用或无法启动的Windows虚拟机。该VM可以是任何相对较新版本的Windows(XP,2003,2003 R2,2008,Vista,2008 R2)。我可以生成任意数量的基于Linux的VM,但由于许可问题,我无法生成额外的Windows VM。我想到的一点是直接从客人记忆中检索它是最容易实现的,也许我错了,上面的方法之一,或者我没想过的方法,会更容易实现
答案 0 :(得分:3)
如果您只是想获取信息,为什么不只是启用内核调试并通过其中一个虚拟串行端口公开它?我相信您应该可以通过I / O端口使用Windows调试工具(WinDbg)或内核调试器(KD)。唯一的唯一要求是因为这是一个VM,虚拟串口应该映射到主机上的命名管道,然后主机(或其他VM,因为您的主机不是Windows)上的调试器应配置为通信在那管道上。你的命令看起来像这样:
windbg -k com:port=\\.\pipe\<pipe_name>,pipe
kd -k com:port=\\.\pipe\<pipe_name>,pipe
传奇人物Mark Russinovich撰写了一篇很棒的博客文章,描述了他如何使用调试器来改变BSOD屏幕的颜色。希望这将为您提供一些使用工具的更多见解,以及缩小范围并让您到正确的区域来提取您正在寻找的信息。
以下是一些帮助您入门的参考资料:
知识库文章151981:如何使用零调制解调器电缆设置远程调试会话
http://support.microsoft.com/kb/151981
任何其他颜色的蓝屏
http://blogs.technet.com/b/markrussinovich/archive/2010/12/14/3374820.aspx
Windows调试工具
http://msdn.microsoft.com/en-us/windows/hardware/gg463009
答案 1 :(得分:1)
可以使用VBoxManage和调试器提取客户(虚拟)物理内存。
VBoxManage debugvm TestVm dumpguestcore --filename guest.dump
gdb --core guest.dump
# dump memory [phys-mem-file] 0x0 [size vm-memory]
之后,可以在内存转储中搜索字符串内容。
另请参阅:http://www.halfdog.net/Misc/TipsAndTricks/VirtualBox.html#ExtractGuestPhysicalMemory