こちらの2010/7/5記事に、ファームバイナリの解析結果がある。ファイルシステムはSquashFSで圧縮されたイメージになっている。
というわけで、ファームからファイルシステムを取り出す方法と、逆にファイルシステムからファームバイナリを構築する方法。
下準備
- Linux環境を用意する。今回は、VMWare上に Ubuntu 10.4 をインストールした。
- Ubuntu10.4標準のsquashfs-toolsは4.0だが、ファーム内のファイルシステムは3.0で作られているので、squashfs-3.0 をインストールする必要がある。
SquashFSの公式サイトから squashfs3.0.tar.gz をダウンロードし、
squashfs3.0.tar.gz 内のsquashfs-toolsをコンパイル・インストールする。$ sudo aptitude install zlib1g-devel $ sudo aptitude install libncurses5-dev $ tar zxf squashfs3.0.tar.gz $ cd squashfs3.0/squashfs-tools $ make (略) $ sudo cp -p mksquashfs /usr/local/bin/mksquashfs3 $ sudo cp -p unsquashfs /usr/local/bin/unsquashfs3
ファームの展開
メモリマップは下記の通り。
000000~10DBBF ブートローダ 10DBC0~2407FF gzipped linux kernel 240800~242FFF gzipされたよくわからないバイナリファイル 243000~2FFFFF gzipされたバッファロのロゴのjpgファイル 300000~BBEFFF ファイルシステムのイメージ BBF000~BBF07F チェックサム(BBF022~BBF041がMD5のASCII表記)
これを元にファームの分解を行う。以下は、展開を行うスクリプト extract.sh
#!/bin/sh dd if=zImage_PF160_2.06.2009-05-08.bin of=1_header.img bs=1 count=3145728 dd if=zImage_PF160_2.06.2009-05-08.bin of=2_fs.img bs=1 skip=3145728 count=9170944 dd if=zImage_PF160_2.06.2009-05-08.bin of=3_checksum_header.img bs=1 skip=12316672 count=34 dd if=zImage_PF160_2.06.2009-05-08.bin of=4_checksum_md5.img bs=1 skip=12316706 count=33 dd if=zImage_PF160_2.06.2009-05-08.bin of=5_checksum_footer.img bs=1 skip=12316739 count=61 sudo unsquashfs3 2_fs.img
このスクリプトを実行することにより、squashfs-root ディレクトリが作成され、その下にファイル群が展開される。
ファームの再構築
以下、元のファームに復元するスクリプト generate.sh
#!/bin/sh sudo mksquashfs3 squashfs-root 2_fs.img -noI sudo chmod og+r 2_fs.img fs_require_size=9170944 fs_real_size=`cat 2_fs.img | wc -c` fs_padding_size=`expr $fs_require_size - $fs_real_size` dd if=/dev/zero of=2_fs_padding.img bs=1 count=$fs_padding_size cat 1_header.img 2_fs.img 2_fs_padding.img| md5sum | sed -e 's/ .*$//' > 4_checksum_md5.img cat 1_header.img 2_fs.img 2_fs_padding.img 3_checksum_header.img 4_checksum_md5.img 5_checksum_footer.img > zImage_PF160_2.06.`date +%Y-%m-%d`.bin
このスクリプトを実行すると、「zImage_PF160_2.06.2010-09-18.bin」のように、末尾をを実行時の日付にしたファイル名で、ファームウェアのファイルが生成される。
インストール
出来たファームファイルをUSBメモリにコピーし、そのUSBメモリをPF-50WGに刺してファームアップデートを実行する。