逆向工程 BYD Dolphin 车机——CAN 总线、AVAS、NFC 钥匙、OTA 等。DiLink 3 / Android 10。
针对 比亚迪海豚 25/26 信息娱乐系统(DiLink 3,Android 10)的逆向工程、文档和工具。
这里的一切都是通过 ADB 探索、APK 反编译和 CAN 总线探测发现的——未使用任何专有文档。
⚠️ 免责声明: 非官方、社区驱动的项目——与比亚迪无任何关联。 对比亚迪内部 Android 服务的逆向工程仅用于教育和互操作性目的。 使用风险自负——修改车辆软件可能会使您的保修失效或违反比亚迪的服务条款。 作者对您的车辆、软件或数据造成的任何损害不承担任何责任。
| 属性 | 值 |
|---|---|
| 平台 | DiLink 3.0 |
| Android | 10 (API 29) |
| SoC | Qualcomm QCM6125 (SM6125 Trinket) |
| 架构 | ARM64,8 核 |
| RAM | ~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.2.2312260.1 |
| DSP | 13.5.5.2505300.2 |
| Bootloader | 已解锁(ro.boot.flash.locked=0) |
| 验证启动 | Orange(已解锁) |
| 仪表盘 | 独立的 Qt/QML 系统(Qt 5.15.10 / 6.5.5) |
已在固件
13.1.32.2507250.1上测试。 较旧版本可能可用。比亚迪较新的固件更新可能会改变或破坏某些功能——不提供任何保证。
初次使用? 请从侧载指南开始,在您的比亚迪上安装应用——无需 root。
有关基于本研究构建的自定义应用,请参阅 byd-apps。
adb connect 192.168.10.10:5555
Third Party Apps XX 文件夹(带国家代码后缀),插入车机BYD6125F(DiLink 3 通用)targetSdk ≤ 33、minSdk ≤ 29从 ADB 注入 CAN 帧 — 无需 root,无需 OBD2 适配器:
# 1. Start the ClusterDebug app + service (acts as privileged proxy)
adb shell "am start -n com.byd.clusterdebug/.MainActivity"
adb shell "am startservice -n com.byd.clusterdebug/.ClusterDebugService"
# 2. Inject CAN frames
adb shell "am broadcast -a com.byd.cluster.spi --es normal 'FF,FF,FF,FF,FF,FF,FF,FF'"
# 3. Capture cluster screenshot
adb shell "fission_screencap -d 1 -p /data/local/tmp/cluster.png"
adb pull /data/local/tmp/cluster.png
有关完整的 UDS 诊断协议、CAN 帧格式和 ECU 网络拓扑,请参阅 Driver Display。
| 功能 | 详情 |
|---|---|
| 空调温度读取 | getTemprature(zone) — zone 1/2 = 设定温度,zone 4 = 车外/环境温度 |
| 完整空调控制 | 40+ 个 getter + SET 方法(启动/停止、温度、风量、风向模式),通过权限绕过实现 |
| 空调远程控制 | hasFeature("ACRemoteControl") = 1,支持 10–30 分钟定时 |
| 权限绕过 | BydPermissionContext(ContextWrapper)在客户端自动授予 BYDAUTO_* 权限 |
| CAN 总线读写 | 通过 ADB 使用 app_process + 反射实现 |
| 75+ 个 BYD 包 | 具备 CAN 总线访问权限,100+ 个自定义 BYDAUTO_* 权限 |
| 引擎模拟器音效 | 模拟器存在且可切换(HAS_SIMULATOR=2),预设通过 0x3E300038 选择。MCU 会存储并回显任何源类型 — 已验证至 200;仅 0 被拒绝 — 因此接受并不代表存在不同的音效,且通过此 API 无法发现真实预设的数量。0x48F00013 返回 1 表示“存在一个源”,而非数量。 — Engine Sound app |
| AVAS 预设选择 | 可通过 CAN 写入 — UI 显示 2 个,但 MCU 接受 0–5+ |
| setBuffer PCM 流式传输 | MCU 接受 128 字节 PCM 帧(ret=0),支持 8+ 个功能 ID。最大缓冲区:128 字节。MCU 是否将其解释为音频尚未确认。 |
| AVAH 测试音 | 使用出厂诊断信号(0x6E970010)在 AVAS 外部扬声器上播放 |
| AVAS 旋律模式 | 通过 TEST_AUDIO_AVAS_SET 音高控制实现 8 种可用模式(门铃、商店提示音、警报、号角等) — Door Sound app |
| CAN 总线注入 | 可实现 VCDS 风格的功能编码 — 通过 com.byd.cluster.spi 广播注入 CAN 帧,无需 root |
| 仪表盘截图 | 通过 fission_screencap -d 1 -p <file> 捕获驾驶员显示屏 |
| 仪表盘读取 | 通过 BYDAutoManager 读取 PowerUnit、TempUnit、BacklightCtlType、InsThemeValue |
| DRL 切换 | setInt(1004, 0x43100046, 1/2) — DRL 自动模式开/关,已通过回读确认 |
| YUN 设备(1034) | MCU 接受所有 0xAA 功能 ID — setBuffer(1034, fid, data) 和 setInt(1034, fid, val) 返回 0(OK)。Cloudmanager 的私有 MCU 通道。执行操作需要 AES 加密。 |
| 内容提供者 | 暴露车辆数据(电池、胎压、保养、行程消耗) |
| 侧载 | USB 驱动器或 ADB — 参见指南 |
| 360 摄像头画面 | 来自全部四个环视摄像头的实时 1280×960 画面,无需 root。 bmmcamera.jar 全局可读 — 自行加载它,并从 shell 用户 ID 的 app_process 直接驱动 JNIBMMCamera。已安装的应用永远无法做到这一点(SELinux 拒绝 untrusted_app_* 访问 bmmcameraserver binder);通过 ADB 启动的进程可以 — 详情 |
| 功能 | 状态 |
|---|---|
| 车门锁状态 | 主车门返回 INVALID (0),儿童锁可读。没有专用的 setDoorLockStatus() — 需要使用通用 set() 配合未知功能 ID |
| 360 摄像头显示控制 | BYDAutoPanoramaDevice(模式、旋转、透明度)在服务端强制执行,BydPermissionContext 绕过失败。画面捕获可用 — 见上文 |
| 功能 | 原因 |
|---|---|
| 自定义 AVAS 音频上传 | setBuffer 接受 128 字节 PCM 数据(ret=0),但 MCU 可能不会将其解释为音频。外部扬声器路由(AUDIO_EXTERIOR_SPEAKER)返回 -10011(Dolphin 不支持)。完整的 Boombox 风格自定义音频尚未确认 — 参见 AVAS 研究。 |
| AVAS 音量控制 | 在 MCU 中硬编码,PROMPT_VOLUME_LEVEL 对其无效 |
| 仪表盘主题/皮肤更改 | AutoContainer 服务在单 OS 模式(fission_single_os=1)下抛出“no AutoContainerNative” |
| 仪表盘调试命令 | 日间/夜间、经典/科技、FPS、皮肤 — 均需要 AutoContainer(被阻止) |
| BYDAutoInstrumentDevice API | 需要 BYDAUTO_INSTRUMENT_COMMON/SET 权限 — shell UID 2000 被阻止 |
| 自定义锁车/开机音效 | MCU 固件拒绝这些命令 |
| 喇叭 | 硬件继电器,无法通过软件控制 |
| 危险警示灯闪烁 | MCU GUID 门控 — MCU 接受 SPI 传输(result=0),但在未注册云认证 GUID 的情况下会静默丢弃远程控制命令。通过 setInt(1005, 0xAA00004A, 1) 使 MCU 上线(已确认 mMCUStatus=1)。帧格式已通过 Ghidra 完全解码。最终障碍:GUID 仅存在于 cloudmanager 进程内存中(需要 root)。 |
| 开机动画 | 需要 root 才能替换(/system/media/) |
| 车内/内部温度 | 未找到 API — 穷举探测确认不可用 |
| 浏览器 blob 下载绕过 | fetch→blob→anchor.click 在固件 13.1.32.2507250.1 上被 BYD 的“Download proibido”策略静默阻止。没有文件落地,没有错误,没有弹窗。此前关于此方法可用的说法不准确 — 完整诊断请参见 test-log。navigator.share 在此版本中也是 undefined。 |
Root 是可选的 — 大多数功能无需 root 即可使用。Root 指南
| 能力 | 详情 |
|---|---|
| 直接 SPI 访问 | /dev/spidev_ivi — 绕过 128 字节 Java API 限制(最多 247 字节 SPI 记录) |
| ALSA 混音器控制 | 通过 tinymix 实现潜在的 AVAS 音频路由 |
| MCU 配置重置 | 通过直接 SPI 命令重置 MCU 状态 |
| 系统分区写入 | 修改 /system/media/(开机动画)、安装系统应用、替换 cluster_theme*.rcc |
| 仪表盘主题替换 | 替换 /system/lib64/ 中的 132MB/124MB RCC 文件,修补 libBydCluster.so 单 OS 检查 |
| OBD 诊断发送 | BYDAUTO_OTA_SET + BYDAUTO_SETTING_COMMON 权限,用于完整 UDS 编码 |
| 内核符号 | /proc/kallsyms 访问、dmesg |
| KernelSU | 不可行 — 需要 GKI 内核 5.10+,设备运行 4.14.117(非 GKI) |
面向研究人员的关键安全相关发现: