torjaeger1709/windows-license-inspector

GitHub: torjaeger1709/windows-license-inspector

一款基于 C++17 的轻量级只读扫描器,通过双收集器交叉验证系统性检测 Windows 和 Office 的许可证篡改与激活绕过行为。

Stars: 0 | Forks: 0

# 许可证完整性扫描器 [![Platform](https://img.shields.io/badge/Platform-Windows%2010%20%7C%2011-0078D6.svg?style=flat-square&logo=windows)](https://www.microsoft.com/windows) [![C++ Standard](https://img.shields.io/badge/C%2B%2B-17-00599C.svg?style=flat-square&logo=c%2B%2B)](https://en.cppreference.com/w/cpp/17) [![Build System](https://img.shields.io/badge/Build-CMake%203.20%2B-064F8C.svg?style=flat-square&logo=cmake)](https://cmake.org/) [![License](https://img.shields.io/badge/License-Academic%20%2F%20Research%20Only-d9534f.svg?style=flat-square)](#) 许可证检查器是一款使用 C++17 编写的轻量级、只读系统完整性扫描器。它对 Windows 10/11 和 Microsoft Office 2016/2019/2021/365 执行系统性检查,以检测未经授权的许可证修改、激活绕过脚本、本地 KMS 模拟器服务以及 Click-to-Run (C2R) 异常。 ## 1. 范围与功能 (工具的作用与限制) ### 工具的作用 - **系统性取证分类**:在 Windows OS (`[A1 - A14]`) 和 Microsoft Office (`[B1 - B3]`) 中执行 17 项只读检查。 - **交叉验证共识**:将主要的内核/COM 许可证状态与辅助的 VBScript 输出 (`slmgr /dlv`) 进行比较,以识别差异。 - **硬件一致性验证**:通过 WMI 读取 ACPI `MSDM` 和 `OA3` 表,将出厂预装的 OEM 数字密钥与当前运行的操作系统版本进行比较。 - **结构化审计报告**:导出人类可读的 (`.txt`) 和机器可解析的 (`.json`) 审计报告,包含完整的收集器细分指标和原始审计跟踪。 ### 工具的限制 (不执行的操作) - **不执行自动修复或删除**:该工具在只读检查模式下运行。它不会删除文件、终止运行的服务或自动修改注册表项。 - **不支持旧版操作系统**:专为 64 位 Windows 10 和 Windows 11 (`x64`) 设计。不支持 Windows 7、Windows 8.1 和 ARM64 架构。 - **不解析外部依赖项**:完全依赖于内置的 Windows API (WMI, COM, Win32 API)。如果本地 WMI 存储库 (`winmgmt` 服务) 损坏或被禁用,受影响的检查将报告为 `UNAVAILABLE (N/A)`。 ## 2. 系统架构与共识管道 ### 2.1 高级架构图 ``` graph TD subgraph "System Collectors" C1["Primary Collector
WMI / COM API
SoftwareLicensingProduct"] C2["Secondary Collector
VBScript Child Process
cscript slmgr.vbs /dlv"] C3["Hardware Collector
ACPI MSDM / OA3 Tables
Firmware OEM Key"] end subgraph "Normalization Layer" N1["Invariant-First Parser
Activation ID / App ID / GUIDs"] N2["Semantic Normalizer
Token-Alias Table Mapping"] end subgraph "Consensus & Verification Layer" V1["Multi-Collector Consensus Engine v1.1
Applicable Fields Agreement & Provenance Tracking"] V2["Zero-Downgrade & Graded Conflict Rules
CRITICAL MISMATCH vs. LEGITIMATE_UPGRADE"] end subgraph "Output & Reporting Layer" O1["Evidence Graph & Risk Scoring
7-Layer DAG Topology"] O2["TXT / JSON Audit Reports
SIEM / SOAR Compatible Schema"] end C1 --> N1 C2 --> N1 N1 --> N2 N2 --> V1 C3 --> V1 V1 --> V2 V2 --> O1 O1 --> O2 ``` ### 2.2 多收集器交叉验证 1. **收集器独立性与来源追踪**: - 主 WMI (`WMI_LICENSE_PRODUCT`):直接连接到 `ROOT\CIMV2` (`IWbemServices`) 以枚举 `PartialProductKey IS NOT NULL` 的 `SoftwareLicensingProduct` 记录。在测试运行中观察到的延迟分解平均值约为 `~15 ms` (COM 初始化) + `~20-515 ms` (查询执行,取决于 WMI 存储库缓存状态)。 - 辅助 SLMGR (`SLMGR_DLV`):通过具有 `7000 ms` 安全超时的异步管道执行 `cscript.exe //NoLogo %windir%\System32\slmgr.vbs /dlv`。观察到的平均延迟约为 `~340-380 ms` (进程生成和脚本解释)。 2. **不变性优先与 Token 别名标准化**: - 为了确保在本地化的 OS 环境 (例如日语、德语、法语) 中进行一致的评估,解析器会提取与语言无关的锚点字符串:`Activation ID` (`{GUID}`)、`Application ID` (`{GUID}`) 以及产品密钥的最后 5 个字符。 - 版本和通道描述通过别名表 (`EditionAlias`) 进行映射,统一等效的 token (`CoreCountrySpecific`, `CoreSingleLanguage`, `Core` $\rightarrow$ `HOME family`;`ProfessionalEducation`, `ProfessionalWorkstation` $\rightarrow$ `PRO family`)。 3. **多因子置信度与适用字段一致性**: - 一致性严格根据适用字段 (`comparedFields`) 进行评估。例如,在 `KMS Machine` 为 `NOT_APPLICABLE` 的零售版或 OEM 系统上,共识分数将在剩余的 4 个字段 (`Status`, `Edition`, `Channel`, `Partial Key`) 中进行计算。 - 如果 `SLMGR_DLV` 遇到超时或执行失败,`Zero-Downgrade Rule` 会将主要的 WMI 检查状态保留为 `VERIFIED` (`Confidence: WMI_ONLY`),且不会进行人为的扣分。 4. **分级冲突严重性与身份边界**: - WMI 和 SLMGR 之间的差异被归类为精确的原因代码 (`conflict_reason_code`):`CRITICAL MISMATCH` (例如,零售版配置上激活了 KMS/GVLK 覆盖) 对比 `LEGITIMATE_UPGRADE` (例如,出厂 OEM 家庭版硬件通过 Microsoft Store 升级为专业零售版)。 - 检查 `[A4]` 仅验证身份和许可证通道 (`Status`, `Edition`, `Channel`, `Partial Key`, `KMS Machine`),而检查 `[A14]` 评估硬件 ACPI `MSDM/OA3` 表的一致性。 ## 3. 威胁覆盖范围与取证套件 (`A1-A14`, `B1-B3`) ### 3.1 威胁覆盖矩阵 | 威胁 / 异常类别 | 目标攻击向量 | 关联的检查 ID | 验证检测标准 | |:---|:---|:---|:---| | **未经授权的 KMS 服务器** | 注册表 (`KeyManagementServiceServer`) & WMI 缓存 | `A1`, `A11` | 自定义 KMS 主机地址、环回 (`127.0.0.1`)、私有局域网 IP 或已知的盗版激活域名。 | | **激活绕过脚本** | PowerShell 历史记录 & 计划任务 | `A2`, `A6` | `ConsoleHost_history.txt` 中的脚本调用命令 (`irm massgrave.dev`, `slmgr /skms`, `gatherosstate`) 以及隐藏的计划续订任务 (`TASK_ENUM_HIDDEN`)。 | | **SPP 服务与 Hook 篡改** | 注册表 (`SkipRearm`)、`sppsvc` 配置和 WMI 许可记录 | `A3`, `A7`, `A8` | `SkipRearm = 1` 策略、`NoGenTicket` 遥测抑制、2038 年评估扩展 Hook 或被禁用的 `sppsvc` 服务。 | | **恶意 KMS 模拟器服务** | Windows 服务管理器 (`OpenSCManager`) & 文件系统 | `A5`, `A9` | 活动或休眠的模拟器服务 (`AutoKMS`, `KMSELDI`, `MAS_AActSvc`) 以及位于 `C:\Program Files` 或 `C:\Windows\Temp` 的破解工具目录 (`KMSAuto`, `KMSpico`, `AAct`)。 | | **网络与 DNS 黑洞** | 本地 `hosts` 文件 (`C:\Windows\System32\drivers\etc\hosts`) | `A10` | 针对微软激活服务器 (`0.0.0.0`, `127.0.0.1`) 或已知 KMS 盗版域名 (`kms.loli.beer`, `kms.03k.org`) 的重定向条目。 | | **SPP DLL 劫持** | COM 注册表 (`InProcServer32`) | `A13` | 验证 `sppc.dll` 和 `slc.dll` 的 COM 服务器路径是否严格指向 `C:\Windows\System32\` 内的有效二进制文件。 | | **硬件与操作系统差异** | ACPI `MSDM/OA3` 表与已安装的 OS 版本对比 | `A14` | 出厂预装的 OEM 数字密钥与当前运行的 OS 版本不匹配 (例如,OEM 家庭版硬件运行未经授权的 Volume/KMS 安装)。 | | **Office C2R / OSPP 异常** | WMI (`Applications\MicrosoftOffice`) & `ospp.vbs` | `B1`, `B2`, `B3` | 将 Click-to-Run (C2R) 用户订阅数字授权与本地安装的 MAK/KMS 密钥进行交叉验证。 | ### 3.2 详细检查规范 #### 模块 A:Windows 许可证取证与硬件一致性 | ID | 检查名称 | 角色 | 类型 | 主要数据源 | |:---|:---|:---|:---|:---| | `A1` | 恶意 KMS 服务器检测 | `PRIMARY` | `FORENSIC_EVIDENCE` | `HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Software Protection Platform` & WMI `SoftwareLicensingService` | | `A2` | PowerShell 与 MAS 历史记录 | `PRIMARY` | `FORENSIC_EVIDENCE` | `%APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt` | | `A3` | KMS38 时间戳 Hook | `PRIMARY` | `FORENSIC_EVIDENCE` | WMI `SoftwareLicensingProduct` (评估结束日期) & 注册表 `SkipRearm` | | `A4` | 许可证状态与通道共识 | `PRIMARY` | `LICENSE_STATE` | 双收集器交叉验证:WMI `SoftwareLicensingProduct` 对比 `slmgr.vbs /dlv` 管道 | | `A5` | 破解工具目录 | `PRIMARY` | `FORENSIC_EVIDENCE` | 文件系统 (`C:\Program Files`, `C:\ProgramData`, `C:\Windows\Temp`) | | `A6` | 隐藏的计划任务 | `PRIMARY` | `FORENSIC_EVIDENCE` | 任务计划程序 API (`ITaskFolder::GetTasks(TASK_ENUM_HIDDEN)`) | | `A7` | 遥测与注册表策略 | `PRIMARY` | `FORENSIC_EVIDENCE` | 注册表 `HKLM\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\Software Protection Platform` | | `A8` | 软件保护服务 | `PRIMARY` | `CONFIGURATION` | Windows 服务管理器 (`sppsvc` 启动类型和运行时状态) | | `A9` | KMS Windows 服务 | `PRIMARY` | `FORENSIC_EVIDENCE` | Windows 服务管理器 (`OpenSCManager` 扫描目标名称:`AutoKMS`, `KMSELDI` 等) | | `A10` | Hosts 文件篡改 | `PRIMARY` | `FORENSIC_EVIDENCE` | 文件系统 (`C:\Windows\System32\drivers\etc\hosts`) | | `A11` | KMS 主机缓存 | `PRIMARY` | `CONFIGURATION` | WMI `SoftwareLicensingProduct` (`KeyManagementServiceHost`, `KeyManagementServicePort`) | | `A12` | SPP 事件日志取证 | `PRIMARY` | `FORENSIC_EVIDENCE` | Windows 事件日志 API (`wevtapi.lib` 查询 `Microsoft-Windows-Security-SPP/Operational`) | | `A13` | DLL 劫持与 SPP 注册表 | `PRIMARY` | `FORENSIC_EVIDENCE` | 注册表 `HKLM\SOFTWARE\Classes\CLSID\{GUID}\InProcServer32` (`sppc.dll`, `slc.dll`) | | `A14` | 固件许可证一致性 | `SUPPORTING` | `CONFIGURATION` | WMI `ROOT\CIMV2` (`SoftwareLicensingService` / ACPI `MSDM` / `OA3` 原始二进制数据) | #### 模块 B:Microsoft Office 取证 | ID | 检查名称 | 角色 | 类型 | 主要数据源 | |:---|:---|:---|:---|:---| | `B1` | Office WMI 许可证探测 | `PRIMARY` | `LICENSE_STATE` | WMI `ROOT\CIMV2\Applications\MicrosoftOffice` (`LicensingStatus`, 通道, 部分密钥) | | `B2` | OSPP.VBS 本地密钥探测 | `SUPPORTING` | `FORENSIC_EVIDENCE` | 子进程执行 `cscript.exe //NoLogo ospp.vbs /dstatus` | | `B3` | Click-to-Run 数字授权 | `PRIMARY` | `LICENSE_STATE` | Click-to-Run 配置注册表与遥测 (`Digital Entitlement / User-Subscription`) | ## 4. 构建要求与编译 ### 4.1 系统依赖项 构建配置需要兼容 C++17 的编译器和原生 Windows SDK 头文件 (`Windows.h`, `WbemIdl.h`, `Taskschd.h`, `Shlwapi.h`, `EvtItf.h`, `Bcrypt.h`)。 | 工具链 / 组件 | 最低版本 | 推荐版本 | 验证目标平台 | |:---|:---|:---|:---| | **CMake** | `3.20+` | `3.28+` | Windows 10 / Windows 11 (`x64`) | **C++ 编译器** | 兼容 C++17 | MSVC 2019 / 2022 (`v19.28+`) | Visual Studio "使用 C++ 的桌面开发" | | **Windows SDK** | `10.0.19041.0+` | `10.0.22621.0+` | 原生链接库:`wbemuuid.lib`, `ole32.lib`, `oleaut32.lib`, `taskschd.lib`, `shlwapi.lib`, `wevtapi.lib`, `bcrypt.lib` | ### 4.2 编译说明 (通过 PowerShell 使用 MSVC) 在仓库根目录下打开 **Developer PowerShell for VS 2022**: ``` cmake -S . -B build -A x64 cmake --build build --config Release ``` 成功编译后,独立二进制文件将输出至:`.\build\Release\license-inspector.exe`。 ## 5. 命令行参考与用法 ### 5.1 CLI 参数 ``` Usage: license-inspector.exe [options] Options: --output, -o Specify file report output format: - txt : ASCII text report - json : Structured JSON audit report for SIEM/SOAR - both : Save both TXT and JSON reports simultaneously --file, -f Custom file path or base name (e.g., "audit_report_2026"). If omitted, auto-generates timestamped names: "license_report_YYYYMMDD_HHMMSS.txt/json" --no-pause, -n Do not wait for "Press any key to exit..." upon completion (recommended for automated scripts and enterprise deployment) --no-admin-check Allow running without Administrator privileges (performs best-effort scan; restricted checks report ACCESS_DENIED) --event-limit Limit number of Event Log records scanned in [A12] (default: 100) --help, -h Display this help message and exit ``` ### 5.2 使用场景 - **标准提权扫描**: .\build\Release\license-inspector.exe - **带有 SIEM JSON 导出的自动化审计**: .\build\Release\license-inspector.exe --output both --file audit_host01 --no-pause --no-admin-check 在工作目录中生成四个输出文件: 1. `audit_host01.txt` (完整的 ASCII 审计报告) 2. `audit_host01.json` (结构化的 SIEM/SOAR JSON 报告) 3. `audit_host01_slmgr.txt` (原始 SLMGR 收集器输出文本镜像) 4. `collector_output/slmgr.txt` (目录审计镜像) ## 6. 样本输出验证 ### 控制台报告

## 7. 已知限制与边缘情况 1. **管理员提权与拒绝访问 (`--no-admin-check`)**: - 查询 `SoftwareProtectionPlatform` HKLM 注册表项、读取 `TASK_ENUM_HIDDEN` 计划任务以及枚举 SPP 事件日志记录 (`wevtapi.lib`) 需要提升的管理员权限。 - 在未提权的情况下使用 `--no-admin-check` 执行时,应用程序会尽力进行分类。受限制的检查将报告 `ACCESS_DENIED` (`VerificationStatus::ACCESS_DENIED`),并且不会惩罚系统信任分数。 2. **WMI 存储库与 COM 提供程序损坏**: - 如果目标工作站存在损坏的 WMI 存储库 (`winmgmt` 服务失败) 或缺失 Office Click-to-Run WMI 类 (`Applications\MicrosoftOffice`),受影响的检查 (`[A1]`, `[A4]`, `[A14]` 或 `[B1]`) 将报告 `UNAVAILABLE (N/A)`。 - 根据取证评分准则,`N/A` 项被视为中性,不会降低整数信任分数 (`ScanSummary::compute` 仅评估已确认的 `WARNING` 或 `CRITICAL` 发现)。 3. **OSPP.VBS 与现代 Click-to-Run 数字授权对比**: - 现代零售发行版 (*Office Home & Student 2021/2024*, *Microsoft 365 Personal*) 通过绑定到 Microsoft 账户 (`MSA`) 的用户订阅数字授权进行身份验证。 - 因此,本地 `ospp.vbs /dstatus` (`[B2]`) 通常会返回 `No installed product keys detected`。引擎会正确识别这种架构状态,并通过 Click-to-Run 遥测 (`[B3]`) 验证合法的许可。 *免责声明:本工具仅用于数字取证、安全研究、教育和企业系统完整性审计。它执行只读检查,不修改操作系统、不更改许可证数据、不绕过激活机制,也不激活软件。作者对滥用本工具的行为不承担任何责任。*
标签:Bash脚本, C++17, HTTP头分析, Linux, Windows, 完整性检查, 系统运维, 许可证审计