- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
|||
Глава 11. Поведение вредоносных программ 269 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Если кейлогер записывает все нажатия, он должен каким-то образом обозначать такие клавиши, как Page Down. Следовательно, у него должен быть доступ к соответствующим строкам. Чтобы их отследить, можно начать с перекрестных ссылок, продвигаясь в обратном направлении. Так вы сможете распознать во вредоносной программе возможности кейлогера.
Механизм постоянного присутствия
Получив доступ к системе, вредоносная программа часто пытается остаться там надолго. Такое поведение называется постоянным присутствием. И если механизм, который для этого используется, является достаточно уникальным, он может послужить идентификатором данного вредоносного кода.
Этот раздел начинается с наиболее распространенного способа достижения постоянного присутствия — изменения системного реестра. Дальше мы покажем, как вредонос пытается закрепиться в системе путем заражения двоичных файлов. В конце будет рассмотрен метод, который не требует редактирования файлов или реестра, — изменение порядка загрузки DLL.
Реестр Windows
Во время обсуждения реестра Windows в главе 7 мы отмечали, что вредоносное ПО часто использует его для хранения своей конфигурации, сбора информации о системе и установки своих исполняемых файлов на постоянной основе. Как вы уже видели на страницах этой книги, особенно в лабораторных работах, для установки вредоносных программ часто используется следующий ключ:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
В реестре есть много других мест для обеспечения постоянного присутствия, но мы не станем перечислять каждое из них, поскольку их запоминание и последующий ручной поиск будут слишком хлопотными и неэффективными. Лучше делать это с помощью специальных инструментов, таких как программа Autoruns от компании Sysinternals: она выводит все приложения, которые запускаются автоматически вместе с системой. А такие утилиты, как ProcMon, позволяют отслеживать изменения реестра в рамках базового динамического анализа.
Обсуждая исследование реестра ранее, мы не упомянули несколько популярных ключей, которые заслуживают более пристального внимания: AppInit_DLLs, Winlogon и библиотеки SvcHost.
AppInit_DLLs
Для постоянного хранения своих динамических библиотек авторы вредоносного ПО используют специальное место в реестре под названием AppInit_DLLs. Библио теки, которые в нем указаны, загружаются во все процессы, которые обращаются
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
270 Часть IV • Возможности вредоносного ПО |
||||
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 |
|
|
|
|
к User32.dll. Так простое добавление в реестр позволяет держать библиотеку постоянно загруженной.
Значение AppInit_DLLs хранится в следующем ключе реестра Windows:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
Значение AppInit_DLLs имеет тип REG_SZ и состоит из названий библиотек, разделенных пробелами. Все процессы, которые используют User32.dll (а таких большинство), загружают AppInit_DLLs. Авторов вредоносного ПО обычно интересуют отдельные процессы, поэтому, прежде чем выполнять вредоносный код, они вынуждены проверять, в каком процессе работает их библиотека. Эту проверку часто производят в функции DllMain зараженной библиотеки.
Winlogon Notify
Вредонос можно привязать к определенному событию Winlogon — например, ко входу или выходу из системы, включению или выключению компьютера, появлению экрана блокировки и т. д. Это даже может позволить вредоносу загружаться в безопасном режиме. В следующем ключе реестра находится значение Notify:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\
Когда процесс winlogon.exe генерирует событие, Windows ищет в значении Notify библиотеки, которые должны его обработать.
Динамические библиотеки SvcHost
Как уже упоминалось в главе 7, в реестре хранится список всех служб, и если их оттуда убрать, они перестанут запускаться. Вредоносное ПО часто устанавливается в виде службы Windows, но при этом, как правило, использует исполняемый файл. Если установить вредонос в качестве библиотеки для svchost.exe, его будет сложнее заметить в списке процессов и реестре, чем в случае со стандартной службой.
Svchost.exe — это универсальный локальный процесс для служб, которые запускаются из динамических библиотек. В системах семейства Windows может выполняться сразу несколько таких процессов. Каждый экземпляр svchost.exe содержит группу служб, что упрощает их разработку, тестирование и управление. Эти группы описываются в следующей ветке реестра (каждое значение представляет отдельную группу):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
Сами службы объявляются в ключах следующего вида:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ИмяСлужбы
Службы Windows содержат множество значений реестра, большинство из которых включают сведения вида DisplayName (отображаемое имя) Description
|
|
|
|
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 |
|
|
|||
Глава 11. Поведение вредоносных программ 271 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
(описание). Авторы вредоносного ПО часто указывают значения, которые помогают вредоносу оставаться незаметным — например, NetWareMan со строкой «Предоставляет доступ к файлам и принтерам в сетях NetWare». Можно также отметить значение реестра ImagePath, которое содержит путь к исполняемому файлу службы. Для библиотеки svchost.exe оно равно %SystemRoot%/System32/ svchost.exe –k GroupName.
Все DLL для svchost.exe содержат ключ Parameters со значением ServiceDLL, куда злоумышленники записывают путь к зараженному DLL-файлу. Там же находится значение Start, которое определяет момент запуска службы (вредоносы обычно загружаются вместе с системой).
В Windows есть ряд заранее определенных служебных групп, и вредоносные программы обычно используют одну из них, иногда перезаписывая второстепенные или редко используемые службы (например, из группы netsvcs), так как создание новой группы легко обнаружить. Чтобы узнать, применялась ли эта методика, проследите за реестром Windows посредством динамического анализа или поищите в ассемблерном коде службы такие функции, как CreateServiceA. Если вредонос модифицирует вышеперечисленные ключи, это означает, что он использует данную методику.
Заражение системных двоичных файлов
Еще один способ обеспечения постоянного присутствия заключается в заражении двоичных файлов системы. Вредонос изменяет отдельные байты системного файла, чтобы тот сам запускал его при следующей загрузке. Наибольший интерес для авторов вредоносного ПО представляют файлы, которые система часто использует в своей работе. Особой популярностью пользуются динамические библиотеки.
Заражение системного двоичного файла обычно происходит за счет изменения входной функции таким образом, чтобы та делала переход к вредоносному коду. Перезаписи подлежит либо самое начало точки входа, либо код, который не нужен для корректной работы зараженной библиотеки. Вредоносный код добавляется в пустой раздел двоичного файла, чтобы не повлиять на его выполнение. Обычно он отвечает за загрузку вредоноса и не зависит от того, куда именно его вставили. Выполнив свою задачу, он переходит к оригинальному коду библиотеки, чтобы все работало так, как до модификации.
При изучении одной зараженной системы мы заметили, что системный двоичный файл rtutils.dll имеет не тот MD5-хеш, который мы ожидали, что заставило нас присмотреться к нему поближе. Мы загрузили в IDA Pro подозрительную и чистую версии rtutils.dll. В табл. 11.1 показано сравнение их функций DllEntryPoint. Разница очевидна: зараженная версия выполняет переход в другое место.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
272 Часть IV • Возможности вредоносного ПО |
||||
w Click |
|
|
|
|
|
|
||||
|
|
|
|
|
o |
m |
||||
|
w |
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
Таблица 11.1. Точка входа в rtutils.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 |
|
||
|
|
|
|
-x cha |
|
|
|
|
Оригинальный код |
Зараженный код |
|
|
|
|
DllEntryPoint(HINSTANCE hinstDLL, |
DllEntryPoint(HINSTANCE hinstDLL, |
|
DWORD fdwReason, LPVOID lpReserved) |
DWORD fdwReason, LPVOID lpReserved) |
|
mov |
edi, edi |
jmp DllEntryPoint_0 |
push |
ebp |
|
mov |
ebp, esp |
|
push |
ebx |
|
mov |
ebx, [ebp+8] |
|
push |
esi |
|
mov |
esi, [ebp+0Ch] |
|
|
|
|
В листинге 11.5 показан вредоносный код, который был вставлен в зараженный файл rtutils.dll.
Листинг 11.5. Вредоносный участок кода, вставленный в системную библиотеку
76E8A660 DllEntryPoint_0
76E8A660 |
pusha |
|
76E8A661 |
call |
sub_76E8A667 |
76E8A666 |
nop |
|
76E8A667 |
sub_76E8A667 |
|
76E8A667 |
pop |
ecx |
76E8A668 |
mov |
eax, ecx |
76E8A66A |
add |
eax, 24h |
76E8A66D |
push |
eax |
76E8A66E |
add |
ecx, 0FFFF69E2h |
76E8A674 |
mov |
eax, [ecx] |
76E8A677 |
add |
eax, 0FFF00D7Bh |
76E8A67C |
call |
eax ; LoadLibraryA |
76E8A67E |
popa |
|
76E8A67F |
mov |
edi, edi |
76E8A681 |
push |
ebp |
76E8A682 |
mov |
ebp, esp |
76E8A684 |
jmp |
loc_76E81BB2 |
... |
|
|
76E8A68A |
aMsconf32_dll db 'msconf32.dll',0 |
Функция с меткой DLLEntryPoint_0 выполняет инструкцию pusha, которая часто используется вредоносами для сохранения начального состояния регистра; по завершении своей работы они могут восстановить состояние с помощью операции popa. Дальше код вызывает sub_76E8A667 , после чего вызывается функция. Обратите внимание на то, что вначале выполняется инструкция pop ecx, которая помещает обратный адрес в регистр ECX (так как она происходит сразу же после вызова). Затем код прибавляет к этому адресу 0x24 (0x76E8A666 + 0x24 = 0x76E8A68A) и помещает его в стек. Участок по адресу 0x76E8A68A содержит строку 'msconf32.dll' . Вызов LoadLibraryA приводит к загрузке файла msconf32.dll. Это означает, что msconf32.dll будет загружаться всеми процессами, которые используют rtutils.dll в качестве модуля, в том числе svchost.exe, explorer.exe и winlogon.exe.
|
|
|
|
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 |
|
|
|||
Глава 11. Поведение вредоносных программ 273 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
После вызова LoadLibraryA вредоносный код выполняет инструкцию popa, восстанавливая тем самым состояние системы, которое было сохранено с помощью исходной инструкции pusha. Вслед за popa идут три операции (начиная с ), идентичные тем, которые присутствовали в чистой версии функции DllEntryPoint из rtutils.dll (см. табл. 11.1). После этого выполняется переход обратно к оригинальной точке входа.
Изменение порядка загрузки DLL
Это простая методика, которая позволяет авторам вредоносного ПО создавать долгоживущие скрытые динамические библиотеки без использования реестра или заражения двоичных файлов. Ей не нужен даже отдельный вредоносный загрузчик, так как она использует механизм загрузки DLL в Windows.
По умолчанию Windows XP ищет библиотеки в таком порядке.
1.Каталог, из которого загружено приложение.
2.Текущий каталог.
3.Системный каталог (для получения пути вида …/Windows/System32/ используется функция GetSystemDirectory).
4.Шестнадцатибитный системный каталог (вида …/Windows/System/).
5.Каталог Windows (для получения пути вида …/Windows/ используется функция
GetWindowsDirectory).
6.Каталоги, перечисленные в переменной среды PATH.
ВWindows XP процесс загрузки DLL можно пропустить с помощью ключа реестра KnownDLLs, который содержит список определенных мест, обычно находящихся в …/Windows/System32/. Этот механизм создан для повышения безопасности (вредоносные библиотеки нельзя разместить выше в цепочке загрузки) и скорости (Windows не нужно выполнять стандартную процедуру поиска, описанную выше), но в нем содержится лишь небольшое количество наиболее важных DLL.
Изменение порядка загрузки можно применять к двоичным файлам, если они не находятся внутри /System32 и не защищены посредством KnownDLLs. Например, файл explorer.exe в /Windows загружает библиотеку ntshrui.dll, которая находится в /System32. Но, поскольку файл ntshrui.dll не входит в число известных DLL, для его поиска выполняется стандартная процедура, в ходе которой /Windows проверяется перед /System32. Если поместить в каталог /Windows зараженную библиотеку с именем ntshrui.dll, она будет загружена вместо настоящей библиотеки. После этого вредоносный код может загрузить оригинальный файл, чтобы не нарушить работу системы.
Этой атаке подвержен любой двоичный файл, который загружается во время запуска системы и не находится в каталоге /System32. Например, процесс explorer.exe имеет примерно 50 уязвимых библиотек. Но даже известные DLL не защищены полностью, поскольку многие из них загружают файлы, для которых выполняется
стандартная процедура поиска.