前言
小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致,但bootloader
有所不同,因此openwrt的固件不要互刷。另外,R3Gv2和R3G、4A百兆版是不同的设备,切勿混淆。
硬件信息
OpenWrt参数页-Xiaomi MiWiFi 3G v2
CPU:联发科 MediaTek MT7621A,双核880MHz
闪存:16MB
内存:128MB
千兆WAN口:1个
千兆LAN口:2个
2.4G无线芯片:MediaTek MT7603E
5G无线芯片:MediaTek MT7612E
USB:无
需要准备的工具
下面的软件,如果电脑上已经有相同功能的软件了,可平替
- 安装 Python3,用于执行特殊py脚本获取telnet权限。如果已安装了Anaconda,就不用重复安装python了。
- 使用 pip 安装 requests 包,
pip install requests
- 安装 Xampp,用于搭建Http服务器,存放并上传固件文件。
- 安装 putty,用于telnet、ssh客户端使用。
- 安装 WinSCP,用于FTP客户端。
- 下载 OpenWRTInvasion 脚本,整个Source Code全下载。
- 下载 breed 固件,breed-mt7621-pbr-m1。
- 下载 OpenWrt 固件,当前版本 23.05.4,openwrt-23.05.4-mirouter-3gv2
正式步骤
- 路由器接好,lan口网线连电脑,登录路由器完成初始设置(设置好管理员密码、wifi密码)
- 将下载好的 OpenWRTInvasion 解压,使用文本编辑器打开
remote_command_execution_vulnerability.py
文件,这里需要改动几处代码。
如图所示,跳过对windows的检测,根据原作者描述windows上使用有时会出问题,所以对windows加了判断,检测windows直接退出。但是脚本代码中并没有什么平台相关的特殊操作,我测试在windows上是可以运行的(Win11 23H2)。router_ip_address强制使用 192.168.31.1,防止 miwifi.com 域名解析错误。
- 在此目录中,右击,在终端中打开(或者命令行中 cd 进入此目录)
执行python remote_command_execution_vulnerability.py
,根据提示,输入路由器ip,默认192.168.31.1,没变化直接回车,然后脚本会尝试获取STOK,提示输入管理员密码。如果脚本获取失败,则需手动登录网页获取URL中的STOK输入到脚本中。
提示 Which option do you prefer 时,选默认直接回车就行。
- 脚本执行结束后,此时路由器就已经开启了 telnet 和 ftp 了,使用 putty 登录 192.168.31.1,协议选 telnet,登录用户名和密码都是
root
。
执行cat /proc/mtd
,查看分区情况
sh
cat /proc/mtd
dev: size erasesize name
mtd0: 01000000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Bdata"
mtd4: 00010000 00010000 "Factory"
mtd5: 00010000 00010000 "crash"
mtd6: 00010000 00010000 "cfg_bak"
mtd7: 00100000 00010000 "overlay"
mtd8: 00d00000 00010000 "OS1"
mtd9: 00b30000 00010000 "rootfs"
mtd10: 00180000 00010000 "disk"
备份mtd分区文件。
然后使用WinSCP或其他FTP工具,将备份文件拷贝至本地电脑。(步骤略)
sh
cd /tmp
mkdir backupB9AD
cd backupB9AD
dd if=/dev/mtd0 of=/tmp/backupB9AD/mtd0-ALL.bin
dd if=/dev/mtd1 of=/tmp/backupB9AD/mtd1-Bootloader.bin
dd if=/dev/mtd2 of=/tmp/backupB9AD/mtd2-Config.bin
dd if=/dev/mtd3 of=/tmp/backupB9AD/mtd3-Bdata.bin
dd if=/dev/mtd4 of=/tmp/backupB9AD/mtd4-Factory.bin
dd if=/dev/mtd5 of=/tmp/backupB9AD/mtd5-crash.bin
dd if=/dev/mtd6 of=/tmp/backupB9AD/mtd6-cfg_bak.bin
dd if=/dev/mtd7 of=/tmp/backupB9AD/mtd7-overlay.bin
dd if=/dev/mtd8 of=/tmp/backupB9AD/mtd8-OS1.bin
dd if=/dev/mtd9 of=/tmp/backupB9AD/mtd9-rootfs.bin
dd if=/dev/mtd10 of=/tmp/backupB9AD/mtd10-disk.bin
-
使用WinSCP或其他FTP工具,将下载好的 breed-mt7621-pbr-m1.bin 上传至路由器 /tmp 目录下。
刷入 breed,
mtd -r write /tmp/breed-mt7621-pbr-m1.bin Bootloader
-
breed刷入完成后,会自动重启进入breed刷机模式,浏览器访问192.168.1.1即可进入breed web页面。如果没能进入,断开路由器电源,按住Reset不放,插上电源,当看到路由器的部分或全部LED连闪4次(大约等待5-8秒),松开Reset,浏览器重新访问192.168.1.1。电脑IP需设置为自动获取(DHCP)
然后,在固件备份 中备份
编程器固件
以及EEPROM
! -
在breed的web页面,启用环境变量,然后添加一个环境变量 ,变量名
autoboot.command
,值boot flash 0x180000
,重启 breed 。 -
官方原版的openwrt固件中firmware地址在0x180000,由于breed的web界面上,没有对应的闪存布局可以选,所以刷入Openwrt时,只能命令行手动刷入。breed后台关于文件传输能用的命令只有 wget,所以需要准备一个 http 服务器,打开 xampp 控制面板,启用 Apache。
将下载好的 openwrt 固件复制到Xampp的htdocs目录,并改个短点名字。例如
D:\MyTools\Xampp\htdocs\me\op-r3gv2.bin
。 -
使用 putty 登录 192.168.1.1,协议选 telnet,进入 breed 后台,然后输入命令:
wget http://192.168.1.2/me/op-r3gv2.bin
,下载固件到路由器。下载完成后,会有提示信息:
sh
wget http://192.168.1.2/me/op-r3gv2.bin
Length: 6554243/0x640283 (6MB) [application/octet-stream]
Saving to address 0x80001000
然后手动擦除一块闪存区域。
sh
flash erase 0x180000 0x800000
# 含义为从0x180000的地址开始,擦除大小为0x800000的内存区域,擦除的区域大小必须大于固件的大小。
复制固件到指定位置
sh
flash write 0x180000 0x80001000 0x640283
#从0x180000这个地址写入保存在0x80001000的数据,写入的大小为 0x640283
- 打开breed的web页面,固件刷入,刷入步骤6中备份的EEPROM文件。刷入完成后,重启即可。
参考链接
小米路由器4A千兆版 折腾记录 完美刷入官方openwrt 2022-08-09更新
终于解决了breed刷机后不能正常启动的问题
小米路由器4A千兆版刷openWRT保姆级教程