【问题标题】:Retrieving BSOD text from VM从 VM 中检索 BSOD 文本
【发布时间】:2012-03-29 15:51:06
【问题描述】:

你将如何从 virtualbox vm 中检索 BSOD 文本??

由于 BSOD 是文本,它应该存储在 VM 的内存空间中的某个地方,并且可能存储在某个明确定义的地方。

我有几个虚拟机被配置为在蓝屏上停止而不是重新启动,并且代码已经到位,可以定期进行屏幕截图。

此时我的计划是区分两个图像,如果没有差异(即屏幕上没有变化)并且4个角的像素都是蓝色(和右边的蓝色),那么我们尝试提取在 BSOD 文本中,搜索文本中的“* STOP:”序列以确认它是 BSOD。

我最初计划使用一种快速而肮脏的 OCR 解决方案来从图像本身中提取文本,但是如果我们可以相对容易地从内存中提取它,我们将消除 OCR 错误的可能性。

我仔细阅读了手册和 API 参考,但没有看到任何似乎立即适用的内容。

是否可以从Virtual Box主机访问guest内存并直接从内存中检索BSOD文本?

更新

澄清一下,我目前考虑了 4 种不同的选择

1) 对 windows 调试协议进行逆向工程,并构建至少一个基本的调试器来监听 vm 的串口

  • 需要逆向工程串行协议,怀疑这会带来相当大的困难

2) 对 Virtualbox 保存的状态文件进行逆向工程,并从 VESA 内存区域中提取文本,我怀疑在将 VM 保存在 BSOD 上之后存储在该文件中

  • 我无法在源代码本身之外找到有关此文件格式的文档。

3) 对使用 API 检索的输出图像运行 OCR

  • 这可能是最好的方法,需要构建或设置和训练某种 ocr 解决方案,超出我的经验。可能做起来比较简单,等宽字体/干净的图片,只处理两种颜色

4) 使用 API 调用或通过创建扩展以某种方式访问​​/公开它直接访问客户内存

  • 正如 Warren 所指出的,似乎没有用于访问内存的 API,可能能够编写扩展以某种方式公开 vm 的内存,但需要了解 Virtualbox 的内部结构。

这是在 Solaris 主机上运行的,有些可能只有一个可用的 Windows vm 可能会或可能不会启动。此 VM 可以是任何相对较新的 Windows 版本(XP、2003、2003 R2、2008、Vista、2008 R2)。我可以生成任意数量的基于 Linux 的 VM,但由于许可问题,我无法生成其他 Windows VM。到目前为止,我的想法是直接从客人的记忆中检索它是最容易实现的,也许我错了,上面的方法之一,或者我没有想到的方法,会更容易实现

【问题讨论】:

  • 为什么不稍后从磁盘中提取小型转储文件,然后重新启动?我严重怀疑您是否可以依赖各种 Windows 内核版本之间的内存布局。 pchell.com/support/minidumps.shtml
  • 部分蓝屏在启动过程中过早生成minidumps,寻找更通用的解决方案
  • 我还应该指定我没有在 Windows 主机系统上运行
  • 嗯。您是否尝试找出 VirtualBox 的 PC“VGA 内存”区域在内存中的位置?我会认为这是它正在模拟的文本模式 VESA VGA 文本视频模式。
  • 这是我正在考虑的主要可能性,我只是无法弄清楚如何进入客人记忆区。或者,字符串也应该存储在内存中的某个位置,但可能没有定义得那么好。

标签: windows virtualbox bsod


【解决方案1】:

如果您只是想获取信息,为什么不启用内核调试并通过其中一个虚拟串行端口公开它呢?我相信您应该能够通过 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 屏幕的颜色。希望这将为您提供有关使用这些工具的更多见解,以及缩小范围并让您找到正确的区域以提取您正在寻找的信息。

以下是一些帮助您入门的参考资料:

【讨论】:

  • 我无法控制主机上存在哪些虚拟机。考虑在启动控制文件中启用调试标志,然后从 Linux 连接到串行端口,但我没有找到有关调试器协议的任何文档
【解决方案2】:

可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多