wheregoes/byd-dolphin-hacking
GitHub: wheregoes/byd-dolphin-hacking
这是一个针对比亚迪海豚车机系统的逆向工程项目,旨在揭示安全漏洞并提供交互工具用于车辆信息安全分析。
Stars: 3 | Forks: 1
# 🚗 比亚迪海豚车机系统 — 研究与逆向工程
针对**比亚迪海豚 25/26**款信息娱乐系统(DiLink 3,Android 10)的逆向工程、文档记录和工具开发。
此处所有内容均通过ADB探索、APK反编译和CAN总线探测发现 — 未使用任何专有文档。
## 📋 目录
- [车机规格](#-head-unit-specs)
- [入门指南](#-getting-started)
- [关键发现](#-key-findings)
- [安全发现](#-security-findings)
- [系统架构](#-architecture)
- [文档资料](#-documentation)
- [脚本工具](#-scripts)
- [仓库结构](#-repository-structure)
- [许可证](#-license)
## 🖥️ 车机规格
| 属性 | 值 |
|----------|-------|
| 平台 | DiLink 3.0 |
| Android | 10 (API 29) |
| SoC | Qualcomm QCM6125 (SM6125 Trinket) |
| 架构 | ARM64, 8核心 |
| 内存 | ~3.5 GB |
| 内核 | 4.14.117-perf |
| ADB | WiFi, 端口 5555 |
| 车机IP | `192.168.10.10` (车辆WiFi) |
| 固件 | `13.1.32.2507250.1` (2025年7月25日) |
| MCU | `13.5.5.2505300.2` |
| Bootloader | **已解锁** (`ro.boot.flash.locked=0`) |
| 验证启动 | 橙色 (已解锁) |
| 仪表盘 | 独立的 Qt/QML 系统 (Qt 5.15.10 / 6.5.5) |
## 🚀 入门指南
**新手?** 从[侧载指南](docs/sideloading-guide.md)开始,在你的比亚迪车机上安装应用 — 无需root权限。
关于基于此研究的自定义应用,请参见 [byd-apps](https://github.com/wheregoes/byd-apps)。
### 快速ADB连接
```
adb connect 192.168.10.10:5555
```
### 侧载快速须知
- **USB方法** — 将APK文件放入 `Third Party Apps XX` 文件夹(国家代码后缀),插入车机
- **万能密码** — `BYD6125F`(DiLink 3系列通用)
- **APK要求** — ARM64, `targetSdk ≤ 33`, `minSdk ≤ 29`
- **国家特定限制** — 哈萨克斯坦 (14应用白名单), 印度 (仅Mappls), 欧洲/日本/澳大利亚 (在线验证)
## 🔬 关键发现
### ✅ 有效功能(无需Root)
| 功能 | 详情 |
|---------|---------|
| **空调温度读取** | `getTemprature(zone)` — 区域1/2 = 设定温度, 区域4 = 室外/环境温度 |
| **完全空调控制** | 40多个getter + SET方法 (启停, 温度, 风扇, 风向模式) 通过权限绕过实现 |
| **空调远程控制** | `hasFeature("ACRemoteControl") = 1`, 支持10-30分钟定时 |
| **权限绕过** | `BydPermissionContext` (ContextWrapper) 在客户端自动授予 `BYDAUTO_*` 权限 |
| **CAN总线读写** | 通过ADB使用 `app_process` + 反射实现 |
| **75+比亚迪软件包** | 具备CAN总线访问权限, 100多个自定义 `BYDAUTO_*` 权限 |
| **引擎模拟器音效** | CAN总线可写 — UI显示3个预设但MCU接受1-255 |
| **AVAS预设选择** | CAN总线可写 — UI显示2个但MCU接受0-5+ |
| **AVAH测试音调** | 使用工厂诊断信号 (`0x6E970010`) 在AVAS外部扬声器播放 |
| **内容提供程序** | 暴露车辆数据 (电池, 胎压, 保养, 行程能耗) |
| **侧载** | USB驱动器或ADB — [参见指南](docs/sideloading-guide.md) |
| **浏览器blob下载绕过** | `fetch→blob→anchor.click` 静默将文件 (包括APK) 保存到 `/sdcard/Download/` — 无需用户手势 (Chromium 113漏洞) |
### ⚠️ 部分有效功能
| 功能 | 状态 |
|---------|--------|
| **车门锁状态** | 主车门返回INVALID (0), 儿童锁可读。没有专用的 `setDoorLockStatus()` — 需要使用未知feature ID的通用 `set()` |
| **360全景影像** | `BYDAutoPanoramaDevice` 服务器端强制执行, 绕过失败。`AVMCamera`/`NormalCamera` 存在于 `bmmcamera.jar` 中但无法被第三方应用加载 |
### ❌ 无效功能
| 功能 | 原因 |
|---------|--------|
| **自定义AVAS音频 (Boombox)** | MCU固件阻止I2S到AVAS的路由 |
| **AVAS音量控制** | MCU硬编码, 无CAN信号可改变 |
| **自定义锁车/开机音效** | MCU固件拒绝命令 |
| **喇叭** | 硬件继电器, 无法通过软件控制 |
| **开机动画** | 需要root权限替换 (`/system/media/`) |
| **车内温度** | 未找到API — 全面探测确认不可用 |
### 🔓 Root权限功能 (Magisk)
Root权限是可选的 — 大多数功能无需root即可工作。[Root指南](docs/rooting-guide.md)
| 功能 | 详情 |
|------------|---------|
| 直接SPI访问 | `/dev/spidev_ivi` — 绕过128字节Java API限制 (最高支持247字节SPI记录) |
| ALSA混音器控制 | 通过 `tinymix` 潜在实现AVAS音频路由 |
| MCU配置重置 | 直接SPI命令重置MCU状态 |
| 系统分区写入 | 修改 `/system/media/` (开机动画), 安装系统应用 |
| 内核符号 | `/proc/kallsyms` 访问, `dmesg` |
| KernelSU | **不可行** — 需要GKI内核5.10+, 设备运行4.14.117 (非GKI) |
## 🔒 安全发现
研究人员的关键安全相关发现:
| 发现 | 影响 |
|---------|--------|
| **Bootloader已解锁** | `ro.boot.flash.locked=0`, 橙色验证启动 — 可通过fastboot实现Magisk root |
| **权限绕过** | `BydPermissionContext` 覆盖 `enforceCallingOrSelfPermission()` — 自动授予所有 `BYDAUTO_*` 权限。适用于空调, 车门锁, 车身控制。对全景影像无效 (服务器端IPC检查) |
| **upgrade_server — 无权限检查** | Binder服务接受来自UID 2000 (shell) 的调用而不抛出SecurityException。可从 `adb shell` 使用有效签名包触发固件更新 |
| **COTA认证破解** | 使用字符移位密钥的HMAC-SHA256。区域分辨率API确认工作正常 (HTTP 200) |
| **浏览器blob绕过** | Chromium 113: `fetch()→blob→anchor.click` 绕过比亚迪的**任意网页**下载阻止 — 远程漏洞利用, 无需ADB。已验证52MB APK |
| **端口7000 (CarPlay)** | `carplayserv` 以**root**权限运行, 监听 `0.0.0.0` — 网络暴露的攻击面 |
| **IDD-IDPS监控** | 入侵检测系统在 `localhost:12406`, 监控 `wlan0`/`rmnet` 接口。三个root-UID客户端 |
| **SPI未保护** | 数据包格式 `[featureId_BE:4][dataLen:1][data:dataLen]` — 无CRC, 无HMAC |
| **大多数BYDAUTO权限** | `protectionLevel=normal` — 任何应用安装时都可请求 |
## 🏗️ 架构
### 通信栈
```
App → BYDAutoManager → Binder → DiCarServer (UID 1000) → auto.default.so → /dev/spidev_ivi → MCU
```
### 音频 / AVAS路径
```
SoC → I2S → MCU DSP → A2B bus → Amplifiers / AVAS speaker
```
### 云控制流程
```
BYD App → HTTPS → BYD Cloud → MQTT → cloudmanager (native) → CAN bus
```
### OTA更新路径
| 路径 | 方法 |
|------|--------|
| **COTA** | 云端OTA — `com.byd.cota` (应用配置/资源更新) |
| **FOTA** | 固件OTA — 需要与IMEI衍生证书的双向TLS |
| **OTG** | USB更新 — 寻找 `msm8953_64` 路径 (遗留, 尽管使用QCM6125 SoC) |
### 网络拓扑
```
Car WiFi: 192.168.10.x
Head Unit: 192.168.10.10
ADB: port 5555
CarPlay: port 7000 (root, 0.0.0.0)
IDD-IDPS: port 12406 (localhost)
```
## 📚 文档资料
### 指南
| 文档 | 描述 |
|-----|-------------|
| 📱 [侧载指南](docs/sideloading-guide.md) | 通过USB或ADB安装应用 — 无需root权限 |
| 🔬 [侧载内部原理](docs/sideloading-internals.md) | 浏览器漏洞利用链, blob下载绕过, AftermarketInstallTool逆向工程, 国家特定白名单 |
| 🔓 [Root指南](docs/rooting-guide.md) | 通过fastboot的Magisk root — A/B分区安全, 恢复程序 |
### 系统深入分析
| 文档 | 描述 |
|-----|-------------|
| 🖥️ [系统概述](docs/system-overview.md) | 硬件, 分区, 服务, 网络拓扑, 开放端口 |
| 🔌 [比亚迪汽车API](docs/bydauto-api.md) | 100多个 `BYDAUTO_*` 权限, 设备类型, 处理器类, protobuf模式 |
| 📊 [内容提供程序](docs/content-providers.md) | CarStatusProvider URI, 模式, 能耗遥测数据格式 |
### 车辆功能
| 文档 | 描述 |
|-----|-------------|
| ❄️ [空调与气候控制](docs/ac-climate-control.md) | 温度区域, 空调状态getter/setter, 编码特性, 权限绕过代码 |
| 🔊 [音效与主题](docs/sound-and-themes.md) | 音频硬件拓扑, 200多个CAN信号ID, AVAS/AVAH分析, MCU探测结果 |
| 📷 [摄像系统](docs/camera-system.md) | 双摄像头API架构, 360视图系统, 权限强制分析 |
| 🔄 [OTA系统](docs/ota-system.md) | COTA/FOTA/OTG逆向工程, upgrade_server漏洞, COTA认证分析 |
### NFC数字钥匙
| 文档 | 描述 |
|-----|-------------|
| 🔑 [NFC数字钥匙](docs/nfc-digital-key.md) | 硬件分析, 固件锁, IntelligentEntry应用逆向工程, CAN信号 |
| ✉️ [NFC激活邮件](docs/byd-nfc-activation-email.md) | 向比亚迪请求NFC激活的邮件模板 — 已证实<24小时激活 |
| | → [英文模板](docs/nfc-activation-email-en.md) · [葡萄牙语](docs/nfc-activation-email-ptbr.md) · [中文](docs/nfc-activation-email-zh.md) |
## 🛠️ 脚本工具
所有脚本通过 `app_process` 在设备上运行。推送并执行:
```
adb push scripts/BydAudioQuery.java /data/local/tmp/
adb shell "cd /data/local/tmp && app_process -Djava.class.path=. / BydAudioQuery read 0x1B10003D"
```
### CAN总线与音频
| 脚本 | 用途 |
|--------|---------|
| `BydAudioQuery.java` | CAN总线读写工具 — 直接信号访问 |
| `BydAudioRoutingTest.java` | 音频路由测试 (I2S, AVAS路径) |
| `BydNavAudioTest.java` | 导航音频通道测试 |
| `BydDeviceScan.java` | 多设备信号扫描器 |
| `SysMix.java` | 系统音频混合器查询 |
### AVAS与音效
| 脚本 | 用途 |
|--------|---------|
| `BydAvasPlayer.java` | AVAS旋律播放器 (频率控制) |
| `AvasRoute.java` | AVAS音频路由实验 |
| `AvasVolume.java` / `AvasVolume2.java` | AVAS音量控制尝试 |
| `AvahFreq.java` | AVAH频率扫描测试 |
| `AvahBare.java` | 最小化AVAH测试音调触发 |
| `AvahCombo.java` | AVAH组合信号测试 |
| `AvahCycle.java` | AVAH循环测试模式 |
| `AvahIsolate.java` | AVAH信号隔离测试 |
| `AvahStop.java` | AVAH信号停止/清理 |
### MCU与系统探测
| 脚本 | 用途 |
|--------|---------|
| `BydMcuProbe.java` | MCU安全探测 — 功能扫描, 极限值测试 |
| `BydBufferProbe.java` | MCU缓冲区溢出/边界测试 |
| `BydSpiDirect.java` | 直接SPI通信 (需要root权限) |
| `BydDebugProbe.java` | 调试接口/隐藏功能发现 |
| `BydLockSoundMonitor.java` | 车门锁声音事件监控 |
### 车辆系统
| 脚本 | 用途 |
|--------|---------|
| `BydNfcKeyProbe.java` | NFC数字钥匙CAN总线扫描器 |
| `BydCotaProbe.java` | COTA云API探测 — 区域分辨率, 认证测试 |
| `BydUpgradeProbe.java` | upgrade_server Binder服务探测 |
| `car-telemetry.py` | 车辆数据轮询与记录 (Python) |
### Chromium标志分析
| 脚本 | 用途 |
|--------|---------|
| `flags_extract.py` / `flags_extract_all.py` | 从车机浏览器提取Chromium标志 |
| `flags_descriptions.py` | 将标志名称映射到描述 |
| `flags_verify.py` / `flags_verify2.py` / `flags_verify3.py` / `flags_verify_final.py` | 验证标志状态和行为 |
| `flags_full_list.py` | 完整标志枚举 |
| `flags_probe_dom.py` | 基于DOM的标志探测 |
## 📁 仓库结构
```
docs/ Guides and deep-dive documentation
scripts/ On-device tools (CAN bus, MCU probes, AVAS, Chromium)
tools/
browser-exploit/ Browser sideloading research
index.html Main test page — blob download bypass PoC
autodownload.html Auto-download trigger test
install.html APK install flow test
pwa.html PWA install behavior test
cdp_capability_audit.py CDP protocol capability audit
cdp_download_test.py CDP download trigger tests
cdp_audit_results.json Full CDP audit results
serve_https.py Local HTTPS server for testing
sideload-test.apk Mock APK for install chain testing
data/
apks/ Extracted system APKs (DiCarServer, CarSetting)
audio-config/ Audio platform XML configs (I2S, mixer paths)
car-status/ CarStatusProvider data dumps
native-libs/ Native shared libraries (auto.default.so, libbydauto.so)
packages/ Package lists and service dumps
permissions/ BYDAUTO permission definitions
system-properties/ System property dumps and Android settings
chromium_flags_*.json Chromium flag analysis data
mcu-probe-*.txt MCU probe scan results
apk-analysis/ Vehicle type mappings (VehicleCarType.json, vehicleType.json)
```
自定义Android应用 (车门音效等) 位于 [byd-apps](https://github.com/wheregoes/byd-apps)。
## 📄 许可证
MIT
标签:ADB调试, Android逆向, APK反编译, ARM64架构, BYD Dolphin, CAN总线分析, DiLink 3, JS文件枚举, meg, NFC密钥破解, OTA更新研究, Qualcomm芯片分析, 云资产清单, 侧载应用, 信息安全, 域名枚举, 嵌入式系统, 工具开发, 汽车电子, 车载信息娱乐系统, 车载系统, 逆向工具, 逆向工程