小米路由器4A 百兆版 刷入原版OpenWrt折腾记录

thumbnail

最近为了能更高效利用校园网,想着搞个路由器整 OpenWrt,然后因为 (穷) 校园网也没有千兆就买了个百兆版的小米路由器 4A。于是各种麻烦和坑就来了~

无互联网进行 OpenWrtInvasion

OpenWrtInvasion这个项目可以利用漏洞架设telnet ftpdssh。但是过校园网验证才能有互联网连接,解决办法很简单,项目原理就是把script.sh上传到路由器并执行。所以只要在本机架设 http 文件服务,然后把script.shbusyboxdropbear 的下载链接改为本地服务器地址即可。
OpenWrtInvasion

刷入 Breed

因为我怕出事,所以先刷了个 breed。备份 eeprom 和刷 breed 就不赘述了。breed 是这个
注意,这个 breed 并不是为专属机型设计的,导致了下面的一系列坑

如果说不刷 breed 直接用原厂 bootloader 的话,可能反而会很顺利。

尝试刷入 OpenWrt

各种失败经历 建议别看(

直接刷

直接刷原版 openwrt 会无限重启,原因就是这个 breed 不能正确的引导,估计原版 openwrt 是为原厂 bootloader 设计的。

尝试自行编译 Lean 版本并修改分区

我找到了 分享小米 R4A 千兆版编译 OPENWRT(Breed 直刷版) 这篇。不过这个讲的是千兆版,作为参考,初步判断问题出在闪存分区上。

照着改了个百兆版的,想参考可以看看这条commit

其实这样编译出来刷进去已经能开机了,不过电源灯一直闪黄色,可能是我配置有问题…这样,可以确定,原因在于刷了 breed 之后闪存启动区不同,导致无法正确加载固件系统。

从 breed 直接擦写闪存

所以除了改固件编译,还有一种办法,那就是让 breed 能(像原厂 breed 那样)正确引导固件。

telnet 到 breed

进入 breed 模式,然后 telnet 到路由器,我这里没开 Windows 的 telnet, 直接用了 kali WSL.

1
2
3
4
5
6
7
8
9
10
└─$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
Boot and Recovery Environment for Embedded Devices
Copyright (C) 2021 HackPascal <hackpascal@gmail.com>
Build date 2021-12-15 [git-f9b74d0]
Version 1.1 (r1337)

Starting breed built-in shell

在之前尝试编译时,已经看到了 OpenWrt 默认的固件分区位置:
firmware-location
所以 我们只要把原版 OpenWrt(5MB 大小,下载) 写在0x160000。固件分区大小为0xea0000 足够了。

将固件下载到路由器

我们仍然需要在本机开一个http文件服务器。然后下载固件到路由器。

1
2
3
4
5
6
7
8
9
wget http://192.168.1.2:2552/openwrt-21.02.1-ramips-mt76x8-xiaomi_mi-router-4a-100m-squashfs-sysupgrade.bin
Connecting to 192.168.1.2:2552... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5243223/0x500157 (5MB) []
Saving to address 0x80000000

[============================================] 100%

Transmission completed in 1.8s.

注意Saving to address 这一行,后面的地址就是下载的文件的位置。记住这个,下面要用到。

擦除固件分区


从这里开始的步骤都非常危险,请谨慎


我们已经知道,分区是从0x160000开始,大小 0xea000,这个大小比固件大小大,直接擦除即可。

1
flash erase 0x160000 0xea0000

写入固件

然后,把固件写入。注意flash write命令的格式
flash [bank <n>] write [verify] [<partbase>] <addr> <src> <size>
其中src是要写入的文件起始地址,就是wget提示保存到的地址,我这里是0x80000000,然后大小是文件大小,wget也有提示。
所以,在我的情况下,执行:

1
2
#请务必先确认你wget得到的具体地址和文件大小
flash write 0x160000 0x80000000 0x500157

大功告成,现在从0x160000就可以进入系统了!

1
boot flash 0x160000

让breed正确地自启动

然而,我们重启时还是无法正常启动,不过会自动进入breed(因为breed找的启动区不对)。

进入breed,打开环境变量设置,启用。

启用breed环境变量

重启。然后进入breed,添加一个环境变量 autoboot.command ,值为boot flash 0x160000。从而让breed从正确位置启动固件。
Add_Env_var
结束!


参考:

Permalink: http://blog.artiga.top/2021/xiaomi-r4ac-openwrt/

本文采用CC BY-NC-SA 4.0许可

Comments