talha-nazeef-ahmed/ALPC-Enumerator
GitHub: talha-nazeef-ahmed/ALPC-Enumerator
Windows 用户态 ALPC 端口枚举工具,通过动态解析对象类型索引和回退查询 PPL 保护信息,解决了标准工具无法枚举受保护端口而导致的 IPC 通信盲区问题。
Stars: 0 | Forks: 0
# 感知 PPL 的 ALPC 端口枚举器
一款 Windows 用户态工具,用于枚举和分类高级本地过程调用(ALPC)端口,包括在标准句柄复制失败时,由 PPL(Protected Process Light)进程拥有的端口。
标准的枚举工具通常会完全跳过受保护或拒绝访问的端口,从而产生盲区。该工具动态解析 ALPC 端口对象类型索引,并回退到 `NtQueryInformationProcess`,以准确分类那些拒绝标准复制请求的端口。
## 实际应用场景
该工具消除了标准 Windows IPC 枚举中的盲区,主要服务于两类受众:
* **威胁狩猎与 DFIR:** 通过 ALPC 通信的恶意软件可能会 hook 或拒绝 `PROCESS_DUP_HANDLE` 访问以隐藏其活动。标准工具会悄无声息地丢弃这些端口。该工具能够捕获失败情况,转而查询 `PS_PROTECTION` 结构。如果一个进程拒绝访问但返回的 Type 和 Signer 为 `0`(None),则它不是合法的 Windows PPL 进程,这种情况极度异常,应被标记以进行立即调查。
* **漏洞研究:** 准确映射未公开的 RPC/ALPC 攻击面需要绝对的精确性。仅依赖句柄复制必然会导致遗漏系统中最高特权(也是最有价值)的目标。
## 执行摘要与原始数据
在运行的 Windows 11 系统上进行测试时,该工具遍历了 **58,916 个打开的句柄**,并分离出了 **2,618 个 ALPC 端口**:
* **52 个受保护的端口**
* **260 个具名端口**
* **346 个路径命名端口**
* **1,960 个匿名端口**
## 内核验证
为了证明用户态枚举的准确性,该工具的输出已针对 Windows 内核调试器(WinDbg)进行了手动验证。对象地址和 PPL 签名者级别与内核真实状态完全匹配。
* 查看 [VERIFICATION.md](./VERIFICATION.md) 获取对比证明。
* 查看 [alpc_verification_log.txt](./alpc_verification_log.txt) 获取原始 WinDbg 会话日志。
## 构建与运行
1. 在 Visual Studio 中打开 `main.cpp` 或通过 MSVC 进行编译。
2. 在 `Release` 模式(x64)下构建。
3. 以管理员身份运行(需要 `SeDebugPrivilege`)。
## 技术方案
该工具没有对 ALPC 对象类型索引进行硬编码(这会在不同的 Windows 版本中失效),而是创建了一个临时的 ALPC 端口并动态查询其类型,以隔离宿主系统正确的索引(例如,索引 46)。当标准句柄复制失败时,它会解码 `PS_PROTECTION` 以提取确切的 Type 和 Signer,从而在不依赖访问权限的情况下对端口进行分类。
完整的详细技术分析,请访问此 Medium 文章链接:https://medium.com/@sphinx_321/userland-alpc-enumeration-dynamic-ppl-aware-approach-283541194102
## 许可证
[MIT](LICENSE)
一款 Windows 用户态工具,用于枚举和分类高级本地过程调用(ALPC)端口,包括在标准句柄复制失败时,由 PPL(Protected Process Light)进程拥有的端口。
标准的枚举工具通常会完全跳过受保护或拒绝访问的端口,从而产生盲区。该工具动态解析 ALPC 端口对象类型索引,并回退到 `NtQueryInformationProcess`,以准确分类那些拒绝标准复制请求的端口。
## 实际应用场景
该工具消除了标准 Windows IPC 枚举中的盲区,主要服务于两类受众:
* **威胁狩猎与 DFIR:** 通过 ALPC 通信的恶意软件可能会 hook 或拒绝 `PROCESS_DUP_HANDLE` 访问以隐藏其活动。标准工具会悄无声息地丢弃这些端口。该工具能够捕获失败情况,转而查询 `PS_PROTECTION` 结构。如果一个进程拒绝访问但返回的 Type 和 Signer 为 `0`(None),则它不是合法的 Windows PPL 进程,这种情况极度异常,应被标记以进行立即调查。
* **漏洞研究:** 准确映射未公开的 RPC/ALPC 攻击面需要绝对的精确性。仅依赖句柄复制必然会导致遗漏系统中最高特权(也是最有价值)的目标。
## 执行摘要与原始数据
在运行的 Windows 11 系统上进行测试时,该工具遍历了 **58,916 个打开的句柄**,并分离出了 **2,618 个 ALPC 端口**:
* **52 个受保护的端口**
* **260 个具名端口**
* **346 个路径命名端口**
* **1,960 个匿名端口**
## 内核验证
为了证明用户态枚举的准确性,该工具的输出已针对 Windows 内核调试器(WinDbg)进行了手动验证。对象地址和 PPL 签名者级别与内核真实状态完全匹配。
* 查看 [VERIFICATION.md](./VERIFICATION.md) 获取对比证明。
* 查看 [alpc_verification_log.txt](./alpc_verification_log.txt) 获取原始 WinDbg 会话日志。
## 构建与运行
1. 在 Visual Studio 中打开 `main.cpp` 或通过 MSVC 进行编译。
2. 在 `Release` 模式(x64)下构建。
3. 以管理员身份运行(需要 `SeDebugPrivilege`)。
## 技术方案
该工具没有对 ALPC 对象类型索引进行硬编码(这会在不同的 Windows 版本中失效),而是创建了一个临时的 ALPC 端口并动态查询其类型,以隔离宿主系统正确的索引(例如,索引 46)。当标准句柄复制失败时,它会解码 `PS_PROTECTION` 以提取确切的 Type 和 Signer,从而在不依赖访问权限的情况下对端口进行分类。
完整的详细技术分析,请访问此 Medium 文章链接:https://medium.com/@sphinx_321/userland-alpc-enumeration-dynamic-ppl-aware-approach-283541194102
## 许可证
[MIT](LICENSE)标签:ALPC, 安全意识培训, 情报收集, 数字取证, 漏洞研究, 端点可见性, 自动化脚本, 进程枚举