- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
|||
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 в нем