小米路由器官方提供的固件是自定义格式,而且刷机时要验证RSA签名,因此只刷自制固件几乎不可能。
通过对固件工具mkxqimage的分析,基本弄清楚了固件打包和解包的流程,如果采用自己的RSA私钥打包固件,然后用自己的RSA公钥替换/usr/share/xiaoqiang/public.pem,那么就能实现通过Web界面刷自制固件。
目录
固件解包
固件工具mkxqimage完成对固件的解包,在解包前先检查Checksum是否正确,然后利用RSA公钥/usr/share/xiaoqiang/public.pem检查RSA签名,这两个步骤通过后,根据[0x0C]的固件类型,以及[0x10]、[0x14]、[0x18]和[0x1C]的4个偏移量拆分固件。固件中可能包含的内容有:
brcm4709_fac_update_nor.bin brcm4709_nor.bin fac_mode.bin nvram_fac.bin ramfsz root.ext4.lzma root.squashfs upsetting.sh upsetting_fac1.sh upsetting_fac2.sh upsetting_fac3.sh vmlinuz.trx
固件格式和解包命令详见:小米路由器固件分析
固件打包
首先要创建一对RSA私钥和公钥,为了以后大家能共享自制固件,建议采用这里提供的密钥文件:private.pem public.pem
下面以稳定版0.4.85为例,介绍固件修改和打包方法。
固件解包
cd /userdisk/data mkdir xqimage cd xqimage wget -O mkxqimage.tgz http://www.iptvfans.cn/miwifi/mkxqimage.tgztar xzf mkxqimage.tgz wget -O brcm4709_hdr_039ef_0.4.85.bin http://bigota.miwifi.com/xiaoqiang/rom/brcm4709_hdr_039ef_0.4.85.bin./mkxqimage -x brcm4709_hdr_039ef_0.4.85.bin
得到2个文件:
-rw-r--r-- 1 root root 16646144 May 30 08:14 brcm4709_nor.bin -rw-r--r-- 1 root root 34853955 May 30 08:14 root.ext4.lzma
前者是FLASH全镜像,这个文件成分比较复杂,目前不建议修改它。
后者是硬盘固件镜像,先用unlzma解压,得到root.ext4
unlzma root.ext4.lzma
固件修改
用mount命令加载
mount -o loop -t ext4 root.ext4 /mnt
接下来先把RSA公钥替换掉,然后开SSH
cd /mnt/usr/share/xiaoqiang mv public.pem public.pem.orig cp /userdisk/data/xqimage/public.pem public.pem.new ln -s public.pem.new public.pem sed -i 's/ssh_en=0/ssh_en=1/g' xiaoqiang-defaults.txt
把一些关掉的Web界面恢复
cd /mnt/usr/lib/lua/luci/controller/web sed -i 's/--entry/entry/g' index.lua
如果需要,还可以对固件进行修改,这里就不再多说。
将上面的修改保存回硬盘固件镜像文件中:
cd /userdisk/data/xqimage umount /mnt sleep 30 # 一定要等待一会儿后再压缩镜像
固件打包
将修改后的硬盘镜像压缩:
./lzma e -a0 root.ext4 root.ext4.lzma ./mkxqimage -o brcm4709_hdr_00000_0.4.85.bin -p ./private.pem -t 5 -f brcm4709_nor.bin -f root.ext4.lzma
以上过程的命令已存储在一个脚本文件中,可直接下载:rom_modify.sh
升级准备
公钥替换
在升级上一步生成的自制固件前,还需要对当前路由器的RSA公钥进行替换,具体方法如下:
mount -o rw,remount / cd /usr/share/xiaoqiang mv public.pem public.pem.orig cp /userdisk/data/xqimage/public.pem public.pem.new ln -s public.pem.new public.pem mount -o ro,remount /
也可以直接下载脚本文件:rsa_key.sh
自制固件测试
用下面的命令测试:
cd /userdisk/data/xqimage mkdir test cd test mkxqimage -x ../brcm4709_hdr_00000_0.4.85.bin ls -l
如果解压固件过程中没有出现错误信息,最后列表出2个文件,说明自制固件打包没问题。
-rw-r--r-- 1 root root 16646144 Jun 1 12:00 brcm4709_nor.bin -rw-r--r-- 1 root root 33188560 Jun 1 12:00 root.ext4.lzma
注意:brcm4709_nor.bin文件的大小一定是16646144。
验证root.ext4.lzma是否正确:
cd /userdisk/data/xqimage/test unlzma root.ext4.lzma mount -o loop -t ext4 root.ext4 /mnt ls -l /mnt/usr/share/xiaoqiang/public.pem* grep ssh_en /mnt/usr/share/xiaoqiang/xiaoqiang-defaults.txt umount /mnt
上面命令执行完毕后,应该能看到一些信息(时间信息会有差别):
lrwxrwxrwx 1 root root 14 Jun 1 11:30 /mnt/usr/share/xiaoqiang/public.pem -> public.pem.new -rw-r--r-- 1 root root 451 Jun 1 11:30 /mnt/usr/share/xiaoqiang/public.pem.new -rwxr-xr-x 1 root root 451 May 27 11:33 /mnt/usr/share/xiaoqiang/public.pem.orig ssh_en=1
备份自制固件
在计算机资源管理器中输入: \\192.168.31.1\XiaoMi\xqimage ,目录列表中能看到brcm4709_hdr_00000_0.4.85,将该自制固件复制到计算机上。
升级自制固件
登录小米路由器管理页面,在“路由设置”-“高级功能”-“路由器手动升级”界面中选中brcm4709_hdr_00000_0.4.85,点“上传并安装固件”按钮,等待数分钟。
安装完固件后,SSH有可能没有启动,这是因为升级固件时将nvram项ssh_en清为0,而第一次启动时通过defaults设置将ssh_en设置为1的动作在dropbear启动之后。只需要重启一下路由器,就能够SSH登录了。
特别提醒
由于替换了路由器中的RSA公钥,路由器不能升级官方固件,如果想恢复成官方固件,只需换回原来的公钥,方法如下:
mount -o rw,remount / cd /usr/share/xiaoqiang cp public.pem.orig public.pem mount -o ro,remount /