Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Майкл_Сикорски,_Эндрю_Хониг_Вскрытие_покажет!_Практический_анализ.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

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Глава 9. OllyDbg  211

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

На рис. 9.5 показана процедура перебазирования DLL при запуске EXE-1 с использованием карты памяти, доступной в OllyDbg. У нас есть один исполняемый файл и две библиотеки. DLL-A с предпочтительным адресом загрузки 0x10000000 уже находится в памяти. Предпочтительный адрес EXE-1 равен 0x00400000. При загрузке библиотеки DLL-B обнаруживается, что она тоже имеет предпочтительный адрес загрузки 0x10000000, поэтому она перемещается в 0x00340000. При этом все ее ссылки на абсолютные адреса памяти меняются так, чтобы она могла корректно работать на новом месте.

Рис. 9.5. Библиотека DLL-B загружается не по тому адресу, который является для нее предпочтительным

Если во время отладки приложения взглянуть на DLL-B в IDA Pro, можно увидеть другой адрес, поскольку IDA Pro не может знать о перебазировании, происходящем на этапе выполнения. Если вы хотите исследовать адрес памяти, полученный из IDA Pro, вам, вероятно, придется его постоянно корректировать. Чтобы этого избежать, вы можете использовать процедуру ручной загрузки, которую мы обсудили в главе 5.

Просмотр потоков и стеков

Вредоносное ПО часто использует сразу несколько потоков. Чтобы открыть окно с текущими потоками, выберите пункт меню View Threads (Вид Потоки). В этом окне выводятся адреса памяти потоков и их текущее состояние (активные, приостановленные или отложенные).

Поскольку приложение OllyDbg является однопоточным, вам, возможно, придется приостановить все потоки, указать точку останова и затем возобновить выполнение программы, чтобы начать отладку в рамках конкретного потока. Нажатие клавиши Pause на главной панели инструментов приостанавливает все активные потоки. На рис. 9.6 показан пример окна Threads (Потоки) с пятью приостановленными потоками.

Чтобы уничтожить отдельный поток, щелкните на нем правой кнопкой мыши и выберите в меню, показанном на рис. 9.6, пункт Kill Thread (Уничтожить поток).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

212  Часть 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

 

 

 

 

Рис. 9.6. Окно Threads с пятью приостановленными потоками и контекстным меню отдельного потока

Каждый поток в процессе имеет собственный стек, где часто хранятся важные данные. Для просмотра стеков можно воспользоваться картой памяти. Например, как вы можете видеть на рис. 9.4, приложение OllyDbg сделало соответствующую пометку для стека главного потока.

Выполнение кода

Глубокие знания и умение выполнять код внутри отладчика являются важными аспектами успешной отладки. OllyDbg поддерживает много разных способов выполнения кода. В табл. 9.1 перечислены самые популярные из них.

Таблица 9.1. Методы выполнения кода в OllyDbg

Функция

Меню

Сочетание

Кнопка

 

 

клавиш

 

 

 

 

 

Выполнить/про-

Debug Run (Отладка Выполнить)

F9

 

играть

 

 

 

 

 

 

 

Приостановить

Debug Pause (Отладка Приостановить)

F12

 

 

 

 

 

Выполнить до вы-

Breakpoint Run to Selection (Точка

F4

 

деления

останова Выполнить до выделения)

 

 

 

 

 

 

Выполнить до воз-

Debug Execute till Return

Ctrl+F9

 

вращения

(Отладка Выполнить до возвращения)

 

 

 

 

 

 

Выполнить до поль-

Debug Execute till User Code (Отладка Вы­

Alt+F9

 

зовательского кода

полнить­ до пользовательского кода)

 

 

 

 

 

 

Пошаговое вы-

Debug Step Into (Отладка Шаг со входом)

F7

 

полнение/шаг со

 

 

 

входом

 

 

 

 

 

 

 

Шаг с обходом

Debug Step Over (Отладка Шаг с обходом)

F8

 

 

 

 

 

 

 

 

 

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

 

 

Глава 9. OllyDbg  213

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Для запуска и остановки программы предусмотрены функции Run (Выполнить) и Pause (Приостановить), хотя последняя используется редко, так как из-за нее программа может остановиться в каком-нибудь бесполезном месте (например, в библио­ течном коде). Вместо этого лучше применять более точные инструменты — например, указывать точки останова, как это продемонстрировано в следующем разделе.

Функция Run (Выполнить) часто используется для перезапуска остановленного процесса, обычно после срабатывания точки останова, чтобы возобновить выполнение. Функция Run to Selection (Выполнить до выделения) позволяет остановить выполнение перед вызовом выделенной инструкции. Если инструкция никогда не вызывается, программа не останавливается.

Функция Execute till Return (Выполнить до возвращения) останавливает выполнение прямо перед выходом из текущей функции. Это может быть полезно, если вы хотите остановить программу сразу после того, как текущая функция завершит свою работу. Но если функция никогда не заканчивается, программа не станет останавливаться.

Функция Execute till User Code (Выполнить до пользовательского кода) может пригодиться во время анализа вредоносного ПО, если вы запутались в библиотечном коде во время отладки. Если программа остановилась на библиотечном коде, выберите пункт меню Debug Execute till User Code (Отладка Выполнить до пользовательского кода), и программа перейдет к тому месту, где начинается скомпилированный вредоносный код (обычно это раздел .text).

OllyDbg поддерживает несколько способов пошагового выполнения. Как уже упоминалось в главе 8, пошаговым называется выполнение, при котором программа немедленно останавливается после вызова каждой инструкции, что позволяет отслеживать работу программы шаг за шагом.

OllyDbg предоставляет два вида пошагового выполнения, которые мы обсуждали в предыдущей главе: шаг со входом и шаг с обходом. В первом случае нужно нажать клавишу F7, а во втором — F8.

Как уже отмечалось, шаг со входом является самым простым вариантом: OllyDbg вызывает одну инструкцию и затем останавливается, независимо от ее типа. Например, в случае с вызовом инструкции 01007568 OllyDbg остановится по адресу 01007568 (поскольку именно туда выполняемая инструкция переносит содержимое регистра EIP).

Шаг с обходом по своему принципу является почти таким же простым. Рассмотрим следующую последовательность инструкций:

010073a4

call 01007568

010073a9

xor ebx, ebx

Если перешагнуть инструкцию call, OllyDbg немедленно остановит выполнение на участке 010073a9 (то есть на инструкции xor ebx, ebx, которая идет далее). Это может оказаться полезным, если нам не хочется заходить в ответвление по адресу 01007568.

И хотя принципиально шаг с обходом является довольно простым, внутри он устроен намного сложнее. OllyDbg создает по адресу 010073a9 точку останова,

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

214  Часть 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

 

 

 

 

возобновляет выполнение (как будто вы нажали кнопку Run (Выполнить)), и затем, когда в ответвлении будет вызвана инструкция ret, он остановит приложение по заданному адресу благодаря скрытой точке останова.

ПРЕДУПРЕЖДЕНИЕ

Шаг с обходом почти всегда работает должным образом. Но в редких случаях обфусцированный или вредоносный код может воспользоваться этой процедурой­ . Например, ответвление 01007568 может невыполнить ret или же это может быть операция получения регистра EIP, что приводит кизвлечению из стека обратного адреса. В таких нестандартных ситуациях шаг с обходом может привести к продолжению работы программы без остановки. Имейте это в виду и используйте данную функцию осторожно.

Точки останова

Как уже обсуждалось в главе 8, существует несколько типов точек останова, и все они поддерживаются в OllyDbg. По умолчанию используются программные точки останова, но вы можете выбрать и аппаратные. Кроме того, вы можете создавать условные точки останова, а также указывать их для адресов в памяти.

Для добавления или удаления точки останова нужно выбрать инструкцию на панели дизассемблирования и нажать F2. Чтобы получить список активных точек останова в программе, выберите пункт меню View Breakpoints (Вид Точки останова) или нажмите значок B на панели инструментов.

После закрытия или принудительного завершения отлаживаемой программы OllyDbg обычно сохраняет местоположение созданных точек останова, что позволит вам использовать их в следующем сеансе отладки (без необходимости заново их устанавливать). В табл. 9.2 приведен полный список точек останова, доступных в OllyDbg.

Таблица 9.2. Типы точек останова в OllyDbg

Функция

Контекстное меню

Клавиша/

 

 

сочетание

 

 

клавиш

 

 

 

Программная точка останова

Breakpoint Toggle (Точка

F2

 

останова Установить/сбросить)

 

 

 

 

Условная точка останова

Breakpoint Conditional (Точка

Shift+F2

 

останова Условная)

 

 

 

 

Аппаратная точка останова

Breakpoint Hardware, on Execution (Точка

 

 

останова Аппаратная, при выполнении)

 

 

 

 

Точка останова для доступа

Breakpoint Memory, on Access (Точка

F2 (выбор

к памяти (чтение, запись или

останова Для доступа к памяти)

памяти)

выполнение)

 

 

 

 

 

Точка останова для записи

Breakpoint Memory, on Write (Точка

 

в память

останова Для записи в память)

 

 

 

 

 

 

 

 

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

 

 

Глава 9. OllyDbg  215

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Программные точки останова особенно полезны при отладке функций, декодиру­ ющих текст. В главе 1 упоминалось, что строки могут послужить хорошим источником информации о возможностях программы, в связи с чем авторы вредоносного ПО часто пытаются обфусцировать строковые данные. При этом задействуется функция декодирования, которая вызывается перед использованием каждой строки. В листинге 9.2 показан пример вызова String_Decoder после добавления в стек обфусцированных данных.

Листинг 9.2. Точка останова для декодирования строки

push offset "4NNpTNHLKIXoPm7iBhUAjvRKNaUVBlr" call String_Decoder

...

push offset "ugKLdNlLT6emldCeZi72mUjieuBqdfZ" call String_Decoder

...

Обфусцированные данные часто трансформируются в полезную строку, которая помещается в стек, поэтому, чтобы ее просмотреть, нам необходимо вывести содержимое стека по окончании ее декодирования. Следовательно, чтобы получить доступ ко всем строкам, точку останова лучше всего указать в конце процедуры трансформации. В таком случае, когда вы нажмете Play (Воспроизвести), OllyDbg продолжит выполнять программу и остановится в момент, когда строка будет готова к использованию. Эта методика позволяет обнаруживать строки по мере их использования в программе. Позже в этой главе мы покажем, как модифицировать инструкции таким образом, чтобы декодировать все строки сразу.

Условные точки останова

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

ПРЕДУПРЕЖДЕНИЕ

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

Условные программные точки останова помогают сэкономить время, если у вас есть часто вызываемая API-функция и вы хотите, чтобы выполнение останавливалось только при передаче ей определенного аргумента (как это показано в следу­ ющем примере).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

216  Часть 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

 

 

 

 

Условные выражения можно использовать для поиска выделения памяти, превышающего определенный размер. Возьмем для примера популярный бэкдор Poison Ivy, который принимает команды от управляющего интернет-сервера, подконтрольного злоумышленнику. Команды реализованы в коде командной оболочки, и для их хранения Poison Ivy выделяет память. В большинстве случаев этот бэкдор выделяет память небольшого объема, что не представляет для нас никакого интереса. Исключение составляют ситуации, когда управляющий сервер шлет существенный объем кода командной оболочки для дальнейшего выполнения.

Чтобы обнаружить такое выделение, лучше всего создать условную точку останова в функции VirtualAlloc (Kernel32.dll), которую Poison Ivy использует для динамического выделения памяти. Тогда, если в условии указан размер больше 100 байт, программа не будет останавливаться при выделениях памяти меньшего объема, которые являются более частыми.

Чтобы подготовить нашу ловушку, можно для начала создать стандартную точку останова в функции VirtualAlloc. На рис. 9.7 показана панель стека в момент ее срабатывания.

Рис. 9.7. Панель стека на момент входа в функцию VirtualAlloc

Мы можем видеть пять первых элементов на вершине стека: обратный адрес, за которым идут четыре аргумента (Address, Size, AllocationType и Protect) функции VirtualAlloc. Слева от аргументов указаны их адреса и значения. В этом примере выделяется 0x29 байт. Поскольку регистр ESP указывает на вершину стека, для доступа к полю Size нужно обратиться к участку памяти [ESP+8].

На рис. 9.8 показана панель дизассемблирования в момент срабатывания точки останова (в начале функции VirtualAlloc).

Рис. 9.8. Создание условной точки останова на панели дизассемблирования

Чтобы словить Poison Ivy на получении большого количества кода командной оболочки, мы зададим условие [ESP+8]>100. Для этого нужно выполнить следующие шаги.

1.Щелкните правой кнопкой мыши на первой инструкции функции на панели дизассемблирования и выберите пункт Breakpoint Conditional (Точка

 

 

 

 

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

 

 

Глава 9. OllyDbg  217

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

останова Условная). На экране появится диалоговое окно, в котором нужно ввести условное выражение.

2.Введите выражение (в данном примере это [ESP+8]>100) и нажмите кнопку OK.

3.Нажмите кнопку Play (Воспроизвести) и подождите, пока код не остановится.

Аппаратные точки останова

OllyDbg позволяет создавать аппаратные точки останова с использованием отдельных регистров процессора, как это было описано в главе 8.

Аппаратные точки останова являются мощным средством, так как они не меняют ваш код, стек или любые другие ресурсы. Они также не снижают скорость выполнения. Но, как отмечалось в предыдущей главе, у них есть одна проблема: их количество ограничено четырьмя.

Чтобы указать аппаратную точку останова, щелкните на соответствующей инструкции правой кнопкой мыши и выберите пункт меню Breakpoint Hardware, on Execution (Точка останова Аппаратная, при выполнении).

Чтобы в OllyDbg по умолчанию использовались аппаратные точки останова вместо программных, нужно открыть меню Debugging Options (Параметры отладки). Это может понадобиться для защиты от методик противодействия отладке, таких как сканирование программных точек останова (см. главу 16).

Точки останова для доступа к памяти

OllyDbg поддерживает точки останова, которые срабатывают при доступе к определенному участку памяти. Эти точки останова могут быть как программными, так и аппаратными. Вы также можете выбрать, когда именно они должны срабатывать: при чтении, записи, выполнении или при любом доступе.

Чтобы создать простую точку останова такого типа, выделите участок на панели дампа или карты памяти, щелкните на нем правой кнопкой мыши и выберите пункт меню Breakpoint Memory, on Access (Точка останова Для доступа к памяти). В любой момент времени может использоваться только одна такая точка. После создания новой предыдущая автоматически удаляется.

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

Точки останова для доступа к памяти особенно полезны во время анализа вредоносного ПО, когда вам нужно определить момент использования загруженной динамической библиотеки: они позволяют остановить выполнение непосредственно при обращении к коду из этой библиотеки. Для этого нужно выполнить следующие шаги.

1.Откройте окно с картой памяти и щелкните правой кнопкой мыши на разделе .text нужной вам библиотеки (это раздел, который содержит исполняемый код).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

218  Часть 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

 

 

 

 

2.Выберите пункт меню Set Memory Breakpoint on Access (Создать точку останова для доступа к памяти).

3.Нажмите клавишу F9 или кнопку Play (Воспроизвести), чтобы возобновить выполнение.

Когда выполнение дойдет до раздела .text внутри DLL, программа должна остановиться.

Загрузка динамических библиотек

Помимо возможности загружать и подключать исполняемые файлы OllyDbg также позволяет отлаживать библиотеки. Поскольку DLL нельзя запустить напрямую, OllyDbg использует для их загрузки фиктивную программу под названием loaddll.exe. Это чрезвычайно полезный подход, поскольку зараженное ПО часто распространяется в виде DLL, а большая часть кода при этом находится в функции DllMain (которая занимается инициализацией и вызывается при загрузке DLL процессом). OllyDbg по умолчанию останавливается на точке входа в загруженную библиотеку (DllMain).

Чтобы вызывать из динамической библиотеки экспортные функции с аргументами, вам сначала нужно загрузить ее в OllyDbg. Когда выполнение остановится на точке входа, на-

жмите кнопку Play (Воспроизвести) — запустит-

ся DllMain и остальной код, необходимый для Рис. 9.9. Кнопка Play в OllyDbg инициализации DLL (рис. 9.9). Затем OllyDbg

остановится, и вы сможете отладить нужную вам экспортную функцию с указанием аргументов. Для этого выберите в главном меню пункт Debug Call DLL Export (Отладка Вызвать экспорт из DLL).

На рис. 9.10 показан процесс загрузки в OllyDbg библиотеки ws2_32.dll и вызова из нее функции ntohl , которая меняет порядок байтов в 32-битном числе с сетевого на локальный. Слева можно добавить любые аргументы на наш выбор. В данном примере мы указали значение 127.0.0.1 (0x7F000001) с сетевым порядком байтов . Флажки в левой части окна устанавливаются, только если мы указываем аргументы.

Вы можете тут же просмотреть ассемблерный код функции ntohl, нажав кнопку Follow in Disassembler (Отслеживать в дизассемблере). Флажок Hide on call (Скрыть при вызове) справа внизу позволяет спрятать окно после выполнения вызова. С помощью флажка Pause after call (Остановить после вызова) можно остановить выполнение сразу после вызова экспортной функции, что может оказаться хорошей альтернативой точкам останова.

Подготовив все необходимые аргументы и регистры, нажмите кнопку Call (Вызвать) справа внизу, чтобы запустить функцию. После этого окно OllyDbg должно вывести значения всех регистров до и после вызова.