1024 字
5 分钟
小米路由器4A 百兆版 刷入原版OpenWrt折腾记录

最近为了能更高效利用校园网,想着搞个路由器整 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.

└─$ 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文件服务器。然后下载固件到路由器。

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,这个大小比固件大小大,直接擦除即可。

flash erase 0x160000 0xea0000

写入固件#

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

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

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

boot flash 0x160000

让breed正确地自启动#

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

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

启用breed环境变量

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


参考:

小米路由器4A 百兆版 刷入原版OpenWrt折腾记录
https://blog.a33.su/posts/xiaomi-r4ac-openwrt/
作者
artiga033
发布于
2021-12-21
许可协议
CC BY-NC-SA 4.0