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

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

124  Часть II  •  Продвинутый статический анализ

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

 

 

 

 

Рис. 5.9. Схема перекрестных ссылок отдельной функции (sub_4011F0)

Повышение эффективности дизассемблирования

Одна из лучших функций IDA Pro — возможность подстраивать процесс дизассемблирования под свои нужды. Вносимые вами изменения могут существенно повысить эффективность анализа.

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

IDA Pro не умеет отменять выполненные действия, поэтому будьте осторожны при внесении изменений.

Переименование местоположений

IDA Pro хорошо справляется с именованием виртуальных адресов и переменных стека, но вы можете придать этим именам больше смысла. Названия, сгенерированные автоматически (фиктивные), такие как sub_401000, не слишком выразительны — куда более полезным было бы имя вроде ReverseBackdoorThread. Вы должны заменить эти фиктивные имена чем-то более осмысленным. Это также поможет вам избежать повторного разбора одной и той же функции. Процесс переименования выполняется лишь в одном месте, после чего IDA Pro автоматически применяет изменения везде, где упоминается соответствующий элемент.

 

 

 

 

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

 

 

Глава 5. IDA Pro  125

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

После замены фиктивных имен на более подходящие вам будет намного легче исследовать перекрестные ссылки. Например, если в программе часто используется функция sub_401200, ее новое имя (скажем, DNSrequest) будет выводиться везде, где она вызывается. Только представьте, сколько времени вы сможете сэкономить в ходе анализа, если у вас перед глазами будет понятное название и вам не нужно будет запоминать, что делает функция sub_401200, или разбирать ее каждый раз заново.

В табл. 5.2 показан пример того, как можно переименовать локальные переменные и аргументы. Слева содержится код на ассемблере до переименования аргументов, а справа — после. В правом столбце можно почерпнуть некоторую информацию. Так, arg_4 и var_598 были переименованы в port_str и port. Как видите, эти новые названия имеют гораздо больше смысла по сравнению с фиктивными именами.

Комментарии

IDA Pro позволяет вам встраивать комментарии в дизассемблированный код (вдобавок к тем, которые она добавляет автоматически).

Чтобы вставить собственный комментарий, поместите курсор на нужную вам строку дизассемблированного кода и нажмите на клавиатуре двоеточие (:). На экране появится окно комментирования. Если вы хотите, чтобы ваш комментарий был указан везде, где упоминается соответствующий адрес, нажмите точку с запятой (;).

Форматирование операндов

В ходе дизассемблирования IDA Pro решает, как форматировать операнды для той или иной инструкции. При отсутствии контекста данные выводятся в шестнадцатеричном виде. IDA Pro позволяет при необходимости отображать эти значения в более понятном виде.

Таблица 5.2. Изменение операндов функции

Без переименования аргументов

С переименованием аргументов

 

 

 

 

 

 

004013C8

mov

eax, [ebp+arg_4]

004013C8

mov

eax, [ebp+port_str]

004013CB

push

eax

004013CB

push

eax

004013CC

call

_atoi

004013CC

call

_atoi

004013D1

add

esp, 4

004013D1

add

esp, 4

004013D4

mov [ebp+var_598], ax

004013D4

mov

[ebp+port], ax

004013DB

movzx ecx, [ebp+var_598]

004013DB

movzx ecx, [ebp+port]

004013E2

test

ecx, ecx

004013E2

test

ecx, ecx

 

 

 

 

 

 

Продолжение

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

126  Часть II  •  Продвинутый статический анализ

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Таблица 5.2 (продолжение)

 

 

 

 

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

 

 

 

 

Без переименования аргументов

С переименованием аргументов

 

 

 

 

 

 

004013E4

jnz

short loc_4013F8

004013E4

jnz

short loc_4013F8

004013E6

push

offset aError

004013E6

push

offset aError

004013EB

call

printf

004013EB

call

printf

004013F0

add

esp, 4

004013F0

add

esp, 4

004013F3

jmp

loc_4016FB

004013F3

jmp

loc_4016FB

004013F8 ;

----------------------

 

004013F8 ;

--------------------

 

004013F8

 

 

004013F8

 

 

004013F8 loc_4013F8:

004013F8 loc_4013F8:

004013F8

movzx

edx, [ebp+var_598]

004013F8

movzx

edx, [ebp+port]

004013FF

push

edx

004013FF

push

edx

00401400

call

ds:htons

00401400

call

ds:htons

 

 

 

 

 

 

На рис. 5.10 показан пример изменения операндов инструкции, которая сравнивает 62h с локальной переменной var_4.

Если щелкнуть правой кнопкой мыши на 62h, появится меню с возможностью вывести это значение как десятичное 98, восьмеричное 142o, двоичное 1100010b или как символ b в кодировке ASCII — вы можете выбрать то, что лучше подходит в вашем случае.

Рис. 5.10. Изменение операндов функции

Чтобы выбрать, ссылается ли операнд на память или выводится в виде данных (по умолчанию), нажмите клавишу O. Представьте, к примеру, что при анализе диз­ ассемблированного кода вы отследили ссылку loc_410000 и увидели следующие инструкции:

mov eax, loc_410000 add ebx, eax

mul ebx

На уровне ассемблера все имеет числовое представление, однако программа IDA Pro приняла число 4259840 (0x410000 в восьмеричном виде) за ссылку на адрес 410000. Для исправления этой ошибки нажмите клавишу O, укажите, что

 

 

 

 

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

 

 

Глава 5. IDA Pro  127

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

это число, и уберите некорректную перекрестную ссылку из окна дизассемблирования.

Использование именованных констант

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

IDA Pro имеет обширный каталог именованных констант для Windows API и стандартной библиотеки C. Кроме того, вы можете выбрать пункт меню Use Standard Symbolic Constant (Использовать стандартные символьные константы) для дизассемблированных операндов, как показано на рис. 5.10. На рис. 5.11 можно видеть окно, которое появляется при выборе этого пункта для значения 0x800000000.

Рис. 5.11. Окно стандартных символьных констант

Отрезки кода, представленные в табл. 5.3, демонстрируют результат применения стандартных символьных констант к стандартному для Windows API вызову CreateFileA. Обратите внимание, насколько больше осмысленного кода содержится справа.

ПРИМЕЧАНИЕ

Для того чтобы определиться с тем, какое значение следует выбрать из списка стандартных символьных констант (который часто оказывается довольно

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

128  Часть II  •  Продвинутый статический анализ

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

длинным), вам нужно свериться со страницей MSDN для соответствующего вызова Windows API. Там вы сможете узнать, какие константы связаны скаждым параметром. Мы обсудим это подробнее в главе 7 при рассмотрении концепций Windows.

 

 

 

 

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

 

 

 

 

Таблица 5.3. Код до и после определения стандартных символьных констант

Без символьных констант

С символьными константами

 

 

 

 

 

mov

esi, [esp+1Ch+argv]

mov

esi, [esp+1Ch+argv]

 

mov

edx, [esi+4]

mov

edx, [esi+4]

 

mov

edi, ds:CreateFileA

mov

edi, ds:CreateFileA

 

push

0

; hTemplateFile

push

NULL ; hTemplateFile

 

push

80h ; dwFlagsAndAttributes

push

FILE_ATTRIBUTE_NORMAL ; dwFlagsAndAttributes

push

3

; dwCreationDisposition

push

OPEN_EXISTING

; dwCreationDisposition

push

0

; lpSecurityAttributes

push

NULL

; lpSecurityAttributes

push

1

; dwShareMode

push

FILE_SHARE_READ

; dwShareMode

push

80000000h ; dwDesiredAccess

push

GENERIC_READ

; dwDesiredAccess

push

edx ; lpFileName

push

edx ; lpFileName

 

call

edi ; CreateFileA

call

edi ; CreateFileA

 

 

 

 

 

 

 

Может случиться так, что стандартная символьная константа, которая вас интересует, не появится в списке и вам придется загрузить соответствующую библиотеку типов вручную. Чтобы просмотреть уже загруженные библиотеки, выберите пункт меню View Open Subviews Type Libraries (Вид Открытые дочерние представления Библиотеки типов).

Обычно библиотеки mssdk и vc6win загружаются автоматически, но, если этого не произошло, вы можете выполнить ручную загрузку (что приходится делать довольно часто при работе с вредоносами, которые используют стандартные API семейства Windows NT). Чтобы получить символьную константу для Native API, загрузите ntapi (Microsoft Windows NT 4.0 Native API). В операционной системе Linux вам похожим образом пришлось бы загрузить библиотеки gnuunx (GNU C++ UNIX).

Переопределение кода и данных

При начальном дизассемблировании в IDA Pro байты время от времени попадают не в ту категорию: например, код может быть определен как данные и наоборот. Чтобы это исправить, нажмите в окне дизассемблирования клавишу U. В результате вы отмените определение функций, кода и данных, превратив их в простой список байтов.

Чтобы пометить байты как код, нажмите клавишу C. Например, в табл. 5.4 показан зараженный PDF-документ под названием paycuts.pdf. На сдвиге 0x8387 в нем