Обновить

Комментарии 14

Статья огонь, все показано на примере, и проблем с воспроизведением ни каких не будет.

Странно, что VirtualProtect с PAGE_EXECUTE_READWRITE не детектиться. По-моему это первое, что должно детектиться.
А кто ещё может добавлять флаг EXECUTE кроме малварей? Есть такие приложения?

Спасибо за вопрос!
VirtualProtect с PAGE_EXECUTE_READWRITE действительно детектится многими EDR, но не сигнатурно, а на поведенческом уровне.
Легитимные приложения - JIT-компиляторы (Chrome V8, .NET JIT, Java JIT, PowerShell JIT), установщики (NSIS, InnoSetup), драйверы, обфускаторы легитимного ПО и системные механизмы (например, ntdll!RtlMoveMemory с последующим исполнением). EDR не может заблокировать все вызовы VirtualProtect с EXECUTE, иначе сломается половина софта.

Никто не мешает сначала выделить с RW, записать, потом поменять на RE и запустить.

Вчитайтесь в код, в примере так и делается. Вопрос в комментарии как раз о детекте virtualprotect на изменение с RW на RE.

Там не так

VirtualProtect(pMemory, shellcode.size(), PAGE_EXECUTE_READWRITE, &oldProtect);

Флаг PAGE_EXECUTE_READWRITE является красным флагом для защит. Лучше PAGE_EXECUTE_READ.

Я могу заблуждаться, но по-моему не каждая полезная нагрузка стартанёт без write...

Фраза «Windows сама вызывает ваш код в своём потоке» вводит в заблуждение. Я понял её так, будто речь идёт о каком-то особом потоке, созданном операционной системой. Далее правильно написано, что это не так: «Код выполняется в контексте потока, который вызвал EnumWindows».

Делал подобное, подтверждаю. рабочий способ

Интересная техника. Но есть нюанс: callback injection через EnumWindows/EnumChildWindows работает только пока Defender не обновит сигнатуры на конкретный callback-вектор. Microsoft обычно закрывает такие штуки за 2-3 недели после публичного disclosure. Вопрос: вы тестировали на актуальных базах Defender (апрель 2026)? Потому что половина подобных техник из 2024-2025 уже не проходит

EnumDisplayMonitors ?
в WinAPI много такого.

все верно) я показал лишь использование одного callback
в то время когда их очень много и если даже 1 не пройдет можно пробовать другие

Тесты проводились на двух свежих win10

Как можно обозвать свежей 19045 если самая последняя 29570, до неё 28020/28000 (26H2/26H1?), а в релизных для широкого круга есть 26300/26220/26200/26100?

Да и Win10 уже снята с поддержки для широкого круга, но есть LTSC2019 (177хх, кажется), LTSC2021 (19044) и ESU.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации