
Инструмент пользовательского режима Windows для перечисления и классификации портов ALPC, включая процессы, защищённые PPL.
Инструмент пользовательского режима Windows для перечисления и классификации портов Advanced Local Procedure Call (ALPC), включая порты, принадлежащие процессам PPL (Protected Process Light), для которых стандартное дублирование дескрипторов не работает.
Стандартные инструменты перечисления часто полностью пропускают защищённые порты или порты с запретом доступа, создавая слепые зоны. Этот инструмент динамически определяет индекс типа объекта ALPC Port и при необходимости использует NtQueryInformationProcess для точной классификации портов, отклоняющих стандартные запросы на дублирование.
Этот инструмент устраняет слепые зоны в стандартном перечислении IPC Windows для двух основных категорий пользователей:
PROCESS_DUP_HANDLE, чтобы скрыть свою активность. Стандартные инструменты молча отбрасывают такие порты. Этот инструмент фиксирует сбой и вместо этого запрашивает структуру PS_PROTECTION. Если процесс запрещает доступ, но возвращает Type и Signer равными 0 (None), это не легитимный процесс Windows PPL — это крайне аномально, и его следует пометить для немедленного расследования.Во время тестирования на реальной системе Windows инструмент обработал 58 916 открытых дескрипторов и выделил 2 618 портов ALPC:
Необработанный вывод: Полный нефильтрованный вывод этого запуска доступен в
alpc_enumerator_output.txt.
Примечание об анонимных портах: Вывод анонимных портов в консоль по умолчанию отключён в
main.cpp, чтобы не раздувать вывод терминала тысячами записей. Если вам требуется вывод анонимных портов в реальном времени, раскомментируйтеcheckEntriesVectorForPrint(anonEntries, "Anonymous");в строке ~451 перед компиляцией.
Чтобы доказать точность перечисления в пользовательском режиме, вывод инструмента был вручную сверен с отладчиком ядра Windows (WinDbg). Адреса объектов и уровни Signer PPL точно совпадают с данными ядра.
main.cpp в Visual Studio или скомпилируйте через MSVC.Release (x64).SeDebugPrivilege).Вместо жёсткого кодирования индекса типа объекта ALPC (который ломается между сборками Windows) инструмент создаёт одноразовый порт ALPC и динамически запрашивает его тип, чтобы определить правильный индекс для хост-системы (например, индекс 46). Когда стандартное дублирование дескрипторов не срабатывает, он декодирует PS_PROTECTION, чтобы извлечь точные Type и Signer, необходимые для классификации портов без опоры на права доступа.
Полный технический разбор доступен по ссылке на Medium: https://medium.com/@sphinx_321/userland-alpc-enumeration-dynamic-ppl-aware-approach-283541194102
Этот инструмент является частью моих текущих исследований ALPC/RPC и внутреннего устройства Windows. В ближайшем будущем я опубликую новые результаты и выпущу сопутствующие инструменты. Если вы нашли это полезным, подпишитесь на меня на GitHub или в моих социальных сетях ниже, чтобы узнавать о будущих публикациях.