Back

小米ai音箱系统简单分析

deny 4月23日

前言

这是一篇关于小米ai音箱(以下简称小爱音箱)的系统分析,为什么会涉及这一话题?这期间详细说的话难以说明白,总结来说就是为了将小爱同学接入homeassistant(有关详情请百度,以下简称hass)。如果你了解hass后并且也打算倒腾倒腾,或者说想看看大神们是怎么玩hass的话,这里也推荐一个网站 hassbian
小爱音箱内部电路板是有两个版本的,黑色的电路板和绿色的电路板;而黑色是能够修改系统文件的,绿色则不能;(不幸的是我手里头的小爱音箱就是绿色的,也一直靠着一套“生命维持系统”才能实现开机自启和守护进程等功能;)所以为了达到修改系统文件的目的,对小爱音箱的系统进行了大致的分析。

正文

通过ssh连接上小爱音箱,用户名为root,无密码。(前提是开启了ssh,参考文章
使用df命令查看分区挂载情况:

root@mico:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/mtdblock4           31.9M     31.9M         0 100% /
tmpfs                   121.2M      1.1M    120.2M   1% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/ubi0_0             136.5M     31.8M    100.0M  24% /data

根目录可用空间居然为0,遂查看/etc/fstab文件,可里面也啥都没有;
多番查找后发现了/proc/mounts文件:

root@mico:~# cat /proc/mounts
/dev/mtdblock4 / squashfs ro,noatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,noatime 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,noatime 0 0
tmpfs /tmp tmpfs rw,nosuid,nodev,noatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,size=512k,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,mode=600,ptmxmode=000 0 0
debugfs /sys/kernel/debug debugfs rw,noatime 0 0
pstore /sys/fs/pstore pstore rw,relatime 0 0
/dev/ubi0_0 /data ubifs rw,relatime 0 0

可以看出根目录是squashfs文件系统,挂载属性为只读。
因为文件系统是squashfs的缘故,所以就算挂载属性是读写也是无法对系统文件进行修改的。
直接修改是无法实现了,也只能想办法“曲线救国”了;于是乎想到了刷机。
下面就不再详述过程,只记录大概;
1.44.4刷机包官方版下载地址:https://bigota.miwifi.com/xiaoqiang/rom/s12a/mico_all_f86a5_1.44.4.bin
查看刷机包内文件:/bin/miso -c <刷机包文件> [-f 指定文件]

root@mico:/data# /bin/miso -c mico_all_f86a5_1.44.4.bin
model:3
file type:0
Segment 0: Offset 0x30
Filename mico_version
Flash addr = 0xffffffff, length = 0x201, partition = 65535
Segment 1: Offset 0x280
Filename root.squashfs
Flash addr = 0xffffffff, length = 0x1f53899, partition = 65535
Segment 2: Offset 0x1f53b60
Filename boot.img
Flash addr = 0xffffffff, length = 0x4a6abe, partition = 65535
Segment 3: Offset 0x23fa660
Filename u-boot.bin.usb.bl2
Flash addr = 0xffffffff, length = 0xc000, partition = 65535
Segment 4: Offset 0x24066a0
Filename u-boot.bin.usb.tpl
Flash addr = 0xffffffff, length = 0x81c00, partition = 65535
Segment 5: Offset 0x24882e0
Filename dtb.img
Flash addr = 0xffffffff, length = 0x9c40, partition = 65535

刷机包解包命令:/bin/miso -r -x <刷机包文件> [-f 指定文件]

root@mico:/data/rootfs# miso -r -x mico_all_f86a5_1.44.4.bin
root@mico:/data/rootfs# ls
boot.img  dtb.img  mico_all_f86a5_1.44.4.bin  root.squashfs  u-boot.bin.usb.tpl  mico_version  u-boot.bin.usb.bl2

nand闪存分区情况:

root@mico:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00200000 00020000 "bootloader"  #uboot
mtd1: 00800000 00020000 "tpl"
mtd2: 00800000 00020000 "boot0"       #系统0的kernel boot.img文件刷入分区
mtd3: 00800000 00020000 "boot1"       #系统1的kernel boot.img文件刷入分区
mtd4: 02000000 00020000 "system0"     #系统0的rootfs root.squashfs文件刷入分区
mtd5: 02000000 00020000 "system1"     #系统1的rootfs root.squashfs文件刷入分区
mtd6: 0a000000 00020000 "data"

查看当前的启动系统:

fw_env -g boot_part

切换系统:

fw_env -s boot_part <boot0或boot1>

root.squashfs里面就是根目录文件系统,可以通过unsquashfs命令将其解包,再用mksquashfs命令打包后便可以刷入到小爱音箱的system分区。(这俩命令小爱音箱里都没有,要另外的Linux系统安装后操作)
具体命令:

unsquashfs root.squashfs #解包后会出现一个名为squashfs-root的文件夹,可以对里面的文件进行修改
mksquashfs squashfs-root <输出文件名> -comp xz -all-root #输出文件名自定义,如果是文件已经存在,请先删除!
mtd write <打包后的文件> </dev/mtd4或者/dev/mtd5> #将打包后的文件通过该命令刷入系统,注意刷入的文件的版本号与被刷入的系统的版本号一致性;

其他发现&补充说明

/etc/ssl/certs 文件夹下存放这各个证书签发机构的证书,想要劫持https流量的可以从这里下手。
/usr/bin 目录下有很多有意思的命令,可以去分析分析

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​‌​​​‌‌‌‌‌‌​​​​‍​​​​​‌‌‌​​​‌‌​​‍‌​​‌‌‌‌​‍‌​​‌​‌‌​‍​‌‌​‌​​​​​​​‌‌​​‍​​​​‌​​​‌​​‌‌‌​‍​​​​​‌‌​​​​​‌​​‍​​​​​​‌​​‌​​​​​‍​​​​‌​​​‌‌‌‌‌‌‌‍​‌​‌‌​​‌​‌​‌​‌​‍​‌​‌‌​‌‌‌‌‌‌​​‌‍​​‌‌​​​​‌‌​‌‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌‌​‌​‍‌​​‌​​​‌‍‌​​​​‌‌​‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​​‌‌​‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌​‌‍‌‌​​‌‌​​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌‌‌​‌‍‌​​‌​​‌‌‍‌​​‌​​​​‍‌​​‌‌​​​‍‌‌​‌​​​‌‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​​​‌​‌‍‌​​​​‌‌​‍‌‌​‌​​​‌‍‌​​​‌​​‌‍‌​​‌​‌‌​‍‌​​​‌‌‌‌‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌‌‌​‍‌‌​​‌​‌​‍‌‌​​‌‌‌​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

系统更新命令 : /bin/ota #这是一个shell脚本文件
对这个文件一路分析下去就能知道系统的刷机机制了。

结束

至此已经能够实现通过刷机的方式修改系统文件了,但是还有一些点我可能没有描述的那么详细,所以在你没有经过具体分析和详细了解其中刷机机制前,请谨慎刷机。
不过也是为了方便进行刷机,也打算开一个repo,将这些操作写成脚本方便大家。
github地址:https://github.com/denymz/mi_aispeaker

Submit
    马克
    马克  2019-05-13, 20:17

    博主,可以提取固件刷到京东mini上面吗?

      deny
      deny  2019-05-15, 13:04

      正常来说是不行的