2015_лекции / Лекция №5_2015
.pdfВставка DLL c помощью глобальных ловушек
Общая схема загрузки вредоносной DLL с помощью ловушек
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpMalFunction, HINSTANCE hMaliciousDLL, DWORD dwRemoteThreadId)
Name |
Type |
Description |
|
|
Число, представляющее тип ловушки - |
|
|
например WH_KEYBOARD или |
idHook |
Integer |
H_KEYBOARD_LL |
lpMalFunction |
HOOKPROC |
Адрес в памяти функции ловушки |
|
|
Дескриптор dll в которой находится функция. |
|
|
Если это локальная ловушка, то этот |
hMod |
HINSTANCE |
параметр 0. |
|
|
'id потока', который Ваша программа будет |
dwRemoteThre |
|
контролировать. Если это глобальная |
adId |
DWORD |
ловушка, то параметр должен быть 0. |
Константа |
Описание |
|
Фильтр процедуры окна. Функция-фильтр ловушки вызывается, когда процедуре окна |
|
посылается сообщение. Windows вызывает этот хук при каждом вызове функции |
WH_CALLWNDPROC |
SendMessage. |
|
Функция-фильтр, контролирующая сообщения после их обработки процедурой окна |
WH_CALLWNDPROCRET |
приемника. |
|
В литературе встречаются следующие названия для этого типа фильтров: "тренировочный" |
|
или "обучающий". Данная ловушка вызывается перед обработкой большинства сообщений |
WH_CBT |
окон, мыши и клавиатуры. |
|
Функция-фильтр, предназначенная для отладки. Функция-фильтр ловушки вызывается |
|
перед любой другой ловушкой Windows. Удобный инструмент для отладки и контроля |
WH_DEBUG |
ловушек. |
|
Функция-фильтр обработки сообщений. Функция-фильтр ловушки вызывается всегда, когда |
WH_GETMESSAGE |
из очереди приложения считывается любое сообщение. |
|
Функция-фильтр, обрабатывающая сообщения оборудования. Функция-фильтр ловушки |
WH_HARDWARE |
вызывается, когда из очереди приложения считывается сообщение оборудования. |
|
Функция-фильтр вызывается, когда из очереди системы считывается любое сообщение. |
WH_JOURNALPLAYBACK |
Используется для вставки в очередь системных событий. |
|
Функция-фильтр вызывается, когда из очереди системы запрашивается какое-либо |
WH_JOURNALRECORD |
событие. Используется для регистрации системных событий. |
|
Функция-фильтр "обработки" клавиатуры. Наверное, наиболее часто используемый тип |
|
ловушки. Функция-фильтр ловушки вызывается, когда из очереди приложения считывается |
WH_KEYBOARD |
сообщения wm_KeyDown или wm_KeyUp. |
WH_KEYBOARD_LL |
Низкоуровневый фильтр клавиатуры. |
|
Функция-фильтр, обрабатывающая сообщения мыши. Функция-фильтр ловушки |
WH_MOUSE |
вызывается, когда из очереди приложения считывается сообщение мыши. |
WH_MOUSE_LL |
Низкоуровневый фильтр мыши. |
|
Функция-фильтр специального сообщения. Функция-фильтр ловушки вызывается, когда |
|
сообщение должно быть обработано диалоговым окном приложения, меню или окном |
WH_MSGFILTER |
приложения. |
|
Фильтр приложения оболочки. Функция-фильтр ловушки вызывается, когда создаются и |
|
разрушаются окна верхнего уровня или когда приложению-оболочке требуется стать |
WH_SHELL |
активным. |
Общая схема загрузки вредоносной DLL с помощью ловушек
LRESULT CallNextHookEx() – вызов следующий в списке обработчик ловушки
BOOL UnhookWindowsHookEx(HHOOK hhk)-
отключает обработчик ловушки
Общая схема загрузки вредоносной DLL с помощью ловушек
Выбор атакуемого процесса в зависимости от задачи ВРПО:
Если у нас кейлоггер, то внедрение может осуществляться во все процессы.
=> сказывается на эффективности работы системы
Если цель загрузить dll => атакуется только один определенный процесс (=> в коде будет присутствовать процедура выбора «жертвы»)
Обычно выбираются редко используемые события для сокрытия своего присутствия (например,
WH_CBT)
Вставка кода с помощью асинхронного вызова процедур
Asynchronous Procedure Call — асинхронный вызов процедуры — документированный механизм в Windows, позволяющий выполнить код в контексте потока, «нарушая» естественный ход выполнения потока.
У каждого потока своя очередь APC –процедур
APC бывают двух видов: режима ядра и пользовательского режима.
APC режима ядра прерывает поток и выполняет процедуру без вмешательства или согласия потока
APC-процедуры пользовательского режима выполняются, когда поток находится в состоянии тревожного ожидания(когда были вызваны такие функции как WaitForSingleObjectEx, WaitForMultipleObjectsEx, Sleep).
Вставка кода с помощью асинхронного вызова процедур
Вставка APC-процедуры
DWORD WINAPI QueueUserAPC(
_In_ PAPCFUNC pfnAPC, указатель на функцию APC
_In_ HANDLE hThread, хендл потока,
которому устанавливается APC _In_ ULONG_PTR dwData данные
);
Часто атакуется svchost.exe, т.к его потоки часто находятся в состоянии тревожного ожидания.
Указатель на функцию = адрес LoadLibrary
Данные = путь к внедряемой библиотеке
Вставка вредоносного кода в адресное пространство процесса
В отличии от вставки dll вставляется непосредственно код в адресное пространство процесса =>
Используется для вставки шелл-кода
Чаще всего используются функции VirtualAllocEx, WriteProcessMemory (обычно дважды для записи данных (1) и кода удаленной нити (2)) и
CreateRemoteThread
При анализе ВРПО необходимо создать дамп памяти всех буферов, которые создаются до вызова функции
WriteProcessMemory
Замена процесса вредоносным процессом
Перезаписывается память запущенного процесса вредоносным =>
Вредоносный процесс маскируется под легитимный (например, svchost.exe) без риска нарушить работоспособность процесса
Основная идея подхода – создание процесса в приостановленном состоянии.
Замена процесса вредоносным процессом
Создать процесс в приостановленном состоянии
Высвободить память, занимаемую легитимным процессом (ZwUnmapViewOfSection)
Выделить память под вредоносный код и записать его (VirtualAllocEx, WriteProcessMemory) В
Восстановить контекст приостановленного процесса, предварительно перезаписав точку входа
(SetThreadContext)
Перезапустить процесс для запуска вредоносного кода ResumeThread)