OpenWrtなど純正ではないファームウェアをルーターにインストールする方法は機種によってやり方が様々ですが、
いくつかのパターンに分けられます。ここではその大体の流れを記述します。
だいたいはこのどれかのパターン単独か、複合的に組み合わせることでインストールやリカバリができると思います。
●ハードウェア無改造で行う方法
■Webインターフェースから書き換える方法
1)アップデート用ページから書き換える方法
純正Web-GUIのファームウェアアップデート用ページからそのままインストールする方法
一番手軽で簡単。
本来は純正ファームウェア以外はチェックされてインストールできないことが多いが、
解析され、メーカー純正に準じる構造に作られているファームウェアであればインストールできる。
この形式のファームウェアはOpenWrt界隈では『 Factory image 』とも呼称される。
2)デバッグ用ページから書き換える方法
通常では入れないデバッグ用ページからインストールする方法
デバッグ用ページへ入る際に特殊なIDとPasswordを必要とする場合もあり
本来やっている機種チェックなどを迂回して対応していないファームウェアをインストールできてしまうリスクあり。
例)Buffalo WZR-HP-AG300H/WZR-HP-G300シリーズ他
■ telnet/sshのCLIから書き換える方法
標準でtelnet/sshできる機種、デバッグページからtelnetを有効にできる機種の場合、
CLI経由で純正ファームウェアのOSにログインし、OSで用意された機能を使ってインストールできる機種もある。
例)NetGear R7800
純正ファームウェアのCLIから書き換える方法
純正ファームウェアのLinuxコンソールにアクセスし、コマンドを使ってインストールする方法
QSDKなどOpenWrtベースの純正ファームウェアではsysupgradeコマンドがそのまま使えることもある。
mtdコマンドやddコマンドなどでflashメモリに直接書き込む方法もある。
メーカー側で意図的にコマンドを無効にしている場合もありいつもできるとは限らない。
■ bootloaderの機能で書き換える方法
おもに家庭用ルーターの場合、出荷前にファームウェアを入れ替える場合に備えて
機器単体で書き換える仕組みを持ったものが多数ある。
その仕組みを解析して流用し、任意のファームウェアに書き換える方法。
bootloaderさえ起動すればインストールできるので、
他の方法でファームウェアインストールに失敗し、OS起動できない場合にも対応できる。
bootloaderの挙動はLED程度でしか反応を見ることができないため、成否がタイミングで決まりがちで
何度も試行錯誤して実施することになる場合が多い。
(後述するシリアルポート接続を行いbootloaderのコンソール表示を見ながら下記の方法を試すと成功率は上がる)
1)TFTP clientで送信する方法
電源ONとともに作業端末からTFTPクライアントを使って ファームウェアを送り込む方法
ルーターの電源ON後のわずかな時間だけTFTPサーバが起動してファームウェアを受け付ける機種がある。
起動時のIPアドレスは固定になっている。
むやみな書き換えを防ぐために、TFTPサーバ起動時は通常とは違う独自のMACアドレスでARPにも応答しない機種があり、
その場合は作業端末側ARPテーブルにスタティックに登録する必要がある。
2)Webブラウザで送信する方法
電源ONとともに作業端末からWebブラウザを使って
ルーターの電源ON後にbootloader内でHTTPサーバが起動してファームウェアを受け付ける機種がある。
起動時のIPアドレスは固定になっている。
通常のWebブラウザで端末からファームウェアを送り込むことが可能だが
インストール可能な時間が短いのでcURLなどのコマンドラインツールを使う方法もある。
3)外部サーバから受信する方法
1、2)とは逆に電源ON時に外部サーバからファームウェアを取得しようとする機種がある。
外部TFTPサーバに取得しに行く場合が多いが、NFS/HTTP/FTP などもありうる。
以前は外部から読み込んだら直接ファームウェアを書き換えてしまう場合もあったが
メモリが十分に増えた最近の機種では、
RAMディスク上で動く最小限の「踏み台OS」を起動させ、踏み台OS経由でファームウェアを書き込む場合が多い。
この踏み台OSのことをOpenWrt界隈では『 initramfs image 』 とも呼称される。
WPS/AOSSボタンを押下しながら電源ONした場合に取得しに行く場合が多い。
●筐体を開けて基板へのアクセスが必要
■シリアルコンソール接続で書き換える方法
基板上のシリアル(UART)ピンにUSB-UART変換アダプタなどを介してシリアル接続する。
基板上に最初からシリアルピンが実装されている場合、スルーホールだけの場合、チップから直接引き出す場合がある。
1)純正ファームウェアのCLIから
純正ファームウェアのLinuxコンソールにアクセスし、コマンドを使ってインストールする方法。
QSDKなどOpenWrtベースの純正ファームウェアではsysupgradeコマンドがそのまま使えることもある。
mtdコマンドやDDコマンドなどでflashメモリに直接書き込む方法もある。
メーカー側で意図的にコマンドを無効にしている場合もありいつもできるとは限らない。
シリアル経由で認証なしでrootプロンプトに入れる場合と、パスワードが必要な場合がある。
セキュリティ対策でkernelがboot完了するとコンソールは応答しないように作られているものもあり、その場合はこの方法は使えない。
2) bootloaderから
bootloaderにシリアルアクセスして書き換える方法。
u-bootやCFEなどのbootloader はflashメモリに書き込む方法を持っている場合がほとんど。
OSアップグレード用コマンドが用意されている場合はそれを利用し、
ない場合は基本的な メモリwrite コマンドで対応する場合がある。
OSではないbootloaderにどのようにファームウェアを転送するかが問題となるが、
以下のパターンがある。(bootloaderのbuild方法に依存)
・bootloader側でTFTPサーバなどを起動させ、端末からネットワーク経由で送信する方法。 例)
WZR-1166DHP2
・bootloaderからTFTP/FTP/HTTP等の外部サーバにファイルを取得しに行く方法 。例)WZR-HP-AG300H
WXR-2533DHP
・USBポートに挿したUSBメモリやメモリカードスロットからrawまたはファイルシステム経由で。 例) WXR-2533DHP
・端末からシリアルポート経由でxmodem 等のバイナリ転送プロトコルを使って送信する。 例)WHR-G54S等
■ 開発用ハードウェアを使う
IoT/組み込み開発用の機器を用いて書き換える方法。
bootloaderが起動できない場合や、bootloaderがシリアルコンソール操作を受け付けない場合にも任意のファームウェアを書き換えることがでる。
フラッシュメモリを直接操作するため確実性は高いが、PC以外に必要な機器・器具が必要でルータ本体よりもコストがかかる場合もある。
電子工作の基本的な知識やスキルは当然必要となる。
1)基板上のflashメモリに直接書き込む
フラッシュメモリライターを基板上のフラッシュメモリのピンに直接接続してファームウェアを書き込む。
OSやbootloaderの仕様に関係なく書き込んでしまえるので、bootloaderを壊してしまった場合も対応できる。
ピン数が8~16と少ないSPIフラッシュなどの場合はメモリクリップを使ってはんだ付けせずに書き込みができる。
例)WSR-1166DHP
(実例)(
Twitter)
NANDフラッシュのように表面実装+多ピンの場合は困難である。
基板上からフラッシュメモリを引き剥がしてフラッシュメモリライターで書き込んだあと、
再はんだ付けして戻す方法があるが、相当なノウハウと実装技術が必要となる。
フラッシュメモリライターは対応できるフラッシュメモリチップの型番や規格が決まっているので、基板上に実装されているものに対応できるものを準備する必要がある。
2)JTAGを使って書き込む
開発時に使うデバッグ用のJTAGポートが基板上にある機種があり、
ここにJTAGプローブと呼ばれる機器を接続し、機器のOSやbootloaderを介さずに
外部からフラッシュメモリを書き換える方法がある
基板上にJTAG用パターンが残されている機種は多いが、
アクセス方法がSoC型番/フラッシュメモリ型番/基板設計に依存するので
高い組込系開発ノウハウが求められる。
開発用の正規のJTAGプローブと専用ソフトは高額なうえ、
SoCメーカーから秘密保持契約の上で提供される公式のデータシートやマニュアルの情報が必要な場合もあり、
アマチュアが趣味の範囲で手を出すには難しい。
一方でBroadcom BRCM4704(mips)系やAtheros ath79(mips)系などやや古いSoCの場合、
解析が進み電子工作の延長で製作できる簡易版のプローブとurJTAGやOpen-OCD等のOSSなどで対応できる場合もある。
最終更新:2019年09月16日 09:53