固件格式分析
以brcm4709_hdr_039ef_0.4.85固件为例
48 44 52 30 63 D4 11 03 FE 3D 1A FD 05 00 02 00 20 00 00 00 20 00 FE 00 00 00 00 00 00 00 00 00 FF 04 00 EA 14 F0 9F E5 14 F0 9F E5 14 F0 9F E5
第1~4字节:ASCII字符串“HDR0”,作为固件的标识;
第5~8字节:4字节整型数0x0311D464,表示固件的大小:51500132字节;
第9~12字节:固件的检查和;
第13~14字节:0x0005,表示固件中包含哪些部分;
第15~16字节:0x0002,表示固件格式版本号;
第17~20字节:0x00000020,表示固件第一部分在整个固件中的偏移量,0.4.85固件的第一部分是brcm4709_nor.bin,也就是Flash中除0xfe0000-0xff0000的board_data外的全镜像;
第21~24字节:0x00FE0020,表示固件第二部分在整个固件中的偏移量,0.4.85固件的第二部分是root.ext4.lzma,也就是硬盘中128M固件的压缩包;
第33字节开始是固件的正式内容开始。
以brcm4709_all_2e59c_0.5.55固件为例
48 44 52 30 91 9C AE 02 30 3F BB F5 03 00 02 00 20 00 00 00 91 4C 09 02 91 EC 82 02 91 EC 82 02 5D 00 00 01 00 00 00 00 08 00 00 00 00 00 00 6F
第1~4字节:ASCII字符串“HDR0”,作为固件的标识;
第5~8字节:4字节整型数0x02AE9C91,表示固件的大小:44997777字节;
第9~12字节:固件的检查和;
第13~14字节:0x0003,表示固件中包含哪些部分;
第15~16字节:0x0002,表示固件格式版本号;
第17~20字节:0x00000020,表示固件第一部分在整个固件中的偏移量,0.5.55固件的第一部分是vmlinuz.trx,也就是Flash中的内核;
第21~24字节:0x02094C91,表示固件第二部分在整个固件中的偏移量,0.5.55固件的第二部分是root.squashfs,也就是Flash中squashfs MTD分区;
第25~28字节:0x0282EC91,表示固件第三部分在整个固件中的偏移量,0.5.55固件的第三部分是root.ext4.lzma,也就是硬盘中128M固件的压缩包;
第33字节开始是固件的正式内容开始。
固件的最后16+256字节是固件的RSA签名区,其中前16字节为头部,内容为:
00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
小米官方在打包固件时用RSA私钥计算出固件的RSA签名,小米路由器下载固件后用RSA公钥来验证RSA签名,有效地防止固件被篡改。这个过程由小米路由器的实用程序mkxqimage完成。
mkxqimage
mkxqimage是小米路由器固件打包和解包工具
Usage: mkxqimg [-o outfile] [-p private_key] [-f file] [-f file [-f file [-f file ]]] [-x file] [-I]
mkxqimage解包命令格式:
mkxqimage -x 固件文件名
如:
mkxqimage -x brcm4709_all_2e59c_0.5.55.bin
得到3个文件:
34163825 root.ext4.lzma 7970816 root.squashfs 2863104 vmlinuz.trx
root.ext4.lzma解压命令:
unlzma root.ext4.lzma
得到root.ext4文件,大小刚好128MB,这是ext4格式分区导出文件,可以用mount -o loop挂载:
mount -o loop -t ext4 root.ext4 /mnt