
Создаёт драйвер ELAM и службу, которая запускает подписанный дочерний процесс как Anti-Malware Protected Process-Light (PPL) в Windows, для исследований в области безопасности.
Этот проект позволяет запускать «произвольный*» процесс как Anti Malware Protected-Process-Light (PPL) в исследовательских целях. (* Подробности см. в разделе Ограничения)
Подробности и обоснование этого проекта см. в этом моём блоге.
Защищённый системный процесс — это модель безопасности в Windows, предназначенная для защиты системных процессов и процессов антивирусов от несанкционированного изменения или интроспекции, даже со стороны администраторов/SYSTEM.
Процессы, запущенные как Anti Malware «Protected Process-Light» (PPL), ограничены в том, что они могут делать, могут загружать только подписанный код, но не могут быть отлажены, проинспектированы или остановлены незащищёнными процессами. Кроме того, они могут
получать доступ к специальным данным, например к ETW-провайдеру Microsoft-Windows-Threat-Intelligence.
Этот проект создаёт драйвер Early-Launch Anti Malware (ELAM) и пользовательскую службу. Служба при запуске запускает настраиваемый дочерний процесс, который также будет помечен как PPL.
Дочерний бинарный файл должен быть подписан тем же сертификатом, что и служба, а также должен соответствовать некоторым другим ограничениям, но в остальном это может быть любой бинарный файл и любые аргументы командной строки на ваш выбор.
Честно говоря, у меня не очень получается объяснить, что такое ELAM и PPL, поэтому вместо этого рекомендую начать отсюда:
Вы можете взять готовую и подписанную версию службы PPLRunner и модуля ядра из Releases. В релизе также есть автогенерируемый сертификат и закрытый ключ в файле .pfx,
защищённом паролем password. Я же говорил, что это только для исследовательских целей, верно?
Чтобы сгенерировать и собрать собственный проект:
Убедитесь, что у вас установлены Windows SDK.
Откройте generate_cert.ps1 и sign_file.ps1 и измените переменную $password на что-то другое (они должны совпадать друг с другом).
Запустите generate_cert.ps1. Это создаст ppl_runner.pfx с новым закрытым и открытым сертификатом.
Он будет использоваться для подписи всех бинарных файлов, используемых PPLRunner.
Соберите ppl_runner.sln. Это создаст 3 бинарных файла:
Драйвер ядра ELAM, содержащий информацию о сертификате. Драйвер на самом деле ничего не делает и не будет фактически загружен, он используется лишь как носитель для сертификата подписи.
Установщик и бинарный файл службы. Как служба PPL, при запуске она запускает дочерний процесс, также как PPL, затем останавливается и завершается.
Пример исполняемого файла, который будет подписан правильным сертификатом Visual Studio во время сборки. PPLRunner может запускать почти любой бинарный файл, это лишь пример, который будет автоматически подписан.
ПРИМЕЧАНИЕ Устанавливайте только на тестовой машине, а не на продакшене/домашнем ПК.
После сборки скопируйте elam_driver.sys и ppl_runner.exe в папку на целевой машине.
Включите тестовую подпись, выполнив следующее из командной строки с повышенными правами, затем перезагрузитесь:
bcdedit /set testsigning on
ppl_runner.exe install
Это должно установить службу с именем ppl_runner.
Чтобы подписать бинарный файл для запуска, подпишите его сертификатом ppl_runner.pfx, используя либо скрипт sign_file.ps1,
либо просто запустив signtool.exe самостоятельно. Если у вас нет signtool.exe, он находится в Windows SDK.
Создайте раздел реестра HKLM\SOFTWARE\PPL_RUNNER.
Установите для ключа по умолчанию/пустого ключа значение типа REG_SZ, содержащее полный путь к исполняемому бинарному файлу
и любые аргументы командной строки. Например, из командной строки:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\binay --argument 1"
Чтобы сервис запустил исполняемый файл, просто выполните из командной строки с повышенными правами:
net start ppl_runner
Как служба PPL, при запуске ppl_runner прочитает ключ реестра, запустит дочерний процесс,
также как PPL, затем остановится и завершится. Успешный запуск всё равно выдаст сообщение the service failed to run,
но если проверить код возврата с помощью sc query ppl_runner, он должен быть 0, то есть ERROR_SUCCESS.
Дочерний процесс не будет виден, однако вы можете использовать Debug Outputs и DBGView.exe, чтобы получить
некоторый вывод (см. код child_example).
Поскольку служба также является Anti Malware PPL, она может быть остановлена и удалена только процессом с аналогично высоким уровнем. Однако мы можем использовать PPLRunner для самоудаления, просто задав в ключе реестра команду:
C:\path\to\ppl_runner.exe remove
И запустите службу. То есть выполните:
REG.exe ADD HKLM\SOFTWARE\PPL_RUNNER /ve /t REG_SZ /d "C:\path\to\ppl_runner.exe remove"
net start ppl_runner
testsigning.ppl_runner.exe install необходимо запускать повторно после каждой перезагрузки.Запустите DBGView от Sysinternals и включите логирование Win32 Global с фильтром по *[PPL_RUNNER]*.
Это покажет все логи от службы и установщика.
Будет дополнено — блог Sealighter
James Forshaw создал замечательный проект для внедрения кода в существующие процессы PPL.
Читать Alex Ionescu — вероятно, лучший способ узнать больше об ELAM и PPL. Возможно, стоит начать с этого: https://www.crowdstrike.com/blog/protected-processes-part-3-windows-pki-internals-signing-levels-scenarios-signers-root-keys/
Читать Matt Graeber и James Forshaw — ещё один отличный способ.
Огромная благодарность Matt за скрипт powershell для получения хеша 'To-Be-Signed' из сертификата.