Extra Window Memory Injection (EWMI) - это техника инъекции процесса, которая заключается в инъекции кода в Extra Window Memory (EWM) окна лотка Explorer, которое представляет собой системное окно, отображающее значки различных системных функций и уведомлений. Эта техника может быть использована для выполнения вредоносного кода в контексте окна лотка Explorer, что потенциально позволяет злоумышленнику обойти обнаружение и выполнить вредоносные действия.
Что такое дополнительная оконная память?
В операционной системе Windows класс окна - это структура данных, определяющая внешний вид и поведение окна. Когда процесс создает окно, он должен сначала зарегистрировать оконный класс, определяющий характеристики окна. В процессе регистрации процесс может запросить выделение до 40 байт дополнительной памяти (EWM) для каждого экземпляра класса. Эта дополнительная память предназначена для хранения данных, специфичных для окна, и доступ к ней можно получить с помощью специальных функций API, таких как GetWindowLong и SetWindowLong. Эти функции принимают хэндл окна в качестве первого аргумента и индекс поля, которое нужно получить или установить, в качестве второго аргумента. Значения полей хранятся в виде «длинных окон».
Использование злоумышленниками инъекции дополнительной оконной памяти
Память EWM достаточно велика, чтобы хранить 32-битный указатель, который может указывать на процедуру Windows (она же Window proc). Оконная процедура - это функция, которая обрабатывает ввод и вывод для окна, включая сообщения, отправляемые в окно, и действия, выполняемые окном. Вредоносное ПО может попытаться использовать EWM как часть цепочки атак, в которой оно записывает код в общие разделы памяти внутри процесса, помещает указатель на этот код в EWM, а затем выполняет код, возвращая управление по адресу, сохраненному в EWM.
Эта техника, известная как Extra Window Memory Injection (EWMI), позволяет вредоносному ПО выполнять код в контексте целевого процесса, предоставляя ему доступ как к памяти процесса, так и к потенциально повышенным привилегиям. Разработчики вредоносного ПО могут использовать эту технику, чтобы избежать обнаружения, записывая полезную нагрузку в общие разделы памяти, а не используя такие вызовы API, как WriteProcessMemory и CreateRemoteThread, которые более тщательно отслеживаются. Более сложные вредоносные программы могут также обходить такие меры безопасности, как предотвращение выполнения данных (DEP), запуская ряд процедур Windows и других системных функций, которые переписывают вредоносную полезную нагрузку в исполняемую часть целевого процесса. Это позволяет вредоносной программе выполнять свой код в обход DEP и других механизмов защиты.
Атакующие могут внедрить вредоносный код в это пространство и выполнить его, что может быть особенно незаметно, учитывая, что EWM - это легитимная и редко контролируемая часть оконного объекта. Суть этой техники заключается в размещении вредоносного кода в EWM и последующем его выполнении, часто через функцию обратного вызова, например оконную процедуру (функцию, которая получает и обрабатывает все сообщения, отправляемые в окно).
Вот общий обзор того, как обычно работает Extra Window Memory Injection:
- Идентификация приложения-жертвы: Атакующий выбирает целевое Windows-приложение, в котором есть окно с выделенной дополнительной памятью.
- Выделение или поиск EWM: если атакующий имеет контроль над исходным кодом приложения или может изменить его с помощью других методов инъекции, он может напрямую выделить дополнительную память для окна с помощью функций Windows API RegisterClassEx или CreateWindowEx. Как вариант, атакующий находит класс окна с ранее выделенной EWM.
- Вставка вредоносного кода в EWM: Атакующий использует соответствующий API, например SetWindowLongPtr с флагом GWL_USERDATA или аналогичным, чтобы скопировать вредоносный код в EWM целевого окна.
- Запуск выполнения: Для выполнения внедренного шеллкода атакующий обычно создает сценарий, в котором сообщение, отправленное в целевое окно, заставляет оконную процедуру перейти в EWM и выполнить шеллкод. Это может быть сделано с помощью поддельного сообщения, которое манипулирует потоком выполнения, или путем изменения указателя оконной процедуры, чтобы он непосредственно указывал на внедренный код.