電動キックボードをリバースエンジニアリングしてRustでファームウェアを書き直してみた
Reverse engineering my e-scooter and rewriting the firmware in Rust
Reverse engineering my e-scooter and rewriting the firmware in Rust
愛用の電動キックボードを分解・解析し、そのファームウェアをRustで一から再構築するという野心的なプロジェクトに取り組みました。低レイヤーのハッキングから安全なメモリ管理まで、Rustを採用することで得られたメリットや、独自実装の過程で直面した技術的課題について共有します。
投稿してくれてありがとう!自分もこの春に電動キックボードを手に入れて、公式アプリとBLEログをリバースエンジニアリングした後に自作アプリを作ってみたよ。ただ、ファームウェアをいじるのはまだ勇気が出ないんだよね。少なくとも、今はまだね。
自分もハードウェアのRust化を進めてるところ。先週はマウス、今週はEUC(応援してくれ)。メモリ破壊に悩まされるよりは、クラッシュするリスクを取るほうがマシだよ。
信じられないくらい素晴らしいプロジェクトだし、解説記事も最高で読んでてスッキリした。UIにSlint [1] を使うことは検討しなかったのかな?buoyant(これもかなりクールだけど)で抱えていたコード生成の肥大化問題もあったし。どっちも使ったことはないんだけど、Embassyでいくつかプロジェクトをやった経験から、組み込みGUIツールを試す言い訳をいつも探してるんだ。
キックボードのファームウェアをRustで書き直すなんて、まさに僕がここに求めていた「無駄に突き抜けた技術力」ってやつだ。どうやって文鎮化させずにデバッグしたの?SWDプローブを使ったのか、それとも純粋な信仰心で乗り切ったのか教えて。
Boschのシステムは解放されるべきだよね。OSSのライブラリをたくさん使っておきながら、供給チェーン全体(予備バッテリーとか)をロックして、他社の外付けバッテリーを使えないようにしてるのは問題だよ。
驚いたことに、USB-Cピンのうち2本がCANバスとして使われていた(規格違反もいいところだ)。
うわ、マジかよ最低だな。正気な人間がそんなことするわけないだろ。
こういうリバースエンジニアリングは自分には黒魔術に見えるよ。記事はすごくいいね。詳細で、自分には到底真似できないような内容だけど、何をしているのか理解しながら読めた。著者さん、お疲れ様。導入の2番目の項目が気に入ったよ。
とても良い記事だけど、Rustで直面した肥大化の問題について質問がある。なぜ型名の長さがバイナリサイズを大きくするんだろう?Rustは実行時に型名を参照しているの?もしそうでないなら、C++みたいにストリップできないものなの?
あと、USB-Cコネクタをやりたい放題に使ってるのは面白いね。USB-Cは安くて信頼性も高いから、ある意味理にかなってるのかも。
これは純粋にすごくクールだ。素晴らしい成果と記事だよ。
何でもRustで書き直すのは、何でもDoomを動かそうとするのと似てるな。