- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 0. Анализ вредоносных программ для начинающих
- •Цель анализа вредоносных программ
- •Методики анализа вредоносного ПО
- •Общие правила анализа вредоносного ПО
- •Глава 1. Основные статические методики
- •Сканирование антивирусом: первый шаг
- •Хеширование: отпечатки пальцев злоумышленника
- •Поиск строк
- •Упакованное и обфусцированное вредоносное ПО
- •Формат переносимых исполняемых файлов
- •Компонуемые библиотеки и функции
- •Статический анализ на практике
- •Заголовки и разделы PE-файла
- •Итоги главы
- •Глава 2. Анализ вредоносных программ в виртуальных машинах
- •Структура виртуальной машины
- •Запуск виртуальной машины для анализа вредоносного ПО
- •Использование виртуальной машины для анализа безопасности
- •Риски при использовании VMware для анализа безопасности
- •Запись/воспроизведение работы компьютера
- •Итоги главы
- •Глава 3. Основы динамического анализа
- •Песочницы: решение на скорую руку
- •Запуск вредоносных программ
- •Мониторинг с помощью Process Monitor
- •Сравнение снимков реестра с помощью Regshot
- •Симуляция сети
- •Перехват пакетов с помощью Wireshark
- •Использование INetSim
- •Применение основных инструментов для динамического анализа
- •Итоги главы
- •Уровни абстракции
- •Архитектура x86
- •Итоги главы
- •Глава 5. IDA Pro
- •Загрузка исполняемого файла
- •Интерфейс IDA Pro
- •Использование перекрестных ссылок
- •Анализ функций
- •Схематическое представление
- •Повышение эффективности дизассемблирования
- •Плагины к IDA Pro
- •Итоги главы
- •Глава 6. Распознавание конструкций языка C в ассемблере
- •Переменные: локальные и глобальные
- •Дизассемблирование арифметических операций
- •Распознавание выражений if
- •Распознавание циклов
- •Соглашения, касающиеся вызова функций
- •Анализ выражений switch
- •Дизассемблирование массивов
- •Распознавание структур
- •Анализ обхода связного списка
- •Итоги главы
- •Глава 7. Анализ вредоносных программ для Windows
- •Windows API
- •Реестр Windows
- •API для работы с сетью
- •Отслеживание запущенной вредоносной программы
- •Сравнение режимов ядра и пользователя
- •Native API
- •Итоги главы
- •Глава 8. Отладка
- •Сравнение отладки на уровне исходного и дизассемблированного кода
- •Отладка на уровне ядра и пользователя
- •Использование отладчика
- •Исключения
- •Управление выполнением с помощью отладчика
- •Изменение хода выполнения программы на практике
- •Итоги главы
- •Глава 9. OllyDbg
- •Загрузка вредоносного ПО
- •Пользовательский интерфейс OllyDbg
- •Карта памяти
- •Просмотр потоков и стеков
- •Выполнение кода
- •Точки останова
- •Трассировка
- •Обработка исключений
- •Редактирование кода
- •Анализ кода командной оболочки
- •Вспомогательные возможности
- •Подключаемые модули
- •Отладка с использованием скриптов
- •Итоги главы
- •Драйверы и код ядра
- •Подготовка к отладке ядра
- •Использование WinDbg
- •Отладочные символы Microsoft
- •Отладка ядра на практике
- •Руткиты
- •Загрузка драйверов
- •Итоги главы
- •Глава 11. Поведение вредоносных программ
- •Программы для загрузки и запуска ПО
- •Бэкдоры
- •Похищение учетных данных
- •Механизм постоянного присутствия
- •Повышение привилегий
- •Заметая следы: руткиты, работающие в пользовательском режиме
- •Итоги главы
- •Глава 12. Скрытый запуск вредоносного ПО
- •Загрузчики
- •Внедрение в процесс
- •Подмена процесса
- •Внедрение перехватчиков
- •Detours
- •Внедрение асинхронных процедур
- •Итоги главы
- •Глава 13. Кодирование данных
- •Простые шифры
- •Распространенные криптографические алгоритмы
- •Нестандартное кодирование
- •Декодирование
- •Итоги главы
- •Глава 14. Сетевые сигнатуры, нацеленные на вредоносное ПО
- •Сетевые контрмеры
- •Безопасное расследование вредоносной деятельности в Интернете
- •Контрмеры, основанные на сетевом трафике
- •Углубленный анализ
- •Сочетание динамических и статических методик анализа
- •Понимание психологии злоумышленника
- •Итоги главы
- •Искажение алгоритмов дизассемблирования
- •Срыв анализа слоя стека
- •Итоги главы
- •Глава 16. Антиотладка
- •Обнаружение отладчика в Windows
- •Распознавание поведения отладчика
- •Искажение работы отладчика
- •Уязвимости отладчиков
- •Итоги главы
- •Глава 17. Методы противодействия виртуальным машинам
- •Признаки присутствия VMware
- •Уязвимые инструкции
- •Изменение настроек
- •Побег из виртуальной машины
- •Итоги главы
- •Глава 18. Упаковщики и распаковка
- •Анатомия упаковщика
- •Распознавание упакованных программ
- •Способы распаковки
- •Автоматизированная распаковка
- •Ручная распаковка
- •Советы и приемы для работы с распространенными упаковщиками
- •Анализ без полной распаковки
- •Итоги главы
- •Глава 19. Анализ кода командной оболочки
- •Загрузка кода командной оболочки для анализа
- •Позиционно-независимый код
- •Определение адреса выполнения
- •Поиск символов вручную
- •Окончательная версия программы Hello World
- •Кодировки кода командной оболочки
- •NOP-цепочки
- •Поиск кода командной оболочки
- •Итоги главы
- •Глава 20. Анализ кода на C++
- •Объектно-ориентированное программирование
- •Обычные и виртуальные функции
- •Создание и уничтожение объектов
- •Итоги главы
- •Какой смысл в 64-битном вредоносном ПО?
- •Особенности архитектуры x64
- •Признаки вредоносного кода на платформе x64
- •Итоги главы
- •Приложения
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
|
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
10 |
||||
|
|
|
|
|
|
.c |
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
Отладка ядра
с помощью WinDbg
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
WinDbg (часто произносится как «уиндбаг») — это бесплатный отладчик от Microsoft. В сфере анализа вредоносного кода он не такой популярный, как OllyDbg, но у него есть много преимуществ, самым важным из которых является возможность отлаживать ядро. В этой главе мы изучим методики отладки ядра и анализа руткитов с помощью WinDbg.
Большая часть материала этой главы применима и к отладке в пользовательском режиме, которую WinDbg тоже поддерживает, но большинство аналитиков безопасности используют для этого OllyDbg, поэтому мы сосредоточимся на режиме ядра. WinDbg также позволяет отслеживать взаимодействия с Windows и предоставляет подробные справочные файлы.
Драйверы и код ядра
Прежде чем приступать к отладке вредоносного кода, вы должны понять, как работает код ядра, почему авторы вредоносов его используют и какие особые проблемы с ним связаны. Драйверы устройств (обычно их называют просто драйверами) позволяют сторонним разработчикам выполнять код в ядре Windows.
Драйверы сложно анализировать, потому что после загрузки в память они остаются там на постоянной основе, отвечая на запросы приложений. Дополнительные трудности вызваны тем, что приложения не взаимодействуют с драйверами напрямую. Вместо этого они работают с объектами устройств, которые обращаются
кконкретному оборудованию. Устройства не всегда представляют собой реальные аппаратные компоненты — они доступны из пользовательского пространства и могут создаваться и уничтожаться по запросу драйвера.
Возьмем, к примеру, USB-накопители. Они управляются системным драйвером, доступ к которому закрыт для прикладных программ. Вместо этого программы выполняют запросы к объекту соответствующего устройства. Когда пользователь вставляет USB-накопитель в компьютер, Windows создает для него объект под названием «диск F:». После этого приложения могут обращаться к этому диску, и эти обращения будут передаваться драйверу накопителя. Тот же драйвер может обрабатывать запросы к другому USB-накопителю, но приложение будет обращаться
кнему через другой объект, например «диск G:».
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 10. Отладка ядра с помощью WinDbg 233 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Чтобы все это работало, как следует, драйверы должны быть загружены в ядро (по аналогии с тем, как DLL загружаются в процессы). При первой загрузке из драйвера вызывается процедура DriverEntry (аналогичная DLLMain в DLL).
Но, в отличие от библиотек, которые предоставляют свои функции посредством экспортных таблиц, драйверы должны зарегистрировать адреса для своих функций обратного вызова. Они будут запускаться, когда программному компоненту в пользовательском пространстве нужно будет выполнить какую-нибудь операцию. Регистрация происходит внутри процедуры DriverEntry, которой Windows передает структуру объекта устройства. Там эта структура заполняется функциями обратного вызова, после чего DriverEntry создает устройство, доступное из пользовательского пространства, — отправляя запросы этому устройству, приложения взаимодействуют с драйвером.
Рассмотрим запрос на чтение, отправленный пользовательской программой. Рано или поздно он дойдет до драйвера, который управляет оборудованием, хранящим запрошенные данные. Сначала программа получит файловый дескриптор устройства, а затем передаст его в вызов ReadFile. Ядро обработает этот вызов и в итоге запустит функцию обратного вызова, которая отвечает за операции чтения.
Среди всех запросов к вредоносным компонентам ядра чаще всего встречается DeviceIoControl — это универсальный вызов, направляемый пользовательским модулем устройству, которое управляется драйвером. В качестве ввода эта программа передает буфер с данными произвольного размера, получая в ответ аналогичный буфер.
Вызовы, направленные от пользовательского приложения к драйверу, работа ющему в режиме ядра, сложно отслеживать из-за вспомогательного системного кода, который при этом выполняется. На рис. 10.1 проиллюстрирован путь запроса от программы из пространства пользователя к драйверу. Одни запросы направлены драйверам, которые управляют устройствами, другие влияют лишь на внутреннее состояние ядра.
Рис. 10.1. Обработка ядром вызовов из пользовательского пространства |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
234 Часть III • Продвинутый динамический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
ПРИМЕЧАНИЕ
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Иногда вредоносное ПО, выполняющееся в режиме ядра, не хранит никаких важных компонентов в пользовательском пространстве. Оно не создает объекта устройства, позволяя драйверу работать самостоятельно.
Вредоносные драйверы обычно не занимаются управлением устройствами — вместо этого они взаимодействуют с основными компонентами ядра Windows, такими как ntoskrnl.exe и hal.dll. Файл ntoskrnl.exe содержит код базовых системных функций, а hal.dll отвечает за работу с самым важным аппаратным обеспечением. Для манипуляции ядром вредоносы часто импортируют функции из обоих этих файлов.
Подготовка к отладке ядра
Производить отладку ядра сложнее, чем отладку прикладных программ: при первой ОС останавливается, что делает невозможным работу отладчика. В связи с этим для отладки ядра чаще всего используют VMware.
Вотличие от пользовательского режима, отладка в режиме ядра требует определенной подготовки. Вам нужно настроить виртуальную машину для отладки ядра, сконфигурировать VMware, чтобы проложить виртуальный последовательный порт между основной и гостевой системами, и подготовить WinDbg на своем компьютере.
Для настройки виртуальной машины нужно отредактировать файл C:\boot.ini, который обычно скрыт (включите отображение скрытых файлов в параметрах папки). Но перед этим сделайте снимок виртуальной машины, чтобы в случае ошибки вы могли отменить изменения.
Влистинге 10.1 показан файл boot.ini с дополнительной строкой, которая делает возможной отладку ядра.
Листинг 10.1. Пример файла boot.ini с возможностью отладки ядра
[boot loader] timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional with Kernel
Debugging" /noexecute=optin /fastdetect /debug /debugport=COM1 /baudrate=115200
В строке указана загружаемая ОС — в данном случае это Windows XP. Строка добавлена для отладки ядра. В вашем файле boot.ini, скорее всего, будет только строка, аналогичная .
Продублируйте последнюю строку своего файла boot.ini и добавьте в нее параметры /debug /debugport=COM1 /baudrate=115200 (не обращайте внимания на
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 10. Отладка ядра с помощью WinDbg 235 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
другие элементы, такие как multi(0)disk(0), — просто скопируйте строку и добавьте указанные выше ключи). Флаг /debug включает отладку ядра, флаг /debugport=COM1 говорит ОС о том, через какой порт будут подключены отладочная и отлаживаемая системы, а флаг /baudrate=115200 определяет скорость соединения. В этом примере мы используем виртуальный COM-порт, созданный программой VMware. Вы также должны поменять название системы во второй записи, чтобы позже ее можно было отличить. В данном случае мы назвали систему Microsoft Windows XP Professional with Kernel Debugging.
В следующий раз, когда вы будете загружать виртуальную машину, у вас должна появиться возможность выбрать версию ОС с включенной отладкой. У вас будет 30 секунд на то, чтобы решить, в каком режиме загружаться. Если вы хотите иметь возможность подключиться к загрузчику ядра, вам следует выбрать версию с поддержкой отладки.
ПРИМЕЧАНИЕ
Тот факт, что загружаемая вами ОС поддерживает отладку, вовсе не означает, что вы должны подключить к ней отладчик. Она может работать и без этого.
Теперь сконфигурируем VMware, чтобы создать виртуальное соединение между гостевой и основной системами. Для этого мы воспользуемся последовательным портом в сочетании с именованным каналом основной системы, добавив новое устройство. Чтобы это сделать, выполните следующие шаги.
1.Выберите пункт меню VM Settings (VM Настройки), чтобы открыть диалоговое окно с настройками VMware.
2.В правой нижней части окна нажмите кнопку Add (Добавить) и выберите в списке тип устройства Serial Port (Последовательный порт).
3.В появившемся диалоговом окне выберите Output to Named Pipe (Вывод в именованный канал) в качестве типа последовательного порта.
4.В следующем окне введите \\.\pipe\com_1 в качестве имени сокета и выберите
всписках пункты This end is the server (Этот конец является сервером) и The other end is an application (Другой конец является приложением). Когда вы закончите,
внастройках виртуальной машины должен появиться серийный порт, настроенный так, как показано на рис. 10.2.
5.Установите флажок Yield CPU on poll (Выделять ЦПУ по запросу).
ПРИМЕЧАНИЕ
Последовательность диалоговых окон может варьироваться в зависимости от версии VMware. Здесь приводятся инструкции для VMware Workstation 7. Другие версии должны иметь те же параметры, но окна для их изменения будут слегка различаться.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
236 Часть III • Продвинутый динамический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис. 10.2. Добавление в виртуальную машину последовательного порта
Запустите сконфигурированную вами машину. Чтобы подключить к ней WinDbg и начать отладку ядра, выполните в основной системе следующие шаги.
1.Запустите WinDbg.
2.Выберите пункт меню File Kernel Debug (Файл Отладка ядра), перейдите на вкладку COM и введите имя файла и скорость соединения, которые вы указали ранее в файле boot.ini (в нашем примере это 115200). Прежде чем нажать кнопку OK, убедитесь в том, что флажок Pipe (Канал) установлен. Ваше окно Kernel Debugging (Отладка ядра) должно выглядеть так, как на рис. 10.3.
Если виртуальная машина уже запущена, отладчик должен подключиться в течение нескольких секунд. Если нет, он подключится на этапе загрузки ОС. Когда соединение будет установлено, вы сможете включить подробный вывод отладки ядра,