
BYD Dolphin 헤드 유닛 리버스 엔지니어링 — CAN 버스, AVAS, NFC 키, OTA 등. DiLink 3 / Android 10.
BYD Dolphin 25/26 인포테인먼트 시스템(DiLink 3, Android 10)에 대한 리버스 엔지니어링, 문서화 및 툴링입니다.
여기의 모든 내용은 ADB 탐색, APK 디컴파일, CAN 버스 프로빙을 통해 발견되었으며, 독점 문서는 사용되지 않았습니다.
⚠️ 면책 조항: 비공식 커뮤니티 주도 프로젝트로, BYD와 아무런 제휴 관계가 없습니다. BYD의 내부 Android 서비스에 대한 리버스 엔지니어링은 교육 및 상호운용성 목적으로만 수행됩니다. 사용에 따른 책임은 본인에게 있습니다 — 차량 소프트웨어를 수정하면 보증이 무효화되거나 BYD의 서비스 약관을 위반할 수 있습니다. 저자는 차량, 소프트웨어 또는 데이터에 발생한 어떠한 손해에 대해서도 책임을 지지 않습니다.
| 속성 | 값 |
|---|---|
| 플랫폼 | 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 |
| 부트로더 | 잠금 해제됨 (ro.boot.flash.locked=0) |
| 검증된 부팅 | Orange (잠금 해제됨) |
| 계기판 클러스터 | 별도의 Qt/QML 시스템 (Qt 5.15.10 / 6.5.5) |
펌웨어
13.1.32.2507250.1에서 테스트되었습니다. 이전 버전에서도 작동할 가능성이 높습니다. BYD의 최신 펌웨어 업데이트는 동작을 변경하거나 중단시킬 수 있으며, 보장할 수 없습니다.
처음이신가요? 사이드로딩 가이드를 통해 루트 없이 BYD에 앱을 설치하는 방법부터 시작하세요.
이 리서치를 기반으로 제작된 커스텀 앱은 byd-apps를 참고하세요.
adb connect 192.168.10.10:5555
Third Party Apps XX 폴더(국가 코드 접미사)에 넣고 차량에 연결BYD6125F (DiLink 3 전반에 걸쳐 범용)targetSdk ≤ 33, minSdk ≤ 29ADB에서 CAN 프레임 주입 — 루트 불필요, 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
See Driver Display for the full UDS diagnostic protocol, CAN frame format, and ECU network topology.
| 기능 | 세부 사항 |
|---|---|
| AC 온도 읽기 | getTemprature(zone) — zone 1/2 = 설정 온도, zone 4 = 외부/주변 |
| 완전한 AC 제어 | 권한 우회를 통한 40개 이상의 getter + SET 메서드 (시작/정지, 온도, 팬, 풍량 모드) |
| AC 원격 제어 | hasFeature("ACRemoteControl") = 1, 10–30분 타이머 지원 |
| 권한 우회 | BydPermissionContext (ContextWrapper)가 클라이언트 측에서 BYDAUTO_* 권한을 자동 부여 |
| CAN 버스 읽기/쓰기 | app_process + 리플렉션을 사용하여 ADB를 통해 |
| 75개 이상의 BYD 패키지 | CAN 버스 접근, 100개 이상의 사용자 정의 BYDAUTO_* 권한 포함 |
| 엔진 시뮬레이터 사운드 | 시뮬레이터 존재 및 전환 가능 (HAS_SIMULATOR=2), 0x3E300038을 통해 프리셋 선택. MCU는 모든 소스 유형을 저장하고 반환함 — 200까지 검증됨; 0만 거부됨 — 따라서 수용이 별개의 사운드를 의미하지 않으며 실제 프리셋 수는 이 API를 통해 확인할 수 없음. 0x48F00013은 "소스가 존재함"을 의미하는 1을 반환하며, 개수가 아님. — Engine Sound 앱 |
| AVAS 프리셋 선택 | CAN 쓰기 가능 — UI는 2를 표시하지만 MCU는 0–5+를 수용 |
| setBuffer PCM 스트리밍 | 8개 이상의 기능 ID에 대해 MCU가 128바이트 PCM 프레임 수용 (ret=0). 최대 버퍼: 128바이트. MCU가 오디오로 해석하는지 미확인. |
| AVAH 테스트 톤 | 공장 진단 신호 (0x6E970010)를 사용하여 AVAS 외부 스피커에서 재생 |
| AVAS 멜로디 패턴 | TEST_AUDIO_AVAS_SET 피치 제어를 통한 8가지 작동 패턴 (초인종, 상점 차임, 경보, 팡파르 등) — Door Sound 앱 |
| CAN 버스 주입 | VCDS 스타일 기능 코딩 가능 — com.byd.cluster.spi 브로드캐스트를 통해 CAN 프레임 주입, 루트 불필요 |
| 클러스터 스크린샷 | fission_screencap -d 1 -p <file>을 통해 운전자 디스플레이 캡처 |
| 계기판 클러스터 읽기 | BYDAutoManager를 통한 PowerUnit, TempUnit, BacklightCtlType, InsThemeValue |
| DRL 토글 | setInt(1004, 0x43100046, 1/2) — DRL 자동 모드 ON/OFF, 읽기로 확인됨 |
| YUN 장치 (1034) | MCU가 모든 0xAA 기능 ID 수용 — setBuffer(1034, fid, data) 및 setInt(1034, fid, val)이 0 (OK) 반환. Cloudmanager의 전용 MCU 채널. 작동을 위해서는 AES 암호화 필요. |
| 콘텐츠 프로바이더 | 차량 데이터 노출 (배터리, 타이어 압력, 유지보수, 주행 소비량) |
| 사이드로딩 | USB 드라이브 또는 ADB — 가이드 참조 |
| 360 카메라 프레임 | 4개의 서라운드 카메라 모두에서 라이브 1280×960, 루트 불필요. bmmcamera.jar는 전 세계 읽기 가능 — 직접 로드하고 shell-uid app_process에서 JNIBMMCamera를 직접 구동. 설치된 앱은 절대 이렇게 할 수 없음 (SELinux가 untrusted_app_*에게 bmmcameraserver 바인더를 거부); ADB를 통해 실행된 프로세스는 가능 — 세부 사항 |
| 기능 | 상태 |
|---|---|
| 도어 잠금 상태 | 메인 도어는 INVALID (0) 반환, 차일드 락은 읽기 가능. 전용 setDoorLockStatus() 없음 — 알 수 없는 기능 ID로 일반 set() 필요 |
| 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가 등록되지 않은 원격 제어 명령은 조용히 삭제됨. MCU가 setInt(1005, 0xAA00004A, 1)을 통해 온라인 상태가 됨 (mMCUStatus=1 확인됨). 프레임 형식은 Ghidra를 통해 완전히 디코딩됨. 최종 장벽: GUID는 cloudmanager 프로세스 메모리 (루트)에서만 사용 가능. |
| 부팅 애니메이션 | 교체하려면 루트 필요 (/system/media/) |
| 실내/내부 온도 | API를 찾을 수 없음 — 철저한 프로빙으로 사용 불가 확인됨 |
| 브라우저 blob 다운로드 우회 | fetch→blob→anchor.click은 펌웨어 13.1.32.2507250.1에서 BYD의 "Download proibido" 정책에 의해 조용히 차단됨. 파일이 생성되지 않고, 오류도, 팝업도 없음. 이것이 작동한다는 이전 주장은 부정확했음 — 전체 진단은 test-log 참조. navigator.share도 이 빌드에서는 undefined. |
루트는 선택 사항 — 대부분의 기능은 루트 없이 작동. 루팅 가이드
| 기능 | 세부 사항 |
|---|---|
| 직접 SPI 접근 | /dev/spidev_ivi — 128바이트 Java API 제한 우회 (최대 247바이트 SPI 레코드) |
| ALSA 믹서 제어 | tinymix를 통한 잠재적 AVAS 오디오 라우팅 |
| MCU 구성 재설정 | MCU 상태를 재설정하는 직접 SPI 명령 |
| 시스템 파티션 쓰기 | /system/media/ 수정 (부팅 애니메이션), 시스템 앱 설치, cluster_theme*.rcc 교체 |
| 클러스터 테마 교체 | /system/lib64/의 132MB/124MB RCC 파일 교체, libBydCluster.so 단일 OS 검사 패치 |
| OBD 진단 전송 | 전체 UDS 코딩을 위한 BYDAUTO_OTA_SET + BYDAUTO_SETTING_COMMON 권한 |
| 커널 심볼 | /proc/kallsyms 접근, dmesg |
| KernelSU | 사용 불가 — GKI 커널 5.10+ 필요, 장치는 4.14.117 (비-GKI) 실행 |
연구자를 위한 주요 보안 관련 발견: