タグ: header

WRC-1167FS fwhandleコマンドメモ

メーカーファームウェアにて、投入されたファームウェアのdecodeを行う fwhandle コマンドのメモ。

/tmp # tftp -r wrc-1167fs_v1.03.bin 192.168.1.133 -g
wrc-1167fs_v1.03.bin 100% |*******************************|  6080k  0:00:00 ETA
/tmp # ls -alh
drwxrwxrwx    3 root     root           0 Sep 14 22:38 .
drwxr-xr-x   17 root     root           0 Sep 14 22:38 ..
-rw-r--r--    1 root     root           5 Sep 14 22:36 dhcpc.lease
-rw-r--r--    1 root     root           3 Sep 14 22:36 dns.suffix
drwxr-xr-x    5 root     root           0 Jan  1  2017 nginx
-rw-r--r--    1 root     root        5.9M Sep 14 22:38 wrc-1167fs_v1.03.bin
/tmp # fwhandle
usage:    head    [-h?]      -h This help
  -s    Source filename
  -d    Destination filename
  -a    Auto set parameter
  -t    Types:    
            bootloader (0)
            state_config (2)
            kernel (3)
            kernel_elecom1700 (5)
            kernel_elecom1701 (6)
            config (1)
            token (4)
  -x    Recovery MD5 file [-u ih_magic]
  -v    FW Version
 -D     Build date
/tmp # fwhandle -t kernel_elecom1701 -x wrc-1167fs_v1.03.bin 
------- ELECOM1701 Header Info
Image Header Size      : 0x0038
Image Header ID        : ELECOM
Image Product Name     : WRC-1167FS
Image Version          : 1.03
------------------------------
------- Header Info
Image Header Size      : 0x0074
Image Header Magic Code: 0x031d6129
Image Data Size        : 6225920
Image Type             : 0x6 [kernel_elecom1701]
Compression Type       : 0x0
Model ID               : 0x00228000
Build Date             : 2017-10-16
Version Firmware       : 1.03
Version Code SCM       : 0abafddb6
Version Config         : e46a8e6df70adbb54129ee057f1ffd35
Data CRC Checksum      : 0x30C2B056
Header CRC Checksum    : 0xff9
------------------------------
FWHANDLE, DECODE PASS
/tmp # ls -alh
drwxrwxrwx    3 root     root           0 Sep 14 22:39 .
drwxr-xr-x   17 root     root           0 Sep 14 22:38 ..
-rw-r--r--    1 root     root           5 Sep 14 22:36 dhcpc.lease
-rw-r--r--    1 root     root           3 Sep 14 22:36 dns.suffix
drwxr-xr-x    5 root     root           0 Jan  1  2017 nginx
-rw-r--r--    1 root     root        5.9M Sep 14 22:39 wrc-1167fs_v1.03.bin.bin
広告

WN-AC1167GRメモ headerチェック

WN-AC1167GR内の header でファームのヘッダが問題無くチェックをパスできるか確認。

# tftp -r openwrt-ramips-mt7620-iodata_wn-ac1167gr-squashfs-factory.bin -g 192.168.0.100
# header -x openwrt-ramips-mt7620-iodata_wn-ac1167gr-squashfs-factory.bin 
### Decoding  image ####
Decode source file [openwrt-ramips-mt7620-iodata_wn-ac1167gr-squashfs-factory.bin]
------- Header Info -------
Vendor  id:  0x0104
Product id:  0x0016
Hardware id:  0x01040016
Version id:  
Code Version:  
Type: 0x3 [kernel]
comp_file_len:  5505028
comp_file_sum:  0x0
Header sum:  0x0
Magic key:  0x0
MD5 chksum:  90ba7450183602a7cbe542bc1a9b436
------------------------------
Decode finished, got file [openwrt-ramips-mt7620-iodata_wn-ac1167gr-squashfs-factory.bin.bin] with size 5505028 bytes
header: Return OK

header付加スクリプト

  • TOOLDIRは環境に合わせて書き換え
  • mkhashとxorimageはOpenWrtのfirmware-utilsを使用
  • ファイルサイズとmd5sumの埋め込みはxxd利用するともう少し簡略化できる(たぶん)
  • create_headerの hw_id を変更することで、WN-AC733GRxやWNPR2600G、ELECOMの同様のヘッダを持つ機種にも利用できるかもしれない
#!/bin/bash

TOOLDIR="/home/tofu/routers/firmware-utils"

create_header(){
	fw_bin="$1"
	hw_id="01040016"

	[ -d "$(pwd)/tmp" ] || mkdir $(pwd)/tmp
	( \
		echo -ne "\x00\x00\x00\x00\x00\x00\x00\x03" | \
			dd bs=42 count=1 conv=sync; \
		echo -ne "\x${hw_id:0:2}\x${hw_id:2:2}\x${hw_id:4:2}\x${hw_id:6:2}" | \
			dd bs=20 count=1 conv=sync; \
		echo -ne "$(printf '%08x' $(stat -c%s $fw_bin) | fold -s2 | xargs -I {} echo \\x{} | tr -d '\n')" | \
			dd bs=8 count=1 conv=sync; \
		echo -ne "$(${TOOLDIR}/mkhash md5 $fw_bin | fold -s2 | xargs -I {} echo \\x{} | tr -d '\n')" | \
			dd bs=58 count=1 conv=sync; \
	 ) > ./tmp/header.bin
}

xor_fw(){
	fw_bin="$1"
	xor_key="8844A2D168B45A2D"

	${TOOLDIR}/xorimage -i $fw_bin -o ./tmp/${fw_bin}.xor -p "$xor_key" -x
}

concat_header(){
	fw_bin="$1"
	cat ./tmp/header.bin ./tmp/${fw_bin}.xor > ./tmp/${fw_bin}.new
}

fw_bin=$1

[ -r "$fw_bin" ] && \
create_header $fw_bin && \
xor_fw $fw_bin && \
concat_header $fw_bin && \
cp ./tmp/${fw_bin}.new ./ || \
echo "ERROR"

実行例

./header.sh openwrt-ramips-mt7620-iodata_wn-ac1167gr-squashfs-plain.bin