Извлечение текста BSOD из ВМ - PullRequest
2 голосов
/ 29 марта 2012

Как бы вы извлекли текст BSOD из виртуальной коробки VM?

Поскольку BSOD - это текст, он должен храниться где-то в области памяти виртуальной машины и, возможно, где-то четко определенным.

У меня есть несколько виртуальных машин, которые были настроены для остановки на синих экранах, а не для перезагрузки, и имеется код для регулярного создания снимков экрана.

На данный момент мой план состоит в том, чтобы различать два изображения, если нет различий (т.е. не было никаких изменений на экране), и все пиксели в 4 углах синие (и правый синий), тогда мы пытаемся извлечь текста BSOD, найдите в тексте последовательность «* STOP:», чтобы подтвердить его как BSOD.

Изначально я планировал быстрое и грязное решение для оптического распознавания текста для извлечения текста из самого изображения, однако, если бы мы могли относительно легко извлечь его из памяти, мы бы исключили возможность ошибок распознавания.

Я просмотрел руководство и справочник по API и не видел ничего, что, кажется, сразу применимо.

Можно ли получить доступ к памяти гостей с хоста Virtual Box и получить текст BSOD непосредственно из памяти?

UPDATE

Просто чтобы уточнить, я рассмотрел 4 различных варианта в настоящее время

1) Обратный инжиниринг протокола отладки Windows и создание хотя бы базового отладчика для прослушивания последовательного порта виртуальной машины

  • Требуется обратный инжиниринг последовательного протокола, подозреваю, что это будет довольно сложным

2) Обратный инжиниринг файла сохраненного состояния Virtualbox и извлечение текста из области памяти VESA, которая, как я подозреваю, сохраняется в этом файле после сохранения виртуальной машины на BSOD

  • Мне не удалось найти документацию по этому формату файла вне самого исходного кода.

3) Запуск распознавания текста на выходном изображении, полученном с использованием API

  • Это может быть лучший путь, требующий создания или настройки и обучения решению ocr некоторого вида, вне моего опыта. Может быть относительно простым, шрифт постоянной ширины / чистое изображение, только два цвета для обработки

4) Доступ к памяти гостей напрямую с помощью вызова API или путем создания расширения для доступа / предоставления доступа к нему каким-либо образом

  • Как указал Уоррен, похоже, что нет API для доступа к памяти, возможно, он сможет написать расширение, чтобы каким-то образом раскрыть память виртуальной машины, но потребует понимания внутренних возможностей Virtualbox.

Он работает на хостах Solaris, и некоторые могут иметь только один доступный Windows vm, который может загружаться или не загружаться. Эта виртуальная машина может быть любой относительно новой версией Windows (XP, 2003, 2003 R2, 2008, Vista, 2008 R2). Я могу порождать произвольное количество виртуальных машин на основе Linux, однако я не могу порождать дополнительные виртуальные машины Windows из-за проблем с лицензированием. В этот момент я думал, что извлечь его непосредственно из памяти гостей будет проще всего, возможно, я ошибаюсь, и один из перечисленных выше методов или тот, о котором я не думал, будет проще реализовать.

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Если вы пытаетесь просто получить информацию, почему бы просто не включить отладку ядра и выставить ее через один из виртуальных последовательных портов?Я считаю, что вы должны иметь возможность использовать либо средства отладки для Windows (WinDbg), либо отладчик ядра (KD) через порт ввода-вывода.Единственное уникальное требование, потому что это виртуальная машина, заключается в том, что виртуальный последовательный порт должен быть сопоставлен с именованным каналом на хосте, а затем отладчик на хосте (или другой виртуальной машине, поскольку ваш хост не является Windows) должен быть настроен для связипо этой трубе.Ваши команды будут выглядеть примерно так:

windbg -k com:port=\\.\pipe\<pipe_name>,pipe

kd -k com:port=\\.\pipe\<pipe_name>,pipe

Существует замечательное сообщение в блоге легендарного Марка Руссиновича, в котором описывается, как он использовал отладчик для изменения цветов экрана BSOD.Надеемся, что это даст вам дополнительное представление об использовании инструментов, а также о сужении поля и получении правильной области для извлечения искомой информации.

Вот несколько ссылок, которые помогут вам начать работу:

1 голос
/ 12 июня 2012

Можно извлечь гостевую (виртуальную) физическую память, используя 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

...