


小米小爱音箱mini,型号LX01,主控用了全志R16-J,四核cortex-a7,NAND 128MB,RAM 128MB。喇叭4欧8w,没有音腔,音质一般。
供电口用的是micro usb,可以用来fastboot烧写分区及adb。启动时没有secure boot,可以编译烧写全志的原版Tina开源linux系统(基于openwrt),作为自己的开发板使用。
底盖是用双面胶粘了一圈,需要先把底座撬开,拆下四颗螺丝,再把喇叭撬出来。后面就拧下螺丝,比较好拆了。
电路板一面有两组丝印标识TX/RX,一组电压0.9v,一组电压3.3v。使用usb-ttl连接3.3v的,如图所示,baudrate 115200。

小爱mini UART Debug port
手里有两个小爱mini,硬件上有区别,一个是18年4月生产的,用了两片音频ADC芯片AC108,以下称这个版本为1st。另一个是只用了一片AC108,而且少了散热用的金属铝板和散热贴纸,大概是为了降低成本,减配了,以下称这个版本为2nd。
小爱mini有四个mic,一个AC108芯片有四路ADC。为了AEC降噪还需要回采通道,所以猜测一片AC108的2nd版本是用了R16-J芯片的ADC。

单个AC108芯片版本

两个AC108芯片版本
1st的uboot版本:
U-Boot 2011.09-rc1-00000-g6f728c1-dirty (Mar 31 2018 - 17:56:48) Allwinner Technology 2nd的uboot版本:
U-Boot 2011.09-rc1-00000-g8396a35-dirty (Sep 20 2018 - 15:49:22) Allwinner Technology 1st在启动时可以按任意键进入uboot命令行。 2nd在启动时可以按's'键进入(多按几次或一直按住)。
fastboot
在uboot命令行中执行fastboot_test命令,可以使用fastboot烧写分区
sunxi#fastboot_test
run usb fastboot
sunxi_fastboot_init
recv addr 0x41000000
send addr 0x45260410
delay time 0
usb init ok
set address 0x8 pc中执行:
% fastboot erase rootfs1
% fastboot flash rootfs1 rootfs.img 小爱mini的nand分区为:
--------fastboot partitions--------
-total partitions:9-
-name- -start- -size-
env : 1000000 100000
kernel1 : 1100000 600000
rootfs1 : 1700000 2000000
kernel2 : 3700000 600000
rootfs2 : 3d00000 2000000
misc : 5d00000 100000
private : 5e00000 100000
crashlog : 5f00000 100000
UDISK : 6000000 0 旧版固件直接登陆 1st的固件版本号: 1.2.10,2018年4月9号,应该是出厂固件,没更新过。 启动完成后,按回车可以直接进入root shell
all servers are OK
LED boot ok.
BusyBox v1.24.1 () built-in shell (ash)
_____ _ __ __ __ ___ ___
| ||_| ___ ___ | | | | | |_ |
| | | || || _|| . | | |__|- -| | |_| |_
|_|_|_||_||___||___| |_____|__|__|___|_____|
----------------------------------------------
Tina Linux (Neptune, 91)
----------------------------------------------
imilab trunk version 0.5.6
root@mico:/# 需要密码登陆
2nd的固件版本号:1.50.4,2020年12月4号。
小米在后来的固件中加了登陆密码,采用了sn+特定字符串计算md5的方式,多款小米音箱都适用。很容易被逆向出密码规则,感兴趣的可以自行搜索一下。这个特定字符串在不同版本固件中还改了几次。
ledserver[453]: open_light start
ledserver[453]: light_show_effect 4
all servers are OK
LED boot ok.
LX01 login: root
Password:
BusyBox v1.24.1 () built-in shell (ash)
_____ _ __ __ __ ___ ___
| ||_| ___ ___ | | | | | |_ |
| | | || || _|| . | | |__|- -| | |_| |_
|_|_|_||_||___||___| |_____|__|__|___|_____|
----------------------------------------------
ROM Type:release / Ver:1.50.4
----------------------------------------------
root@LX01:~# 不过在最新的固件中,小爱mini为1.56.1,登陆密码改为了DSA签名算法,使用私钥加密SN+随机字符串作为登陆密码, 输入后公钥解密, 验证。这种加密方式本身还是很难被攻破的。
LX01 login: root
================================
pipe try (micocfg_sn)
pipe try (micocfg_channel)
file /tmp/mico_pam_magic.data empty, recreadte
c09a4a8a
try get user:magic[release]: 18***/********C09A4A8A
get user:root
user try login root
magic[release]: 18***/********C09A4A8A
password:
>>>>>>>>>password_in=30313233343536
dsa verify sign len 14:30313233343536, magic(len 22) 18***/********C09A4A8A
dsa verify sign len 7, digest(len 22) 18***/********C09A4A8A
DSA_verify err error:0D07209B:lib(13):func(114):reason(155)!
dsa verify failed
Login incorrect
LX01 login: 但可以另辟蹊径,先来看一则锁的故事:
一间屋子换了一把新锁(DSA), 没有钥匙很难打开。但隔壁屋子的锁容易打开, 而且大家都知道了怎么打开。而从隔壁屋子可以进到这间屋子, 从里面可以把锁打开, 还可以把锁换掉, 甚至直接把门拆了。
后来两间屋子都被换了新锁, 从外面进不去了。
知道屋子要经常装修(OTA), 就找到了装修公司的电话, 叫来了装修队。半途把装修队拦了下来, 说锁不要装了, 大门常打开。装修队谁的话都听, 照办了。可是监工(MISO)看装修队的施工方案有问题, 不让动工。于是找到了门卫(UBOOT), 经过门卫的同意, 装修队把屋子硬给装了(FASTBOOT), 大门常打开。
门卫也是谁的话都听, 如果不听话了, 还可以把门卫换成自己的人, 那样干什么就更方便了。
后来还把装修公司的电话扔了, 再也叫不来装修队了(rm /bin/ota)。 1. 分区中的固件
新的固件使用DSA签名的登陆验证,很难进入。而通过uboot切换启动分区,另一分区中如果仍为旧的验证方式,则可以进入系统。
在uboot命令行中, 通过执行命令:
run setargs_first boot_first
run setargs_second boot_second 可以选择启动的分区。
进入系统后,可以将另一个rootfs分区dd出来。使用unsquashfs工具解压,修改后,用mksquashfs工具打包,再从uboot中用fastboot烧写进去。
2. ota固件
小爱mini中,通过执行matool_check_upgrade命令来检查是否需要升级,如果需要升级,则显示ota包的下载地址,否则没有显示。此外,在/tmp目录中的log日志文件中也可以看到ota请求的地址。
root@mico:/tmp# matool_check_upgrade
https://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/lx01/mico_firmware_c1cac_1.56.1.bin 31458536 获得了ota固件链接,下载后使用binwalk提取固件,同样可以使用unsquashfs/mksquaskfs/fastboot修改固件并烧写。
$ binwalk mico_firmware_c1cac_1.56.1.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
23944 0x5D88 uImage header, header size: 64 bytes, header CRC: 0x32556CD8, created: 1970-01-01 00:00:00, image size: 2944424 bytes, Data Address: 0x40008000, Entry Point: 0x40008000, data CRC: 0xCBE58ED2, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "ARM OpenWrt Linux-3.4.39"
24008 0x5DC8 Linux kernel ARM boot executable zImage (little-endian)
40299 0x9D6B gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)
4195272 0x4003C8 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 27150277 bytes, 2061 inodes, blocksize: 262144 bytes, created: 2021-10-28 13:55:53 提取固件:
$ binwalk -e mico_firmware_c1cac_1.56.1.bin warning提示改变了一些symbol link,所以删掉squashfs-root和squashfs-root-0目录。
使用unsquashfs重新解压rootfs
$ sudo unsquashfs 4003C8.squashfs
Parallel unsquashfs: Using 8 processors
1968 inodes (2124 blocks) to write
[==========================================================================/] 2124/2124 100%
created 1389 files
created 93 directories
created 578 symlinks
created 1 device
created 0 fifos
created 0 sockets 得到的squashfs-root目录即为rootfs。
3. 修改固件
修改的固件中的inittab可以绕过登陆验证: 在/etc/inittab中将 ::askconsole:/bin/login 改为 ::askconsole:/bin/sh
4. 打包squashfs
$ sudo mksquashfs squashfs-root rootfs_mod.img -comp xz -b 256k
Parallel mksquashfs: Using 8 processors
Creating 4.0 filesystem on rootfs_mod.img, block size 262144.
[==========================================================================-] 1545/1545 100%
Exportable Squashfs 4.0 filesystem, xz compressed, data block size 262144
compressed data, compressed metadata, compressed fragments,
compressed xattrs, compressed ids
duplicates are removed
Filesystem size 26510.50 Kbytes (25.89 Mbytes)
41.29% of uncompressed filesystem size (64198.31 Kbytes)
Inode table size 17618 bytes (17.21 Kbytes)
24.42% of uncompressed inode table size (72145 bytes)
Directory table size 20300 bytes (19.82 Kbytes)
43.05% of uncompressed directory table size (47149 bytes)
Number of duplicate files found 29
Number of inodes 2061
Number of files 1389
Number of fragments 74
Number of symbolic links 578
Number of device nodes 1
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 93
Number of ids (unique uids + gids) 1
Number of uids 1
root (0)
Number of gids 1
root (0)
5. 使用fastboot烧写
$ fastboot erase rootfs1
Erasing 'rootfs1' OKAY [ 7.492s]
Finished. Total time: 7.514s
$ fastboot flash rootfs1 rootfs_mod.img
Sending 'rootfs1' (26512 KB) OKAY [ 1.291s]
Writing 'rootfs1' OKAY [ 6.057s]
Finished. Total time: 7.383s
启动后,回车进入root shell:
BusyBox v1.24.1 () built-in shell (ash)
_____ _ __ __ __ ___ ___
| ||_| ___ ___ | | | | | |_ |
| | | || || _|| . | | |__|- -| | |_| |_
|_|_|_||_||___||___| |_____|__|__|___|_____|
----------------------------------------------
ROM Type:release / Ver:1.56.1
----------------------------------------------
root@LX01:~#
小爱音箱mini板子上留有uart调试口,可以较容易的进入root shell。小米没有对这款设备做诸多限制,可以完全作为自己的设备开发使用。
下篇中将会介绍下编译烧写全志的Tina linux(小爱mini本身也是基于Tina linux开发)。文中提到的开发工具均为linux下的,windows下的工具问题请感兴趣的同学自行搜索。
如果有问题或者想交流,可以通过以下方式联系(base64): wx:c3lzdGVtMnBsYXllcgo=, email: c3lzdGVtLXBsYXllckBvdXRsb29rLmNvbQo=,提问前请先 学会提问。 ref: 1. https://zhuanlan.zhihu.com/p/35292635 2. https://bbs.hassbian.com/forum.php?mod=viewthread&tid=11139&page=1