ConnorHowell/medc17-checksum-tool
GitHub: ConnorHowell/medc17-checksum-tool
博世 MED17/EDC17 ECU 固件校验和(CRC32/ADD32/ADD16)的分析与校正工具,利用 GF(2) 矩阵代数实现即时 CRC32 求解,并支持 CVN 修复和 Bleichenbacher 签名生成。
Stars: 39 | Forks: 17
# MEDC17 Checksum 工具
用于 Bosch MED17/EDC17 ECU 固件二进制文件的 Checksum 分析与校正工具。
## 概述
分析与校正 Bosch MED17 和 EDC17 ECU 固件文件中的 checksum。支持 CRC32、ADD32 和 ADD16 算法。
## 功能
- ✅ **自动 block 检测** - 识别二进制文件中的所有 checksum block
- ✅ **三种算法** - 支持 CRC32、ADD32 和 ADD16
- ✅ **即时 CRC32 求解** - 基于 GF(2) 矩阵代数
- ✅ **RSA 签名伪造** - 生成有效的 Bleichenbacher 签名
- ✅ **CVN 校正** - 修复 Calibration Verification Number 以匹配原始文件
- ✅ **安全操作** - 绝不覆盖原始文件
[
](https://howellsystems.co.uk)
## 环境要求
Python 3.7+ 及 `rich` 包:
```
pip install rich
```
## 用法
### 分析 checksum(只读)
```
python main.py firmware.bin
```
### 校正 checksum
```
python main.py firmware.bin --correct --output firmware_corrected.bin
```
### 校正 checksum 和 CVN
```
python main.py modified.bin --correct --fix-cvn original.bin --output fixed.bin
```
### 选项
```
-h, --help Show help
-c, --correct Correct invalid checksums
-o OUTPUT, --output Output file path for corrected binary
--fix-cvn ORIGINAL Fix CVN to match the CVN from ORIGINAL file
```
## 工作原理
### Checksum Block 结构
ECU 固件包含多个 Bosch block,其 checksum 用于保护不同的区域:
- **绝对常量** (0xC0)
- **Customer Block** (0x30)
- **应用软件** (0x40)
- **Dataset** (0x60)
- **Startup Block** (0x10)
### 两阶段校正
1. **阶段 1 (ADD32/ADD16)**:使用简单的算术运算修改 checksum 区域的最后 4 个字节
2. **阶段 2 (CRC32)**:使用 GF(2) 矩阵代数即时求出精确的 dCSAdjust 值
### CRC32 数学求解
传统方法需要暴力破解数十亿个值。本工具将 CRC32 建模为 GF(2) 上的 32 个线性方程,构建一个 32×32 的矩阵,并使用高斯消元法进行求解。
### CVN (Calibration Verification Number)
CVN 是特定内存区域上的 CRC32 checksum,OBD-II 诊断会报告该值以验证 calibration 的完整性。修改 calibration 数据时,CVN 会发生改变,并且不再与经销商的记录匹配。
**CVN 校正的工作原理:**
本工具没有为每个 ECU 变体硬编码区域,而是直接从二进制文件中动态发现 CVN 配置结构:
1. **结构发现** - 通过扫描特征码来定位 CVN 配置(我们始终知道 DS0 会出现在主结构中)
2. **区域提取** - 从结构中读取实际的内存区域(通常是 ASW + Dataset 区域,但这可能因 ECU 而异)
3. **Patch 定位** - 在 CVN 范围内但处于 checksum 关键区域之外,计算最佳的 patch 点
4. **GF(2) 求解** - 使用矩阵代数找到一个能产生目标 CVN 的 4 字节 patch 值
此方法适用于不同的 MED17/EDC17 变体,无需针对特定变体进行配置。
**未来增强:** 建立一个包含软件版本号及其对应 CVN 值的 CSV 数据库,可以完全免除对原始二进制文件的需求。
## 技术细节
| 算法 | 初始值 | 预期结果 | 方法 |
|-----------|---------------|-----------------|---------|
| **CRC32** | 0xFADECAFE | 0x35015001 | IEEE 802.3 (0xEDB88320) 位反转多项式 |
| **ADD32** | 0xFADECAFE | 0xCAFEAFFE | 32 位 dword 求和(忽略溢出) |
| **ADD16** | 0xFADECAFE | 0xCAFEAFFE | 32 位 dword 中 16 位 word 的求和 |
## 待办事项
计划中的未来增强功能:
- [ ] **Sync block** - WinOLS 引用了这些内容,它们是什么??
- [ ] **ECM/代码监控 checksum** - 确保所有监控 checksum 都已校正
- [ ] **变体 Dataset 校正** - 即使仅修改了 calibration,WinOLS 也会对 VDS block epilog(如果存在)进行更改,需要进一步调查
- [ ] **扩展测试** - 对超出 calibration 更改范围的代码段修改进行验证
欢迎贡献!
## 许可证
MIT 许可证 - 详见 [LICENSE](LICENSE)
## 致谢
版权所有 (c) 2025 Connor Howell
## 免责声明
](https://howellsystems.co.uk)
标签:Bosch MED17, ECU固件, Python, 云资产清单, 无后门, 校验和, 汽车电子, 逆向工具, 逆向工程