
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」暗号化トランスポート、デバイス側とアプリ側の信頼境界、ファクトリーコンソール、そして所有する個体に自作イメージを書き込むための再現可能な手法。
分析は 2 つのビルドにまたがる — 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/アンビエント、ジェスチャー、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 チェックポイント |
| 信頼境界 | 各ステージが検証する内容と、イメージの信頼がどこに依存するか |