yfdoor
yfdoor
发布于 2021-10-24 / 348 阅读 / 0 评论 / 0 点赞

小米 AX3600 开启 SSH 以及 OpenWrt 刷机指南

小米路由 AX3600 本身目前没有开源, OpenWrt 官方也没有支持这款路由,但是网上已经陆续流出各种刷机教程和固件,特尝试一下并记录如下:

  • 前言

  1. 本文所用文件(提取码: ewy1): https://pan.baidu.com/s/1zMzLcfj5nG3IszpbuM-btA
  2. 自编译 AX3600 OpenWrt 固件:AX3600 OpenWrt
  3. OpenWrt AX3600 WIKI: AX3600 WIKI
  • 开启 SSH

  1. 固件降级
    要开启 SSH,首先需要将小米的官方固件降级。下载 AX3600 v1.0.17 的固件,在路由器后台选择本地「固件升级」,等待降级完成后重新设置好路由器,可以登录路由后台即可。(注意关掉自动升级,以免又升级到新的版本)
    固件地址:AX3600 v1.0.17

  2. 获取 STOK
    登陆小米路由器后台后,浏览器地址栏 stok= 后面的一段内容即是需要记录的 STOK 值,准备好备用。

    	http://192.168.31.1/cgi-bin/luci/;stok=[STOK]/web/home#router
    
  3. 获取 SSH
    将下面代码中的 [STOK] 替换为第二步你自己的值(注意括号要去掉),替换完成后复制到浏览器打开,回车后显示 {code:0} 即为成功。这样即可开启 AX3600 的 SSH。

    	http://192.168.31.1/cgi-bin/luci/;stok=[STOK]/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B	
    

    等于执行:
    (nvram set ssh_en=1;nvram commit)
    (sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear)
    (/etc/init.d/dropbear start)

  4. SSH 密码
    将下面代码中的 [STOK] 替换为第二步你自己的值(注意括号要去掉),替换完成后复制到浏览器打开,回车后显示 {code:0} 即为成功。这样就将 root 的密码设置为 admin 了。

    	http://192.168.31.1/cgi-bin/luci/;stok=[STOK]/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B%20echo%20-e%20'admin%5Cnadmin'%20%7C%20passwd%20root%3B
    

    等于执行:
    (echo -e 'admin\nadmin' | passwd root)

  5. 备份 bdata
    现在应该可以通过 ssh 连接到 小米 AX3600 了(密码是 admin),在小米 AX3600 上执行如下代码,将 mtd9 备份一下,以备不时之需。

    	nanddump -f /tmp/bdata_mtd9.img /dev/mtd9
    

    将 /tmp/bdata_mtd9.img 下载并做好备份。

  6. 固化 SSH
    接下来把下载的 mitool.zip 解压出的 3 个文件上传到路由 /tmp 目录里; 然后依次执行:

    	# 移至 data 目录,长期保存,以备后续使用
    	mv /tmp/mitool /data
    	cp /data/mitool/* /tmp
    	chmod +x /tmp/mitool*
    
    	# 使用 mitool.sh 解锁
    	/tmp/mitool.sh unlock
    
    	# 机器会自动重启,重启后继续执行
    	/tmp/mitool.sh hack
    

    至此就设置好了永久 ssh、telnet、uart 权限并自动重启,同时会计算出默认的 root 密码,注意记录保存密码,恢复出厂后 telnet 和 ssh 需要用;如需查看密码,可执行如下命令:

    	# 查看默认密码
    	/tmp/mitool.sh password
    
  • 注意事项:
    • 如果丢失 SSH ,你也可以 telnet 连接上 AX3600 后执行如下代码,即可恢复。(用户名是 root,密码是刚才第六步固化 SSH 后得出的密码)
      	sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear 
      	/etc/init.d/dropbear start
      
    • 失败恢复,通过恢复之前备份的 bdata 分区来恢复。
      	mtd write /tmp/bdata_mtd9.img bdata
      
  • 刷入 QSDK

  1. 首先需要设置 env 开启必要的选项,ssh 下依次输入以下命令:

    	nvram set flag_last_success=0
    	nvram set flag_boot_rootfs=0
    	nvram set flag_boot_success=1
    	nvram set flag_try_sys1_failed=0
    	nvram set flag_try_sys2_failed=0
    	nvram set boot_wait=on
    	nvram set uart_en=1
    	nvram set telnet_en=1
    	nvram set ssh_en=1
    	nvram commit		
    
  2. mtd 写入 qsdk 固件,首先把固件 xiaomimtd12.bin 传到路由器 tmp 目录下,然后 ssh 命令输入:

    	mtd write /tmp/xiaomimtd12.bin rootfs
    
  3. 拨电源重启路由器,启动起来后由浏览器 192.168.1.1,进入 qsdk 固件。

  4. 在后台 web 页面的备份升级菜单下,升级 qsdk 固件 nand-ipq807x-single.img。因为 qsdk 的固件比较大,原版两个 rootfs 分区比较小挂载不上ubi_date,这一步是把 rootfs_1 分区扩大到128M。从最后的备注章节我们可以看到不同系统下的 mtd 分区大小,rootfs_1 由原来的 023c0000 变为了 08000000。(16进制:35M 到 128M)

    mtd12: 023c0000 00020000 "rootfs"
    mtd13: 023c0000 00020000 "rootfs_1"

    mtd12: 023c0000 00020000 "rootfs"
    mtd13: 08000000 00020000 "rootfs_1"

  5. 再在后台 web 页面下刷相同固件(nand-ipq807x-single.img)一次。由于上一步把分区表改掉了,rootfs_1 分区定重新构建 UBI,所以定重新刷一遍固件。

  6. 由于固件一直在 rootfs 分区里,现在需要 ssh 把固件启动切换到另一个分区 rootfs_1 中,ssh 执行下面两条命令,然后重启,刷机完成。

    	fw_setenv flag_last_success 1
    	fw_setenv flag_boot_rootfs 1
    
  • 备注:以上全部成功完成后 qsdk 才算刷完。

  • 刷双固件

  1. 刷机方法
    在 qsdk 固件下把固件 xiaomi1.1.12.ubi 上传到路由器的 /tmp 目录,ssh 输入以下命令:

    	ubiformat /dev/mtd12 -y -f /tmp/xiaomi1.1.12.ubi
    

    如果没有报错误,则刷机成功,现在就是双系统了。

  2. 系统切换

    	# qsdk --> Mi 切换方法:
    	fw_setenv flag_last_success 0
    	fw_setenv flag_boot_rootfs 0
    
    	# 重启后进入小米系统,telnet 连接路由器,输入以下命令再次开起 ssh,并修改 ssh root 密码为 admin:
    	sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear
    	/etc/init.d/dropbear start
    	echo -e 'admin\nadmin' | passwd root
    
    	# Mi--> qsdk 的切换方法:	
    	nvram set flag_last_success=1
    	nvram set flag_boot_rootfs=1
    	nvram commit
    
  • 备注:双固件下必须把小米的自动升级关掉,小米的刷机模式是 a-b,b-a,自动升级就会把 qsdk 固件覆盖成小米固件,刷新升级小米固件必须在qsdk模式下命令进行。

  • QSDK 刷到 OpenWrt

    由于 QSDK 有校验,无法通过 web 界面直接更新,可以使用 sysupgrade 或 ubiformat 强制更新。

  1. 使用 sysupgrade(建议尽量不要使用 sysupgrades 升级):
    选定要用的升级包:openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-sysupgrade.bin,将文件上传到路由器的 /tmp 目录下,再用 SSH 登录到终端中,执行命令:

    	sysupgrade -F -n /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-sysupgrade.bin
    

    刷写后,会自动重启。

  2. 使用 ubiformat
    首先用 SSH 登录到终端中,执行如下命令,切换到小米固件下(rootfs 分区)。

    	# 切换至小米系统 rootfs分区
    	fw_setenv flag_last_success 0
    	fw_setenv flag_boot_rootfs 0
    	reboot 
    

    重启路由器后,IP 地址(192.168.31.1)可能会变,注意鉴别。选定要用的升级包:openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-factory.ubi,将文件上传到路由器 /tmp ,运行如下命令进行写入:

    	ubiformat /dev/mtd13 -y -f /tmp/openwrt-ipq807x-generic-xiaomi_ax3600-squashfs-nand-factory.ub
    	nvram set flag_last_success=1
    	nvram set flag_boot_rootfs=1
    	nvram commit
    

    ubiformat 可以刷 .ubi .bin 固件都可以。拔电源重启路由器。(必须拔电源重新启动路由器不要打命令重新启动)

  • 备注:

  • 小米固件通过浏览器执行 shell code:

    	http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=-h%3B<your encoded shell code>%3B
    
  • 查看当前分区

    	fw_printenv -n flag_boot_rootfs
    	或者
    	nvram get flag_boot_rootfs
    

    可以用上面的命令查看返回值是 1 还是 0。

    • 返回 0 是小米系统 (mtd12:rootfs)
    • 返回 1 是 OpenWRT 系统 (mtd13:rootfs_1)
  • 小米固件 Flash Layout:

    	root@XiaoQiang:~# cat /proc/mtd
    	dev:    size   erasesize  name
    	mtd0: 00100000 00020000 "0:SBL1"
    	mtd1: 00100000 00020000 "0:MIBIB"
    	mtd2: 00300000 00020000 "0:QSEE"
    	mtd3: 00080000 00020000 "0:DEVCFG"
    	mtd4: 00080000 00020000 "0:RPM"
    	mtd5: 00080000 00020000 "0:CDT"
    	mtd6: 00080000 00020000 "0:APPSBLENV"
    	mtd7: 00100000 00020000 "0:APPSBL"
    	mtd8: 00080000 00020000 "0:ART"
    	mtd9: 00080000 00020000 "bdata"
    	mtd10: 00080000 00020000 "crash"
    	mtd11: 00080000 00020000 "crash_syslog"
    	mtd12: 023c0000 00020000 "rootfs"
    	mtd13: 023c0000 00020000 "rootfs_1"
    	mtd14: 01ec0000 00020000 "overlay"
    	mtd15: 00080000 00020000 "rsvd0"
    	mtd16: 0041e000 0001f000 "kernel"
    	mtd17: 0160a000 0001f000 "ubi_rootfs"
    	mtd18: 01876000 0001f000 "data"
    
  • QSDK Flash Layout:

    	root@OpenWrt:~# cat /proc/mtd
    	dev:    size   erasesize  name
    	mtd0: 00100000 00020000 "0:SBL1"
    	mtd1: 00100000 00020000 "0:MIBIB"
    	mtd2: 00300000 00020000 "0:QSEE"
    	mtd3: 00080000 00020000 "0:DEVCFG"
    	mtd4: 00080000 00020000 "0:RPM"
    	mtd5: 00080000 00020000 "0:CDT"
    	mtd6: 00080000 00020000 "0:APPSBLENV"
    	mtd7: 00100000 00020000 "0:APPSBL"
    	mtd8: 00080000 00020000 "0:ART"
    	mtd9: 00080000 00020000 "bdata"
    	mtd10: 00080000 00020000 "crash"
    	mtd11: 00080000 00020000 "crash_syslog"
    	mtd12: 023c0000 00020000 "rootfs"
    	mtd13: 08000000 00020000 "rootfs_1"
    	mtd14: 01ec0000 00020000 "overlay"
    	mtd15: 00080000 00020000 "rsvd0"
    	mtd16: 00900000 00020000 "0:WIFIFW"
    	mtd17: 00554000 0001f000 "kernel"
    	mtd18: 019cb000 0001f000 "ubi_rootfs"
    	mtd19: 0578d000 0001f000 "rootfs_data"
    	mtd20: 0022e000 0001f000 "wifi_fw"
    
  • OpenWrt Flash Layout:

    	root@OpenWrt:/dev# cat /proc/mtd
    	dev:    size   erasesize  name
    	mtd0: 00100000 00020000 "0:sbl1"
    	mtd1: 00100000 00020000 "0:mibib"
    	mtd2: 00300000 00020000 "0:qsee"
    	mtd3: 00080000 00020000 "0:devcfg"
    	mtd4: 00080000 00020000 "0:rpm"
    	mtd5: 00080000 00020000 "0:cdt"
    	mtd6: 00080000 00020000 "0:appsblenv"
    	mtd7: 00100000 00020000 "0:appsbl"
    	mtd8: 00080000 00020000 "0:art"
    	mtd9: 00080000 00020000 "bdata"
    	mtd10: 00080000 00020000 "crash"
    	mtd11: 00080000 00020000 "crash_syslog"
    	mtd12: 023c0000 00020000 "rootfs"
    	mtd13: 08000000 00020000 "rootfs_1"
    	mtd14: 01ec0000 00020000 "overlay"
    	mtd15: 00080000 00020000 "rsvd0"
    	mtd16: 00900000 00020000 "0:wififw"
    

评论