- •Внимание!
- •Об авторах
- •О техническом редакторе
- •О соавторах
- •Предисловие
- •Благодарности
- •Отдельное спасибо
- •Введение
- •Необходимая квалификация
- •Изучение на примерах
- •Структура книги
- •Глава 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 |
|
|
262 Часть 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 (пароли, хеши и т. д.), для непосредственного использования или дальнейшей расшифровки.
Программы, которые записывают нажатия клавиш.
В данном разделе мы рассмотрим каждую из этих разновидностей вредоносного ПО.
Перехват GINA
В Windows XP для хищения учетных данных используется прием, состоящий в перехвате GINA (graphical identification and authentication — графическая идентификация и аутентификация). Система GINA создавалась для того, чтобы позволить сторонним приложениям адаптировать под себя процесс входа в систему, добавляя поддержку таких технологий, как аппаратная радиочастотная идентификация (radio-frequency identification, RFID) на основе маркеров или смарт-карт. Авторы вредоносного ПО пользуются этой возможностью для загрузки кода, который крадет учетные данные.
GINA реализуется в виде DLL под названием msgina.dll и загружается программой Winlogon во время входа в систему. Winlogon также поддерживает сторонние плагины, загружая их перед GINA DLL (как при атаке посредника). Для удобства Windows предоставляет следующую ветвь реестра, где Winlogon может найти и загрузить сторонние DLL:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL
Когда-то мы нашли там зараженный файл fsgina.dll, который оказался перехватчиком GINA.
На рис. 11.2 показан пример того, как данные для входа в систему попадают к вредоносной библиотеке, проходя от Winlogon к msgina.dll. Вредоносу (fsgina.dll) удается перехватить всю учетную информацию, которую пользователь вводит во время аутентификации. Он может записать ее на диск или передать по сети.
Рис. 11.2. Вредоносная библиотека fsgina.dll притаилась между системными файлами 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 |
|
|
|||
Глава 11. Поведение вредоносных программ 263 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Поскольку библиотека fsgina.dll перехватывает поток взаимодействия между Winlogon и GINA, она должна передать его дальше в msgina.dll, чтобы система продолжила нормально функционировать. Для этого вредоносу приходится экспортировать все функции, которые требуются системе GINA, — их насчитывается больше 15, и большинство из них имеют префикс Wlx. Очевидно, что при обнаружении в DLL множества экспортных функций, которые начинаются с Wlx, можно с большой долей вероятности предположить, что это перехватчик GINA.
Большинство этих экспортных вызовов обращаются к реальным функциям внутри msgina.dll. В случае с fsgina.dll это относится ко всем функциям, кроме
WlxLoggedOutSAS. В листинге 11.1 показан экспорт WlxLoggedOutSAS в fsgina.dll.
Листинг 11.1. Экспортная функция WlxLoggedOutSAS в GINA DLL, с помощью которой записываются похищенные учетные данные
100014A0 |
WlxLoggedOutSAS |
|
100014A0 |
push |
esi |
100014A1 |
push |
edi |
100014A2 |
push |
offset aWlxloggedout_0 ; "WlxLoggedOutSAS" |
100014A7 |
call |
Call_msgina_dll_function |
... |
|
|
100014FB |
push |
eax ; Args |
100014FC |
push |
offset aUSDSPSOpS ;"U: %s D: %s P: %s OP: %s" |
10001501 |
push |
offset aDRIVERS ; "drivers\tcpudp.sys" |
10001503 |
call |
Log_To_File |
Учетная информация сразу же передается в файл msgina.dll с помощью вызова, обозначенного как Call_msgina_dll_function . Эта функция динамически находит и запускает вызов WlxLoggedOutSAS из msgina.dll, который указывается в виде аргумента. Вызов в строке выполняет запись данных. В качестве аргументов он принимает учетную информацию, строку форматирования, с помощью которой эта информация будет выводиться, и имя файла для записи. В итоге сведения о любом успешном входе в систему сохраняются в файл %SystemRoot%\system32\drivers\ tcpudp.sys. Этот файл содержит имя пользователя, домен и два пароля — текущий и старый.
Сохранение хешей
Вредоносное ПО в Windows часто сохраняет системные хеши, чтобы получить доступ к учетным данным. После сохранения злоумышленники пытаются расшифровать эти хеши в автономном режиме или использовать их для атаки типа pass-the-hash. В ходе этой атаки хеши LM и NTLM применяются для удаленной NTLM-аутентификации, что не требует их расшифровки и получения соответствующего пароля.
Для сохранения хешей существуют программные пакеты Pwdump и Pass-the- Hash (PSH), которые распространяются бесплатно. Поскольку оба этих инструмента имеют открытый исходный код, на их основе создано множество вредоносного ПО.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
264 Часть 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 |
|
|
|
|
У большинства антивирусов предусмотрены сигнатуры для стандартных скомпилированных версий этих утилит, поэтому злоумышленники часто пытаются скомпилировать собственные их вариации, чтобы избежать обнаружения. Примеры, приводимые в этой главе, являются разновидностями pwdump и PSH, с которыми мы сталкивались в реальных условиях.
Pwdump — это набор программ, которые выводят из диспетчера учетных записей безопасности (security account manager, SAM) хеши в формате LM i NTLM, принадлежащие локальным пользователям. Pwdump внедряет DLL внутрь процесса LSASS (local security authority subsystem service — сервер проверки подлинности локальной системы безопасности), более известного как lsass.exe. О внедрении DLL мы поговорим в главе 12, а пока что вам стоит знать лишь о том, что это прием, посредством которого вредоносное ПО выполняет библиотеки внутри других процессов, пользуясь всеми их привилегиями. Инструменты для сохранения хешей часто атакуют процесс lsass.exe, потому что он обладает достаточными привилегиями и доступом ко многим полезным API-функциям.
Стандартная версия Pwdump использует библиотеку lsaext.dll. При внедрении ее в lsass.exe она вызывает функцию GetHash, которая экспортируется из lsaext.dll, чтобы выполнить извлечение хешей. При этом используются недокументированные функции Windows, которые позволят получить порядковые номера всех пользователей в системе и незашифрованные хеши паролей каждого из них.
Столкнувшись с вариацией Pwdump, нужно проанализировать ее библиотеки, чтобы понять, как происходит сохранение хешей. Первым делом следует обратить внимание на экспортные функции. Из Pwdump по умолчанию экспортируется вызов GetHash, но злоумышленники могут легко поменять его имя, чтобы сделать его менее узнаваемым. Затем стоит попытаться определить функции, которые применяются в экспортных вызовах. Многие из них могут находиться динамически, поэтому в экспортных вызовах часто встречается многократное использование операции GetProcAddress.
В листинге 11.2 показан код экспортной функции GrabHash из DLL одной из версий Pwdump. Поскольку библиотека внедряется в lsass.exe, перед использованием многих символов ей сначала приходится находить их в ручном режиме.
Листинг 11.2. Уникальные АPI-вызовы, которые используются экспортной функцией GrabHash в одном из вариантов Pwdump
1000123F |
push |
offset LibFileName |
; "samsrv.dll" |
10001244 |
call |
esi ; LoadLibraryA |
|
10001248 |
push |
offset aAdvapi32_dll_0 |
; "advapi32.dll" |
... |
|
|
|
10001251 |
call |
esi ; LoadLibraryA |
|
... |
|
|
|
1000125B |
push |
offset ProcName |
; "SamIConnect" |
10001260 |
push |
ebx |
; hModule |
10001265 |
call |
esi ; GetProcAddress |
|
... |
|
|
|
10001281 |
push |
offset aSamrqu ; "SamrQueryInformationUser" |
|
10001286 |
push |
ebx |
; hModule |
|
|
|
|
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. Поведение вредоносных программ 265 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
1000128C |
call |
esi ; GetProcAddress |
|
... |
|
|
|
100012C2 |
push |
offset aSamigetpriv ; "SamIGetPrivateData" |
|
100012C7 |
push |
ebx |
; hModule |
100012CD |
call |
esi ; GetProcAddress |
|
... |
|
|
|
100012CF |
push |
offset aSystemfuncti ; "SystemFunction025" |
|
100012D4 |
push |
edi |
; hModule |
100012DA |
call |
esi ; GetProcAddress |
|
100012DC |
push |
offset aSystemfuni_0 ; "SystemFunction027" |
|
100012E1 |
push |
edi |
; hModule |
100012E7 |
call |
esi ; GetProcAddress |
|
Влистинге 11.2 показан код получения дескрипторов библиотек samsrv.dll
иadvapi32.dll с помощью вызова LoadLibrary. Файл samsrv.dll содержит API для простого доступа к SAM, а файл advapi32.dll был найден для доступа к функциям, которые не импортированы в lsass.exe. Динамическая библиотека данной вариации Pwdump использует дескрипторы этих библиотек для поиска множества функций. Пять самых важных из них показаны в листинге (обратите внимание на вызовы GetProcAddress и их аргументы).
Из samsrv.dll импортируются такие интересные вызовы, как SamIConnect,
SamrQueryInformationUser и SamIGetPrivateData. Вызов SamIConnect впоследствии используется для подключения к SAM, после чего для каждого пользователя в системе вызывается функция SamrQueryInformationUser.
Хеши извлекаются с использованием вызова SamIGetPrivateData, а затем расшифровываются с помощью функций SystemFunction025 и SystemFunction027,
импортированных из advapi32.dll (строки и ). Ни одна из API-функций в этом листинге не описана в официальной документации.
PSH Toolkit содержит программы, которые создают дампы хешей. Самый популярный из этих дампов известен под названием whosthere-alt. В нем хранится содержимое SAM, полученное путем внедрения DLL в lsass.exe. При этом, если сравнивать с Pwdump, используется совершенно другой набор API-функций. В листинге 11.3 показан код версии whosthere-alt, которая экспортирует функцию с именем TestDump.
Листинг 11.3. Уникальные API-вызовы, которые используются экспортной функцией TestDump
версии whosthere-alt
10001119 |
push |
offset LibFileName ; "secur32.dll" |
|
1000111E |
call |
ds:LoadLibraryA |
|
10001130 |
push |
offset ProcName ; "LsaEnumerateLogonSessions" |
|
10001135 |
push |
esi |
; hModule |
10001136 |
call |
ds:GetProcAddress |
|
... |
|
|
|
10001670 |
call |
ds:GetSystemDirectoryA |
|
10001676 |
mov |
edi, offset aMsv1_0_dll ; \\msv1_0.dll |
|
... |
|
|
|
100016A6 |
push |
eax |
; path to msv1_0.dll |
100016A9 |
call |
ds:GetModuleHandleA |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
266 Часть 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 |
|
|
|
|
Поскольку данная библиотека внедряется в lsass.exe, ее функция TestDump создает дамп хеша. Она динамически загружает файл secur32.dll и находит в нем вызов LsaEnumerateLogonSessions , чтобы получить список локальных уникальных идентификаторов (locally unique identifiers, LUID). В этом списке содержатся имена и домены, которые указывались при каждом входе в систему. Библиотека перебирает их, чтобы получить доступ к учетной информации. Для этого с помощью вызова GetModuleHandle она ищет внутри msv1_0.dll неэкспортированную функцию, NlpGetPrimaryCredential, которая позволяет создавать дампы хешей NT и LM.
ПРИМЕЧАНИЕ
Понимать, как вредонос добывает хеши, очень важно, но еще важнее определить, что он с этими хешами делает: сохраняет на диск, загружает на сайт или использует в атаке типа pass-the-hash? Эти подробности могут быть очень важны, поэтому, прежде чем браться за идентификацию низкоуровневых методик создания дампов, следует определить общую функциональность кода.
Кейлогеры
Кейлогеры — это классический вид вредоносов для хищения учетных данных. Они записывают нажатия клавиш, позволяя злоумышленнику наблюдать за вводом имени пользователя и пароля. Для Windows существует множество разновидностей кейлогеров.
Кейлогеры в пространстве ядра
Кейлогеры этого вида сложно обнаружить с помощью пользовательских программ. Они часто входят в состав руткитов и могут действовать как драйверы клавиатуры, что позволяет им захватывать нажатия клавиш и обходить приложения и системы защиты, работающие в режиме пользователя.
Кейлогеры в пользовательском режиме
Кейлогеры, работающие в пользовательском пространстве, обычно используют Windows API и реализованы путем перехвата или опроса. При перехвате Windows API уведомляет вредонос о нажатии каждой клавиши — с помощью функции SetWindowsHookEx. Метод опроса использует функции GetAsyncKeyState
и GetForegroundWindow из Windows API, чтобы постоянно опрашивать состояние клавиш.
Кейлогеры, занимающиеся перехватом, пользуются стандартной для Windows функцией SetWindowsHookEx. Для ее вызова кейлогер может распространяться в виде исполняемого файла; он также может включать в себя библиотеку для сохранения
|
|
|
|
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. Поведение вредоносных программ 267 |
to |
|
|
|
|
|
||||
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
нажатий, которую можно автоматически внедрить во множество системных процессов. Мы еще вернемся к функции SetWindowsHookEx в главе 12.
Прежде всего нас интересуют опрашивающие кейлогеры, которые используют вызовы GetAsyncKeyState и GetForegroundWindow. Функция GetAsyncKeyState
определяет, является ли клавиша нажатой, и если да, то нажимали ли ее после последнего вызова GetAsyncKeyState. Функция GetForegroundWindow определяет активное окно — то, которое находится в фокусе: так кейлогер может узнать, какое приложение использует ввод с клавиатуры (например, Блокнот или Internet Explorer).
На рис. 11.3 проиллюстрирована типичная циклическая структура, которую можно найти в опрашивающих кейлогерах. Сначала делается вызов GetForegroundWindow, который записывает активное окно. Затем внутренний цикл перебирает список клавиш, определяя состояние каждой из них с помощью функции GetAsyncKeyState. Если клавиша нажата, программа проверяет состояние Shift и Caps Lock, чтобы узнать, как правильно записать нажатие. По завершении внутреннего цикла опять вызывается функция GetForegroundWindow, чтобы проверить, находится ли пользователь в том же окне. Этот процесс повторяется достаточно быстро, успевая за пользовательским вводом (кейлогер может использовать вызов Sleep, чтобы не потреблять слишком много ресурсов).
Рис. 11.3. Циклическая структура кейлогера
на основе функций GetAsyncKeyState и GetForegroundWindow
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
w |
|
|
to |
|
|
268 Часть 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 |
|
|
|
|
В листинге 11.4 показана та же циклическая структура в дизассемблированном виде.
Листинг 11.4. Ассемблерный код кейлогера на основе функций GetAsyncKeyState
и GetForegroundWindow
00401162 |
call |
ds:GetForegroundWindow |
|
... |
|
|
|
00401272 |
push |
10h |
; nVirtKey Shift |
00401274 |
call |
ds:GetKeyState |
|
0040127A |
mov |
esi, dword_403308[ebx] |
|
00401280 |
push |
esi |
; vKey |
00401281 |
movsx |
edi, ax |
|
00401284 |
call |
ds:GetAsyncKeyState |
|
0040128A |
test |
ah, 80h |
|
0040128D |
jz |
short loc_40130A |
|
0040128F |
push |
14h |
; nVirtKey Caps Lock |
00401291 |
call |
ds:GetKeyState |
|
... |
|
|
|
004013EF |
add |
ebx, 4 |
|
004013F2 |
cmp |
ebx, 368 |
|
004013F8 |
jl |
loc_401272 |
|
Перед входом во внутренний цикл программа вызывает GetForegroundWindow. Цикл начинается в строке , сразу же проверяя состояние клавиши Shift с помощью GetKeyState. Эта функция позволяет быстро проверить, нажата ли клавиша, но, в отличие от GetAsyncKeyState, она не помнит, была ли та нажата с момента предыдущего вызова. Затем в строке кейлогер индексирует массив клавиш на клавиатуре, используя регистр EBX. Нажатие новой клавиши записывается, но перед этим вызов GetKeyState проверяет, активизирован ли режим Caps Lock. В конце EBX инкрементируется , чтобы можно было проверить следующую клавишу в списке. После проверки 92 клавиш (368 / 4) внутренний цикл завершается, но только для того, чтобы начаться вновь после очередного вызова GetForegroundWindow.
Идентификация кейлогеров по их строкам
Чтобы распознать возможности кейлогера внутри вредоноса, можно проверить импортируемые им API-функции, но вы также можете поискать индикаторы среди его строк. Второй способ может оказаться особенно полезным, если вредонос обфусцирует свой импорт или использует разновидность кейлогера, с которой вы ранее не сталкивались. Например, ниже приводится список строк из кейлогера, описанного в предыдущем разделе:
[Up]
[Num Lock] [Down] [Right] [UP] [Left] [PageDown]