小米路由固件格式
来自Jack's Lab
1 概述
路由固件的格式,基本是基于 openwrt 的 trx 这个简单的二进制文件格式
2 小米格式
小米自己改了一个打包工具 mkxqimage,要知道其固件格式,需要分析一下这个工具
0.5.56 版固件下的工具,先看一下内部字符串:
$ strings /bin/mkxqimage ...... /usr/share/xiaoqiang/public_ssh.pem /usr/share/xiaoqiang/public.pem error fopen public key error PEM_read_RSAPublicKey error EVP_PEKY_new error EVP_PKEY_st1_RSA ...... -:x:t:o:f:p:S:I ...... upsetting.sh brcm4709_nor.bin root.ext4.lzma upsetting_fac1.sh fac_mode.bin upsetting_fac2.sh fac_mode.bin upsetting_fac3.sh fac_mode.bin root.ext4.lzma root.squashfs vmlinuz.trx upsetting.sh brcm4709_fac_update_nor.bin nvram_fac.bin root.ext4.lzma root.squashfs ramfsz vmlinuz.trx
参考 carabob001 在这个页面对 小米路由固件的分析
以 0.2.62 固件为例:
comcat@jackslab:/work/openwrt/xiaomi/rom$ hexdump -C brcm4709_hdk_0.2.62.bin | head -n 3 00000000 48 44 52 30 21 90 62 02 54 20 9e 15 04 00 02 00 |HDR0!.b.T ......| 00000010 20 00 00 00 21 a0 37 02 21 a0 37 02 21 a0 37 02 | ...!.7.!.7.!.7.| 00000020 5d 00 00 01 00 00 00 00 08 00 00 00 00 00 00 6f |]..............o|
00 - 03: 0x30 52 44 48,为 TRX 文件的标识 (Magic number) 04 - 07: 0x02629021,为整个固件大小,40013857字节 08 - 11: CRC32 12 - 13: 0x0004,固件类型 14 - 15: 0x0002,固件格式版本号 16 - 19: 0x00000020,表示第一分区在整个文件中的偏移量,即从 0x20 处开始,是为第一个固件文件位置开始处 20 - 23: 0x0237A021,表示第二分区在整个文件中的偏移量 24 - 27: 0x0237A021,表示第三分区在整个文件中的偏移量,此处无效 29 - 31: 0x0237A021,表示第四分区在整个文件中的偏移量,此处无效
brcm4709_hdk_0.2.62.bin 解压后:
root@XiaoQiang:/userdisk/rom/0.2.62$ mkxqimage -x ../brcm4709_hdk_0.2.62.bin -rw-r--r-- 1 root root 37199873 Nov 28 01:21 root.ext4.lzma -rw-r--r-- 1 root root 2813952 Nov 28 01:21 vmlinuz.trx 两个文件合并大小为: root@XiaoQiang:/userdisk/rom/0.2.62$ echo $((37199873+2813952)) 40013857 差正好是 TRX 文件头的大小 0x20 = 32 root@XiaoQiang:/userdisk/rom/0.2.62$ echo $((0x02629021-40013825)) 32