BBR-4MG::ファームウェア改造
シリアルポート経由でファームウェアをアップロードできるようになったので,多少のトラブルなら怖くありません.そこで,少しファームウェアを解析して弄ってみることにしました.
注意
現在,ファームウェアをダウンロードしようとすると,解析等を禁止するラインセンスが表示されるようになってます.ダウンロードした場合,それに同意したこととなりますので,そのファームウェアの解析・改造等は契約上できません.
よって,細かいことは古いファームウェアについてしか分からないので,参考程度に留めてください.
…Webインターフェイスからの自動更新を使った場合は同意しなくてもダウンロードできそうなので,一旦新しいファームウェアをダウンロードさせて,Linuxを動かして読み出せば……って,これはグレーゾーンでしょうか.
ツール
PFS.IMGを書き換えたり,zipで固めたPFS.IMGをファームウェアに埋め込むツールを置いておきます.あまりデバッグしてないので危険なソフトですので,注意してください.pfsedit.zipもルータに入れようとしたら,サイズが大きすぎたのかルータがエラー吐きました(汗).ファームウェアからzipファイルを抜き出したり,PFS.IMGからファイルを取り出すことも出来ます.
Download: pfsedit.zip
- Ver 0.1.2(04.10.19)
- ファイルを追加するボタンを追加
- PFS.IMG単体で開けるように
- PFS.IMG内のファイルを全て保存できるように
- その都合でサンプルのwwwをmywwwに変更
覚え書き
- ファームウェアはWeb:256KB,コード512KBの2パートになっている
- それぞれのパートはZIPで圧縮
- ZIPの圧縮レベルによっては起動に失敗するかも(…気のせいっぽい)
- それぞれのパートの最後にサイズやチェックサムが書いてあるが,チェックサムは無視してもOK
- PFS.IMGのサイズが851968(0xd0000)byteを超えると内容が壊れる
- ログイン前に読めるファイル: login.stm,loginpserr.stm,cgi-bin/login.exe,images/*,*.xml まだあるかも.
- 起動しなくなったらシリアルからファームを書き込むしかない?
- シリアル経由だとSOHO.BINとPFS.IMGをそれぞれzipで固めたものをそのまま書き込める
SOHO.BIN
こちらも,少し解析すれば改造できると思います.
- MIPS用の逆アセンブラで逆アセンブルできます
- バイトオーダーはリトルエンディアン
- ファイル先頭からプログラムが始まっています
- 動作中は0x80001000から始まるメモリに配置されます
メモが残っていて名前が付けられている関数だけですが,大体どの辺りに何の関数があるかの一覧です.ほんの極一部ですが,ファームウェアの一部を書き換えて,試しに関数を呼んだりしても面白いかも知れません.
80001000 EntryPoint 800015D0 get_pc() 800015DC find_file(a0:path)? 80004254 sprintf(s,format,...)? 8000477c sio_printf(format,...) 80005424 toupper? 80005440 toupper(a0) 8000545C tolower(a0) 80005478 strcpy() 800054D4 nstrcpy(a0,a1,a2) 8000555C strlen(a0) 80005594 strchr(a1,a0) 800057D0 strcmp(a0,a1) 80005B58 strcmp2(a0,a1) 80005C54 strcat(a0,a1) 800066B8 sio_putchar() 80006700 sio_inputchar() 80006724 sio_chekinput() 80006740 sio_chekinput2() 80009194 main() 80032c3c initialize_data_area()! 80034538 SaveConfig() 800512d4 SHA1_Update(sha,dat,size)?? 80066804 GetCGIAddr(a0,a1) 80068054 GetPath() 800688DC GetFileInfo(a0,a1) 80074784 FindFlash() 80074D8C EraseFlash() 800754E4 WriteFlash() 80075908 OverWriteFlash(1,dst,size) 800A07E0 login.exe(a0,a1,a3=soc?) 800C59E4 wan_network.exe 800d6f60 fprintf(f,format,...)
不思議なものでニーモニックをジーっと眺めていると,Cの関数名が見えてきます(人間としてどうかと思いますが…).
フラッシュメモリ
フラッシュメモリは0x1fc00000あたりにあるみたいです.
- 使われているチップはAM29LV160DBでした
- 内容は0xbfc00000から2MBの範囲にマップされています
- 0x9fc00000からも同じ内容が読めるようです
- 書き込むには,何か色々しないと駄目っぽい
シリアルポート
シリアルポートは0xb2600000辺りのアドレスに割り当てられてます.
- 0xb2600000を読み書きすることで,入出力が出来るようです.
- 0xb2600018にシリアルポートの状態が入っています.
- 0x20のビットが立っていれば送信バッファが一杯?
- 0x10のビットが立っているとき受信バッファが空?
bank 3からプログラムを読み込んだ後のABCDEF…という文字列は,SOHO.BINの先頭で一文字ずつ出力しています.このあたりを見ながら書けば,Hello worldくらいのプログラムはすぐに書けるでしょう(^^;.
ちょっと文字を入出力するプログラムを書いて遊んでみましたが,それ以上のことはやってません.
AM5120
ADM5120のメモリマップが書いてある文書がネット上に見当たらないのですが,探し方が悪いのかな….どうも,USBのホストコントローラまで内臓してそうなんですが….どうなんでしょう.
(追記)…データシートが公開されているようです.ADM5120で動くLinuxのソースもあります.これでもう解析しなくて済みます.
静かに動くWebサーバ
ファームウェアをちょっといじってWebサーバにしてみました.login画面を入れ替えただけで,プログラム領域は書き換えていません(^^;.
半田ごて使って簡単な回路が組めて,バイナリエディタが使える人ならそんなに難しくないと思いますが,くれぐれも気をつけてやってください.難しいと思ったら,やらないで下さい.
この文書の履歴
- 2005-09-27 分離