小米路由固件格式

来自Jack's Lab
2014年6月4日 (三) 22:50Comcat (讨论 | 贡献)的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到: 导航, 搜索

1 概述

路由固件的格式,基本是基于 openwrt 的 trx 这个简单的二进制文件格式


本页参考了 carabob001 在这个页面对 小米路由固件的分析 节约了不少时间,在此表示感谢!



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
......
brcm4709_nor.bin
brcm4709_fac_update_nor.bin
nvram_fac.bin
fac_mode.bin
upsetting_fac1.sh
upsetting_fac2.sh
upsetting_fac3.sh
upsetting.sh
root.ext4.lzma
root.squashfs
ramfsz
vmlinuz.trx


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: 0x30524448,为 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))
40013825

# 差正好是 TRX 文件头的大小 0x20 = 32
root@XiaoQiang:/userdisk/rom/0.2.62$ echo $((0x02629021-40013825))
32


0.2.62 整个文件的大小为:

root@XiaoQiang:/userdisk/rom/0.2.62$ ls -l brcm4709_hdk_0.2.62.bin
 -rw------- 1 comcat comcat 40014129  6月  4 12:13 ../brcm4709_hdk_0.2.62.bin

# 与实际整个固件大小的差值为 272 = 16 + 256:
root@XiaoQiang:/userdisk/rom/0.2.62$ echo $((40014129-40013857))
272


获取这额外的 272 字节:

root@XiaoQiang:/userdisk/rom/0.2.62$ dd if=brcm4709_hdk_0.2.62.bin of=rsa-sig.bin bs=1 skip=40013857

$ hexdump -C rsa-sig.bin
00000000  00 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  97 ca 7b 87 29 c2 b6 e4  cd 8d 19 6d 1c d8 71 ed  |..{.)......m..q.|
00000020  6a 0d 98 ac 2e 05 8d 1a  32 a2 10 c9 31 45 08 50  |j.......2...1E.P|
00000030  c1 5d 59 e3 68 25 32 6c  da 87 67 ee 68 be 06 58  |.]Y.h%2l..g.h..X|
00000040  4e 41 eb 34 d7 69 b5 57  2b 4a 5d 23 78 3b d4 c5  |NA.4.i.W+J]#x;..|
00000050  d5 34 47 b1 f0 b6 d8 4e  df 0f 10 d1 69 5a 60 03  |.4G....N....iZ`.|
00000060  93 18 e0 3e f4 32 5c d7  2d 75 68 e7 b4 17 a1 6d  |...>.2\.-uh....m|
00000070  38 8a 38 e7 2d ae ca ae  f8 ab 07 be 46 2d 4e 58  |8.8.-.......F-NX|
00000080  cc 8e ff e1 a0 2a 6e 0a  97 8f e8 a7 b3 b5 29 c5  |.....*n.......).|
00000090  ea 20 2e ea c4 ab 05 5a  ca 37 98 ea 1b 67 34 ab  |. .....Z.7...g4.|
000000a0  75 ef d4 36 00 52 6d 30  2b e9 b6 27 81 7b 57 28  |u..6.Rm0+..'.{W(|
000000b0  84 89 7a 8e 70 08 93 ab  09 51 c9 73 79 4b 6d 99  |..z.p....Q.syKm.|
000000c0  a2 cd 64 84 d9 c8 a6 36  5e 63 fd 06 32 fe f8 36  |..d....6^c..2..6|
000000d0  46 6a 76 1e 4e b2 67 ea  db 34 24 60 21 67 5a c7  |Fjv.N.g..4$`!gZ.|
000000e0  72 ae 53 c5 8d 34 40 19  04 08 12 e2 e3 7c bf 99  |r.S..4@......|..|
000000f0  07 ea d0 fe c5 4b 10 cf  73 0c 93 29 dc c9 ae b8  |.....K..s..)....|
00000100  1b df 8c 70 98 34 70 42  c8 88 34 66 55 02 56 58  |...p.4pB..4fU.VX|

此应为 RSA 签名所在


可以看到,本质上小米的这个固件格式实际还是 TRX 文件格式,可以手工解压的:

comcat@jackslab:/work/openwrt/xiaomi/rom/0.2.62$ dd if=../brcm4709_hdk_0.2.62.bin of=p1 bs=1 count=$((0x0237A021-0x20)) skip=32
记录了37199873+0 的读入
记录了37199873+0 的写出
37199873字节(37 MB)已复制,56.4376 秒,659 kB/秒

comcat@jackslab:/work/openwrt/xiaomi/rom/0.2.62$ dd if=../brcm4709_hdk_0.2.62.bin of=p2 bs=1 count=$((0x02629021-0x0237A021)) skip=$((0x0237A021))
记录了2813952+0 的读入
记录了2813952+0 的写出
2813952字节(2.8 MB)已复制,4.22887 秒,665 kB/秒

# 解出的 p1 和 p2 与使用 mkxqimage 解压后的文件一致:
comcat@jackslab:/work/openwrt/xiaomi/rom/0.2.62$ md5sum p1
aad4db39b8b07f92af7332d4ff844da4  p1
comcat@jackslab:/work/openwrt/xiaomi/rom/0.2.62$ md5sum root.ext4.lzma 
aad4db39b8b07f92af7332d4ff844da4  root.ext4.lzma

comcat@jackslab:/work/openwrt/xiaomi/rom/0.2.62$ md5sum vmlinuz.trx 
662539869d4144ec9af04c4111d71468  vmlinuz.trx
comcat@jackslab:/work/openwrt/xiaomi/rom/0.2.62$ md5sum p2
662539869d4144ec9af04c4111d71468  p2























个人工具
名字空间

变换
操作
导航
工具箱