去年我購買了一台 Rodecaster Duo,以解決一些音訊上的困擾,讓我和女友在同一個房間玩遊戲並在 Discord 上聊天時,各自的麥克風都能正常運作且沒有回音,同時也能輕鬆地切換到我的工作電腦。Rodecaster Duo 真的很棒,使用起來非常輕鬆,而且在家裡效果極佳。我會很樂意推薦給任何尋找類似解決方案的人。

一如我家中所有設備的慣例,我會確保在更新韌體時,我有足夠的工具來捕捉韌體更新的運作方式,或者至少能捕捉到韌體檔案,以便嘗試逆向工程、深入研究,並了解我們所處行業中經常令人震驚的現實。

我當時覺得有點懶惰,以為 Rode 會在更新前將韌體下載到我的電腦上,所以我設定了 macOS 的 Instruments 來捕捉磁碟活動,並找到了韌體被下載的位置,令人驚訝的是,它只是一個壓縮的 tarball。我進行更新的設備碰巧禁用了寫入 USB 磁碟的功能,所以更新實際上失敗了。

深入研究後,我發現了設備上實際運行的程式碼二進位檔,以及處理更新本身的 shell 腳本。磁碟上有兩個分割區,這樣如果一個損壞,它就可以從另一個啟動。它也沒有對進來的韌體進行任何簽章檢查。我習慣了許多這類設備的供應商現在都會要求簽章韌體,很高興能真正擁有一台我可以修改的設備。我還注意到 SSH 似乎預設是啟用的,插上乙太網路線後,我發現 SSH 確實啟用,並且僅支援公鑰驗證。以下是預設添加的密鑰:

由於我的更新失敗了,我換到了一台 Windows 電腦,設定了 Wireshark 和 USBPcap,然後透過 Rodecaster App 進行更新。我大致瀏覽了 pcap 文件,並查看了更新開始的位置,因為當時我還將它用於另一台電腦的音訊,所以流量很大。我記下了我認為有趣的封包號碼,並將它們交給 Claude Code 處理,以便在我做其他事情時,它能深入分析 pcap。

過了一會兒(Claude 只花了 10 分鐘左右,但我忙了一段時間),我回來時得到了一個結構分析,以及一個用於手動更新設備的 Python 腳本。RODCaster App 會向設備發送一些 HID 控制指令,一個指令('M' 指令)用於進入更新模式,然後另一個指令('U' 指令)用於觸發更新。兩者都只是透過 HID 報告 1 發送的單個 ASCII 字元。

我只是一個寫 YAML 的奴隸,有時也是一個平均以下的 Ghidra 使用者,很少與硬體設備互動,所以從 Claude 那裡獲得一些發現上的幫助很有用,同時也為我指明了學習 HID 設備的資源。

結構非常簡單,你發送 'm' 指令,然後將 archive.tar.gz 和 archive.md5(顯然只是 archive 的 md5sum)複製到新暴露的磁碟上。然後發送 'U' 指令來觸發刷機。

我還在用我的 Mac 工作,並想創建一些自訂韌體(cfw)來 SSH 進入設備,所以我使用了一個容器來啟用密碼驗證(別罵我),並將我自己的公鑰添加到授權密鑰中,然後導出一個供我刷機的歸檔。你實際上不需要太多東西就能刷機,看這裡(函數範例,實際上並沒有添加太多東西)。

運行你的腳本來刷機,然後你就可以 SSH 到它了。

我真的很驚訝我能如此輕鬆地刷機,而且能擁有一台這樣的設備真的很棒。它是一個非常好的設備,而且幾乎融入背景,我從不需要去想它。我不太清楚為什麼 SSH 會被啟用,或者為什麼預設會添加這個密鑰,但我已經提交了一個工單給 RODE,因為我找不到一個明顯的安全電子郵件來報告。我沒有收到回覆,但我會觀察未來的韌體更新是否會有所改變。

自從我處理這件事以來已經過去幾個月了,我正試圖將我的想法寫在筆記本上,只做非常輕微的編輯,然後就發布。我真的很喜歡我擁有的所有 RODE 產品,並且又一次想購買更多設備。

如果你想問我關於這個的問題,或者有任何疑問,你可以透過這個域名的主要字母,在這個域名聯繫我。