
JBL Wave Buds 2(BES1306) 펌웨어에 대한 리버스 엔지니어링 노트 및 Python 도구: OTA 컨테이너 형식, 플래시 레이아웃, BLE/GATT 프로토콜, CRC-32 신뢰 모델.
JBL Wave Buds 2(Bestechnic BES1306, PID 2100)에 대한 리버스 엔지니어링 노트 및 재현 가능한 도구 모음: 플래시 내부 레이아웃, 바이트 단위까지 명세화된 OTA 컨테이너 형식, BLE/GATT 명령 프로토콜과 BES "TOTA v2" 암호화 전송, 디바이스 및 앱 측 신뢰 경계, 팩토리 콘솔, 그리고 소유한 기기에 자체 빌드한 이미지를 로드하는 재현 가능한 방법을 다룹니다.
분석은 두 빌드에 걸쳐 진행되었습니다 — IDA로 분석한 wavebuds.elf(2025년 4월)와 배포 패키지 2.9.0(2026년 9월) — 완전히 명세화된 8-스트림 OTA 컨테이너(바이트 단위로 동일한 재패키징으로 검증됨), 앱과 디바이스 양측에서 확인된 CRC-32 무결성 모델, 54/59개 항목의 팩토리 명령 테이블, 12개의 OTA RAM 상태 변수, 7,960개 함수 열거, 그리고 빌드 간 차이 분석을 포함합니다. 의미 복원은 OTA/플래시/CRC/팩토리 하위 시스템에 대해서는 심층적으로 이루어졌으며 그 외 영역은 열거 수준에 그칩니다 — 완전성 감사를 참조하세요.
[!WARNING] 이는 소유자가 직접 수행한 하드웨어 연구이며 공식 JBL 업데이트가 아닙니다. 수정된 이미지를 플래싱하는 것은 되돌릴 수 없습니다: 다운로드 단계는 단계적으로 진행되며 벽돌화에 안전하지만, CRC는 유효하나 손상된 이미지의 활성화에는 노출된 복구 경로가 없습니다. 무엇이든 재현하기 전에 SAFETY.md를 읽으세요.
튀르키예어 버전: README.tr.md

테스트된 기기에서의 하드웨어 결과: 앱 + 사용자 CA MITM OTA 파이프라인이 검증된 후, 양쪽 이어버드가 연결되고 100%를 보고하며 모든 앱 컨트롤(ANC/Ambient, 제스처, EQ)이 작동합니다. 1바이트 수정 이미지도 동일한 방식으로 수용되었고 기기는 완전히 정상 동작을 유지했습니다.
주소는 분석된 빌드(wavebuds.elf) 기준입니다. 주소 원장과 출처를 참조하세요.
0x2C0918BC는 설정, 각 세그먼트, 그리고 전체 이미지를 CRC-32 루틴 0x2C0CE944(테이블 0x2C0F5218)와 "BEST" 매직으로 검사합니다. 1바이트가 수정된 CRC 유효 이미지가 수용되어 부팅되었습니다.com.jbl.counterfeit.Rsa2048DynamicVerifier)는 위조 방지(디바이스 진위 확인)용이며, 펌웨어 서명용이 아닙니다.0x28120000에 복사되므로 다운로드 단계는 벽돌화에 안전합니다.0x2C0905E4: MEMORY[0x20026BA0] ∈ {2,4})에 의해 게이트됩니다.UNRESOLVED입니다.수정은 의도적으로 최소한입니다 — 압축 해제된 이미지의 1바이트입니다. 압축 해제 오프셋 64096에서 RTX 커널 문자열 RTX V5.5.1 → V5.5.2로 변경하고 컨테이너 CRC-32를 재계산합니다. 설계상 외관상의 변경입니다: 요점은 동작을 바꾸는 것이 아니라 디바이스가 수정되었으나 CRC가 유효한 이미지를 수용함을 증명하는 것입니다.
Base (owner-supplied; not redistributed)
official 2.9.0 package 549,558 bytes SHA-256 836cb251f9fb2261dde14f39ba18d358c48018817f3c3d1b527e1ac5f3ab7ba2
decompressed image 955,596 bytes SHA-256 489663e80b76f20f4c94671064908569fac5f4e3df10ab6d7369baffe094f67d
container CRC-32 A0C7CCEC (valid), input range [0x0, 0x862AD)
저장소에는 의도적으로 JBL 펌웨어가 포함되어 있지 않습니다. 직접 합법적으로 취득한 패키지를 제공하고 다음을 재현하십시오:
python3 tools/ota_unpack.py <official_2.9.0_package.bin> --extract image.bin
python3 tools/ota_repack.py make-test <official_2.9.0_package.bin> test.bin
python3 tools/ota_unpack.py test.bin # exactly one decompressed byte differs; CRC valid
재패킹된 컨테이너의 정확한 바이트는 LZMA 인코더에 따라 달라지며, 기기는 패키지 해시가 아닌 CRC-32를 검증합니다(docs/04 참조). 그리고 1바이트 압축 해제 차이는 결정적입니다. 앱을 통한 전달은 docs/08에 있습니다.
| 플래시 맵 | 2 MB NOR 파티셔닝 |
| OTA 명령 흐름 | 시퀀스와 그 CRC-32 체크포인트 |
| 신뢰 경계 | 각 단계가 검증하는 것, 그리고 이미지 신뢰가 어디에 있는지 |