- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
228 Часть III • Продвинутый динамический анализ |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Bookmarks
|
|
|
|
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 |
|
|
|
|
Плагин Bookmarks входит в стандартный состав OllyDbg. Он позволяет устанавливать закладки для участков памяти, чтобы позже вы могли легко к ним вернуться, не запоминая их адреса.
Чтобы добавить закладку, щелкните правой кнопкой мыши на панели дизассемблера и выберите пункт меню Bookmark Insert Bookmark (Bookmark Вставить закладку). Для просмотра закладок используйте пункт меню Bookmarks Bookmarks (Bookmark Закладки), после чего щелкните на нужной вам закладке, чтобы перей ти к соответствующему адресу.
Отладка с использованием скриптов
Поскольку плагины к OllyDbg представляют собой скомпилированные библиотеки, создавать или изменять их обычно довольно сложно. Поэтому для расширения возможностей мы используем отладчик ImmDbg, который поддерживает Pythonскрипты и обладает простым API.
Python API в ImmDbg включает в себя множество вспомогательных средств и функций. Например, вы можете интегрировать свои скрипты в отладчик в виде машинного кода, чтобы иметь возможность создавать собственные таблицы, графики и всевозможные пользовательские интерфейсы. Среди распространенных причин написания скриптов при анализе вредоносных программ можно выделить преодоление защиты от отладки, перехват встроенных функций и ведение журнала аргументов. Многие такие скрипты можно найти в Интернете.
Наиболее популярный вид Python-скриптов, которые пишут для ImmDbg, называется PyCommand. Такие скрипты хранятся в каталоге PyCommand\ внутри установочного каталога ImmDbg. Написав скрипт, вы должны скопировать его в этот каталог, чтобы его можно было запустить. Эти команды на языке Python можно выполнять на командной панели, указывая перед ними символ !. Чтобы получить список доступных команд, введите !list.
PyCommand имеет следующую структуру.
Для импорта модулей языка Python можно использовать набор соответствующих инструкций (как и в любом другом Python-скрипте). Функции ImmDbg доступны в модулях immlib и immutils.
Функция main считывает аргументы командной строки (которые передаются в виде списка).
Код скрипта реализует действия PyCommand.
Инструкция return содержит строку. Когда скрипт завершит свою работу, эта строка будет выведена на главной панели состояния отладчика.
В листинге 9.3 показан пример простого скрипта, реализованного в виде PyCom mand. Этот скрипт позволяет запретить вредоносной программе удалять файлы из системы.
|
|
|
|
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 |
|
|
|
|
Листинг 9.3. Скрипт PyCommand для нейтрализации DeleteFile
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 9. OllyDbg 229 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
import immlib
def Patch_DeleteFileA(imm):
delfileAddress = imm.getAddress("kernel32.DeleteFileA") if (delfileAddress <= 0):
imm.log("No DeleteFile to patch") return
imm.log("Patching DeleteFileA")
patch = imm.assemble("XOR EAX, EAX \n Ret 4") imm.writeMemory(delfileAddress, patch)
def main(args):
imm = immlib.Debugger() Patch_DeleteFileA(imm)
return "DeleteFileA is patched..."
Вредоносное ПО часто использует операцию DeleteFile для удаления файлов из системы, не давая вам шанса скопировать их в другое место. Если запустить этот скрипт с помощью команды !scriptname, он модифицирует функцию DeleteFileA так, чтобы она ничего не делала. Метод main вызывает функцию Patch_DeleteFileA , которая возвращает адрес DeleteFileA; для этого используется вызов getAddress из ImmDbg API. Получив этот адрес, мы можем заменить функцию удаления собственным кодом. В данном случае мы переопределяем ее так, как указано на шаге . Этот код присваивает 0 регистру EAX и возвращается из вызова DeleteFileA. Данное изменение приведет к тому, что операция DeleteFile будет всегда завершаться неудачно, не давая вредоносной программе удалять файлы из системы.
Чтобы узнать больше о написании Python-скриптов, ознакомьтесь с примерами PyCommand, которые приводятся на справочной странице ImmDbg. Более глубоко эта тема раскрыта в книге Джастина Сейца Gray Hat Python (No Starch Press, 2009).
Итоги главы
OllyDbg является самым популярным отладчиком пользовательского режима, который дает широкие возможности для динамического анализа вредоносного кода. Как вы могли убедиться, его богатый графический интерфейс позволяет отображать большой объем информации об отлаживаемой программе. Например, карта памяти является отличным средством для определения структуры вредоноса в памяти и просмотра всех его разделов.
OllyDbg поддерживает различные виды точек останова, включая условные, которые используются для прерывания выполнения в зависимости от параметров вызываемой функции или при доступе к определенному участку памяти. OllyDbg может изменять запущенные исполняемые файлы, чтобы заставить их выполнить код, который обычно игнорируется; внесенные изменения можно сделать постоянными, применив их к двоичному файлу на диске. Для расширения встроенных возможностей OllyDbg можно использовать подключаемые модули и скрипты.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
230 Часть 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 |
|
|
|
|
Программа OllyDbg популярна для отладки в пользовательском режиме, однако она неспособна производить отладку вредоносного ПО, работающего в режиме ядра, такого как руткиты и зараженные драйверы устройств. Для этих целей предназначен другой отладчик, WinDbg, которому посвящена следующая глава. Вы должны владеть этим инструментом, если хотите производить динамический анализ вредоносных программ этого вида.
Лабораторные работы
Лабораторная работа 9.1
Проанализируйте вредоносную программу под названием Lab09-01.exe, используя OllyDbg и IDA Pro, и ответьте на следующие вопросы. Мы уже изучали этот вредонос в лабораторных работах в главе 3, применяя базовые методики статического и динамического анализа.
Вопросы
1.Как заставить эту программу установиться?
2.Какие аргументы командной строки она принимает? Каковы требования к паролю?
3.Как с помощью OllyDbg модифицировать исполняемый файл, чтобы он не требовал предоставления пароля в командной строке?
4.Какие локальные индикаторы имеет этот вредонос?
5.Какие действия он может выполнять, руководствуясь командами, поступающими по сети?
6.Есть ли для этого вредоноса какие-либо полезные сетевые сигнатуры?
Лабораторная работа 9.2
Проанализируйте с помощью OllyDbg зараженный файл Lab09-02.exe и ответьте на следующие вопросы.
Вопросы
1.Какие строки можно обнаружить в двоичном файле статическими методами?
2.Что произойдет, если запустить исполняемый файл?
3.Как заставить этот образец выполнить свой вредоносный код?
4.Что происходит по адресу 0x00401133?
5.Какие аргументы передаются ответвлению 0x00401089?
6.Какое доменное имя использует эта вредоносная программа?
|
|
|
|
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 231 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
7.Какая процедура кодирования используется для обфускации доменного имени?
8.Какую роль играет вызов CreateProcessA по адресу 0x0040106E?
Лабораторная работа 9.3
Проанализируйте зараженный файл Lab09-03.exe, используя OllyDbg и IDA Pro. Этот вредонос загружает три библиотеки (DLL1.dll, DLL2.dll и DLL3.dll), скомпилированные так, чтобы запрашивать один и тот же участок памяти. В связи с этим при просмотре их кода в OllyDbg и IDA Pro вы можете увидеть разные адреса. Эта лабораторная работа поможет вам попрактиковаться в поиске корректных адресов в IDA Pro при просмотре кода в OllyDbg.
Вопросы
1.Какие библиотеки импортирует Lab09-03.exe?
2.Какой базовый адрес запрашивают DLL1.dll, DLL2.dll и DLL3.dll?
3.Какой базовый адрес назначается библиотекам DLL1.dll, DLL2.dll и DLL3.dll при отладке файла Lab09-03.exe в OllyDbg?
4.Что делает функция импорта, которую Lab09-03.exe вызывает из DLL1.dll?
5.Назовите имя файла, в который производится запись, когда вызывает
Lab09-03.exe WriteFile.
6.Lab09-03.exe создает задачу с помощью вызова NetScheduleJobAdd; откуда берутся данные для его второго аргумента?
7.Во время выполнения или отладки программы вы увидите, что она выводит три загадочных фрагмента данных, которые относятся к каждой из трех загруженных DLL. Что они означают?
8.Как открыть файл DLL2.dll в IDA Pro, чтобы его загрузочный адрес со-
впадал с тем, который используется в OllyDbg?