- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
224 Часть 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.14. Чтобы сохранить изменения на диск, выберите пункт меню Save file (Сохранить файл) .
Обратите внимание на то, что на рис. 9.13 и 9.14 содержится один и тот же код, только вместо JNZ вставлены инструкции NOP. Эта процедура навсегда сохранит инструкции NOP в исполняемый файл на диске, благодаря чему вредонос будет принимать любой ключ. Данный подход может пригодиться в том случае, если вам нужно изменить вредоносный код на постоянной основе, чтобы его было легче анализировать.
Анализ кода командной оболочки
OllyDbg предоставляет простой (но недокументированный) способ анализа кода командной оболочки. Он подразумевает выполнение следующих шагов.
1.Скопируйте код командной оболочки из hex-редактора в буфер обмена.
2.Выберите на карте памяти участок типа Priv (это приватная память, назначенная процессу — она отличается от исполняемых образов, которые разделяются между разными процессами и доступны только для чтения).
3.Выполните двойные щелчки на строках карты памяти, чтобы проанализировать их шестнадцатеричное представление. Этот участок должен состоять из нескольких сотен байтов сплошных нулей.
4.Щелкните правой кнопкой мыши на выделенном участке карты памяти и выберите пункт меню Set Access Full Access (Указать доступ Полный доступ), чтобы этот участок можно было читать, записывать и выполнять.
5.Вернитесь на панель с дампом памяти. Выделите участок, заполненный нулями (он должен быть достаточно большим, чтобы вместить весь код командной оболочки), щелкните на нем правой кнопкой мыши и выберите пункт меню
Binary Binary Paste (Двоичный код Вставить двоичный код). Так вы скопируете код командной оболочки на выделенный участок.
6.Назначьте регистру EIP отредактированный вами участок памяти. Для этого щелкните правой кнопкой мыши на инструкции на панели дизассемблера и выберите пункт меню New Origin Here (Новый источник).
Теперь код командной оболочки можно запускать, отлаживать и пошагово выполнять, как будто это обычная программа.
Вспомогательные возможности
OllyDbg предоставляет множество механизмов, которые помогают с анализом, включая следующие.
Ведение журнала. OllyDbg постоянно ведет журнал событий. Чтобы его открыть, выберите пункт меню View Log (Вид Журнал). Среди прочей информации в нем отражено, какие исполняемые модули были загружены, какие точки
|
|
|
|
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 225 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
останова сработали. Журнал может помочь вам понять, какие шаги привели вас к тому или иному состоянию.
Окно отслеживания. В OllyDbg есть окно Watches (Отслеживание), которое позволяет следить за значением генерируемых вами выражений. Выражения в нем постоянно обновляются. Открыть его можно с помощью пункта меню View Watches (Вид Отслеживание). Чтобы указать в нем выражение, нажмите клавишу Пробел.
Справка. Пункт меню OllyDbg Help Contents (Помощь OllyDbg Содержание) предоставляет подробные инструкции по написанию выражений в разделе Evaluation of Expressions (Проверка выражений). Это будет полезно при необходимости отслеживать определенный участок данных или какую-то сложную функцию. Например, если вас интересует участок памяти EAX+ESP+4, вы можете ввести выражение [EAX+ESP+4].
Маркировка. Как и IDA Pro, OllyDbg позволяет маркировать ответвления и циклы. Метка представляет собой символьное имя, которое назначается определенному адресу отлаживаемой программы. Чтобы ее создать, перейдите на панель дизассемблера, щелкните правой кнопкой мыши на адресе и выберите пункт меню Label (Метка). На экране появится окно, в котором нужно будет ввести имя метки. В результате все ссылки на этот участок памяти будут использовать метку, а не адрес. На рис. 9.15 показан пример добавления метки password_loop. Обратите внимание на то, что ссылка по адресу 0x401141 изменилась в соответствии с новым именем.
Рис. 9.15. Задание метки в OllyDbg
Подключаемые модули
Для OllyDbg существуют стандартные и множество сторонних плагинов, доступных для загрузки. Довольно объемную библиотеку, предназначенную для анализа вредоносного кода, можно найти по адресу www.openrce.org/downloads/browse/OllyDbg_Plugins.
Эти плагины представляют собой динамические библиотеки, которые нужно поместить в корень установочного каталога OllyDbg. После этого они автоматически распознаются и добавляются в меню Plugins (Плагины).
ПРИМЕЧАНИЕ
Процесс написания подключаемых модулей для OllyDbg может показаться довольно утомительным. Если вы желаете расширить возможности OllyDbg, мы советуем делать это путем написания Python-скриптов (подробности ищите чуть ниже, в разделе «Отладка с использованием скриптов»).
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
226 Часть III • Продвинутый динамический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
OllyDump
|
|
|
|
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 |
|
|
|
|
OllyDump является самым популярным плагином к OllyDbg. Он позволяет сохранять отлаживаемый процесс в PE-файл. OllyDump пытается выполнить процедуру, которая происходит при загрузке исполняемого файла, при этом разделы (код, данные и т. д.) будут сохранены в том состоянии, в котором они пребывают в памяти на текущий момент. OllyDump обычно используется для распаковки кода, о чем мы подробно поговорим в главе 18.
На рис. 9.16 показано окно OllyDump. Перед созданием дампа вы можете вручную указать точку входа и сдвиги разделов, хотя мы советуем вам положиться в этом на OllyDbg.
Рис. 9.16. Окно плагина OllyDump
Hide Debugger
Плагин Hide Debugger предоставляет целый ряд методик для защиты OllyDbg от обнаружения. Многие аналитики безопасности постоянно используют этот плагин — на случай, если вредоносная программа попытается противостоять отладке.
Hide Debugger, в частности, защищает от проверок IsDebuggerPresent и FindWindow, приемов с необработанными исключениями и использования OuputDebugString в OllyDbg. Противоотладочные методики рассмотрены в главе 16.
Command Line
Плагин Command Line открывает доступ к OllyDbg из командной строки. По своим возможностям он похож на WinDbg, хотя мало кто пользуется этим в OllyDbg (отладчик WinDbg обсуждается в следующей главе).
|
|
|
|
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 227 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Чтобы активизировать окно командной строки, выберите пункт меню Plugins Com mand Line Command Line (Плагины Command Line Командная строка). В табл. 9.3 приводится список распространенных команд. Остальные команды можно найти в справочном файле, который поставляется вместе с плагином Command Line.
Таблица 9.3. Команды плагина Command Line в OllyDbg
Команда |
Назначение |
|
|
BP выражение [,условие] |
Создает программную точку останова |
|
|
BC выражение |
Удаляет точку останова |
|
|
HW выражение |
Создает аппаратную точку останова для выполнения |
|
|
BPX метка |
Создает точку останова для каждого вызова метки |
|
|
STOP или PAUSE |
Приостанавливает выполнение |
|
|
RUN |
Запускает программу |
|
|
G [выражение] |
Выполнение до адреса |
|
|
S |
Шаг со входом |
|
|
SO |
Шаг с обходом |
|
|
D выражение |
Создает дамп памяти |
|
|
Во время отладки часто возникает необходимость прервать выполнение и вызвать функцию импорта, чтобы увидеть, какие параметры ей передаются. Для быстрого создания точки останова в начале функции импорта можно воспользоваться командной строкой.
В примере на рис. 9.17 показан отрезок вредоносного кода с обфусцированными строками, который при этом импортирует функцию gethostbyname. Вы можете видеть, что в командной строке выполняется команда bp gethostbyname, которая создает точку останова в начале функции gethostbyname. После этого программа запускается и останавливается в заданном месте. Взглянув на параметры, вы можете увидеть доменное имя, адрес которого эта функция пытается получить (в данном случае это malwareanalysisbook.com).
Рис. 9.17. Использование командной строки для быстрого создания точек останова