- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
286 Часть 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 |
|
|
|
|
Прямое внедрение, как и внедрение DLL, подразумевает выделение и вставку кода в адресное пространство внешнего процесса. В нем используется похожий набор вызовов Windows API. Разница состоит в том, что вместо создания отдельной DLL и принуждения процесса ее загрузить вредоносный код вставляется непосредственно в сам процесс.
Прямое внедрение отличается большей гибкостью, но для успешного выполнения этой процедуры без отрицательных последствий для атакуемого процесса требуется большое количество модифицированного кода. С помощью этой методики можно внедрять скомпилированный код, но чаще всего она используется для вставки кода командной оболочки.
При прямом внедрении обычно встречаются три функции: VirtualAllocEx,
WriteProcessMemory и CreateRemoteThread. Как правило, выполняется два вызова —
VirtualAllocEx и WriteProcessMemory. Первый выделяет и записывает данные, которые нужны внешнему потоку выполнения, а второй выделяет и записывает сам код потока. Вызов CreateRemoteThread будет содержать местоположение кода внешнего потока (lpStartAddress) и его параметр (lpParameter).
Поскольку данные и функции, используемые внешним потоком, должны существовать в заражаемом процессе, обычная процедура компиляции здесь не подойдет. Например, строки не должны находиться в стандартном разделе .data, а для использования функций, которые еще не были загружены, придется применять вызовы LoadLibrary/GetProcAddress. Существуют и другие ограничения, в которые мы не станем углубляться. В сущности, для прямого внедрения автор вредоносного ПО должен либо владеть хорошими навыками написания ассемблерного кода, либо обходиться вставкой относительно простого кода командной оболочки.
Для анализа кода внешнего потока вам, вероятно, придется отладить вредоносную программу и сохранить для дальнейшего исследования все буферы памяти, которые встречаются до вызовов WriteProcessMemory. Поскольку эти буферы часто содержат код командной оболочки, вам понадобятся соответствующие навыки, которые мы рассмотрим в главе 19.
Подмена процесса
Вместо того чтобы вставлять код в атакуемый процесс, некоторые вредоносы используют прием под названием «подмена процесса» — перезапись адресного пространства активного процесса с помощью зараженного исполняемого файла. Злоумышленники используют этот подход, когда хотят замаскировать вредоносный код под обычную программу, не рискуя обрушить процесс из-за внедрения в него.
Этот прием позволяет вредоносу получить те же привилегии, какие имеет подменяемый им процесс. Например, если бы вредоносная программа подменила процесс svchost.exe, в списке процессов остался бы тот же исполняемый файл svchost.exe, запущенный из каталога C:\Windows\System32, что, скорее всего, не вызвало бы никаких подозрений (это, к слову, распространенная атака).
|
|
|
|
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 |
|
|
|||
Глава 12. Скрытый запуск вредоносного ПО 287 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Ключевым аспектом данной методики является создание процесса в приостановленном состоянии, то есть процесса, который загружается в память, но ничего не делает, так как его главный поток не выполняется. Такая программа будет бездействовать, пока кто-то извне не запустит ее главный поток. В листинге 12.2 показано, как автор вредоносного ПО приостанавливает процесс, передавая значение CREATE_ SUSPENDED (0x4) в качестве аргумента dwCreationFlags для вызова CreateProcess.
Листинг 12.2. Ассемблерный код, демонстрирующий подмену процесса
00401535 |
push |
edi |
; lpProcessInformation |
00401536 |
push |
ecx |
; lpStartupInfo |
00401537 |
push |
ebx |
; lpCurrentDirectory |
00401538 |
push |
ebx |
; lpEnvironment |
00401539 |
push |
CREATE_SUSPENDED ; dwCreationFlags |
|
0040153B |
push |
ebx |
; bInheritHandles |
0040153C |
push |
ebx |
; lpThreadAttributes |
0040153D |
lea |
edx, [esp+94h+CommandLine] |
|
00401541 |
push |
ebx |
; lpProcessAttributes |
00401542 |
push |
edx |
; lpCommandLine |
00401543 |
push |
ebx |
; lpApplicationName |
00401544 |
mov |
[esp+0A0h+StartupInfo.dwFlags], 101h |
|
0040154F |
mov |
[esp+0A0h+StartupInfo.wShowWindow], bx |
|
00401557 |
call |
ds:CreateProcessA |
|
Эта процедура плохо описана в официальной документации, но с ее помощью процесс можно загрузить в память и остановить на точке входа.
В листинге 12.3 показан псевдокод на языке C, выполняющий подмену процесса.
Листинг 12.3. Подмена процесса в виде псевдокода на языке C
CreateProcess(...,"svchost.exe",...,CREATE_SUSPEND,...);
ZwUnmapViewOfSection(...); VirtualAllocEx(...,ImageBase,SizeOfImage,...);
WriteProcessMemory(...,headers,...); for (i=0; i < NumberOfSections; i++) {
WriteProcessMemory(...,section,...);
}
SetThreadContext();
...
ResumeThread();
Закончив с приготовлениями, следует записать в адресное пространство заражаемого процесса вредоносный исполняемый файл. Обычно для этого используется функция ZwUnmapViewOfSection, освобождающая весь участок памяти, на который указывает переданный ей аргумент. Вслед за этим загрузчик выполняет операцию VirtualAllocEx, чтобы выделить новое адресное пространство для вредоносного кода, и вызывает WriteProcessMemory, чтобы записать туда каждый раздел вредоноса; обычно это делается в цикле, как показано в строке .
На завершающем этапе вредонос восстанавливает среду атакуемого процесса и связывает точку входа с вредоносным кодом, используя вызов SetThreadContext. В конце вызывает ResumeThread, чтобы вредонос, подменивший обычный процесс, смог начать свою работу.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
288 Часть 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 |
|
|
|
|
Подмена процесса является эффективным способом маскировки вредоносных программ. Притворяясь обычным Windows-процессом, вредонос может избежать обнаружения со стороны брандмауэров и систем предотвращения вторжения (intrusion prevention systems, IPS). Кроме того, вредонос может обмануть даже опытного пользователя, который будет видеть в списке процессов путь к оригинальному исполняемому файлу, даже не подозревая, что тот был подменен.
Внедрение перехватчиков
Этот метод загрузки вредоносного кода основан на использовании перехватчиков Windows, которые перехватывают сообщения, направляемые приложениям. Злоумышленники могут внедрять перехватчики для достижения двух целей.
Сделать так, чтобы вредоносный код выполнялся при перехвате определенного сообщения.
Сделать так, чтобы в адресное пространство атакуемого процесса загрузилась определенная библиотека.
Как видно на рис. 12.3, пользователь генерирует события, которые передаются операционной системе, а она передает сообщения, созданные этими событиями, потокам, подписанным на них. Справа показан один из приемов, с помощью которого зло умышленник может вставить в перехваченные сообщения вредоносную библиотеку.
Рис. 12.3. Поток событий и сообщений в 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 |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
Глава 12. Скрытый запуск вредоносного ПО 289 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Локальные и внешние перехватчики
В Windows есть два вида перехватчиков.
Локальные. Используются для просмотра или изменения сообщений, направленных во внутренний процесс.
Внешние. Используются для просмотра или изменения сообщений, направленных во внешний процесс.
Существует две разновидности внешних перехватчиков: высоко- и низкоуровневые. Высокоуровневый внешний перехватчик требует, чтобы его функция экспортировалась и находилась в DLL — ОС свяжет ее с адресным пространством перехватываемого потока (или всех потоков сразу). Низкоуровневый внешний перехватчик требует, чтобы его функция находилась в процессе, который его устанавливает. Эта функция получает уведомление до того, как ОС сможет обработать событие.
Кейлогеры на основе перехватчиков
Внедрение перехватчиков часто используется в таких вредоносных приложениях, как кейлогеры, которые записывают нажатия клавиш. Информацию о нажатии можно получить путем регистрации обработчиков высокого (WH_KEYBOARD) или низкого (WH_KEYBOARD_LL) уровня.
При использовании процедуры типа WH_KEYBOARD обработчики часто выполняются в контексте внешнего процесса, но они также могут работать и в процессе, который их установил. В случае с типом WH_KEYBOARD_LL события передаются непосредственно процессу, установившему перехватчик, поэтому тот будет выполняться в соответствующем контексте. И тот и другой тип перехватчиков позволяет кейлогеру записывать нажатия клавиш и сохранять их в файл или же модифицировать их перед тем, как они дойдут до процесса или системы.
Использование функции SetWindowsHookEx
SetWindowsHookEx является основной функцией для внешнего перехвата в Windows. Она принимает следующие аргументы.
idHook. Определяет тип устанавливаемой процедуры перехвата.lpfn. Указывает на процедуру перехвата.
hMod. В случае с высокоуровневыми перехватчиками определяет дескриптор библиотеки, в которой находится процедура перехвата (lpfn). В случае с низкоуровневыми перехватчиками определяет локальный модуль, в котором объявлена процедура lpfn.
dwThreadId. Определяет идентификатор потока, с которым будет связана процедура перехвата. Если этот аргумент равен нулю, перехватчик будет связан
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
290 Часть 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 |
|
|
|
|
со всеми существующими потоками, которые выполняются в одной системе с вызывающим кодом. При использовании низкоуровневых перехватчиков ему следует присвоить ноль.
Процедура перехвата может содержать код для обработки сообщений, поступающих из системы, а может и бездействовать. В любом случае она обязана сделать вызов CallNextHookEx, который гарантирует, что следующая процедура в цепочке вызовов получит сообщение и что система продолжит работать корректно.
Атака на отдельные потоки
При атаке на поток с конкретным параметром dwThreadId вредонос обычно содержит инструкции для определения системного потока с подходящим идентификатором, но он также может атаковать все потоки подряд. Второй вариант применяется только кейлогерами и их аналогами, целью которых является перехват сообщений. Загрузка во все потоки сразу может замедлить ОС и спровоцировать срабатывание системы предотвращения вторжений (IPS). Поэтому, если вредоносу нужно лишь загрузить DLL во внешний процесс, он внедрится только в один поток, чтобы остаться незаметным.
Чтобы атаковать определенный поток, нужно сначала найти подходящий процесс и запустить его, если он в этот момент не работает. Перехват сообщений, которые часто используются Windows, повышает вероятность срабатывания IPS, поэтому вредоносные программы обычно устанавливают перехватчики для менее востребованных сообщений, таких как WH_CBT (относится к обучающим компьютерным программам).
В листинге 12.4 показан ассемблерный код, который выполняет внедрение перехватчика, чтобы загрузить DLL в адресное пространство другого процесса.
Листинг 12.4. Внедрение перехватчика: ассемблерный код
00401100 |
push |
esi |
|
00401101 |
push |
edi |
|
00401102 |
push |
offset LibFileName |
; "hook.dll" |
00401107 |
call |
LoadLibraryA |
|
0040110D |
mov |
esi, eax |
|
0040110F |
push |
offset ProcName |
; "MalwareProc" |
00401114 |
push |
esi |
; hModule |
00401115 |
call |
GetProcAddress |
|
0040111B |
mov |
edi, eax |
|
0040111D |
call |
GetNotepadThreadId |
|
00401122 |
push |
eax |
; dwThreadId |
00401123 |
push |
esi |
; hmod |
00401124 |
push |
edi |
; lpfn |
00401125 |
push |
WH_CBT ; idHook |
|
00401127 |
call |
SetWindowsHookExA |
|
Вредоносная программа загружает зараженную библиотеку (hook.dll), после чего получает адрес процедуры перехвата. Эта процедура, MalwareProc, делает лишь один вызов — CallNextHookEx. После этого из потока, принадлежащего процессу notepad.exe (будем считать, что он запущен), вызывается локальная функция
SetWindowsHookEx, которая получает идентификатор dwThreadId для notepad.exe.