|
|
本帖最后由 noah_bentusi 于 2024-8-10 16:20 编辑
# 关于破解小米路由AX9000的那点破事
## 概述
花了好几天的时间,终于把小米路由器破解成功了。于是想着把这些天做的事情梳理一下。
大概过程是这样。
1. 先刷了miwifi_ra70_all_develop_1.0.140.bin开发版固件。想着通地docker服务把ssh服务打开。却发现国内已经无法直接拉取镜像了。导致docker后台管理镜像一直拉取失败。折腾了半夜才搞定。
2. 搞定了docker后。却发现开发版固件不支持16位子网。强行写配置,AX9000直接罢工不干了。
3. 无奈。只能想办法破解最新的稳定版本miwifi_ra70_firmware_cc424_1.0.168.bin固件。
4. 于是,各种捣鼓。正确地找到解压小米固件的办法。然后,开开心心修改里面的配置文件。
5. 修改好后配置。却又犯了难。路由器和网上的mkxqimage工具都是阉割版,没有打包固件功能。
6. 又一次大无语。还好网上的mkxqimage是开源的。只能仔细读其源代码。按照逻辑反向写了打包功能。
7. 终于打成了自定义固件。已经做好了变砖的准备。下好了小米修复工具,准备变砖线刷固件。结果是一次成功。真是开心死了。
下面就梳理一下破解的详细过程。本文提到的所有工具,都附在压缩包中。可供下载。
## 破解的详细过程
### 前提
破解的环境,需要有一台ubuntu或者debian的linux操作系统。我的所有操作都是在linux系统下完成的。
### 刷开发版本固件
进入小米路由器后的 `常用设置` -> `系统状态`。
将firmware/miwifi_ra70_all_develop_1.0.140.bin固件手动升级。
之后按照步骤初始化好。
#### 安装docker服务
拿一个usb移动硬盘。在linux系统下,使用`fdisk`命令,划分出第一个分区为Linux filesystem。 分区类型是20
用`mkfs.ext4`命令,将第一个分区格式化为ext4格式。
虽后,插到小米路由器上。在 `高级设置` -> `Docker`。点击安装docker服务。等待一小会儿,安装成功。
这时,点击运行docker。服务运行起来后,等待5、6秒再关上。不必去安装docker管理系统。反正因为国内网络原因,也装不上。
之所以运行一下,是因为docker服务启动后,会移动硬盘上创建一个docker服务运行目录。这是我们需要用的。
#### 修理docker服务运行目录
将移动硬盘重新挂载到linux系统下。你会在该分区下,看到/mi_docker/lib/docker这个目录,就是docker服务运行目录。docker服务所有数据都保存在这里。
ubuntu/debian系统,可以用`apt install docker-ce`安装docker服务。linux系统的docker服务运行目录处于/var/lib/docker。
这时,我们就可以偷梁换柱了。
用`sudo service docker stop`。把docker服务停止。然后`sudo mv /var/lib/docker /var/lib/docker.raw`, 将系统本身运行目录挪开。
再`sudo ln -s ${your_udisk_mount}/mi_docker/lib/docker /var/lib/docker`将移动硬盘运行目录映射过来。 这里${your_udisk_mount}替换成你的移动分区挂载的实际位置
然后,再运行`sudo service docker start`。
至此,linux系统已经成功运行移动硬盘上的环境了。
#### 摸拟arm64架构
因为小米路由器的cpu是arm64的。我的机器是amd64的,构架不一样。无法直接运行arm64镜像。所以需要使用qemu来转译arm64指令。如果你的linux系统刚好是arm64的。就可以跳过这里。
我现在需要加载qemu镜像和binfmt镜像。
在docker/qemu.img和docker/binfmt.img可以找到这两个镜像。使用下面命令进行加载
sudo apt install qemu-user-static
docker load -i docker/qemu.img
docker load -i docker/binfmt.img
再做qemu指令映射
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --name docker-builder --driver docker-container --use
#### 构建破解镜像
然后,我们就可以构架破解打开ssh服务的镜像了。镜像编译代码在docker/craker下。有这么几个文件
Dockerfile docker镜像生成配置文件。不需要改动
crack.sh 破解动作执行脚本。行为就是将下面三个文件,复制到小米路由器相应的位置上
rc.local 开机运行脚本。里面写了启动ssh服务的命令。这里打开的是2222端口。可以修改成任意端口
authorized_keys 连接ssh服务,我喜欢使用密钥进行连接。连接私钥放在了/ssh-keys目录下了
dropbear_rsa_host_key ssh服务器的私钥。不需要改动
构建镜像之前,需要先加载基础镜像
docker load -i alpine.img
进入craker目录下。就可以构建镜像了。如果系统本身是arm64。只需要直接构建就可以了。`docker build -t cracker .`
转译构建,需要执行这个命令
docker buildx build \
--platform linux/arm64 \
--tag "cracker"
#### 运行破解镜像容器
在本地把破解镜像运行起来。
docker run -d -v /etc:/run --restart always --name cracker cracker
这里我用的是--restart always。所以破解镜像容器会不停的执行破解操作。这样移动硬盘挂载到小米路由器,docker运行起来后。破解容器就会自动不停运行起来。
把docker服务停下来
sudo service docker stop
sudo rm /var/lib/docker #把docker运行目录映射删除
sudo mv /var/lib/docker.raw /var/lib/docker #恢复原有的运行目录
#### 破解ssh
将移动硬盘重新挂载到小米路由器上。点击运行docker。运行起来,等个几秒种后,就可以重启小米路由器。试着ssh就连上去了。
docker服务和移动硬盘就可以抛弃不用了。
如果一般使用的话。到此就可以结束了。但是开发版固件,不支持16位子网。我家还有一大堆智能设备,ip拥挤不堪。所以,我还需要破解稳定版本固件。
### 破解稳定版固件
#### 关于mkxqimage
路由器和网上的mkxqimage工具都是阉割版,没有打包固件功能。于是我阅读了开源的mkxqimage解包代码。逆向写了打包代包。代码我用的是nodejs写的。nodejs是同类于python的一种语言。python能做的,nodejs一样都能做。nodejs使用的javascript语言,因为我平常工作用的都是c\c++、java、javascript这些类c语言,所以我喜欢用nodejs来写小工具,而不是python。
nodejs的运行环境在https://nodejs.cn/官网可以下载到。
mkxqimage代码在/mkxqimage目录下。
node main.mjs #就可以运行
解压命令是
node main.mjs --action read --image 固件文件 --publicKey 公钥文件 --output 解包输出目录
打包命令是
node main.mjs --action write --model 固件设备id --image 固件文件 --privateKey 私钥文件 --file 第一个文件 --file 第二个文件 ...
其中固件设备id,在官方固件解包输出的时候可以看到。
#### 解包工作
官方固件解压公钥文件,可以在小米路由器上找到。位置在`/usr/share/xiaoqiang/public.pem`。我在/bin-keys下也放一份。
解压命令如下:
node main.mjs --action read --image ../firmware/miwifi_ra70_firmware_cc424_1.0.168.bin --publicKey public.pem --output ../unpack
在unpack目录会有
xiaoqiang_verison # 固件版本描述文件
root.ubi # mtd设备文件,相当于一个磁盘数据。小米路由器系统都保存在这里。
#### 加载ubi
ubuntu系统加载ubi需要安装以下几个包
sudo apt install mtd-utils squashfs-tools
然后在内核中装载起来
sudo modprobe ubi #装载ubi系统支持
sudo modprobe first_id_byte=0x20 second_id_byte=0xa2 third_id_byte=0x00 fourth_id_byte=0x15 #摸拟一个mtd设备
现在`cat /proc/mtd`,就可以看到系统里一个mtd设备可以供装载ubi文件使用了。执行下面命令装ubi文件
sudo ubiformat /dev/mtd1 -y # 清空mtd设备中的内容, 注意这里mtd1的1是可以变动的。
# 我的系统下是1。有的系统可能是0,或者是其它数字。
# 需要查看/proc/mtd来确定"NAND simulator partition 0"的位置
sudo ubiformat /dev/mtd1 -f root.ubi -s 2048 -O 2048 -y # 将root.ubi文件刷进mtd设备
sudo ubiattach /dev/ubi_ctrl -O 2048 -m 1 # 加载mtd1内容。其中 -m 1就是mtd1的意思
不出意外的话。我们可以看到`ls /dev/ubi0*`下
/dev/ubi0 # ubi0磁盘。我估且管它叫磁盘吧
/dev/ubi0_0 # ubi0磁盘的第一个分区
/dev/ubi0_1 # ubi0磁盘的第二个分区
/dev/ubi0_2 # ubi0磁盘的第三个分区
经常过挂载尝试,我搞清楚了这三个分区的内容。
* 第一个分区,运行kernel。不需要动
* 第二个分区,是系统根分区。所有配置和运行文件都在这里。该分区是squashfs格式的
* 第三个分区,是个空分区。里面啥也没有。
### 读取三个分区的数据
由于ubi系统是只读系统,而我们需要配置其中的内容,所以我们要其中数据弄出来再作修改。之后打包也要用到。
sudo dd if=/dev/ubi0_0 ubi/ubi0.dat #第一个分区数据复制到ubi0.dat中
sudo dd if=/dev/ubi0_1 ubi/ubi1.dat
sudo dd if=/dev/ubi0_1 ubi/ubi2.dat
挂载squashfs数据
sudo mount -t squashfs -o loop ./ubi/ubi1.dat rom-firmware
rom-firmware目录里面就看到小米路由器根分区所有文件了
### 破解ssh
rom-firmware是只读的。所以需要先把文件都复制出来
sudo cp -rp rom-firemware/* rom/
最终我们有了一个可修改的小米系统了。而且,因为我们安装了qmeu转译功能。所以我们是可以直接运行里面程序的。可执下面的命令,进入小米系统。
sudo chroot ./rom sh
破解开启ssh服务,需要将之前cracker目录下的文件,按照cracker.sh里面的动作,复制到相应的目录就可以了。
既然解开了根分区,那么我们可以做的更多。比如 开启udpxy提供iptv,ddns动态域名, dnsmasq自定义域名 等等。只是注意别搞得太过份。因为小米路由器的mtd容量有限,不要撑爆了。
### 打包固件
修改完成后。就是打包工作了。
#### 打包squashfs
首先需要将小米根分区数据打包回squashfs数据文件 。
sudo rm -f ubi/root.squashfs
sudo mksquashfs ./rom ./ubi/root.squashfs -comp xz -b 262144
#### 封装ubi文件。
在ubi下有一个ubi.cfg,是我已经写好的封装配置文件,直接用就可以了。
[kernel]
mode=ubi
image=ubi0.dat
vol_id=0
vol_type=dynamic
vol_name=kernel
[ubi_rootfs]
mode=ubi
image=root.squashfs
vol_id=1
vol_type=dynamic
vol_name=ubi_rootfs
[rootfs_data]
mode=ubi
vol_id=2
vol_type=dynamic
vol_name=rootfs_data
vol_size=1
vol_flags=autoresize
执行封装命令
ubinize -o custom.ubi -m 2048 -s 2048 -p 128KiB ubi.cfg
封装好了之后。为了保险,我自己尝试加载了一下
sudo ubidetach /dev/ubi_ctrl -m 1 # 缷裁mtd1
sudo ubiformat /dev/mtd1 -y
sudo ubiformat /dev/mtd1 -f custom.ubi -s 2048 -O 2048 -y
sudo ubiattach /dev/ubi_ctrl -O 2048 -m 1
自行去检查一下三个分区中的数据。就不赘述了。
#### 打包成固件
mkdir custom
cp unpack/xiaoqiang_verison custom/xiaoqiang_verison
cp ubi/custom.ubi custom/root.ubi
cd mkxqimage
node main.mjs --action write --model 37 --privateKey ../bin-key/custom.prk --image ../custom/custom.bin --file ../custom/xiaoqiang_verison --file ../custom/root.ubi
最后在custom目录下,就有了custom.bin。我们自定义的固件。
### 安装固件
由于打包固件,用的是自定义的密钥。所以安装固件,需要将bin-key/custom.pbk文件替换到小米路由器的/usr/share/xiaoqiang/public.pem上面。
之后,就可以正常通过后台管理页面上传安装固件了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|