Логотип
Главная | Статьи | Обход EDR: Как прятать процессы в памяти через Process Hollowing. Практика с C++ и WinAPI. Маскировка под системные службы
Обход EDR: Как прятать процессы в памяти через Process Hollowing. Практика с C++ и WinAPI. Маскировка под системные службы

Обход EDR: Как прятать процессы в памяти через Process Hollowing. Практика с C++ и WinAPI. Маскировка под системные службы

17 июня, 2025

72

Эй, хакеры и кодеры! Сегодня мы погружаемся в мрачный и захватывающий мир обхода Endpoint Detection and Response (EDR) систем. Тема на повестке — Process Hollowing (или “выдалбливание процесса”), техника, которая позволяет спрятать вредоносный код в памяти легитимного процесса. А чтобы всё выглядело максимально невинно, замаскируем наш процесс под системную службу. Всё это с использованием C++ и WinAPI. Готовы? Погнали!

Что такое Process Hollowing и зачем это нужно?

Process Hollowing — это техника инъекции кода, при которой мы берём легитимный процесс (например, svchost.exe), “выдалбливаем” его внутренности (заменяем оригинальный код процесса) и вставляем туда свой вредоносный пейлоад. При этом процесс продолжает выглядеть как настоящий, что затрудняет его обнаружение EDR-системами, которые часто сканируют запущенные процессы по имени и пути.

Зачем это нужно?

  • Обход сигнатурного анализа: твой код скрыт внутри легитимного процесса.
  • Маскировка: EDR может не заподозрить svchost.exe, особенно если он запущен из правильного пути.
  • Устойчивость: процесс выглядит как системный, и администраторы вряд ли будут его трогать.

Как это работает? Пошаговый план

  1. Создаём целевой процесс в приостановленном состоянии. Мы запускаем легитимный процесс (например, svchost.exe) с флагом CREATE_SUSPENDED, чтобы он не начал исполнение.
  2. Выдалбливаем память процесса. Освобождаем секцию памяти, где находится оригинальный код процесса, используя NtUnmapViewOfSection.
  3. Записываем свой пейлоад. Выделяем новую память и записываем туда наш вредоносный код.
  4. Меняем точку входа. Подменяем адрес точки входа (Entry Point) на наш код через SetThreadContext.
  5. Возобновляем выполнение. Снимаем приостановку процесса, и наш код начинает работать под видом легитимного приложения.
  6. Маскировка под службу. Убеждаемся, что процесс выглядит как системная служба, чтобы не вызывать подозрений.

Звучит круто, да? Теперь давай реализуем это на C++ с использованием WinAPI.

Практика: Код на C++ с Process Hollowing

Ниже приведён пример кода, который демонстрирует технику Process Hollowing. Я разбил его на части с комментариями, чтобы всё было ясно даже новичку. Мы будем подменять процесс svchost.exe.

Предупреждение: Этот код предназначен только для образовательных целей. Использование в реальных атаках может быть незаконным. Будь осторожен, кодер!

Маскировка под системные службы

Чтобы твой процесс выглядел как системная служба, важно учитывать несколько моментов:

  1. Имя и путь процесса. Используй svchost.exe или другой системный процесс, который обычно запускается из C:\Windows\System32. EDR-системы могут проверять путь запуска.
  2. Запуск от имени SYSTEM. Если у тебя есть привилегии, запусти процесс от имени SYSTEM, чтобы он выглядел как настоящая служба. Для этого можно использовать CreateProcessAsUser с токеном SYSTEM (например, через уязвимость повышения привилегий).
  3. Регистрация службы (опционально). Если хочешь пойти дальше, зарегистрируй процесс как службу через CreateService. Это добавит легитимности.

Лайфхак: Чтобы ещё больше запутать EDR, подмени аргументы командной строки процесса. Например, svchost.exe часто запускается с аргументами вроде -k netsvcs. Используй это при вызове CreateProcessW.

Как усложнить обнаружение?

EDR-системы становятся умнее, и простой Process Hollowing может быть пойман. Вот несколько трюков для усложнения обнаружения:

  • Шифрование пейлоада. Храни пейлоад в зашифрованном виде и расшифровывай его в памяти перед инъекцией.
  • Обфускация кода. Используй полиморфные техники, чтобы твой код менялся при каждом запуске.
  • Скрытие памяти. После инъекции меняй права доступа на выделенную память (например, с PAGE_EXECUTE_READWRITE на PAGE_READONLY), чтобы уменьшить подозрительность.
  • Анти-дебаг. Добавь проверки на отладчики и виртуальные машины (VM), чтобы затруднить анализ.

Потенциальные проблемы и как их обойти

  1. EDR мониторит вызовы API. Некоторые системы фиксируют подозрительные вызовы вроде WriteProcessMemory или SetThreadContext. Решение: используй прямые системные вызовы (syscall) вместо WinAPI.
  2. Процесс не запускается. Убедись, что у тебя есть права на запуск процесса и доступ к файлу svchost.exe.
  3. Антивирус ловит пейлоад. Перед инъекцией тестируй свой код на VirusTotal или используй кастомный шифровальщик.

Заключение: Стань невидимым

Process Hollowing — это мощная техника, которая позволяет обойти многие EDR-системы, если всё сделано правильно. С маскировкой под системные службы и парой трюков ты можешь стать практически невидимым для большинства защитных решений. Но помни: чем глубже ты копаешь, тем больше ответственности. Используй эти знания только для тестирования и обучения.

Если хочешь углубиться, вот тебе направление: изучи reflective DLL injection — следующий уровень маскировки. А пока — компилируй код, тестируй в песочнице и делись результатами.

Лайфхак на прощание: Если ты новичок, начни с отладки кода в Visual Studio и используй Process Monitor для анализа поведения процесса. Это сэкономит тебе кучу времени.

Давай, жги, кодер!