- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
. |
|
|
|
|
|
.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 119 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Рис. 5.5. Пример поиска
ряет результат инструкции strcmp. Один из операндов strcmp — строка $mab, которая, скорее всего, и является паролем.
004010E0 |
push |
offset aMab |
; "$mab" |
004010E5 |
lea |
ecx, [ebp+var_1C] |
|
004010E8 |
push |
ecx |
|
004010E9 |
call |
strcmp |
|
004010EE |
add |
esp, 8 |
|
004010F1 |
test |
eax, eax |
|
004010F3 |
jnz |
short loc_401104 |
|
004010F5 |
push |
offset aKeyAccepted ; "Key Accepted!\n" |
|
004010FA |
call |
printf |
|
004010FF |
add |
esp, 4 |
|
00401102 |
jmp |
short loc_401118 |
|
00401104 |
loc_401104 |
; |
CODE XREF: _main+53j |
00401104 |
push |
offset aBadKey |
; "Bad key\n" |
00401109 |
call |
printf |
|
В следующем примере показан результат ввода обнаруженного нами пароля ($mab). Программа выводит другое сообщение:
C:\>password.exe
Enter password for this Malware: $mab
Key Accepted!
The malware has been unlocked
Этот пример демонстрирует, насколько быстро можно получить информацию о двоичном файле, воспользовавшись функцией поиска и ссылками.
Использование перекрестных ссылок
Перекрестные ссылки (в IDA Pro они называются xref) могут сказать вам, откуда вызывается функция или где используется строка. Если вы нашли интересную функцию и хотите узнать, с какими параметрами она вызывается, с помощью перекрестных ссылок вы можете быстро перейти в то место, где эти параметры помещаются в стек. Это также позволяет генерировать наглядные схемы, которые могут помочь при выполнении анализа.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
120 Часть 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.2 показана перекрестная ссылка , которая говорит о том, что данная функция (sub_401000) вызывается из главной функции со сдвигом 0x3. Код ссылки показывает, какой переход позволяет попасть в нужное место — в этом примере оно помечено как . Мы это знаем, потому что сдвиг 0x19 в sub_401000 является инструкцией jmp по адресу 0x401019.
Листинг 5.2. Перекрестные ссылки в коде |
|
|
|||
00401000 |
sub_401000 |
proc near |
; |
CODE XREF: _main+3p |
|
00401000 |
push |
ebp |
|
|
|
00401001 |
mov |
ebp, esp |
|
|
|
00401003 |
loc_401003: |
|
; |
CODE XREF: sub_401000+19j |
|
00401003 |
mov |
eax, 1 |
|
|
|
00401008 |
test |
eax, eax |
|
|
|
0040100A |
jz |
short loc_40101B |
|
|
|
0040100C |
push |
offset aLoop |
; "Loop\n" |
||
00401011 |
call |
printf |
|
|
|
00401016 |
add |
esp, 4 |
|
|
|
00401019 |
jmp |
short loc_401003 |
|
|
По умолчанию для каждой функции в IDA Pro выводится всего несколько перекрестных ссылок, даже если их становится намного больше во время вызова. Чтобы просмотреть все перекрестные ссылки функции, щелкните на ее имени и нажмите клавишу X. Окно, которое появится на экране, должно содержать список всех мест, откуда вызывается данная функция. На рис. 5.6 показано окно Xrefs со списком перекрестных ссылок для sub_408980 — в его нижней части можно видеть, что функция вызывается 64 раза (Line 1 of 64).
Выполните двойной щелчок на любом элементе списка, чтобы перейти по соответствующей ссылке в окно дизассемблирования.
Рис. 5.6. Окно Xrefs
|
|
|
|
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 121 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Этот вид перекрестных ссылок используется для отслеживания данных внутри двоичного файла. Они могут указывать на любой байт данных, которые упоминаются в коде с помощью адреса памяти, как показано в листинге 5.3. Например, вы можете видеть перекрестную ссылку на DWORD 0x7F000001 . Она говорит нам о том, что данные используются в функции, размещенной по адресу 0x401020. В следующей строке показана перекрестная ссылка для строки <Hostname> <Port>.
Листинг 5.3. Перекрестные ссылки на данные |
|
|
||
0040C000 |
dword_40C000 |
dd 7F000001h |
; |
DATA XREF: sub_401020+14r |
0040C004 |
aHostnamePort |
db '<Hostname> <Port>',0Ah,0 ; DATA XREF: sub_401000+3 |
Как вы помните из главы 1, статический анализ строк часто является отправной точкой в исследовании вредоноса. Если вы заметите интересную строку, воспользуйтесь функцией перекрестных ссылок в IDA Pro, чтобы узнать, где и как именно она применяется в коде.
Анализ функций
Одной из самых полезных особенностей IDA Pro является возможность распознавать и маркировать функции, разделяя их на локальные переменные и параметры. В листинге 5.4 показан пример функции, распознанной программой IDA Pro.
Листинг 5.4. Пример функции и стека
00401020 |
; =============== S U B |
R O U T I N E============================= |
|
00401020 |
|
|
|
00401020 |
; Attributes: ebp-based |
frame |
|
00401020 |
|
|
|
00401020 |
function |
proc near |
; CODE XREF: _main+1Cp |
00401020 |
|
|
|
00401020 |
var_C |
= dword ptr -0Ch |
|
00401020 |
var_8 |
= dword ptr -8 |
|
00401020 |
var_4 |
= dword ptr -4 |
|
00401020 |
arg_0 |
= dword ptr 8 |
|
00401020 |
arg_4 |
= dword ptr 0Ch |
|
00401020 |
|
|
|
00401020 |
|
push |
ebp |
00401021 |
|
mov |
ebp, esp |
00401023 |
|
sub |
esp, 0Ch |
00401026 |
|
mov |
[ebp+var_8], 5 |
0040102D |
|
mov |
[ebp+var_C], 3 |
00401034 |
|
mov |
eax, [ebp+var_8] |
00401037 |
|
add |
eax, 22h |
0040103A |
|
mov |
[ebp+arg_0], eax |
0040103D |
|
cmp |
[ebp+arg_0], 64h |
00401041 |
|
jnz |
short loc_40104B |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|
|||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|
|||
w |
|
|
to |
|
|
122 Часть II • |
Продвинутый статический анализ |
|||||
w Click |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
|
|
||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
00401043 |
mov |
ecx, [ebp+arg_4] |
||
|
|
|
|
|
|
|
|
00401046 |
mov |
[ebp+var_4], ecx |
||
|
|
|
|
|
|
|
|
00401049 |
jmp |
short loc_401050 |
||
|
|
|
|
|
|
|
|
0040104B loc_40104B: |
|
; CODE XREF: function+21j |
||
|
|
|
|
|
|
|
|
0040104B |
call |
sub_401000 |
||
|
|
|
|
|
|
|
|
00401050 loc_401050: |
|
; CODE XREF: function+29j |
||
|
|
|
|
|
|
|
|
00401050 |
mov |
eax, [ebp+arg_4] |
||
|
|
|
|
|
|
|
|
00401053 |
mov |
esp, ebp |
||
|
|
|
|
|
|
|
|
00401055 |
pop |
ebp |
||
|
|
|
|
|
|
|
|
00401056 |
retn |
|
||
|
|
|
|
|
|
|
|
00401056 function |
endp |
|
|
|
|
|
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 |
|
|
|
|
Обратите внимание на то, как IDA Pro показывает, что в функции используется слой стека, основанный на EBP : это означает, что локальные переменные и параметры функции будут адресоваться через регистр EBP. Программа IDA Pro успешно распознала все локальные переменные и параметры этой функции. Первые она пометила префиксом var_, а вторые — префиксом arg_. Их имена содержат суффиксы, которые отвечают их сдвигу относительно регистра EBP. IDA Pro маркирует только те локальные переменные и параметры, которые используются в коде. Невозможно с уверенностью сказать, был ли распознан весь исходный код.
Как отмечалось в главе 4, локальные переменные имеют отрицательный сдвиг относительно регистра EBP, а аргументы — положительный. В листинге представлено начало стека . Первая строка говорит о том, что переменная var_C соотносится со значением -0xCh. Таким образом программа IDA Pro сообщает о том, что она подставила var_C вместо -0xC , делая инструкцию абстрактной. Например, инструкцию mov [ebp-0Ch], 3 можно прочитать как «var_C теперь равна 3». Такое абстрагирование делает чтение дизассемблированного кода более эффективным.
Иногда IDA Pro не удается определить функцию. В таких ситуациях вы можете создать ее вручную, нажав клавишу P. У IDA Pro также могут возникнуть сложности с определением слоев стека, основанных на регистре EBP, а вместо удобных меток на экране могут появиться инструкции mov [ebp-0Ch], eax и push dword ptr [ebp010h]. В большинстве случаев вы можете это исправить: для этого нужно нажать Alt+P, выбрать пункт BP Based Frame (Слой, основанный на BP) и указать 4 bytes for Saved Registers (4 байта для сохраненных регистров).
Схематическое представление
IDA Pro поддерживает пять инструментов для создания схем. Все они доступны на панели инструментов, показанной на рис. 5.7. Четыре из них используют перекрестные ссылки.
Если нажать одну из этих кнопок, на экране появится схема, построенная с помощью приложения WinGraph32. В отличие от графического представления в окне дизассемблирования, эти схемы нельзя редактировать внутри IDA (их часто называют устаревшими схемами). Инструменты для создания схем описаны в табл. 5.1.
|
|
|
|
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 123 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Таблица 5.1. Варианты схем
Кнопка |
Функция |
Описание |
|
|
|
|
Создает блок-схему |
Пользователи обычно предпочитают интерактивный графиче- |
|
текущей функции |
ский режим окна дизассемблирования, но иногда, чтобы полу- |
|
|
чить альтернативное представление, можно воспользоваться |
|
|
этой кнопкой (с ее помощью мы будем создавать блок-схемы |
|
|
в главе 6) |
|
|
|
|
Выводит схему всех |
Используйте эту кнопку, чтобы получить общее представ- |
|
вызовов программы |
ление об иерархии вызовов внутри программы (рис. 5.8). |
|
|
Чтобы увидеть подробности, используйте функцию масшта- |
|
|
бирования в WinGraph32. Схематическое представление |
|
|
больших, статически скомпонованных исполняемых файлов |
|
|
может оказаться слишком загроможденным и фактически |
|
|
бесполезным |
|
|
|
|
Выводит все ответ- |
Эта кнопка помогает увидеть, как добраться до определенно- |
|
вления выбранной |
го идентификатора. Она также может показать разные пути, |
|
перекрестной ссылки |
которыми программа может достичь той или иной функции |
|
|
|
|
Выводит перекрест- |
Это удобное представление цепочки вызовов. Например, |
|
ные ссылки для вы- |
на рис. 5.9 показана схема для одной функции. Заметьте, |
|
бранного символа |
как sub_4011f0 вызывает sub_401110, а та потом обращается |
|
|
к gethostbyname. Так вы можете легко определить назначение |
|
|
самой функции и ее вложенных вызовов. Это самый простой |
|
|
способ получить краткую сводку о функции |
|
|
|
|
Выводит схему пере- |
Используйте эту кнопку для построения собственных схем. |
|
крестных ссылок, |
Вы можете задать глубину рекурсии, используемые символы, |
|
заданную пользова- |
начальный или конечный символ, а также типы узлов, кото- |
|
телем |
рые будут исключены из схемы. Это единственный способ |
|
|
изменить представление, сгенерированное в IDA Pro для |
|
|
вывода в WinGraph32 |
|
|
|
Рис. 5.8. Схема перекрестных ссылок программы