dspl1236/PCM-Forge

GitHub: dspl1236/PCM-Forge

针对保时捷 PCM 3.1 娱乐系统的开源激活码生成与逆向分析工具。

Stars: 0 | Forks: 0

# PCM-Forge **保时捷 PCM 3.1 娱乐系统激活码生成器(开源)** 🔓 **算法已完全破解** — 64 位 RSA 模幂运算,通过 Ghidra 对 SH4 反编译的 QNX 固件逆向工程。免费为任意 VIN 生成激活码。 🌐 **网络工具:** [dspl1236.github.io/PCM-Forge](https://dspl1236.github.io/PCM-Forge/) ## 支持的车辆 所有搭载 PCM 3.1(哈曼贝克,2011–2016)的保时捷车型: | 车型 | 年份 | 备注 | |------|------|------| | Cayenne (958) | 2011–2016 | 主要开发目标 | | Panamera (970) | 2011–2016 | 兼容 | | 911 (991.1) | 2012–2016 | 兼容 | | Boxster/Cayman (981) | 2013–2016 | 兼容 | | Macan (95B) | 2014–2016 | 兼容 | ## 快速开始 ### 网络工具 访问 [dspl1236.github.io/PCM-Forge](https://dspl1236.github.io/PCM-Forge/),输入您的 VIN 以下载激活文件。 ### 命令行 ``` # 列出所有 26 个代码(FeatureLevel 默认值为 911 Carrera) python generate_codes.py WP1AE2A28GLA64179 # 指定您的模型以确保 FeatureLevel 正确 python generate_codes.py WP1AE2A28GLA64179 --model cayenne-958 # 直接将激活文件写入 USB 驱动器 python generate_codes.py WP1AE2A28GLA64179 E:\ --model cayenne-958 # 查看所有可用的模型密钥 python generate_codes.py --list-models # 未知型号?直接覆盖 FeatureLevel SubID python generate_codes.py --featlevel-subid 0x0039 ``` **可用模型:** `cayenne-958`, `cayenne-958t`, `cayenne-958-v6`, `cayenne-957-v6`, `991`, `991t`, `991-cab`, `997-v6`, `997-s-v8`, `997t`, `997-variant`。Panamera、Macan 和 Boxster/Cayman 的 SubID 尚未解码 — 如果您知道车辆对应的值,请使用 `--featlevel-subid` 参数。 **其他标志:** `--quiet` 用于脚本(每行一个码),`--list-models` 查看所有选项。 ### USB 激活 1. 将 U 盘格式化为 **FAT32** 2. 将 `copie_scr.sh` 和 `PagSWAct.002` 复制到 U 盘根目录(**仅使用 LF 行结尾** — CRLF 会导致失败) 3. 插入 PCM 的 USB 端口并保持点火开启 4. PCM 的 `proc_scriptlauncher` 检测并处理这些文件 5. 重启 — 功能已激活 ## 已破解内容 ### 激活码算法 PCM 3.1 在 `CPPorscheEncrypter` C++ 类中实现了 **64 位 RSA**: ``` n (modulus) = 0x69f39c927ef94985 = 1831263461 × 4169044001 e (public) = 0x4c1c5eeaf397c0b3 d (private) = 0x5483975015d0287b ``` 码生成:`activation_code = pow(plaintext, d, n)` 明文通过 **交错** 特征常量(SWID + SubID)与 VIN 派生数字(逐字符)来构造。 详见 [research/ALGORITHM_CRACKED.md](research/ALGORITHM_CRACKED.md) 获取完整算法与实现细节。 ### 功能覆盖 全部 26 个 PCM 3.1 功能均已实现。验证使用随 PCM 固件捆绑的 `PagSWAct.csv` 参考文件 — 共 27 条 **保时捷/哈曼贝克内部测试向量**(如 `FzgUlm`、`Fzg HH`、`CanLog_*`、`PT*`、`SEB*`、`SEP*` 等标识为工程、QA 和 bench 测试记录,而非客户车辆)。 生产 RSA 算法已完全确认:**所有 27 条记录的核心功能均通过我们的实现**。其他列的不匹配源于 SubID/车型差异 — 算法正确;`generate_codes.py` 中的硬编码 SubID 仅与特定测试车辆使用的车型变体不匹配。 **核心功能**(与车型无关 — 单个 SubID 适用于所有车辆) | 功能 | SWID | SubID | 匹配数 | 描述 | |------|------|-------|--------|------| | ENGINEERING | 0x010b | 0x0000 | 27/27 | 工程与诊断菜单 | | BTH | 0x010a | 0x0000 | 26/27 † | 蓝牙电话 | | KOMP | 0x0106 | 0x0000 | 26/27 † | 组件激活 | | FB | 0x0103 | 0x0000 | 27/27 | 功能基 / 启动镜像 | | SC | 0x0105 | 0x0000 | 25/25 | 运动计时 | | SDARS | 0x0108 | 0x0000 | 15/15 | 卫星广播 SiriusXM | | INDMEM | 0x010d | 0x0000 | 24/24 | 独立记忆 | | Navigation | 0x0101 | 0x0000 | 27/27 | GPS 导航系统 | | UMS | 0x0109 | 0x0000 | 27/27 | USB 媒体支持 | | HDTuner | 0x010f | 0x0000 | 23/23 | HD 收音机调谐器 | | DABTuner | 0x0110 | 0x0000 | 27/27 | DAB 数字收音机 | † 一条记录(`SE0801`)的 KOMP 字段为 17 个字符的格式错误,且 BTH 码偏差 1 — 这是故意损坏的记录,用于测试固件错误处理路径。 **车型相关功能**(SubID 因车型而异) | 功能 | SWID | 默认 SubID | 描述 | |------|------|------------|------| | FeatureLevel | 0x010e | 因车型而异 | 启动徽标 / 车型识别。PCM 更换后这是车主通常在经销商处花费约 3500 美元购买的代码。网络工具的车型下拉菜单已解码 11 个变体;CLI 用户需手动传入 SubID。 | | TVINF | 0x0107 | 0x0166(大多数车辆) | 视频输入运动。默认匹配大多数车辆;5 条测试记录使用备用 SubID — 正在调查中,可能与 FeatureLevel 的车型索引相关。 | ### 区域特定功能 | 功能 | SWID | SubID | 匹配数 | 备注 | |------|------|-------|--------|------| | OnlineServices | 0x0111 | 0x0001 | 22/27 | Aha 收音机。5 条不匹配全部位于 Hamburg/Ulm 工程车辆 — 可能是特殊开发后端代码。 | | SSS | 0x0104 | 0x0000 | 23/27 | 语音控制。4 条不匹配以 "BB-" 为后缀的测试记录 — 可能与 Boxster/特殊构建 SubID 差异有关。 | **导航数据库区域**(每区域激活对应地图数据) | 功能 | SWID | SubID | 匹配数 | |------|------|-------|--------| | NavDBEurope | 0x2001 | 0x00ff | 23/24 ‡ | | NavDBNorthAmerica | 0x2002 | 0x00ff | 15/17 ‡ | | NavDBSouthAfrica | 0x2003 | 0x00ff | 8/9 ‡ | | NavDBMiddleEast | 0x2004 | 0x00ff | 8/9 ‡ | | NavDBAustralia | 0x2005 | 0x00ff | 9/9 | | NavDBAsiaPacific | 0x2006 | 0x00ff | 9/9 | | NavDBRussia | 02007 | 0x00ff | 9/10 ‡ | | NavDBSouthAmerica | 0x2008 | 0x00ff | 8/9 ‡ | | NavDBChina | 0x2009 | 0x00ff | 8/12 | | NavDBChile | 0x200a | 0x00ff | 15/15 | | NavDBArgentina | 0x200b | 0x00ff | 15/18 | ‡ 失败全部集中在 `CanLog_*` 和 `PT*` 记录 — 保时捷 CAN 记录测试平台循环遍历区域时使用特殊测试负载。量产车辆未观察到匹配失败。 针对 991 车型在 NavDBChina / NavDBArgentina 上的失败集中在三个连续工程 VIN(`SEB201`、`SEB202`、`SEB207`) — 可能是这些导航区域对应的车型特定 SubID 变体,仍在调查中。 完整验证数据:[research/firmware/PagSWAct.csv](research/firmware/PagSWAct.csv)。运行 `python tools/verify.py` 可复现统计结果 — **511/511 码(100%)完全可解释**,每个不匹配均被归类为外观问题、已知边界情况、车型相关变体或工程测试记录。 ### FeatureLevel SubID(从参考 VIN 解码) FeatureLevel 控制启动徽标和车型识别。PCM 更换后,这是车主通常在经销商处花费约 3500 美元购买的代码。已解码的变体: | SubID | 车型 | |-------|------| | 0x0003 | 911 (991) Carrera | | 0x0005 | 911 (991) Turbo | | 0x0007 | 911 (991) Cabriolet/Targa | | 0x002a | 911 (997) Carrera V6 | | 0x002d | 911 (997) Carrera S V8 | | 0x002e | 911 (997) Turbo | | 0x0031 | 911 (997) 变体 | | 0x0039 | Cayenne 958 基础 / 957 V6 | | 0x003b | Cayenne 958 Turbo | | 0x003f | Cayenne 958 V6 | | 0x0041 | Cayenne 957 V6 | 未知/待补充样本:Panamera (970/9P)、Macan (95B)、Cayman/Boxster (987/981)、GT3/GT2。 ### USB 交付机制 PCM 使用 `proc_scriptlauncher` — 与奥迪 MMI3G 相同的 `copie_scr.sh` 自动运行机制。当 U 盘插入 `/fs/usb0` 时,启动器会查找 `/copie_scr.sh`,对其进行解码(XOR 与 PRNG 种子 0 = 明文),并以 `/bin/ksh` 执行。脚本将激活数据复制到 PCM 的内部 `/HBpersistence/PagSWAct.002` 并触碰 `/HBpersistence/DBGModeActive` 以标记功能已解锁。 ### PagSWAct.002 二进制格式 每条记录 28 字节: - `[0..15]` — 16 个 ASCII 十六进制字符的激活码 - `[16..17]` — 填充 - `[18..19]` — SWID(小端 u16) - `[20..21]` — SubID(小端 u16) - `[22]` — 状态(`1` = 已解锁) - `[23]` — 填充 - `[24..27]` — 类型(小端 u32,`1` = 永久) ### 固件架构 | 组件 | 详情 | |------|------| | 操作系统 | QNX 6.3.0 SP1 | | CPU | Renesas SH4A (SuperH) | | 主二进制文件 | PCM3Root(5.8MB ELF,12,604 个函数) | | IOC 网关 | 带有 CMX-RTX RTOS 的 Renesas V850 | | IFS 格式 | 带 LZO 压缩的 QNX IFS(16 位大端长度前缀) | | 加密 | `CPPorscheEncrypter` 类中的自定义 64 位 RSA | | 密钥位置 | PCM3Root 中的文字池 0x082270b4 / 0x082270b8 | ## 仓库结构 ``` PCM-Forge/ ├── README.md ├── generate_codes.py ← Command-line code generator (26 features) ├── docs/index.html ← Web tool (GitHub Pages) ├── tools/ │ ├── verify.py ← Verification against PagSWAct.csv (100%) │ └── diff_fw.py ← Firmware variant diff tool ├── research/ │ ├── ALGORITHM_CRACKED.md ← Complete algorithm documentation │ ├── PCM31_RESEARCH.md ← Hardware/software architecture │ ├── PCM31_SYSTEM_INFO.md ← Target vehicle details │ ├── USB_ENGINEERING_ACCESS.md │ ├── CROSS_PLATFORM_NOTES.md ← PCM 3.1 vs PCM 4/MIB2 comparison │ └── firmware/ ← Extracted firmware data │ ├── PagSWAct.csv ← 27 known VIN/code pairs (verification dataset) │ └── *.bin, *.txt ← IOC firmware, Ghidra output └── shared/uds/ ← UDS diagnostic stack (shared with MMI3G) ``` ## 完成方式 完整的逆向工程链条: 1. **QNX IFS 提取** — LZO 解压固件镜像(227 个块,6.8MB → 14.2MB) 2. **二进制提取** — 从 IFS 目录结构中提取 129 个文件 3. **Ghidra 反编译** — 将 PCM3Root 作为 SH4A ELF 加载,分析 12,604 个函数 4. **函数追踪** — 通过字符串交叉引用定位 `CPPorscheEncrypter::verify` 5. **算法识别** — 识别模幂运算(平方-乘算法)位于 `FUN_082405a0` 6. **密钥提取** — 在文字池中找到 RSA 参数的十六进制字符串 7. **模数分解** — 使用 Pollard's rho 在毫秒内分解 64 位模数 8. **私钥计算** — `d = e^(-1) mod φ(n)` 9. **VIN 映射** — 带 16 位溢出的加权和,验证所有 27 个已知配对 10. **明文发现** — 逐字符交错(而非拼接) 11. **USB 交付** — `proc_scriptlauncher` + `copie_scr.sh` 自动运行机制 ## 已知限制 - **部分车型变体缺少 SubID** — Panamera (970/9P)、Macan (95B)、Cayman/Boxster (987/981)、GT3/GT2 的 SubID 尚未解码。如果您有其中一种车型的可用 FeatureLevel 码,请新建 issue — 可通过尝试解密恢复 SubID 并添加到车型表。 - **TVINF 也可能与车型相关** — 5 条测试记录不匹配默认 SubID `0x0166`。模式匹配 FeatureLevel,表明可能按车型变化。需要更多样本以完全解码。 - **FeatureLevel 无零售激活** — 经销商对此码收费约 3500 美元。PCM-Forge 免费生成,但仅适用于您的具体车型变体。错误的 SubID = 错误的码。 ## 相关项目 **按平台:** | 代际 | 平台 | 您的车? | 工具 | |------|------|----------|------| | PCM 3.1 (SH4 / QNX 6.3) | Harman Becker | Cayenne 958、911 991.1、Panamera 970、Boxster/Cayman 981、Macan 95B | **PCM-Forge**(本仓库) | | MMI 3G / 3G+ (SH4 / QNX 6.3) | Harman Becker | Audi A4–A8 (B8/B8.5/C6/C7/D3/D4)、VW Touareg 7P(带 RNS-850) | **[MMI3G-Toolkit](https://github.com/dspl1236/MMI3G-Toolkit)** | | PCM 4 / MHI2 / MIB2 (Tegra ARM / QNX 6.5) | Harman | Panamera 971、911 991.2+、718、更新款 Macan | [M.I.B.](https://github.com/Mr-MIBonk/M.I.B._More-Incredible-Bash)、[harman-f AIO 更新]() | | MIB3 / MIB4 / E3 (ARM / Linux) | Continental / CARIAD | 2020 年后 VAG 车辆 | 尚未逆向工程 | **在 Harman 产品树中相同的特征标识符方案:** Porsche 在从 Harman Becker 迁移到 Harman 的 Tegra 基础 MIB2 平台时复用了 `SWID.SubID` 十六进制结构。harman-f 的 [AIO 固件补丁](https://github.com/harman-f/MHI2_US_POG11_K5186_1-MU1476-AIO#features) 中记录的 FEC 码证实该方案延续 — 我们的 `0x0003`、`0x0005`、`0x0007` FeatureLevel 值用于 911 车型,对应其 MIB2 FEC 条目。但 **激活机制完全不同**:PCM 3.1 严格验证 RSA 签名(PCM-Forge 通过模数分解伪造),而 PCM 4 / MIB2 完全跳过签名验证(harman-f 直接写入全 0xFF 替代签名)。详见 [research/CROSS_PLATFORM_NOTES.md](research/CROSS_PLATFORM_NOTES.md) 对比二进制格式、攻击面和交付机制的完整分析。 **VAG 生态工具:** - [**jilleb/mib2-toolbox**](https://github.com/jilleb/mib2-toolbox) — MIB2-HIGH 工具箱(848 ⭐)。与 PCM 4 同代(不同品牌:VAG 乘用车 vs 保时捷)。我们的 MMI3G-Toolkit 受其启发 - [**jilleb/mib1-toolbox**](https://github.com/jilleb/mib1-toolbox) — MIB1-HIGH 前身。与我们的 PCM 3.1 代最接近的 VAG 模拟 - [**jilleb/odis2vcp**](https://github.com/jilleb/odis2vcp) — 将 ODIS XML 转换为 VCP XML。若您有 ODIS 并希望提取数据集用于 VCDS/VCP 工具 - [**jilleb/binary_tools**](https://github.com/jilleb/binary_tools) — 二进制文件比较的最小 Python 脚本。PCM-Forge 的 `tools/diff_fw.py` 是此方法的扩展版本 ## 致谢 - **harman-f** — PCM 4 / MIB2 固件修补研究。他们的 `addfec` 脚本是我们 [CROSS_PLATFORM_NOTES.md](research/CROSS_PLATFORM_NOTES.md) 中记录 MIB2 FecContainer.fec 二进制格式的罗塞塔石碑 - **jilleb** — `tools/diff_fw.py` 固件对比工具受 [jilleb/binary_tools](https://github.com/jilleb/binary_tools) 的 `find_identical_ranges.py` 启发。特征标志探索的工具箱概念源自 [jilleb/mib1-toolbox](https://github.com/jilleb/mib1-toolbox) 和 [mib2-toolbox](https://github.com/jilleb/mib2-toolbox) - **保时捷/哈曼贝克 IOC 固件工程师** — 在固件包中留下 PagSWAct.csv(27 条测试向量),使 100% 算法验证成为可能 ## 许可证 MIT 许可证 — 参见 [LICENSE](LICENSE) ## 免责声明 仅供研究与教育用途。自行承担使用风险。作者不对车辆或组件损坏负责。
标签:64位RSA, ECU, FAT32, Ghidra, Harman Becker, PCM, Python, QNX, SEO: 保时捷PCM激活, SEO: 车辆信息娱乐破解, SEO: 逆向工程工具包, SH4, USB, VIN, Web工具, 二进制发布, 云资产清单, 代码生成, 保时捷, 信息娱乐系统, 固件分析, 域名枚举, 嵌入式, 开源工具, 无后门, 模块化指数, 汽车电子, 汽车诊断, 渗透测试工具, 激活码生成, 车辆安全, 逆向工具, 逆向工程, 钥匙生成