Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Майкл_Сикорски,_Эндрю_Хониг_Вскрытие_покажет!_Практический_анализ.pdf
Скачиваний:
18
Добавлен:
19.04.2024
Размер:
17.17 Mб
Скачать

 

 

 

 

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.

Если виртуальная машина уже запущена, отладчик должен подключиться в течение нескольких секунд. Если нет, он подключится на этапе загрузки ОС. Когда соединение будет установлено, вы сможете включить подробный вывод отладки ядра,