
PPL로 보호되는 프로세스를 포함하여 ALPC 포트를 열거하고 분류하는 Windows 사용자 영역 도구입니다.
PPL(Protected Process Light) 프로세스가 소유한 포트를 포함하여 ALPC(Advanced Local Procedure Call) 포트를 열거하고 분류하는 Windows 유저랜드 도구로, 표준 핸들 복제가 실패하는 경우에도 동작합니다.
표준 열거 도구는 보호되거나 액세스가 거부된 포트를 완전히 건너뛰는 경우가 많아 사각지대를 만듭니다. 이 도구는 ALPC 포트 객체 유형 인덱스를 동적으로 확인하고 표준 복제 요청을 거부하는 포트를 정확하게 분류하기 위해 NtQueryInformationProcess로 폴백(fallback)합니다.
이 도구는 두 가지 주요 사용자를 위해 표준 Windows IPC 열거의 사각지대를 제거합니다:
PROCESS_DUP_HANDLE 액세스를 후킹하거나 거부하여 활동을 숨길 수 있습니다. 표준 도구는 이러한 포트를 조용히 누락합니다. 이 도구는 실패를 포착하고 대신 PS_PROTECTION 구조를 조회합니다. 프로세스가 액세스를 거부하면서 Type과 Signer가 0(None)을 반환한다면 이는 합법적인 Windows PPL 프로세스가 아니며, 매우 이례적인 상황이므로 즉시 조사 대상으로 플래그를 지정해야 합니다.라이브 Windows 시스템에서 테스트하는 동안 이 도구는 58,916개의 열린 핸들을 순회하여 2,618개의 ALPC 포트를 분리했습니다:
원시 출력: 이 실행의 전체 필터링되지 않은 출력은
alpc_enumerator_output.txt에서 확인할 수 있습니다.
익명 포트 참고 사항: 익명 포트의 콘솔 출력은 터미널 출력이 수천 개의 항목으로 비대해지는 것을 방지하기 위해
main.cpp에서 기본적으로 비활성화되어 있습니다. 익명 포트에 대한 실시간 출력이 필요하면 컴파일 전에 ~451번째 줄의checkEntriesVectorForPrint(anonEntries, "Anonymous");주석을 해제하십시오.
유저랜드 열거가 정확함을 입증하기 위해 이 도구의 출력은 Windows 커널 디버거(WinDbg)로 수동 검증되었습니다. 객체 주소와 PPL 서명자 수준은 커널의 실제 값과 정확히 일치합니다.
main.cpp를 열거나 MSVC로 컴파일합니다.Release 모드(x64)로 빌드합니다.SeDebugPrivilege 필요).ALPC 객체 유형 인덱스를 하드코딩하는 대신(Windows 빌드에 따라 깨질 수 있음), 이 도구는 임시 ALPC 포트를 생성하고 해당 유형을 동적으로 조회하여 호스트 시스템에 맞는 정확한 인덱스(예: 인덱스 46)를 분리합니다. 표준 핸들 복제가 실패하면 PS_PROTECTION을 디코딩하여 액세스 권한에 의존하지 않고 포트를 분류하는 데 필요한 정확한 Type과 Signer를 추출합니다.
전체 기술 분석은 미디엄 글에서 확인할 수 있습니다: https://medium.com/@sphinx_321/userland-alpc-enumeration-dynamic-ppl-aware-approach-283541194102
이 도구는 ALPC/RPC 및 Windows 내부 구조에 대한 진행 중인 연구의 일부입니다. 가까운 시일 내에 추가 발견 사항을 게시하고 동반 도구를 출시할 예정입니다. 유용하게 사용하셨다면 GitHub에서 팔로우하거나 아래 소셜 미디어를 통해 향후 출시 알림을 받아보시기 바랍니다.