DD-WRTとかZRouterでルーターのファームを書き換えた後に、何らかの事情で元に戻したい場合があるかもしれません。猛牛さんのルーターを戻してみたので、そのやり方を書いてみます。私はFreeBSDで操作してますが、おそらくLinuxでも同じようにできるのではないかと思います。
とりあえずメーカーのサイトからファームをダウンロードして展開しておきます。
u-boot編
猛牛さん仕様のフォーマットはブロックがstartで始まるようなのでまずその間所を確認します。
% strings -t d wzr2g300n_155 | grep start
156 start
509264 start
この場合、一つ目がLinuxカーネルで二つ目がrootfsです。
まずカーネルを抜き出してみます。buffalo-encというツールを使います。抜き出し開始位置は上で調べた値+1になります。
% tail -c+157 wzr2g300n_155 > kernel.org
% ./buffalo-enc -d -i kernel.org -o kernel.bin
Magic : 'start'
Seed : 0x6e
Product : 'WZR2-G300N'
Version : '1.55'
Data len : 509069
Checksum : 0x511e7aa0
startの位置からデータを抜き出して、それをbuffalo-encで変換します。後ろにrootfsが付いていますが、それは変換しないようです。
encriptのキーはデフォルトはBuffaloになっていますが、モデルによっては別のものになっていて、展開できない事があります。
[buffalo-enc] *** error: unable to decrypt
続いてrootfsを戻してみます。
% tail -c+509265 wzr2g300n_155 > rootfs.org
% ./buffalo-enc -d -i rootfs.org -o rootfs.bin
Magic : 'start'
Seed : 0x6e
Product : 'WZR2-G300N'
Version : '1.55'
Data len : 1867776
Checksum : 0x0d76fc1d
カーネルとrootfsをつなげたものがイメージになるのですが、カーネルの最後の方にはFlashのブロックサイズに合わせてパディングされています。
パディングされたlinuxのパティションのサイズが分からなければ、一度kernel.binをメモリに貼り付けて起動してログを確認してみます。
Creating 7 MTD partitions on "5VT13XX_mapped_flash":
0x00000000-0x0000e000 : "uboot"
0x0000e000-0x00010000 : "uboot_environ"
0x00010000-0x000c0000 : "linux"
0x000c0000-0x003d0000 : "rootfs"
0x003d0000-0x003e0000 : "user_property"
0x003e0000-0x003f0000 : "factory_default"
0x003f0000-0x00400000 : "nvram"
たまにu-bootの環境変数にパーティションのデータが入っているケースもありますが、間違っている場合もかなりあります。
このターゲットではlinuxパーティションは704K(0xb0000)とってあるので、カーネルファイルをその大きさに変えます。
% dd if=kernel.bin of=kernel.sync bs=704k conv=sync
これでカーネルとrootfsをひっつけて出来上がりです。
% cat kernel.sync rootfs.bin > original.img
% file original.img
original.img: u-boot legacy uImage, Linux-2.4.20_mvl31-5VT9000-MPW1, Linux/ARM, OS Kernel Image (lzma), 509005 bytes, Wed Dec 9 09:41:56 2009, Load Address: 0x40008000, Entry Point: 0x40008000, Header CRC: 0x6027AB9F, Data CRC: 0xEF277621
original.imgをu-bootで焼けば元通りです。
CFE編
Broadcomの初期のSOCを使ったモデルを戻してみました。このターゲットはCFEというブトローダーを使用しています。メーカーからダウンロードできるfirmwareは以下のようなヘッダーが付いています。
$ hexdump -c wbrbg_223.dms
0000000 W B R - B 1 1 2 . 2 3 1 . 0
0000010 1 _ K o p t \n f i l e l e n = 3
0000020 1 0 0 6 7 2 \n H D R 0 \0 P / \0 ?
これを落としてHDRから始まるCFEのTRXといわれる形式にします。
$ dd if=wbrbg_223.dms of=wbr.trx bs=1 skip=39
これをこの方法で焼くと元に戻ります。