Redmi AC 2100 刷机Breed+OpenWrt

Posted by 王灿辉 on 2022-05-23

都说红米这款路由器不刷机就别买,足以见得官方出的ROM有多拉跨。我买来用了快一年了,一直没时间搞,确实时不时就断一下。最近突然来兴致了,就刷一下吧,自己用着也舒服些。

我买的路由器出厂版本已经是2.0.23了,可以直接反弹shell,不用先用小米的恢复工具先刷一遍。不是2.0.23的朋友可以先从【下载汇总】客户端/ROM下载下载一下固件和恢复工具。

开启 ssh

这里,我们使用 openwrt 官网提供的方法打开 ssh。

登录路由器管理界面,按 F12 打开开发者工具,点击 console,输入下列代码,并回车。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function getSTOK() {
    let match = location.href.match(/;stok=(.*?)\//);
    if (!match) {
        return null;
    }
    return match[1];
}

function execute(stok, command) {
    command = encodeURIComponent(command);
    let path = `/cgi-bin/luci/;stok=${stok}/api/misystem/set_config_iotdev?bssid=SteelyWing&user_id=SteelyWing&ssid=-h%0A${command}%0A`;
    console.log(path);
    return fetch(new Request(location.origin + path));
}

function enableSSH() {
    stok = getSTOK();
    if (!stok) {
        console.error('stok not found in URL');
        return;
    }
    console.log(`stok = "${stok}"`);

    password = prompt('Input new SSH password');
    if (!password) {
        console.error('You must input password');
        return;
    }

    execute(stok, 
`
nvram set ssh_en=1
nvram commit
sed -i 's/channel=.*/channel=\\"debug\\"/g' /etc/init.d/dropbear
/etc/init.d/dropbear start
`
    )
        .then((response) => response.text())
        .then((text) => console.log(text));
    console.log('New SSH password: ' + password);
    execute(stok, `echo -e "${password}\\n${password}" | passwd root`)
        .then((response) => response.text())
        .then((text) => console.log(text));
}

enableSSH();

运行成功会弹出一个输入框,让你设置 ssh 的密码,输入密码点确定即可,帐号是 root。

刷入 Breed

https://breed.hackpascal.net/ 下载 breed-mt7621-xiaomi-r3g.bin,下载好之后用 scp 传到路由器里。

1
$ scp breed-mt7621-xiaomi-r3g.bin root@192.168.1.1:/tmp

把 breed 刷入 Bootloader 分区。

1
$ mtd -r write /tmp/breed-mt7621-xiaomi-r3g.bin Bootloader

完事儿之后,reboot 复位一下路由器,找根牙签按住 reset 键,直到路由器的 system 灯变成蓝灯闪烁后松开。

浏览器访问 http://192.168.1.1,可以看到breed被刷入成功。

刷入 OpenWrt

在小米 R3G 设置中,找到并删除 normal_firmware_md5 这个键值,因为刷新刷的固件 md5 值与原来的不一致会导致无法开机。

点击环境变量编辑,添加一个字段 xiaomi.r3g.bootfw,值为 2

因为,breed 的启动流程如下:

  1. 如果 kernel0 存在,那么启动 kernel0。
  2. 如果 kernel0 不存在,kernel1 存在,那么启动 kernel1。
  3. 如果 kernel0 和 kernel1 都存在,则检查环境变量 xiaomi.r3g.bootfw 的值,如果存在且值为 2,那么启动 kernel1,否则启动 kernel0。

点击固件更新中的固件后,上传 openwrt-ramips-mt7621-redmi-router-ac2100-initramfs-kernel.bin 固件,确定后点击更新,完成刷机,等待路由器自动复位起来。

这个initramfs是运行在内存里的,在它之上做的任何配置重启后都会丢失,还需要到路由器的升级界面刷一下 openwrt-ramips-mt7621-redmi-router-ac2100-squashfs-sysupgrade.bin 固件。

之后也可以使用 mtd 直接刷。

将 openwrt-ramips-mt7621-redmi-router-ac2100-squashfs-kernel1.bin 和 openwrt-ramips-mt7621-redmi-router-ac2100-squashfs-rootfs0.bin 两个固件上传到 /tmp 目录下,执行下面的命令写入。

1
2
$ mtd write openwrt-ramips-mt7621-redmi-router-ac2100-squashfs-kernel1.bin kernel1
$ mtd write openwrt-ramips-mt7621-redmi-router-ac2100-squashfs-rootfs0.bin rootfs0

同样,完事儿之后,reboot 一下。



赞赏支持
微信赞赏
微信赞赏
支付宝
支付宝