- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
. |
|
|
|
|
9 |
|||||
|
|
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
OllyDbg
|
|
|
|
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 — отладчику для платформы x86, разработанному Олегом Ющуком. OllyDbg предоставляет возможность анализировать вредоносные программы во время их выполнения. Этот бесплатный и простой в использовании инструмент имеет множество плагинов, которые расширяют его возможности, поэтому он часто применяется для аналитики безопасности и обратного проектирования.
OllyDbg имеет давнюю и интересную историю. Сначала он использовался для взлома ПО, а обретя популярность, стал основным инструментом для анализа вредоносов и исследования уязвимостей. Но затем компания Immunity, занимающаяся безопасностью, купила кодовую базу OllyDbg 1.1 и переименовала этот продукт
вImmunity Debugger (ImmDbg). Целью компании было сделать его более подходящим для поиска уязвимостей и исправить в нем программные ошибки. Итоговые изменения оказались косметическими и коснулись лишь графического интерфейса ImmDbg. Тем не менее при этом была добавлена поддержка полноценного интерпретатора Python вместе с API, благодаря чему некоторые пользователи все же перешли с OllyDbg на ImmDbg.
Но ничего страшного, если вы предпочитаете ImmDbg, так как это, в сущности, тот же OllyDbg 1.1, и все, чему вы научитесь в этой главе, относится к обоим отладчикам. Стоит лишь обратить внимание на то, что многие подключаемые модули OllyDbg не подходят к ImmDbg, и, пока их не перенесут на новую платформу, вы не сможете ими пользоваться. ImmDbg имеет некоторые преимущества, например возможность расширения функций за счет использования Python API (подробнее об этом — в разделе «Отладка с использованием скриптов» в конце этой главы).
Возвращаясь к непростой истории OllyDbg, нужно упомянуть версию 2.0, выпущенную в июне 2010 года. Она разрабатывалась фактически с нуля, но на момент написания этой книги так и не получила широкого распространения. Многие считают ее бета-версией. В этой и последующих главах мы будем отмечать ситуации,
вкоторых она предоставляет полезные возможности, отсутствующие в версии 1.1.
Загрузка вредоносного ПО
Начать отладку в OllyDbg можно несколькими способами. Вы можете загружать исполняемые файлы и даже DLL напрямую. Если вредонос уже запущен в системе, вы можете подключиться к его процессу и таким образом приступить к отладке.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
206 Часть 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 позволяет удобно запускать вредоносный код с поддержкой режима командной строки или выполнять отдельные участки внутри DLL.
Открытие исполняемого файла
Чтобы начать отладку вредоносной программы, проще всего выбрать пункт меню File Open (Файл Открыть) и перейти к исполняемому файлу, который вы хотите загрузить (рис. 9.1). Если отлаживаемая вами программа требует задания аргументов, вы можете указать их в поле Arguments (Аргументы) диалогового окна открытия файлов (в OllyDbg это единственный этап, на котором можно передать аргументы командной строки).
Рис. 9.1. Открытие исполняемого файла с указанием аргументов командной строки
После этого OllyDbg загрузит двоичный файл с помощью собственного загрузчика. Это похоже на загрузку файлов в Windows.
По умолчанию OllyDbg останавливается на точке входа, известной как WinMain. Если ее местоположение не удается определить, OllyDbg берет адрес точки входа из PE-заголовка. Параметры запуска можно изменить с помощью меню Options Debugging Options (Параметры Параметры отладки). Например, чтобы отладчик останавливался немедленно, до выполнения какого-либо кода, выберите пункт System Breakpoint (Системная точка останова).
ПРИМЕЧАНИЕ
OllyDbg 2.0 имеет больше параметров остановки, чем версия 1.1. Например, выполнение можно остановить в начале функции обратного вызова TLS. Такие функции позволяют вредоносным программам выполнить код до того, как их работа будет остановлена. В главе 16 мы покажем, как функции обратного вызова TLS применяются для противодействия отладке и как от них защититься.
|
|
|
|
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 207 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Помимо непосредственного открытия исполняемых файлов OllyDbg умеет подключаться к активным процессам. Эта возможность полезна в ситуациях, когда нужно отладить уже запущенное вредоносное ПО.
Чтобы подключить OllyDbg к процессу, выберите пункт меню File Attach (Файл Подключить) . На экране появится список, из которого вы сможете выбрать нужный вам процесс (если в системе есть несколько процессов с тем же именем, вам нужно будет знать его идентификатор). После этого щелкните на пункте меню Attach (Подключить). Отладчик запустится и остановит программу вместе со всеми ее потоками.
Проделав все это, вы увидите на своем экране код текущего активного потока, работа которого приостановлена. Однако остановка могла произойти во время выполнения инструкции из системной динамической библиотеки. Вам незачем отлаживать библиотеки Windows, поэтому, если это случится, вам нужно будет вернуться к основному коду. Проще всего это сделать, указав точку останова на входе в блок кода. И в следующий раз при доступе к данному блоку программа остановится. Позже в текущей главе мы объясним, как создавать подобные точки останова.
Пользовательский интерфейс OllyDbg
Загрузив программу в OllyDbg, вы увидите окно с множеством информации, которая может пригодиться при анализе вредоносного кода (рис. 9.2).
Рис. 9.2. Интерфейс OllyDbg
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
208 Часть 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 |
|
|
|
|
Окно состоит из следующих панелей.
Панель дизассемблирования . Здесь выводится код отлаживаемой программы — указатель на текущую инструкцию, а также несколько инструкций до и после. Обычно на этой панели выделяется инструкция, которая должна выполниться на следующем шаге. Чтобы отредактировать код или данные (или добавить новые ассемблерные инструкции), нажмите, находясь на этой панели, клавишу Пробел.
Панель регистров . На этой панели выводится текущее состояние регистров в отлаживаемой программе. По мере изменения со стороны ранее выполненных инструкций они будут менять свой цвет с черного на красный. Как и в случае с панелью дизассемблирования, здесь вы можете редактировать содержимое регистров во время отладки: для этого щелкните правой кнопкой мыши на значении любого регистра и выберите пункт
Modify (Изменить). На экране появится диалоговое Рис. 9.3. Изменение регистра окно, показанное на рис. 9.3. В нем вы можете по-
менять соответствующее значение.
Панель стека . Эта панель выводит текущее состояние стека в памяти для отлаживаемого потока. Здесь всегда отображается вершина стека. Чтобы его отредактировать, щелкните правой кнопкой мыши на одном из его адресов и выберите пункт Modify (Изменить). OllyDbg выводит полезные комментарии для некоторых адресов, которые хранят аргументы API-вызовов. Это помогает в анализе, так как вам не нужно самостоятельно определять направление стека и узнавать, в каком порядке размещены аргументы в том или ином вызове.
Панель дампа памяти . Эта панель содержит текущий дамп памяти отлаживаемого процесса. Находясь в ней, нажмите Ctrl+G и введите адрес, дамп которого вы хотите просмотреть; то же самое можно сделать, щелкнув на соответствующем адресе и выбрав пункт Follow in Dump (Проследить в дампе). Чтобы отредактировать память, щелкните на этой панели правой кнопкой мыши и выберите пункт меню Binary Edit (Двоичный код Редактировать). Так вы можете поменять глобальные переменные и другие данные, которые вредоносная программа хранит в оперативной памяти.
Карта памяти
С помощью пункта меню View Memory (Вид Память) можно открыть окно Memory Map (Карта памяти), которое отображает все блоки памяти, выделенные для отлаживаемой программы. На рис. 9.4 показана карта памяти утилиты Netcat.
Карта памяти — это отличный способ ознакомиться со структурой приложения в памяти. Как можно видеть на рис. 9.4, исполняемый файл разбит на разделы с кодом и данными. Вы также можете просмотреть все подключаемые DLL (а также их код и данные). Чтобы вывести дамп памяти любой строки на карте, достаточно
|
|
|
|
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 209 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
выполнить на ней двойной щелчок. Вы также можете отправить данные из дампа памяти на панель дизассемблирования, щелкнув на них правой кнопкой мыши и выбрав пункт меню View in Disassembler (Просмотреть в дизассемблере).
Рис. 9.4. Карта памяти для Netcat (nc.exe)
Перебазирование
Карта памяти может помочь понять, как PE-файл перебазируется во время выполнения. Перебазирование — это процедура загрузки модуля в Windows по адресу, который отличается от базового.
Базовый адрес
У всех PE-файлов в Windows есть предпочтительный базовый адрес, известный также как ImageBase. Он определяется в PE-заголовке.
ImageBase не всегда, но обычно совпадает с адресом, по которому вредоносная программа будет загружена. Большинство исполняемых файлов рассчитано на загрузку по адресу 0x00400000, который используется по умолчанию во многих компиляторах на платформе Windows. Разработчики могут располагать свои файлы в других местах. Программы, которые поддерживают рандомизацию размещения
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
210 Часть 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 |
|
|
|
|
адресного пространства (address space layout randomization, ASLR — технология повышения безопасности), часто меняют свое местоположение. Хотя в основном это свойственно динамическим библиотекам.
Изменение местоположения необходимо, поскольку одно и то же приложение может импортировать множество DLL-файлов, каждый из которых имеет предпочтительный базовый адрес загрузки. Если у двух библиотек ImageBase равен 0x10000000, они не смогут загрузиться по этому адресу одновременно. Поэтому Windows загрузит одну из них по этому адресу, а другую куда-то переместит.
Большинство DLL, поставляемых вместе с Windows, имеют разные предпочтительные значения ImageBase и не конфликтуют между собой. Однако у сторонних приложений базовый адрес часто совпадает.
Абсолютные и относительные адреса
Процесс перебазирования не ограничивается лишь загрузкой кода в другом месте. Многие инструкции ссылаются на относительные адреса, но некоторые используют абсолютные. Например, в листинге 9.1 показана типичная последовательность инструкций.
Листинг 9.1. Ассемблерный код, требующий перебазирования
00401203 mov eax, [ebp+var_8]
00401206 cmp [ebp+var_4], 0
0040120a jnz loc_0040120
0040120c mov eax, dword_40CF60
Большинство этих инструкций используют относительные адреса — они будут нормально работать без всякого вмешательства вне зависимости от того, где они загружаются. Однако инструкция для доступа к данным не сможет быть выполнена в таком виде, поскольку она обращается к абсолютному адресу. Если загрузить файл на участок памяти, который отличается от предпочтительного, этот адрес станет некорректным. Данную инструкцию следует перенаправить по другому адресу во время загрузки файла. Большинство библиотек упаковывается вместе со списком таких фиксированных адресов. Вы можете найти их в разделе
.reloc PE-заголовка.
Динамические библиотеки загружаются в произвольном порядке, но после исполняемого файла. Это означает, что вы не можете предсказать заранее, на какой участок памяти будут перебазированы DLL-файлы. Если библиотека требует перебазирования, но при этом у нее нет раздела .reloc, ее невозможно загрузить.
Перемещение библиотек плохо сказывается на производительности и увеличивает время запуска программ. Обычно во время компиляции для всех библиотек по умолчанию выбирается один и тот же базовый адрес. Это существенно увеличивает вероятность их перебазирования, поскольку все они рассчитаны на загрузку на одном и том же участке памяти. Хорошим программистам известно об этой проблеме, поэтому они самостоятельно выбирают базовые адреса для своих библиотек, чтобы минимизировать их перемещение.