- サーモン島 lrks 著
- JBL SoundGearのシステム音がうるさい
- SPI ProgrammerでFWを書き換えられる
- システム音のファイルを編集して静かにしてみた
- JBL SoundGearを買いました
- 購入後、急に安売りしだしたような…
- この方法が広まり、値段が上がることを願う
- レビューによれば、起動時の音が大きいらしい
- 神経質な人も居るなぁと思った
- 本当に大きかった
- システムサウンド全般の音が大きい
- 起動時の音はまだマシ、LowBatteryのときの音は緊急速報のアラーム音レベル
- これは最大音量で鳴らしている?出荷前検査か何かでMAXどのぐらい出るか確認している?
- そんなことしなくていいから
- ファームウェアを更新すると音を小さくできるらしい
- すでに最新版だった
- ファームウェア書き換えか何かでなんとか音を小さくできないか?
- JBL製品のReverse engineeringをやっている人がいる
- Reverse-engineering JBL flip 4 | Hackaday.io
- JBL flip 4 のファームウェアダンプや"PS_KEY"など。
- PS_KEY というのを書き換えれば起動音を消せるらしい
- システム音のテーブルがあり、その中身をゼロにする
- JBL flip 4 にはCSR(Qualcomm)のSoCが使われている
- Dnstje/JBL-Charge-3-firmware: JBL Charge 3 Bluetooth speaker firmware stuff.
- JBL Charge 3 のファームウェアダンプなど。
- ここでもCSRのSoCが使われている
- Reverse-engineering JBL flip 4 | Hackaday.io
- SoundGearでの情報は見つからなかったが、参考にしていろいろやってみる
- SoundGearもCSRのSoCが入っている?
- JBLが公開しているファームウェア更新ツールを見てみる
- http://support.harman-japan.co.jp/update/SOUNDGEAR_update.php
- 同梱されている
HidDfu.dll
のプロパティに「CSR」「Cambridge Silicon Radio」の文字が見える - たまたま同梱されただけかもなので絶対とはいえないが、たぶんCSRのSoCが入っているんじゃないでしょうか
- CSRは「BlueSuite」というユーティリティツールを提供している
- SoCと通信して、ATコマンドを発行できたり、"PS_KEY"を見れたり、Flashを読み書きできる
- (出どころが怪しいが)その辺のGoogle driveから手に入る
- "PS_KEY" を見てみる
- PS_KEY: 設定のパラメータかなにか
- HID DFUモードにする
- (JBLのファームウェア更新手順と同様に)PCとSoundGearをUSBケーブルを繋いで、Vol.UP と Bluetoothボタン を同時に5秒長押し
- ただのDFUモードでも良い
- 何かと何かのボタンを15秒くらい長押しする
- 必要なかったので具体的なボタンは忘れた、必要になっても5C2通り試せばいい
- PSToolなどで見る
- 面白いものは見つけられなかった
- Flashを読み書きしてみる
- USB経由ではできなかった
- 失敗編 ← ネタバレ
- JBLのFW更新ツールでは、更新ファイルをインターネットからダウンロードしてくる
- Fiddlerで確認
- HTTPだったので楽
- 中身を見る
- JBL flip 4(とJBL Charge 3)ではファームウェアダンプをAudacityなどで開くとシステムサウンドが聞ける
- Analyzing the firmware... using Audacity =0 | Details | Hackaday.io
-
signed 16-bit pcm, big-endian, 1 channel, 16k sample rate.
- SoundGearの更新ファイルでもやってみる
- 確かにシステムサウンドが聞ける
- この音量を小さく変えて、FW更新ファイルを作ってしまえば良いんじゃないか
- ファイル構造もみる
- ヘッダは
csr-dfu2
- あまり情報がない
- JBL Charge 3 の人が何か聞いているが未解決
- firmware - CSR DFU File Format - Reverse Engineering Stack Exchange
csr-dfu1
だと「BlueCore01」のファイルらしいcsr-dfu2
で変わっているところも結構あるが、フッターの手前でチェックサム(CRC)が入るところは同じっぽい- http://read.pudn.com/downloads330/sourcecode/embedded/1450690/AN092.pdf
- bluezのdfutoolユーティリティでチェックサムが合うか確認もできる
- https://github.com/heinervdm/bluez/blob/master/tools/dfutool.c
- 文字エンコーディングをUTF-16にして眺めると、
なんとか.kap
とかそんなのが見える - それで調べると更新ファイルを作成する手順が出てきた
- CSR8670的DFU功能_网络_wzz4420381的博客-CSDN博客
- "signed" "private.key" など不穏なワードが見える、無理じゃないか
- ヘッダは
- システム音の部分を1byteだけ変えた更新ファイルを作る
- チェックサムも計算して変える
- BlueSuite付属ツールでFWを更新してみる
- うまくいかない…
- JBL提供の更新ツールでやってみる
- mitmproxyで改変した更新ファイルを配信する
- ハネられる…
- チェックサムを誤ったものにすると即ハネられる、でもチェックサムを正しくするとしばらくかかってハネられるのでやはりsignedとかそういう系な気がする
- システム音は平文で見えるので、どこかに署名付きのチェックサムがある?
- 場所がわからない
- 分かったとして、チェックサムが数Byteだったとしてもブルートフォースするには手間がかかりすぎる
- CSRの(一部?)SoCにはSPI経由でアクセスできる
- ファームウェアの読み書き可能
- 通常は専用プログラマが必要、ただしFTDIのモジュールからアクセスできるような実装がある
- まずは適当なデバイスでやってみる
- TT-BA09(Bluetooth トランスミッター レシーバー)があった
- 中にはCSR8670が入っている、そして基板には
I
とかO
とかK
とかそれっぽいシルク印刷と共にテストパッドがある - csr-spi-ftdiのセットアップをして、繋いでみる
- 何も反応しないが……
- それはさておき、SoundGearでもやってみる
- どう分解する?
- ちょっと眺めてみる
- アンプはTPA3128D2が使われていた
- Gainは26db(R1=20k, R2=100k)
- (もう少し小さくしていてくれればこんな苦労はせずに済んだのに…とはいえデータシートに記載があるのは20dbまでなので大して変わらない気もするが)
- 電源ボタンの近くにテストパッドがあった
- G ... たぶんGND
- CLK ... 間違いなく絶対100%CLK
- MI ... たぶんMISO
- CS ... たぶんCSB
- MO ... たぶんMOSI
- B+ ... BIAS?バッテリー?外部入力にも使える?電源入れて測ったら3.3V出ていたので、一応FT232のVIOは3.3Vにしておく
- 繋いだら普通に通信できた
C:\Program Files (x86)\CSR\BlueSuite 2.6.6>BlueFlashCmd.exe -identify blueflashcmd, version 2.6.6.1311 Release Copyright (c) 2002-2017 Qualcomm Technologies International, Ltd. All Rights Reserved. Qualcomm Technologies International, Ltd. Confidential and Proprietary. 15:34:07.165000: all:spi.c:558:spi_init: csr-spi-ftdi 0.5.3, git rev 80b2ad0 Resetting XAP Identifying XAP Flash identity: size = 251 sectors (15.6875 Mbit), man_id = 0x0000, dev_id = 0x0000 Firmware ID (loader)="rck_16unified_fl_bt4.2_28a1_1601111356_ble_encr128 2016-01-11" Firmware ID (stack)="rck_16unified_fl_bt4.2_28a1_1601111356_ble_encr128 2016-01-11" Result: Usable flash size: 251 sectors, 15.6875 megabit. *** FTDI Statistics ******************************************************** csr-spi-ftdi version: 0.5.3 (git rev 80b2ad0) Time open: 2.80 s Time in xfer: 2.56 s (91.54% of open time) Reads: 357 (9786 bytes, 27.41 bytes avg read size) Writes: 412 (8526 bytes, 20.69 bytes avg write size) Xfer data rate: 6.97 KB/s (18312 bytes in 2.56 s) IOPS: 299.00 IO/s (769 IOs in 2.56 s) FTDI chip: FT232R (3), buffer size: 384 bytes FTDI stats: 888.00 xfers/s (63.00 short reads/s, 2280 xfers/164 short reads in 2.56 s, 2.00 xfers/IO, 259.00 bytes/xfer) SPI max clock: 1000 kHz, min clock: 1000 kHz, slowdowns: 0 **************************************************************************** Success
- FWをダンプしてみる
- 変なテキストフォーマットで出てくる
@000000 5343 @000001 6252 @000002 6663 @000003 3177
- Binaryにする
- この辺 をそのまま使う
- システムサウンド部分を1Byteだけ変える
- 変なテキストフォーマットにする
import os import sys def toraw(filename): with open(filename, 'r') as x_file: with open(filename + '.bin', 'wb') as b_file: for line in x_file: if len(line)<4: continue addr, str_hex_val = line.split(' ') b_file.write(bytearray([ int(str_hex_val[2:4], 16), int(str_hex_val[0:2], 16) ])) def tofw(filename): line = 0 with open(filename, 'rb') as b_file: with open(filename + '.fw', 'w') as x_file: while True: b1 = b_file.read(1) if len(b1) != 1: break b2 = b_file.read(1) if len(b2) == 0: data = '{:02x}'.format(ord(b1)) else: data = '{:04x}'.format((ord(b2) << 8) | ord(b1)) x_file.write('@{:06x} {}\r\n'.format(line, data)) line += 1 if __name__ == '__main__': cmd = sys.argv[1] filename = sys.argv[2] if cmd == 'raw': toraw(filename) elif cmd == 'fw': tofw(filename)
- FWを書く
- いけるやん!
- こっちでは署名は要らない?ようだ
- 手順をまとめる
- BlueSuiteをインストールする
- https://github.com/lorf/csr-spi-ftdi を使えるようにする
- FWをダンプする
- Binaryに変換する
- システムサウンドを小さくする
- AudacityではRawファイルのexportに難があるので、wavosaurがおすすめ
- wavosaurでFWを開いてシステムサウンド部分のVolumeを小さく(かなり小さくしても聞こえる)して、そのままexport
- FWの一部をexportしたデータで置き換え
- 下記は置き換え範囲の例(
システムサウンド, 開始位置, 終了位置
)
('pairing_complete.raw', 796163, 813013)
('shutdown.raw', 824677, 857931)
('wakeup.raw', 866975, 925525)
('ringtone.raw', 1302529, 1375941)
('low_battery.raw', 1585841, 1609335)
('disconnect.raw', 1618595, 1627967)
('pairing_waiting.raw', 1695313, 1914913)
- 元のFW形式に変換
- FWを書き込む
- 返品しようと思ったけど解決できてよかったです
申し訳ないが駆逐艦を君付けで呼ぶのはNG