小米AI音响(非mini版)的拆解及简要系统分析
概要
因公司需要,采购了一台小米AI音响,价格299RMB,淘宝上或许可以便宜一丢丢吧。
等了一个星期才到货,到货就扒了衣服了,外壳全白,符合小米的智能家居的颜色。
一、小米AI音响的拆机部分
拆解步骤:
1、从小米AI音响的底部,将胶垫撕掉后,露出4颗螺丝孔位,螺丝为十字螺丝,此步骤拆解简单;
2、将小米AI音响的箱体抽出;
3、箱体打开后,同样有四颗十字螺丝固定着主板;
4、将主板上的电源线、面板线及喇叭线移除后,将三个触点焊接上对应的TTL线;
5、焊接完毕后,重新将主板固定到AI的箱体上,并接上对应的电源线、面板线及喇叭线;
6、打开对应的电脑上的串口软件(建议PUTTY,串口波特率115200 8N 1),将箱体接入电源适配器,通电后,让其正常应用。
二、小米AI音响系统的分析部分
1、扫描小米包装上的二维码,下载小爱音响APP,并在手机上安装好;
2、第一次的时候,需要配置网络,并通过蓝牙将对应的信息(SSID,密码,加密方式等)传递到小爱音响上,让其接入网络;
3、此时,就需要对应的软件进行分析小爱音响了。
个人分析此设备的步骤及想法:
1、扫描小爱音响的网络端口;
2、利用nmap进行网络的抓包;
3、分析小爱音响的APP的logcat日志;
4、逆向小爱音响APP;
5、利用小爱音响的主板上的串口,打印TTL信息,如果可能的话,进入到小爱音响的系统之中;
6、查找小爱音响的升级的OTA信息,截取对应的升级固件,并利用逆向工具解压对应的固件,分析固件中的文件内容;
7、综合上述的信息,将所有信息归集到一起,总体上对此设备进行分析总结。
实现的过程如下:
1、扫描小爱音响的wifi端口;
功劳不能说没有,等了30分钟,看到的就一个TCP端口53,失望而归;
2、利用nmap抓取小米音响的通讯包;
可以说此方法,能截取95%以上的音频数据源格式的地址,有效,但对于分析系统的实现无用;
在抓取此包时,发现了一个9999端口,此后续分析为nao_httpd的进程启动的,提供此设备的xml配置文件的信息。
3、分析小爱音响的APP的logcat日志;
这个步骤,我就不多说了,大家都懂,自己看日志吧,无非就是些MICO的push和通过POST和GET来获取API对应的数据信息;
4、逆向小爱APP
这个也忽略不讲了,大家自己去搞定吧,逆向的方法和工具有很多。
这个步骤我没有做,因为从软件起家的小米,不会傻到不做一点防护,有兴趣的自己去玩;
5、音响主板上的串口,这个较为有效,而且实现方便;
缺点就是需要摸索对应的焊点和线序,在此我给出对应的焊点和线序,可以帮大家轻松进入系统:
小米AI音响串口焊点链接到USB的线序:
(建议串口软件PUTTY,波特率115200 )
TPM26 <—-> GND
TPM25 <—-> TXD
TPM24 <—-> RXD
拿到串口后,你就可以看到其内部的所有信息了。
6、OTA的部分,获取固件并解压固件,这个也是可以实现的。
实现的方法:
因为你今天买到的小爱音响里面的固件,已经是旧的固件了。
在小爱音响app的升级页面里可以获取到此设备需要升级的请求,通过获取请求的地址能够拿到对应的固件地址。
拿到固件地址后,就去逆向此固件吧,很轻松搞定bin里面的内容,对文件系统进行分析就能够分析出你想要的内容。
如图:
下载的文件如下:
7、整理上述的所有信息,共享给读者朋友们,用于分析和学习。
下面我就将上述分析的结果都展示给大家:
串口TTL的启动信息(有点长,凑合着看吧):
敲击键盘上的回车后,就直接进入了系统:
获取MAC对应的信息:
RTC对时,这个方法,大家都可以用的.
触摸板touchpad是通过ubus进行交互的,具体的如下:
这里是不是看到了ssh_enable,实际上也是可以通过ssh进入系统的。
只是这里小米将ssh设置了一个开关,而且只能用秘钥认证来进入。
对于拿到串口后,就不需要了。
自己用dropbearkey生成一个key,放在/data/etc/dropbear/目录下,
然后运行对应的命令就可以开启dropbear的ssh访问了。
无密码进入。
root@mico:/# dropbear -r /data/etc/dropbear/dropbear_rsa_host_key -E
Windows下也是可以登录到小爱音响内部,如图:
分区结构:
9999端口所看到的文件内容:
其他的文件也是可以看到的,这里就不说明了。
常见的几个调用:
播放对应音乐(本地、网络)的方法,实际很简单,小爱音响提供了工具:
设置音量的方法(两种都是可以的):
小爱的欢迎音乐:
root@mico:~# /bin/notify.sh welcome
API的配置文件:
另外,可以通过接口,获取小米音响的消息服务器列表!
https://api.mina.mi.com/brokerlist/config
几个脚本:
小米增加的几个进程:
增加了几个定时任务:
其中就有OTA的升级部分,还有mediapalyer的状态监测,如果内存不足的话,则会重启mediaplayer程序。
在运行升级检测的时候,从日志的截取上能够获取到对应的下载路径和升级文件的头部信息,具体的参加下面的截图:
从中可以看出这个bin文件的构成部分,cfe+linux+rootfs+weight+sqafs+ramfs,再结合上面的upgrade的脚本,就能够初步判定此脚本的运行过程了。
一些可以直接执行的命令,获取对应的设备信息(已经破坏了返回值,但输入的命令都是可以执行的):
综述:
架构上,小米音响用的是openwrt的LEDE系统,增加了对应的几个关键的进程,比如:didiagent、mediaplayer messagingagent notify、miio_client_helper等,通过mqtt消息订阅机制解决app端到平台,平台到音响间的通信问题,总体来说并不是很复杂,外围器件比如蓝牙、wifi,功放等这些都是附属的必须品。
**
天猫精灵设备拆机及系统分析
**
我手头的这个天猫精灵型号为TG_X1,黑色天猫精灵AI助手,拆解没有多少难度,但需要注意连接线的问题。
拆机后,看到主控板的信息如下:
主控型号:联发科 MT8516
MT8516支持四核心64位ARM® Cortex-A35™,主频达1.3GHz。该芯片还内建WiFi 802.11 b/g/n 和蓝牙 4.0NAND
Flash 型号:MT29F2G08ABAEAWP
功放:TI TAS5751M/5W单喇叭,搭载无源辐射器
灯控板上有几个焊点(应该是ADB的USB接口),焊接上去,结果发现已经无用了。
究其原因发现,升级固件后,将adbd的程序给删除了
具体的参见/lib/systemd/system/android-tools-adbd.service文件的内容:
在/data/usr/bin目录下就剩下一个android-gadget-setup了,adbd文件已经不存在了。
如果阿里自己的程序员需要调试的话,导入一个adbd的就可以了。
为了验证自己的猜测,我解压了一个同样平台下的UBI的文件系统,获取了一个ADBD的程序,放到天猫精灵/data/usr/bin/目录下,重新启动天猫精灵,就能看到ADB的设备了。
下面是这个ADB设备的PID和VID,与上面程序中的是相同的
连接好对应的线路后,就可以用ADB调试天猫精灵了。
USB线的线序及颜色对应关系,如下图:
以下为adb调试的截图:
adbd的文件需要放置在这个目录下/data/usr/bin/目录下,这样在系统启动的时候,就会加载这个进程,进行启动了。
这里我将adbd的程序共享出来了,有需要的自己去下吧。
下载地址:https://download.csdn.net/download/leekwen/10420146
至于如何放置这个ADBD的程序?
你可以先通过下面的串口进去,然后通过天猫精灵里面的wget命令下载一下就可以了。用chmod设置好可执行权限后,重新启动,就开启了天猫精灵的adbd调试口。那么以后就不需要再拆机用串口调试了。但是第一次的时候,你需要拆机,将这个程序导入到天猫精灵的/data/usr/bin/目录下。
串口调试的方法如下下面先看看串口的进入方法,这里阿里们没有将这个串口给屏蔽,所以给了我们机会啊。
在主控板上,看到了UART的接口,直接焊上线,TTL走起;
看到了一个大串口的乱码输出,看来一定是波特率不对了。
阿里天猫精灵的串口波特率应该是:921600
设置正确的波特率,OK,输出正确的字符。
以下为输出的启动信息(真的好长):
直接按个Enter键,oK,出现了登录提示:
Yocto GENIVI Baseline (Poky/meta-ivi) 11.0.1 aud8516-ali-slc ttyS0
aud8516-ali-slc login:
Yocto GENIVI Baseline (Poky/meta-ivi) 11.0.1 aud8516-ali-slc ttyS0
aud8516-ali-slc login:
输入用户名:root 按回车,竟然直接取到了 # 特权,与adb的调试方式类似啊!
看看具体的信息吧:
MTD分区的信息:
设备的ID及系统的版本信息:
启动的服务:
这里看到了ADBD服务了,仔细查看发现其实已经不存在了,所以有了上面的怀疑(USB的接口线为ADB的调试口),事实证明确实如此,上面的移植ADBD的程序,也证明了这一点。
这里看到了一个主要的服务appmainprog,这个服务就是这个系统的服务的核心服务了。
其实这个服务是MTK提供的一个智能语音的应用进程框架的核心了。
阿里的这个天猫精灵用的应该是Zelus 智能语音开发平台,自己包装了一下,在wifi密码的输入上采用了自己的支付宝支付密码配对方式,OTA的接口为自己处理了一下,硬件方案和软件平台估计就是Zelus 智能语音开发平台了。
这个为OTA升级后的ubifs文件系统的挂载脚本:
PCM卡的信息:
aplay list一下CARD设备:
OTA升级时,会将/data分区重写,所以/data分区的内容也就是升级的内容了。
我已经将整个分区导出来了,来来来,走过路过不要错过,看看这个分区的结构吧!
rootfs的格式为ubifs格式,大家自行挂载吧!
具体的可以参考ubifs镜像的挂载方式。
固件导出的方法有很多,比如DD,tar等等;
因为这个天猫精灵没有开放任何可用的TCP端口,nmap扫描过一次,结果失望而归。从串口中如何将系统的固件导出到自己的Linux系统中,这里我就不详细说明了。大神们自己摸索,提醒一下而已,比如curl,wget,telnet,ftp,lftp,tftpd等等,都可以试试看。
顺便提醒一句吧,tftp就不要用了,不可用,telnet无效,ftp,lftp没有命令,只剩下curl和wget了。curl是可以上传下载的,懂了吧!!在/data/smartbox目录下,你可以看到如下的json,这些都是通过curl进行下载后,MD5比较下,确认无误后,进行播放或上传等操作,比如这个:
这个ZIP的链接,你们可以直接下载下来,里面都是些提示音之类的资源和控制led的资源文件;
led灯的控制,有一个二进制文件可以用:
/usr/lib/smartbox/bootled
你可以在那个升级的脚本里发现这个命令,传递两个参数,0或者1;有条件的可以试试看。
/usr/lib/smartbox/bootled 0
/usr/lib/smartbox/bootled 1
进入到/usr/lib/smartbox目录后,发现如下的内容:
看来,philips和hilink以及btgatt也是可以支持的,99RMB, 买不到吃亏,买不到上当!
**
若琪智能音响Rokid硬件拆解及系统架构分析
**
Rokid简介
Rokid是一家总部位于杭州的公司,与我同在一个城市,大家感兴趣的话,可以参见此链接进行了解下他们的发展历程(Rokid的故事)。
创始人来自阿里,他在成立的时候,希望是致力于人工智能行业,但是目前来看,大家都觉得他是搞音响的。我去,“高大上”的人工智能瞬间跌入了街头地摊,创始人也很无奈,其主要就是大众对他们的产品不太了解,从而造成了如此的误解。
同样,我对这家公司也知之甚少,只是通过Rokid官网才知道他们是2014年成立的,并与2014年11月15日进行了产品的内部展示,后来就将这一天被内部定为”Rokid日”。产品的原型和设计也都非常不错,获得了不少设计奖,在这一点上我们应该为他们点赞。
如果大家对他们感兴趣的话,可以去看看Rokid创始人的访谈,自行百度吧,这里不再写链接,以防止有推送广告之嫌。
废话不多说了,开始对我手头的这个MINI版的Rokid进行剖析吧,请大家接着来看!!
硬件系统分析
外观
我拿到的是最新推出Mini版,也是最便宜的一款Rokid(梵星系列:JD上399张毛爷爷),我的这个颜色为白色的,还有一款为枪色的。
外观图示
为了保持我的设备可用(防止将我的设备给我封闭了),我不得不将我的产品的ID进行打码处理。
因为硅胶上面的那些字体不好拍照,大家就将就这看吧,如下图:
这个角度好,亮亮的。
配件
这个是截图来自JD网站上的,上面的这款就是枪色的(那是枪黑色的),接口为USB TypeC。
硬件内部结构
硬件拆解
脚垫撕开后,里面是螺丝孔和锂电池插孔,为了移动方便,后续可以增加锂电。
上盖部分,里面应该是触屏按键和拾音话筒部分,通过连接线与主板相连。
底盖部分,就是主控板了。拆开上面的三颗螺丝后,就可以看到对应的主控芯片了。
上一个全图,脚垫和上盖,底盖部分,将底盖拆开后,会看到一个散热片和主控芯片部分。如下图:
主要芯片
主控芯片
BT+WIFI芯片
总体分析:
主控芯片:
Amlogic A113X quad core Cortex A53 processor
蓝牙+WIFI二合一芯片:
AP6212是正基AMPAK推出的一款低功耗高性能的WiFi+BT4.2模块,该模块符合802.11b/g/n标准,其中WiFi功能采用SDIO接口,蓝牙采用UART/I2S/PCM接口,具有Station Mode,SoftAP,P2P功能等,主要应用于OTT盒子、广告机、智能手机及便携式设备之中。
NAND FLASH:
SAMSUNG K9F4G08U0F-SCB0 4G (512mx8) Nand Flash
软件系统分析通过Rokid的APP将Rokid mini 梵星配置到自己的Openwrt路由上,然后通过Nmap软件进行扫描这个IP以获取其开放的端口号。
端口号开放:80、4201、5355、5555、10004、15003、15005、15006。
登录到80端口上,能看到如下的界面:
从这个页面上点击“文档”会进入到rokid的github上去,从而可以看到RokidOS的源代码部分。感兴趣的可以进去瞅瞅吧。
具体的链接发布出来了:https://rokid.github.io/rokidos-linux-docs/source/getting_started/overview.html
上面包含了Rokid的整体系统的架构部分,系统的编译、构建、刷机等等操作说明是一份非常完整的文档说明。
细节部分自己去摸索吧,我关心的是我的这个设备的调试部分,所以可以进入“系统调试”页面后,发现,原来USB TypeC实际上也是刷机线,直接将其接入到Windows系统中,会看到一个ADB的设备,通过ADB4.4即可进入的系统中。
ADB进入系统
通过dmesg获取启动过程的信息。
其它
通过其它的命令,可以将这个系统的目录进行打包出来,获取其系统的BIN文件;
具体的信息:
其整体系统的BIN文件为squashfs文件,解压Squashfs文件后,能获取整个系统的目录结构和实际运行的文件;
通过分析其整体系统的文件发现,在进行OTA升级的时候,设备会自动的下载一个tgz的包,然后擦除/data目录,将其重新解压至/data/以达到升级的目的;
OTA部分,大家可以自行的研究,我这里就贴一个OTA的API吧。
得到的这个TGZ包后,就获取了rokid的data部分下新的内容。
来来来,围观一下整体的目录吧!
下面的这个很重要,你们都懂的。。
看到OTA没有,那个就是在线升级的部分了。
因为159行,展示不全,那就贴一下出来吧。
至于里面的URL啊,API啊等等lua源码里面都有的。
如果感兴趣,我可以将这个squashfs解压的包共享出来,不知道Rokid会不会来咬我啊。O(∩_∩)O哈哈~。
启动时,资源部分在res里面,在activation启动时调用对应的ogg以播放对应的提示声音,比如,入网/启动/唤醒/关机等等。
下载下OTA的升级包吧,看看里面到底是什么鬼!
目录结构如上图。想看具体源码的你们自己下载吧,上面有API的返回链接地址。好了,我就写到这里了。总结一下:智能硬件(音响)方面,大多是从android演变而来,将Android手机系统中语音助手的功能进行放大,并做好音响的功放功能,整合出来了这样的一个产品,从产品的实现上来说,实现并不困难,难的是能将这个产品做到极致。若琪算是一个还不错的产品了,如果能在安全性上做的更好的话!!阿里出来的,对体验性要求比较高,但是若琪梵星这个的触摸按键,那个尿性,你能叫体验性高吗?功放的功能也是一般般吧。。产品内部的代码也没有多少做了加密处理,只在通讯上做了些认证,可是认证的整个实现方式,都能够看到源码,那么你那再好的认证,也相当于白搭。。如果通过中间人攻击OTA升级的部分的话,那么你家的这个东西会不会半夜里放出来鬼叫声,那就看看这个攻击者想不想搞你了。。假如有一天,你睡着了,突然播放出了鬼叫声,那估计是你家的智能设备抽风了吧!!哈哈