小米路由器固件修改

来自IPTV爱好者
跳转至: 导航搜索

小米路由器官方提供的固件是自定义格式,而且刷机时要验证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.tgz
tar 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 /

返回:小米路由器固件 小米路由