小米路由改私有云

来自Jack's Lab
2014年6月5日 (四) 11:21Comcat (讨论 | 贡献)的版本

跳转到: 导航, 搜索

目录

1 小米路由硬件概览

1.1 主核心

主核心是一颗 BCM4709 SoC,片内含有:


> ARM Cortex-A9 Dual-Core

- 32 KB I-cache and 32 KB D-cache per core

- 256 KB L2 Cache (shared)

- 128-entry TLB

- SMP and AMP capable

- Boot ROM


> DDR3 接口
> NOR/NAND 接口
> 5个 10/100/1000 PHY 口
> USB 3.0/PCIe 口
> 2个 PCIe 1x 口
> USB2.0/SDIO3/MDIO/UART/I2C/SPI/GPIO/PWM/WDT ...



1.2 WiFi 芯片

2.4G 用的一片 BCM43217,标称能到 300Mbps (与 Netgear R6250 一致;高端 Netgear R7000 2.4GHz 用的一片 BCM4360,600Mbps)

5G 用的一片 BCM4352,标称能到 867Mbps (Netgear R7000 用的一片 BCM4360, 1300Mbps)



WiFi 部分与 ASUS RT-AC56U 一致


高端路由如 Netgear R7000 / ASUS RT-AC68U 在 2.4G 和 5G 皆选用性能更强劲的 BCM4360


从WiFi的缩水(300Mbsps/2.4G+867Mbps/5G)可以推测其性能较 Netgear R7000 (600Mbps/2.4GHz*+1300Mbps/5GHz) 要差

Netgear R7000 和 ASUS RT-AC68U 对比测试: http://www.smallnetbuilder.com/wireless/wireless-reviews/32239-ac1900-first-look-netgear-r7000-a-asus-rt-ac68u



1.3 Flash

一片 MXIC 25L12835F

128MBit (16MB) 大小的 SPI Flash

SOP8 宽体封装



1.4 内存

内存为 256MB DDR3-1600,直接接在 SoC 上 (大小与 Netgear R7000 一致)



1.5 硬盘

内置 1TB SATA 硬盘,因为 BCM4709 不像更高端的 BCM5862x 直接带 SATA 3.0 控制器,其额外用了一片 PCIe 接口的 SATA 控制芯片


硬盘出厂分为 4 个 primary 分区:

  • 1 分区为系统,64MB
  • 2 分区也是备份系统区,64MB,从 1 区启动失败会自动尝试挂载2区
  • 3 分区为系统配置备份区
  • 4 分区为用户数据区


总体参考了 ASUS RT-AC56U、Netgear R7000 以及 ASUS RT-AC68U 的设计



2 基础 Hack

官方系统启动日志

完整的内核启动信息

系统基本信息搜集

openwrt nvram信息搜集

小米路由系统启动过程

官方发布的固件收集

小米路由固件解包打包

小米路由固件格式

小米路由vmlinuz.trx格式解析 (Kernel + initramfs)

小米路由相关工具链 (Toolchain)



2.1 打开 SSH

2.1.1 不拆机法

来源:http://bbs.xiaomi.cn/thread-9756897-1-3.html

先Web管理界面里,“路由设置“ -> “高级功能” -> “路由器手动升级” 里选择 0.4.58 版本的固件,上传并安装固件,等待其重启后,通过如下 http api 打开 SSH:

在小米路由的web控制台中,将URL链接中的 /web/home 替换成

/api/xqsystem/upgrade_rom?url=%3Bnvram+set+ssh_en%3D1%3Bnvram+commit%3B%2Fetc%2Finit.d%2Fdropbear+start%3B

执行后,返回:{"code":0}

ssh root@192.168.31.1 密码 admin



2.1.2 拆机法

官方给出的打开 SSH 的方法还要通过云端的小米帐号,既愚蠢又鸡贼

其实 openwrt 系统已经内置 dropbear 服务(嵌入式环境下的 SSH 服务),在 /etc/init.d/ 下有 dropbear 的启动脚本,/etc/rc.d 下也有 dropbear 的链接

只是 openwrt 在 nvram 里放了一些参数,然后 /etc/init.d/dropbear 启动脚本会检查这些参数,关键参数 'ssh_en' 在 nvram 里默认为零,因此 dropbear 是启动不了的

其实只要把硬盘拆下来,挂载在 PC 机上,挂载上第三个分区,替换 etc/init.d/dropbear etc/shadow 并在 etc/dropbear/ 加入两个 key 文件即可打开 SSH 服务

etc/init.d/dropbear 修改:

--- old/etc/init.d/dropbear	2014-05-22 22:40:08.000000000 +0800
+++ new/etc/init.d/dropbear	2014-06-02 20:21:46.000000000 +0800
@@ -41,7 +41,7 @@
 	# check if section is enabled (default)
 	local enabled
 	config_get_bool enabled "${section}" enable 1
-	[ "${enabled}" -eq 0 ] && return 1
+	#[ "${enabled}" -eq 0 ] && return 1
 
 	# verbose parameter
 	local verbosed
@@ -56,7 +56,7 @@
 	local val
 	# A) password authentication
 	config_get_bool val "${section}" PasswordAuth 1
-	[ "${val}" -eq 0 ] && append args "-s"
+	#[ "${val}" -eq 0 ] && append args "-s"
 	# B) listen interface and port
 	local port
 	local interface
@@ -72,10 +72,10 @@
 	[ "${val}" -eq 1 ] && append args "-a"
 	# E) root password authentication
 	config_get_bool val "${section}" RootPasswordAuth 1
-	[ "${val}" -eq 0 ] && append args "-g"
+	#[ "${val}" -eq 0 ] && append args "-g"
 	# F) root login
 	config_get_bool val "${section}" RootLogin 1
-	[ "${val}" -eq 0 ] && append args "-w"
+	#[ "${val}" -eq 0 ] && append args "-w"
 	# G) host keys
 	config_get val "${section}" rsakeyfile
 	[ -f "${val}" ] && append args "-r ${val}"
@@ -118,11 +118,12 @@
 	include /lib/network
 	scan_interfaces
 	config_load "${NAME}"
-	flag_ssh=`nvram get ssh_en`
-	if [ "$flag_ssh" == "1" ];
-	then
+	#flag_ssh=`nvram get ssh_en`
+	#flag_ssh=1
+	#if [ "$flag_ssh" == "1" ];
+	#then
 		config_foreach dropbear_start dropbear
-	fi
+	#fi
 }
 
 stop()

etc/shadow 则是把 root 密码改为 'admin'

root:$1$mGrY9Gpt$vT7nVZg7fYnJ3rI5.UvJP0:16205:0:99999:7:::
daemon:*:0:0:99999:7:::
ftp:*:0:0:99999:7:::
network:*:0:0:99999:7:::
nobody:*:0:0:99999:7:::

etc/dropbear/dropbear_dss_host_key 和 etc/dropbear/dropbear_rsa_host_key 则是 dropbear 运行所必须

把他们打成一个包 enable_xiaomi_router_ssh-jackslab.tgz,放在:http://pan.baidu.com/s/1nt2sb9J

用法:

# dmesg|tail
[365314.453954] ata3: EH complete
[365314.454059] scsi 2:0:0:0: Direct-Access     ATA      ST1000LM024 HN-M 2BA3 PQ: 0 ANSI: 5
[365314.454321] sd 2:0:0:0: Attached scsi generic sg1 type 0
[365314.454341] sd 2:0:0:0: [sdb] 1953525168 512-byte logical blocks: (1.00 TB/931 GiB)
[365314.454346] sd 2:0:0:0: [sdb] 4096-byte physical blocks
[365314.454639] sd 2:0:0:0: [sdb] Write Protect is off
[365314.454644] sd 2:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[365314.454747] sd 2:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[365314.474876]  sdb: sdb1 sdb2 sdb3 sdb4
[365314.476042] sd 2:0:0:0: [sdb] Attached SCSI disk

# mount /dev/sdb3 /mnt
# ls /mnt/
dhcp.leases  etc  lost+found  sysapi  sysapihttpd  usr
# tar zxf enable_xiaomi_router_ssh-jackslab.tgz -C /mnt/
# sync
# umount /mnt/

拔开,重新插入小米路由,启动后 ssh root@192.168.31.1 密码为 admin



2.1.3 官方开SSH原理

官方打开 SSH 的刷机包原理: http://www.iptvfans.cn/wiki/index.php/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%99%A8%E5%AE%98%E6%96%B9SSH



2.2 打开串口写

默认的UART可以看到输出,但是不能写。需要修改nvram:

打开 SSH 后,root 登录:

# ssh root@192.168.31.1
root@192.168.31.1's password: 

root@XiaoQiang:~# nvram get uart_en
0
root@XiaoQiang:~# nvram set uart_en=1
root@XiaoQiang:~# nvram commit


或者:

先Web管理界面里,“路由设置“ -> “高级功能” -> “路由器手动升级” 里选择 0.4.58 版本的固件,上传并安装固件,等待其重启后,通过如下 http api 打开串口写:

在小米路由的web控制台中,将URL链接中的 /web/home 替换成

/api/xqsystem/upgrade_rom?url=%3Bnvram+set+uart_en%3D1%3Bnvram+commit%3B

执行成功后,服务器返回:{"code":0}

串口默认配置为 115200 8n1

如果重启后自动进入 ramfs,而没有挂载 /dev/sda1 或者 squashfs,查一下 flag_package_update 这个 nvram 参数,如果是5,将其改为 0,重启后即恢复正常:

BusyBox v1.17.1 (2014-04-26 02:54:05 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

$ nvram get flag_package_update
5
$ nvram set flag_package_update=0
$ nvram commit
$ reboot




3 参考















个人工具
名字空间

变换
操作
导航
工具箱