都说红米这款路由器不刷机就别买,足以见得官方出的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 的启动流程如下:
- 如果 kernel0 存在,那么启动 kernel0。
- 如果 kernel0 不存在,kernel1 存在,那么启动 kernel1。
- 如果 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
一下。