
TeraStation で遊ぼう - ファームウェアいじり
2005.02.18 更新
[TeraStation で遊ぼう - TOP /
ファームウェア情報]
■firmimg.bin いじりツール
- ソースコード → firmimgtool.c
- 無保証。GPL には染まっていないつもり。再利用はご自由に。でも非常に汚い。
- RedHat Linux 8.0 (i386), MontaVista Linux 3.3.1 (ppc), FreeBSD 4.10-STABLE
(i386), Solaris 8 (sparc) でのコンパイル・実行を確認。Endian 自動判別。
- 使用法: firmimgtool [-icmkrfh] <firmimg_filename>
- -i : firmware ファイル情報の表示 (default)
- -c : firmware ファイルから kernel, initrd イメージを切り出し
- -m : kernel, initrd イメージから firmware ファイルを組み立て
- -k <filename> : kernel イメージのファイル名 (gzipped)
- -r <filename> : initrd イメージのファイル名 (gzipped)
- -f <filename> : -m オプション指定時、ヘッダ情報を切り出すファイル名
(chksum および offset, size 等は自動的に計算)
- -h : ヘルプメッセージの表示
- 実行例
- ./firmimgtool firmimg.bin
firming.bin のファイル情報を表示
- ./firmimgtool -c -k kernel.gz -r initrd.gz firmimg.bin.103
firming.bin.103 ファイルから kernel, initrd イメージを切り出し
- ./firmimgtool -m -k kernel_mod.gz -r initrd_mod.gz firmimg.bin
-f firmimg.bin.103
kernel_mod.gz, initrd_mod.gz の各イメージから firmimg.bin
ファイルを組み立て, その際のヘッダ情報は firmimg.bin.103 から抽出
■in.telnetd を仕込む
アップデータで書き込まれる firmimg.bin ファイルに細工して、in.telnetd と
その他ちょっとした設定を仕込んでみる。
0.前提条件
- ext2 filesystem のイメージファイルがマウント可能であること
- firmimgtool, gzip 等が実行可能であること
- バージョン 1.02β および 1.04a (Link de 録!! 1.20) で確認
- イメージファイルの編集作業は TeraStation 上で実行した
- 非常に危険な行為であることを認識の上で作業すること
1.イメージファイルの取り出し
- アップデータの手順書に従い、firmimg.bin ファイルを取得。そのファイルを
上記firmimgtoolで分解。
./firmimgtool -ck kernel.gz -r initrd.gz firmimg.bin
gzip -d initrd.gz
として、initrd (ramdisk イメージ)を取り出す。
2.イメージファイルのマウント
- 取り出したイメージをマウント。マウント先ディレクトリを ./mnt と
して、Linux なら
mount -o loop initrd ./mnt
FreeBSD ならvnconfig -c /dev/vn0 initrd
mount_ext2fs /dev/vn0 ./mnt
等と実行。
3.イメージファイルを細工
- rpm コレクションから telnet-server-0.17.x-30vl1.ppc.rpm を取得し、
in.telnetd をコピーしてイメージに組み込み。
rpm2cpio *RPMDIR*/telnet-server-0.17.x-30vl1.ppc.rpm |\
(cd ./mnt; cpio -iv ./usr/sbin/in.telnetd)
- 続いて、アップデート完了時に HDD 内のシステムにトラップを仕込むため、
下記のファイルを ./mnt/etc/rc.d/rc6.d/S20hackset として転送。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
echo -n "Setting something hacking... "
if [ -f /usr/sbin/in.telnetd ]; then
[ ! -d /mnt/array1/usr/sbin ] && mkdir -p /mnt/array1/usr/sbin
/bin/cp /usr/sbin/in.telnetd /mnt/array1/usr/sbin/
fi
echo 'admin ALL = (ALL) ALL' > /mnt/array1/etc/sudoers
chmod 440 /mnt/array1/etc/sudoers
echo 'telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd' \
>> /mnt/array1/etc/inetd.conf
echo "done."
4.イメージファイルの書き戻し
- アンマウント。
umount ./mnt
vnconfig -u /dev/vn0 ……(FreeBSD の場合のみ)
- 再圧縮。
gzip -9 initrd
- 再結合。
./firmimgtool -imk kernel.gz -r initrd.gz -f firmimg.bin firmimg.bin.new
- 結合時、'Firmware size overflow'のエラーが出たら失敗。イメージファイルの
容量を減らすべく努力する。:-)
- 念のため、firmimg.bin.new のヘッダ部が正常かどうかを、元の firmimg.bin と
firmimgtool -iの表示結果を比較する等して確認しておく。全体の
firmsize, checksum と、initrd の size の項は変わっていて当然である。
- なお、1.04a (Link de録!! 1.20) の allimage.bin ファイルをベースに作業する
場合、上記に追加して、作成した firmimg.bin を allimage.bin 形式に変換する
作業も必要。例えば、新イメージのファイルサイズを*SIZE*として、以下の
ように作業。
tail -c `expr 4194304 - *SIZE*` allimage.bin |\
cat firmimg.bin.new - > allimage.bin.new
5.ファームウェアの書き込み
- 作成したイメージファイルを firmimg.bin の名前で Windows 上でアップデータを
展開したディレクトリに戻し、アップデートを実行。
-
既にファームのバージョンが上がっていると Flash ROM を上書きしてくれないので、
"HD-HTGL FWUpdate.exe" を /FORCE オプション付きで起動する。
6.確認
- admin ユーザで TeraStation に telnet できることを確認。
- ログイン後、sudo bash で root になれることも確認。
- telnet のポートを塞ぎたい人はopenssh のインストールに進んだ後、/etc/inted.confから in.telnetd の記述を削除。