PF-50WG ファームの展開と再構築


こちらの2010/7/5記事に、ファームバイナリの解析結果がある。ファイルシステムはSquashFSで圧縮されたイメージになっている。
というわけで、ファームからファイルシステムを取り出す方法と、逆にファイルシステムからファームバイナリを構築する方法。

下準備

  1. Linux環境を用意する。今回は、VMWare上に Ubuntu 10.4 をインストールした。
  2. 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に刺してファームアップデートを実行する。

カテゴリー: PF-50WG タグ: , パーマリンク