小米路由改私有云

来自Jack's Lab
2017年5月9日 (二) 13:09Comcat (讨论 | 贡献)的版本

跳转到: 导航, 搜索

目录

1 硬件概览

小米路由R1D系统框图

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)


  • BCM43217: 2.4G WiFi 802.11b/g/n Transceiver,PCIe 2.0 接口,射频+基带+MAC一片解决,300Mbps 参考:此页
  • BCM4352: 5G WiFi 2-Stream 802.11ac Transceiver(支持802.11a/b/g/n)PCIe 2.0 接口,射频+基带+MAC一片解决,867 Mbps 参考:此页


WiFi 部分与 ASUS RT-AC56U 一致


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

  • BCM4360: 5G WiFi 3-Stream 802.11ac Gigabit Transceiver(支持802.11a/b/g/n)PCIe 2.0 接口,射频+基带+MAC一片解决,802.11n 600Mbps, 802.11ac 1300Mbps 参考: 此页


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

Netgear R7000 和 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 控制芯片 ASMedia ASM1062


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

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



1.6 MISC

1.6.1 TMP75

主板温度传感器,I2C 接口



1.6.2 NFC

没有这个设备,只是在外壳的顶端贴了一片 NFC 帖,内含必要信息而已



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



2 基础 Hack

CFE信息收集

官方系统启动日志

完整的内核启动信息

系统基本信息搜集

网络配置状态信息搜集

openwrt nvram信息搜集

路由提供的网络服务相关信息汇集


小米路由系统启动过程

官方发布的固件收集

小米路由固件解包打包 (米厂自己改了个trx,叫:mkxqimage)

小米路由固件格式 (TRX格式增强)

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

小米路由flash备份



2.1 打开 SSH

2.1.1 不拆机法

来源:小米路由论坛

先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 的刷机包原理



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 核心系统开发

现有核心包在这个页面: http://github.com/comcat/miwifi

小米路由相关工具链 (Toolchain,内核和文件系统编译环境)

小米路由内核开发环境搭建

Xiaomi Router R1D Kernel Developing Notes



4 Applications

4.1 Connected devices

Using the dnsmaq to monitor:

/data/dhcp.leases
root@Jarvis:~# wl -i wl0 assoclist
root@Jarvis:~# wl -i wl1 assoclist
assoclist 18:FE:34:A2:65:AD
assoclist 18:FE:34:F2:8A:14
assoclist AC:A2:13:CA:B3:7A
assoclist 5C:CF:7F:82:6B:D8
assoclist 5C:CF:7F:94:D9:9A
assoclist 5C:CF:7F:94:DC:2C
assoclist AC:A2:13:CA:F0:40

# Proprietary Atheros (madwifi)
# wlanconfig ath0 list sta



4.2 WiFi Config files

root@Jarvis:~# cat /etc/config/network 

config switch 'eth0'
	option enable '1'

config switch_vlan 'eth0_1'
	option device 'eth0'
	option vlan '1'
	option ports '0 2 5*'

config switch_vlan 'eth0_2'
	option device 'eth0'
	option vlan '2'
	option ports '4 5'

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0.1'
	option proto 'static'
	option ipaddr '192.168.31.1'
	option netmask '255.255.255.0'

config interface 'wan'
	option username '900000563616'
	option proto 'pppoe'
	option password 'i7k9e7b8'
	option ifname 'eth0.2'



5 参考















个人工具
名字空间

变换
操作
导航
工具箱