- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
|||
Глава 16. Антиотладка 395 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
воспользоваться вредоносное ПО, выполняя определенный обработчик только при нормальной работе.
Чтобы обойти эту ловушку, не перешагивайте через инструкцию icebp.
Уязвимости отладчиков
Как любое другое программное обеспечение, отладчики имеют уязвимости, и иногда злоумышленники пользуются этим для предотвращения отладки. Ниже представлено несколько популярных уязвимостей, связанных с тем, как OllyDbg обращается с форматом PE.
Уязвимости в PE-заголовке
Первая методика подразумевает изменение PE-заголовка в двоичном исполняемом файле, в результате чего при его загрузке в OllyDbg происходит сбой. Это выражается в ошибке вида Bad or Unknown 32-bit Executable File(«Поврежденный или неизвестный 32-битный исполняемый файл»), хотя за пределами отладчика программа обычно работает нормально.
Данная проблема вызвана тем фактом, что OllyDbg слишком строго следует спецификации PE-заголовка от компании Microsoft. PE-заголовок обычно содержит структуру, известную как IMAGE_OPTIONAL_HEADER. Ее подмножество представлено на рис. 16.5.
Рис. 16.5. Уязвимость на основе IMAGE_OPTIONAL_HEADER и NumberOfRvaAndSizes
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
396 Часть V • Противодействие обратному проектированию |
||||
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 |
|
|
|
|
Несколько последних элементов этой структуры представляют особый интерес. Поле NumberOfRvaAndSizes определяет количество записей в массиве DataDirectory, который идет далее. Массив DataDirectory содержит сведения о местоположении других важных элементов исполняемого файла; это не просто массив структур IMAGE_ DATA_DIRECTORY в конце опциональной структуры заголовка. Каждая структура IMAGE_ DATA_DIRECTORY определяет размер и относительный виртуальный адрес каталога.
Размер массива равен IMAGE_NUMBEROF_DIRECTORY_ENTRIES — то есть 0x10. В Windows загрузчик игнорирует любое значение NumberOfRvaAndSizes, превышающее 0x10, поскольку оно просто не влезет в массив DataDirectory. OllyDbg следует стандарту и всегда использует NumberOfRvaAndSizes. В итоге, если сделать массив больше чем 0x10 (например, 0x99), OllyDbg покажет пользователю всплывающее окно, после чего завершит программу.
Для противодействия этому приему проще всего вручную изменить PE-заголовок с помощью hex-редактора или PE Explorer и присвоить полю NumberOfRvaAndSizes значение 0x10. Конечно, вы также можете использовать отладчик, который не подвержен этой уязвимости, например WinDbg или OllyDbg 2.0.
Еще один метод, связанный с заголовками разделов, вызывает во время загрузки в OllyDbg (WinDbg или OllyDbg 2.0 устойчивы к этой атаке) сбой вида File contains too much data (Файл содержит слишком много данных). В разделах представлено содержимое файла, включая код, данные, ресурсы и другую информацию. Каждый раздел имеет заголовок в виде структуры IMAGE_SECTION_HEADER, отрезок которой показан на рис. 16.6.
Рис. 16.6. Структура IMAGE_SECTION_HEADER
Здесь нас интересуют элементы VirtualSize и SizeOfRawData. Согласно специ фикации формата Windows PE поле VirtualSize должно содержать общий размер раздела на момент его загрузки в память, а поле SizeOfRawData — размер данных на диске. Для отражения данных раздела на память загрузчик Windows использует наименьшее из этих двух значений. Если SizeOfRawData больше VirtualSize, в память копируются только данные VirtualSize, а все остальное игнорируется. OllyDbg использует только SizeOfRawData, поэтому, если присвоить данному полю нечто вроде 0x77777777, в отладчике произойдет сбой.
|
|
|
|
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 |
|
|
|||
Глава 16. Антиотладка 397 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Чтобы уберечься от этого приема, проще всего вручную отредактировать PEзаголовок с помощью hex-редактора, чтобы поля SizeOfRawData и VirtualSize имели похожие значения (имейте в виду, что согласно спецификации они должны быть кратными значению FileAlignment из структуры IMAGE_OPTIONAL_HEADER). Для этого отлично подойдет программа PE Explorer, потому что ее нельзя обмануть за счет большого размера SizeofRawData.
Уязвимость на основе OutputDebugString
Вредоносные программы часто пытаются использовать уязвимости в OllyDbg версии 1.1, связанные со строками форматирования. Для этого они передают функции OutputDebugString аргумент %s, что приводит к сбою в OllyDbg. Остерегайтесь подозрительных вызовов наподобие OutputDebugString ("%s%s%s%s%s%s%s%s%s%s%s%s%s%s"). Если выполнить этот код, ваш отладчик принудительно завершится.
Итоги главы
В этой главе вы познакомились с некоторыми популярными методами антиотладки. Чтобы научиться их распознавать и обходить, требуются терпение и упорство. Не забывайте делать заметки во время анализа, записывая, где вы обнаружили тот или иной антиотладочный прием и как вы с ним справились. Это поможет вам в случае, если процедуру отладки придется начать заново.
Большинство методик антиотладки можно распознать с помощью здравого смысла, неспешно отлаживая процесс. Например, ваше внимание может привлечь код, который преждевременно завершает работу внутри условного перехода. Самые популярные приемы основаны на доступе к структуре fs:[30h], вызовах Windows API или выполнении сверки времени.
Конечно, как и в случае с анализом безопасности, лучший способ научиться противостоять антиотладочным методикам — постоянно разбирать и изучать код вредоносного ПО. Не забывайте: злоумышленники всегда ищут новые пути борьбы с отладчиками, чтобы не дать вам расслабиться.
Лабораторные работы
Лабораторная работа 16.1
Проанализируйте с помощью отладчика зараженный файл Lab16-01.exe. Он содержит тот же код, что и Lab09-01.exe, но с добавлением антиотладочных приемов.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
398 Часть V • Противодействие обратному проектированию |
||||
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 |
|
|
|
|
1.Какие методики антиотладки применяет этот вредонос?
2.Что произойдет, если каждая методика достигнет своей цели?
3.Как обойти данные методики?
4.Как вручную изменить структуру, которая проверяется во время выполнения?
5.Какой плагин к OllyDbg защитит вас от методов антиотладки, использу емых в этом файле?
Лабораторная работа 16.2
Проанализируйте с помощью отладчика зараженный файл Lab16-02.exe. Целью данной работы является подбор правильного пароля. Эта программа не применяет вредоносное содержимое.
Вопросы
1.Что произойдет, если запустить файл Lab16-02.exe из командной строки?
2.Что произойдет, если запустить файл Lab16-02.exe и попытаться подобрать к нему параметр командной строки?
3.Какой пароль у командной строки?
4.Загрузите файл Lab16-02.exe в IDA Pro. В каком месте функции main содержится операция strncmp?
5.Что произойдет, если загрузить этот вредоносный файл в OllyDbg с параметрами по умолчанию?
6.Что уникального в структуре PE-заголовка этого файла?
7.Где находится функция обратного вызова? (Подсказка: нажмите сочетание клавиш Ctrl+E в IDA Pro.)
8.С помощью каких антиотладочных приемов программа немедленно завершает свою работу в отладчике? Как избежать этой проверки?
9.Какой пароль командной строки можно увидеть в отладчике после отключения антиотладки?
10. Сработает ли в командной строке пароль, найденный в отладчике?
11. Какой из методов антиотладки отвечает за разницу между паролем, найденным в отладчике, и тем, который передается в командной строке? Как бы вы нивелировали эту разницу?
|
|
|
|
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 |
|
|
|||
Глава 16. Антиотладка 399 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Лабораторная работа 16.3
Проанализируйте с помощью отладчика зараженный файл Lab16-03.exe. Эта вредоносная программа похожа на Lab09-02.exe, но содержит определенные изменения, в том числе и добавление антиотладочных методик. Если возникнут сложности, обратитесь к лабораторной работе 9.2.
Вопросы
1.Какие строки вы можете найти с помощью статического анализа двоичного файла?
2.Что произойдет, если запустить этот файл?
3.Как нужно переименовать этот экземпляр, чтобы он работал нормально?
4.Какие методы антиотладки использует этот вредонос?
5.Какие ответные действия предпринимаются каждым из методов при обнаружении отладчика?
6.Что является залогом успеха антиотладочных приемов в этом вредоносе?
7.Какое доменное имя использует этот вредонос?