- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Предисловие
В сфере цифровой безопасности найдется мало таких несбалансированных ниш, как те, в которых приходится иметь дело с вредоносным ПО, защитными инструментами и операционными системами.
Летом 2011 года я присутствовал на выступлении Пейтера Затко (по прозвищу Мадж) на конференции Black Hat в Лас-Вегасе, штат Невада, где он рассказывал об асимметричной природе современного программного обеспечения. Он объяснил, как в ходе анализа 9000 вредоносных файлов у него получилась выборка, каждый элемент которой состоял в среднем из 125 строк кода.
Вы можете возразить, что Мадж специально отбирал только «простые» или «заурядные» экземпляры. Что насчет по-настоящему грозного вредоносного ПО? Наподобие (затаите дыхание) Stuxnet? Согласно Ларри Л. Константину (www.informit.com/ articles/article.aspx?p=1686289), Stuxnet насчитывал около 15 тысяч строк кода, что в 120 раз превышает объем среднего вредоноса из вышеупомянутой выборки. Этот вирус был узконаправленным и заточенным под конкретную атаку, что, вероятно, сказалось на его размере.
На секунду отвлечемся от мира вредоносного ПО. Текстовый редактор, который я использую (gedit из состава среды GNOME), включает в себя файл gedit.c с 295 строками кода — и это всего лишь один из 128 исходных файлов, опубликованных в репозитории данного проекта (git.gnome.org/browse/gedit/tree/gedit?id=3.3.1) (не считая трех других каталогов). Если свести все вместе, получится 70 484 строки. То есть по своему объему вредоносы более чем в 500 раз уступают обычным приложениям. Удивительная эффективность, если сравнивать с такой довольно прозаичной программой, как текстовый редактор!
Среднее значение в 125 строчек, полученное Маджем, показалось мне немного заниженным, поскольку «вредонос» — понятие растяжимое. Многие вредоносные приложения существуют в виде пакетов или наборов со множеством функций
иэлементов инфраструктуры. В качестве примера я взял файлы, которые можно справедливо назвать исходными элементами трояна Zeus (.cpp, .obj, .h и т. д.),
инасчитал в них 253 774 строки. Если сравнить Zeus с одним из образцов из выборки Маджа, получится соотношение, превышающее 2000 к 1.
Затем Мадж сравнил размер вредоносного ПО с продуктами, которые должны его перехватывать и обезвреживать. По его оценке, современные защитные системы
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
16 Предисловие |
||||
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 |
|
|
|
|
насчитывают в среднем 10 миллионов строк кода. Для ровного счета предположим, что некоторые продукты состоят из 12,5 миллиона строчек; это выводит соотношение между атакующим и защитным кодом на уровень 100 000 к 1. Иными словами, чтобы противостоять одной вредоносной строке кода, приходится возводить целую крепость высотой 100 000 строк.
Мадж также сравнил объем вредоносного ПО и операционных систем, в работу которых оно должно вмешиваться. По оценкам аналитиков, исходный код Windows XP состоит из 45 миллионов строк, при этом аналогичных данных о Windows 7 вообще не существует. В качестве среднего показателя для современных ОС Мадж берет число 150 миллионов (вероятно, подразумевая последние версии Windows). Для наглядности возьмем 125 миллионов — в результате получается, что инструмент, способный взломать операционную систему, может быть в миллион раз меньше ее самой.
Теперь посмотрим, как соотносятся размеры в каждом из упомянутых случаев:
120:1 — Stuxnet в сравнении со средним вредоносом;
500:1 — простой текстовый редактор в сравнении со средним вредоносом;2000:1 — вредоносный пакет в сравнении со средним вредоносом;100 000:1 — защитный инструмент в сравнении со средним вредоносом;
1 000 000:1 — атакуемая операционная система в сравнении со средним вредоносом.
С точки зрения защищающейся стороны, такая разница в размере между обычным вредоносным ПО и защитными механизмами или атакуемыми операционными системами выглядит довольно мрачно. Даже если вместо рядового вируса взять вредоносный пакет, ситуация принципиально не изменится. Похоже, производителей защитных инструментов, прикладывающих множество усилий на написание тысяч строк кода, уделывают ловкие и проворные злоумышленники с их куда более компактными программами.
Так как же быть тем, кто защищается? Ответ прост: последовать примеру любого лидера, попавшего в незавидное положение, и превратить сильные стороны противника в его недостатки. Забудьте о размере защитных механизмов и операционных систем — с этим уже ничего не поделать. Наоборот — вас должен вдохновлять тот факт, что вредоносные программы являются куда более мелкими.
Представьте, что вам нужно понять принцип работы защитной системы по ее коду, состоящему из тех самых 12,5 миллиона строчек. Это непосильная задача, хотя некоторые исследователи занимаются такими вещами в качестве хобби. Один из потрясающих примеров такой работы можно найти в книге Тэвиса Орманди Sophail: A Critical Analysis of Sophos Antivirus (dl.packetstormsecurity.net/papers/virus/Sophail.pdf), которая была представлена на конференции Black Hat в Лас-Вегасе в 2011 году. Анализ такого огромного масштаба является скорее исключением из правила.
Вместо того чтобы беспокоиться о миллионах (или сотнях/десятках тысяч) строчек кода, следует сосредоточиться на участке размером в тысячу или меньше: именно там находится большая часть вредоносного ПО, которое вам когда-либо
|
|
|
|
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 |
|
|
|||
w17 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
встретится. Вы, как защитник, должны в первую очередь определить, чем занимается вредоносный код, как он себя проявляет в вашей среде и как с ним справиться. Если вы владеете подходящими навыками и имеете дело с образцом умеренного размера, у вас есть шанс ответить на все эти вопросы и, следовательно, снизить риск взлома вашей системы.
Как авторы вредоносного ПО всегда готовы завалить вас зараженными файлами, так и авторы этой книги готовы помочь вам обрести навыки борьбы с вредоносами. Эта книга — одна из тех, которые должны быть под рукой у каждого аналитика безопасности. Если вы новичок, то, прежде чем вступать в бой, вам следует ознакомиться с вводным материалом и практическими примерами. Если вы специалист средней руки, это издание поможет вам выйти на новый уровень. Здесь есть что почерпнуть даже продвинутым инженерам — и когда ваши менее опытные коллеги будут у вас что-то спрашивать, вы сможете порекомендовать им прочесть те или иные страницы.
На самом деле это даже две книги в одной. В первой читатель учится анализировать современные вредоносные программы — уже только это оправдывает покупку. Но авторы решили не останавливаться и фактически написали второй том, который можно было бы озаглавить как «Прикладной анализ вредоносного ПО». Он состоит из лабораторных работ, кратких ответов и развернутого анализа, представленного в конце каждой главы и в приложении B. Кроме того, авторы сами написали все вредоносные образцы, которые используются в примерах, подготовив для вас разнообразную, но при этом безопасную среду для обучения.
Таким образом, вместо того чтобы сетовать на очевидную асимметричность с точки зрения систем защиты, скажите спасибо, что вредоносное ПО обрело именно такую форму. Вооружившись книгами, подобными этой, вы получите фору, необходимую для обнаружения и устранения вторжений в вашу организацию или организации ваших клиентов. Авторы этой книги являются экспертами в данной области, поэтому помните, что советы, которые вы здесь найдете, получены в реальных условиях, а не в изолированной исследовательской лаборатории. Наслаждайтесь чтением и помните, что чем больше экземпляров вредоносного ПО вы тщательно исследуете, тем сложнее придется вашим противникам.
Ричард Бейтлич (@taosecurity),
глава службы безопасности в Mandiant и основатель TaoSecurity, Манассас-Парк, Виргиния, 2 января 2012 года