- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
. |
|
|
|
|
|
7 |
|||
|
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Анализ вредоносных программ для 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 |
|
|
|
|
Большинство вредоносных программ нацелены на платформу Windows и тесно взаимодействуют с этой ОС. Глубокое понимание основных подходов к написанию кода для Windows позволит вам распознавать локальные индикаторы вредоноса, отслеживать то, как он использует ОС для выполнения кода без использования переходов или вызова инструкций, и определять его назначение.
Эта глава охватывает широкий спектр концепций, знакомых Windows-разра ботчикам, но, даже если вы один из них, вам все равно стоит ее прочитать. Безвредные программы обычно корректно компилируются и следуют методическим рекомендациям от компании Microsoft, однако вредоносное ПО может иметь необычную структуру и выполнять неожиданные действия. В этой главе будут рассмотрены уникальные приемы, с помощью которых вредоносная программа использует возможности Windows.
Windows является сложной системой, и мы не в состоянии охватить все ее аспекты. Вместо этого мы сосредоточимся на функциях, наиболее интересных для анализа безопасности. Мы начнем с краткого обзора некоторой общей для Windows API терминологии, а затем обсудим модификации операционной системы и способы создания локальных индикаторов. После этого будут рассмотрены разные пути выполнения кода за пределами анализируемого файла. В конце мы поговорим о том, как вредоносные программы используют режим ядра для скрытия своей активности и получения дополнительных возможностей.
Windows API
Windows API — это широкий набор интерфейсов, который определяет способ взаимодействия вредоносного ПО с библиотеками от компании Microsoft. Он настолько развит, что приложению, которое разрабатывается только для Windows, редко требуются сторонние библиотеки.
ВWindows API используются определенные термины, названия и соглашения,
скоторыми необходимо познакомиться, прежде чем приступать к отдельным функ-
циям.
|
|
|
|
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 |
|
|
|||
Глава 7. Анализ вредоносных программ для Windows 161 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Типы и венгерская нотация
Windows API в основном использует свои собственные названия для представления типов в языке C. Например, типы DWORD и WORD представляют 32-битные и 16-битные целые беззнаковые числа. Стандартные для C типы, такие как int, short и unsigned int, обычно игнорируются.
ВWindows для обозначения функций, как правило, используется венгерская нотация. Это соглашение об именовании, которое упрощает определение типов переменных с помощью префиксов. Переменные, содержащие 32-битное целое беззнаковое число (DWORD), начинаются с dw. Например, если третий аргумент функции VirtualAllocEx называется dwSize, вы будете знать, что это DWORD. Венгерская нотация помогает определить тип переменной и упрощает чтение кода, но иногда она становится довольно громоздкой.
Втабл. 7.1 перечислены некоторые популярные типы в Windows API (далеко не все). В скобках указаны соответствующие префиксы.
Таблица 7.1. Распространенные типы в Windows API
Тип и префикс |
Описание |
|
|
WORD (w) |
16-битное беззнаковое значение |
|
|
DWORD (dw) |
32-битное беззнаковое значение (двойной WORD) |
|
|
Дескрипторы (H) |
Ссылка на объект. Информация, хранящаяся в дескрипторе, не доку- |
|
ментируется. Работа с дескриптором должна выполняться только через |
|
Windows API. Примеры: HModule, HInstance и HKey |
|
|
Длинные указа- |
Указатель на другой тип. Например, LPByte является указателем на byte, |
тели (LP) |
а LPCSTR указывает на строку символов. Строки обычно имеют префикс |
|
LP, так как они на самом деле представляют собой указатели. Иногда вме- |
|
сто LP вам будет встречаться префикс P (Pointer). В 32-битных системах он |
|
ничем не отличается от LP. Изначально он предназначался для 16-битных |
|
систем, где и видна разница |
|
|
Callback |
Представляет функцию, которая вызывается из Windows API. Например, |
|
InternetSetStatusCallback передает указатель на функцию, которая вызыва- |
|
ется всякий раз, когда меняется состояние интернет-соединения в системе |
|
|
Дескрипторы
Дескрипторы — это элементы, которые были открыты или созданы операционной системой: окно, процесс, модуль, меню, файл и т. д. Дескрипторы похожи на указатели в том смысле, что они ссылаются на внешний объект или участок памяти. Отличие состоит в том, что их нельзя использовать в арифметических операциях и они не всегда представляют адрес объекта. Единственное, что можно сделать с дескриптором, — сохранить его и затем передать в вызов функции, чтобы сослаться на тот же объект.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
162 Часть 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 |
|
|
|
|
В качестве примера можно привести функцию CreateWindowEx, которая возвращает дескриптор окна HWND. Для любых последующих операций с этим окном, таких как DestroyWindow, вам придется использовать этот дескриптор.
ПРИМЕЧАНИЕ
Согласно Microsoft HWND нельзя использовать в качестве указателя или арифметического значения. Однако дескрипторы, возвращающиеся из некоторых функций, представляют значения, которые могут вести себя как обычные указатели. В данной главе мы будем обращать на это ваше внимание.
Функции файловой системы
Одним из самых частых способов взаимодействия вредоносного ПО с системой является создание или изменение файлов. При этом определенные названия файлов или их изменение могут послужить хорошими локальными индикаторами.
Файловая активность может подсказать, чем занимается вредонос. Например, если зараженная программа создает файл и сохраняет в него информацию о посещенных веб-страницах, она, вероятно, представляет собой некий вид шпионского ПО.
Компания Microsoft предоставляет несколько функций для доступа к файловой системе.
CreateFile. Эта функция используется для открытия существующих и создания новых файлов. Кроме того, она способна открывать каналы, потоки и устройства ввода/вывода. Параметр dwCreationDisposition определяет, будет ли файл открыт или создан заново.
ReadFile и WriteFile. Эти функции используются для чтения и записи файлов. Обе они работают в поточном режиме. При первом вызове ReadFile из файла считывается несколько байтов; при следующем вызове будут прочитаны байты, которые следуют дальше. Например, если открыть файл и вызвать ReadFile размером 40, следующий вызов начнет чтение с 41-го байта. Но, как вы можете догадаться, ни одна из этих функций не позволяет легко перемещаться по файлу.
CreateFileMapping и MapViewOfFile. Отображение файлов часто используется авторами вредоносного ПО, так как оно позволяет легко манипулировать файлами, предварительно загружая их в память. Функция CreateFileMapping загружает файл с диска в RAM. Функция MapViewOfFile возвращает указатель на начальный адрес отображения, который можно использовать для доступа к отображенному файлу. С помощью этих функций и указателя программа может выполнять чтение и запись в любом месте файла. Эта возможность чрезвычайно полезна для определения файловых форматов, так как она позволяет легко переходить по разным адресам в памяти.
|
|
|
|
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 |
|
|
|||
Глава 7. Анализ вредоносных программ для Windows 163 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Отображения файлов часто используются для копирования возможностей загрузчика Windows. Вредоносная программа может проанализировать отображенный PE-заголовок и внести все необходимые изменения в файл, находящийся в памяти, позволяя ему выполняться так, как будто он был загружен самой операционной системой.
Специальные файлы
В Windows имеется много типов файлов, с которыми можно работать обычным способом, но доступ к которым невозможен через букву их диска или папку (например, c:\docs). Такие файлы часто используются вредоносными программами.
Специальные файлы сложнее обнаружить, так как они не отображаются в листинге каталога. Некоторые из них могут давать более широкий доступ к системному оборудованию и внутренним данным.
Специальный файл можно передать в виде строки любой файловой функции, которая будет обращаться с ним, как с любым другим. Ниже мы рассмотрим общие файлы, альтернативные потоки данных и файлы, доступные через пространства имен.
Общие файлы
Общие файлы являются подвидом специальных файлов. Их имена начинаются с \serverName\share или \\?\serverName\share. Они позволяют получить доступ к содержимому общей папки, которая хранится в сети. Префикс \\?\ вынуждает систему полностью отключить разбор строк, делая возможным доступ к более длинным именам файлов.
Файлы, доступные через пространства имен
В ОС существуют дополнительные файлы, которые доступны через пространства имен. Под пространством имен можно понимать фиксированный набор папок, каждая из которых хранит определенный тип объектов. В системах NT пространство самого низкого уровня имеет префикс \. У него есть доступ ко всем устройствам, и внутри него содержатся все другие пространства имен.
ПРИМЕЧАНИЕ
Для просмотра пространства имен NT в вашей системе можно воспользоваться бесплатной утилитой WinObj Object Manager от компании Microsoft.
Пространство имен устройств Win32 с префиксом \\.\ часто используется вредоносными программами для прямого доступа к физическому оборудованию и выполнения операций записи и чтения, аналогичных файловым. Например,