- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
478 Часть VI • Специальные темы |
||||
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 |
|
|
|
|
Для выполнения инструкций WOW64 использует 32-битный режим в процессорах архитектуры x64, но для правильной работы реестра и файловой системы требуются дополнительные шаги. Системные DLL, которые являются фундаментом среды Win32, находятся в корневом каталоге системы (обычно это \Windows\ System32). Многие приложения обращаются к этому каталогу при поиске DLL или установке собственных библиотек. Таким образом, библиотеки для 32- и 64-битных процессов должны быть отдельными, чтобы избежать конфликтов.
С целью совместимости 64-битные двоичные файлы хранятся в каталоге \System32. Когда же к нему обращаются 32-битные приложения, они перенаправляются к каталогу \SysWOW64. Это довольно неочевидное решение, поскольку 64-битные файлы находятся в каталоге \System32, а 32-битные — в \SysWOW64.
Если в ходе анализа 32-битной вредоносной программы в 64-битной системе обнаружится, что она записывает файл в C:\Windows\System32, результат записи следует искать в каталоге C:\Windows\SysWOW64.
Еще одно перенаправление выполняется для 32-битных приложений, которые обращаются к ключу реестра HKEY_LOCAL_MACHINE\Software: в этом случае ключ меняется на HKEY_LOCAL_MACHINE\Software\Wow6432Node. Это относится к любому 32-битному приложению, которое получает доступ к ветке реестра Software.
32-битные программы обычно не знают, что они работают в подсистеме WOW64, но существует несколько механизмов, которые открывают им путь к внешней среде. В первую очередь это функция IsWow64Process, с помощью которой 32-битный код может определить, выполняется ли он внутри WOW64. Чтобы обратиться к реальному каталогу \System32, можно использовать путь C:\Windows\Sysnative, даже если
\System32 ведет в \SysWOW64.
Функция Wow64DisableWow64FsRedirection полностью отключает перенаправление в файловой системе для заданного потока. Функции реестра, такие как
RegCreateKeyEx, RegDeleteKeyEx и RegOpenKeyEx, поддерживают новый флаг, который позволяет указать, к какой версии реестра приложение хочет обращаться — 32-битной или 64-битной (независимо от разрядности программного кода). Этим флагом может воспользоваться 32-битный вредонос, который пытается повлиять на 64-битные программы.
Признаки вредоносного кода на платформе x64
В 64-битном коде можно найти определенные признаки вредоносной активности, которые отсутствуют в 32-битных программах. Эти довольно стандартные конструкции обычно свойственны только коду, сгенерированному компилятором.
Например, в 64-битном коде, как правило, проще отличить указатель от данных. Целые числа чаще всего занимают 32 бита. И, хотя это не является обязательным требованием, для хранения индекса при переборе элементов от 1 до 100 большинство программистов выберет 32-битное целое число.
|
|
|
|
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 |
|
|
|||
Глава 21. Шестидесятичетырехбитные вредоносные программы 479 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
В табл. 21.1 приводятся 32- и 64-битные версии вызова одних и тех же функций.
Таблица 21.1. 32- и 64-битные вызовы функций с двумя параметрами
32-битный код |
|
64-битный код |
|
|
|
|
|
|
|
|
|
004114F2 |
mov |
eax, [ebp+var_8] |
0000000140001148 |
mov |
rdx, [rsp+38h+var_18] |
004114F5 |
push |
eax |
000000014000114D |
mov |
ecx, [rsp+38h+var_10] |
004114F6 |
mov |
ecx, [ebp+var_14] |
0000000140001151 |
call |
sub_14000100A |
004114F9 |
push |
ecx |
|
|
|
004114FA |
call |
sub_411186 |
|
|
|
|
|
|
|
|
|
В32-битном коде, показанном слева, функция sub_411186 имеет два параметра. Мы не знаем, какие у них типы и для чего они нужны. Нам лишь известно, что оба параметра являются 32-битными.
В64-битном коде, показанном справа, тоже можно видеть два параметра, но здесь
присутствует и дополнительная информация. Первая инструкция mov помещает значение в регистр RDX — значит, это 64-битное значение, скорее всего, является указателем. Второй аргумент помещается в регистр ECX: по всей видимости, это 32-битное значение, поскольку ECX является 32-битной версией RCX. Это точно не указатель, так как указатели занимают 64 бита. Мы по-прежнему не можем сказать, чем является этот параметр – целым числом, дескриптором или чем-то другим, — но такие мелкие подсказки могут оказаться бесценными при определении назначения функции.
Итоги главы
Анализ 64- и 32-битных вредоносных программ мало чем различается, так как их инструкции и концепции очень похожи. Чтобы определить, сколько аргументов и локальных переменных имеет каждая функция, аналитик безопасности должен понимать, как делается вызов и каким образом используется стек. Также важно иметь представление о подсистеме WOW64 на случай, когда придется анализировать 32-битный исполняемый файл, изменяющий системные каталоги или ключи реестра, которые использует ОС. Большинство вредоносных приложений все еще 32-битные, но количество 64-битных версий продолжает расти, и в будущем они должны стать еще более популярными.
Лабораторные работы
Для запуска вредоносного ПО в этих работах вам потребуется 64-битный компьютер и 64-битная виртуальная машина. Для анализа зараженного кода вам будет нужна продвинутая версия IDA Pro (Advanced).
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
480 Часть VI • Специальные темы |
||||
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 |
|
|
|
|
Лабораторная работа 21.1
Проанализируйте код в файле Lab21-01.exe. Эта лабораторная является немного измененным вариантом лабораторной работы 9.2, скомпилированным для 64-битных систем.
Вопросы
1.Что произойдет, если запустить эту программу без каких-либо аргументов?
2.Ваша версия IDA Pro может не распознать функцию main автоматически. Как определить вызов этой функции?
3.Что именно сохраняют в стек инструкции в диапазоне от 0x0000000140001150 до 0x0000000140001161?
4.Как заставить эту программу выполнить свой основной код, не меняя имени исполняемого файла?
5.Какие две строки сравниваются в вызове strncmp по адресу 0x0000000140001205?
6.Принимает ли какие-либо параметры функция по адресу 0x00000001400013C8?
7.Сколько аргументов передается в вызов CreateProcess по адресу 0x0000000140001093? Как вы это определили?
Лабораторная работа 21.2
Проанализируйте зараженный файл Lab21-02.exe в виртуальных машинах с архитектурой x86 и x64. Этот вредонос похож на Lab12-01.exe, но с добавлением 64-битного компонента.
Вопросы
1.Что примечательного в разделе с ресурсами данного вредоноса?
2.Под какую платформу скомпилирован этот вредонос — x64 или x86?
3.Каким образом он определяет тип среды, в которой выполняется?
4.Как отличается его поведение в 64-битной и 32-битной среде?
5.Какой файл или файлы вредонос сбрасывает на диск при работе на платформе x86? Где их можно найти?
6.Какой файл или файлы вредонос сбрасывает на диск при работе на платформе x64? Где их можно найти?
7.Процесс какого типа запускает вредонос при работе в 64-битной среде?
8.Каково назначение этого вредоноса?