『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 5367|回复: 11

[已解决] 【智能音箱】小爱音箱pro拆机,刷机,开启ssh,备份系统的方法

[复制链接]

2

主题

14

帖子

61

积分

注册会员

Rank: 2

积分
61
金钱
47
HASS币
0
发表于 2022-6-30 17:26:02 | 显示全部楼层 |阅读模式
目录拆机
小爱音箱pro底部有个软垫子,用细的起子别进去,然然后撕下来就可以看到螺丝孔。依次拆下螺丝,打开底盖。之后会看到电源线和AUX线在壳子上用四个螺丝固定着,拆下这四个螺丝即可分离壳子和内部主体部分。(注意螺丝别乱了,有三处不一样的螺丝:底座,电源线,电路板固定螺丝)
底座拆开后:

                               
登录/注册后可看大图
内部电路板,图中标箭头的位置rx,tx,gnd即为ttl链接的触点,在电路板后面也有对应的rx, tx, gnd,在板子后面的这三个位置用电烙铁分别焊接一条杜邦线,准备链接usb转ttl模块(CH340模块),进行调试。

                               
登录/注册后可看大图
获取管理员权限
使用nmap扫描音箱端口可以发现音箱只开启了53和9999端口,无法telnet或者ssh链接,所以只能使用ttl进行链接。
1、ubuntu安装puttysudo apt install putty
2、链接usb转ttl模块(接线rx–>rx, tx–>tx, gnd–>gnd),电脑查询新增的COM端口设备 ls /dev,新增的一般在最后一个, 类似/dev/ttyUSB0 或者 /dev/COM0
3、 启动putty 并设置链接类型为serial,设置tty端口速率为115200,设置端口为你本机的端口如/dev/ttyUSB0. 点击 open

                               
登录/注册后可看大图

4、按下回车之后可看到linux 登录界面,输入用户名:root 后回车,由于旧版的系统没有密码,如果你的系统版本比较旧,会直接以root进入系统。
5、如果你的系统升级到了最新版,已经无法直接进入系统, 需要切换到另一个系统尝试(小爱音箱有两套系统,升级时会往另一套系统刷入固件,这样好处就是升级时断电的话,可以自动切换到另一个系统,下一次升级时,刷坏的系统会被重新刷机激活)。
6、切换系统的方法。链接上ttl,拔掉小爱电源并重新插上来重启小爱,此时ttl会输出大量启动日志,在重启时迅速按ctrl+c或者任意按键,会进入uboot.
  • uboot 执行printenv可查看系统当前的环境变量,其中boot_part指定了当前启动的是哪个系统。
  • uboot 执行setenv boot_part boot0切换到另一个系统,如果你以前是boot1那就设置为boot0,反之以前是boot0就设置为boot1.
  • uboot 执行 run bootcmd 进入系统引导,此时会进入你设置的另一个系统
    7、在新的系统尝试root无密码登录。如果不行,且系统没有提示[magic][release]字样,可以尝试使用计算的密码登录。密码计算方法:先将SN码和固定字符串拼接之后取md5, 然后前14位字符为密码。伪代码md5(SN+SALT).hex().lower()[:14],其中SN为你机器的SN码,在机器底座上写着,一般为XXXXX/A0XUXXXX;SALT为一个固定的字符串,可以用9C78089F-83C7-3CDC-BCC9-93B378868E7F 或者 B0168A6D-119A-F21A-DA58-980732F80A19 试试。执行下面的语句也行,将SN处替换为你的SN编码.
  • python -c 'import hashlib;print(hashlib.md5(b"SN"+b"B0168A6D-119A-F21A-DA58-980732F80A19").hexdigest()[:14])'
  • python -c 'import hashlib;print(hashlib.md5(b"SN"+b"9C78089F-83C7-3CDC-BCC9-93B378868E7F").hexdigest()[:14])'
Shell[url=][/url][url=][/url]4行,221字

8、如果还是无法进入系统,尝试进入failsafe模式(小爱固件改自openwrt)。进入方法: 重启音箱,等一点时间(log会有提示 push f … failsafe)后连续按f + enter,此时会进入failsafe模式。
  • 查看当前固件布局cat /proc/mtd。可看到当前的固件中存在system1 和sytem0
  • 查看当前系统磁盘 df -h(system0 对应/dev/mtdblock4, sytem1对应/dev/mtdblock5)
  • 挂载syetem0 mount /dev/mtdblock4 /mnt/sys1 ,直接执行etc/mi_console,会输出当前root用户的密码。或者查看 etc/mi_console文件中的SALT(密码生成逻辑在这个文件里,/mnt/sys1/etc/init.d/boot_check会调用mi_console生成密码)。执行strings /mnt/sys1/bin/mi_console | grep -E '^[A-Z0-9-]+$'' 获得SALT,然后用上一步的计算方法计算密码,然后切换到对应系统进行登录,如果还是无法登录,可用试试这样操作另一个系统。
9、如果还是无法登录系统或者无法进入failsafe模式,直接使用uboot刷写固件。
刷机uboot刷机
1、前提:需要准备一个系统镜像。方法:将当系统镜像通过uboot提供的loady,loadx,loadb命令从计算机传输到音箱系统指定的内存地址中,然后使用nand earse擦除 磁盘 分区,最后使用nand write 将内存中的数据写入固定的磁盘地址中。
2、准备系统镜像。
  • 可通过升级时抓包或者使用网上别人已经提供的系统升级文件分离出system.img。固件文件提取命令binwalk -e xxx.bin
  • 也可直接使用网上已经登录系统的用户,备份的自己的系统镜像。这里我直接使用网络上分享的备份系统,系统版本1.66.8。来源: https://bbs.hassbian.com/forum.php?mod=redirect&goto=findpost&ptid=8754&pid=349732 感谢原作者提供的系统镜像。
    3、修改系统固件。
  • 解包系统: sudo unsquashfs -dest m5 m5.img
  • 设置ttl无密码登录: 修改m5/etc/inittab 文件,将ttyS0::askfirst:/bin/login 这一行改为 ttyS0::askfirst:/bin/ash --login
  • 重置系统密码: 准备修改m5/etc/shadow文件,将root密码替换为自己的密码。shadow文件中:分割的第二位为密码,格式为$加密类型$SALT$加密的密码,加密类型 1代表md5. 可使用openssl 生成, 执行openssl passwd -1 -salt 'N0Iz0LLs' 'reece++'生成 salt为N0lz0LLs,密码为reece++的加密后密码,将输出的字符串替换掉 m5/etc/shadow里root:xxxx:处的xxxx,改为root1$N0Iz0LLs$EPqv7WOl5S7ub/.EppH73.:18128:0:99999:7:::。如果不需要密码,可以直接留空,改为root::0:99999:7:::(建议设置密码,不然ssh链接不安全)。
  • 设置开机启动脚本: 编辑etc/rc.local,在其中加入你准备开机执行的命令,此处可加入以下命令开启ssh。
  • # open ssh
  • [ -d /data/dropbear ] || mkdir /data/dropbear
  • [ -s /data/dropbear/rsa.key ] || dropbearkey -t rsa -s 1024 -f /data/dropbear/rsa.key &> /dev/null
  • /usr/sbin/dropbear -E -P /var/run/dropbear.pid -r /data/dropbear/rsa.key > /tmp/ssh.log
  • # your script
  • /data/user.sh
Shell[url=][/url][url=][/url]8行,273字

含义: /data/dropbear文件夹不存在则创建, /data/dropbear/rsa.key 文件不存在则自动生成,然后启动dropbear 在默认22端口开启ssh 服务,最后执行/data/user.sh, 以后可编辑这个文件来加入自己的开机自启命令,不用修改系统(运行时系统是只读模式,只有data和tmp可写)
  • 禁止自动升级系统: 编辑m5/etc/crontabs/root,注释掉* 3 * * * /bin/ota slient # check ota,也可以将执行mv /bin/ota /usr/share/ota.bk将升级程序移动到其他地方,防止远程执行升级。
  • 重新打包系统: sudo mksquashfs m5 m5_1.img -b 131072 -comp xz -no-xattrs
    4、进入uboot,刷写固件。
  • 查看固件分区布局,启动时输出的日志里会输出固件分区布局,如下所示:
  • Creating 6 MTD partitions on "A revision NAND 1Gib TC5XXXXXXXXX":
  • 0x000000800000-0x000001000000 : "tpl"
  • 0x000001000000-0x000001600000 : "boot0"
  • 0x000001600000-0x000001c00000 : "boot1"
  • 0x000001c00000-0x000004400000 : "system0"
  • 0x000004400000-0x000006c20000 : "system1"
  • NAND bbt detect factory Bad block at 6000000
  • 0x000006c20000-0x000008000000 : "data"
Shell[url=][/url][url=][/url]9行,353字

本次将刷入system0分区,当然你也可以刷入sytem1分区。
  • 将m5_1.img传输的windows下,电脑切换到windows系统,下载secureCRT, 或者其他支持 kermit, xmodem, ymodem,zmodem协议的终端链接软件。使用secureCRT链接对应com端口(可在设备管理中查看对应com端口),设置好传输速率115200和流控制XON/XOFF。重启小爱进入uboot.
  • uboot执行loady 1c00000准备将ymodem协议传输的文件写入内存地址1c00000
  • 使用电脑secureCRT–菜单传输–菜单发送ymodem文件,添加刚才打包的镜像文件m5_1.img,开始传输。这个过程相当漫长,传输速率大概1-5kb/s,需要2个小时才能传输完。
  • 传输完后, 开始擦除系统分区,根据刚才的固件分区布局可知,system0在0x000001c00000-0x000004400000地址范围内,先将该部分地址擦除为1(注意!注意!注意!!!请确认你的固件分区布局,不同设备可能不一致,如果你擦除了其他分区的数据,可能导致系统无法启动,请确认输入执行的地址正确。)执行 nand earse 1c00000 2800000,从1c00000地址处开始擦除2800000大小的空间,用结束地址减去开始地址就是分区大小。也可以执行python -c 'print("%x" % (0x4400000-0x1c00000,))'计算出分区大小。
  • 写入固件到分区。执行nand write 1c00000 1c00000 2800000将内存1c00000处的数据写入磁盘1c00000处,写入大小2800000。
  • 必须先擦除才能写入,nand write只能将1 变为0 不能将0变为1,所以需要先执行nand earse 将磁盘擦除为 0xff。如果你忘记擦除就写入,系统0启动时会由于squashfs 文件系统错误而无法启动,此时按以上流程刷重新写系统就行。
  • 刷写成功之后,执行setenv boot_part boot0设置启动刚才刷写的系统0,然后执行run bootcmd加载系统。
  • 如果刷写成功,ttl中直接按回车就可以进入系统,ssh服务也已经启动。

                               
登录/注册后可看大图
系统内刷机
如果你已经以root进入了系统,且链接上网络,可通过 dd 或者 mtd命令直接刷写系统。此处假设你已经进入system1,需要刷写system0.
1.执行 scp [email protected]:m5.img /tmp/m5.img使用scp将系统镜像从ubuntu传输到音箱系统。其中[email protected] 替换为你ubuntu系统的用户名和ip地址,如果不能链接,可能是你ubuntu系统sshd服务配置有问题。
2.执行 mtd write /tmp/m5.img system0将系统镜像写入system0分区内。
3.执行/usr/bin/fw_env -s boot_part boot0 设置环境变量boot_part, 使重启时进入system0
4.重启系统reboot -f
第2步也可用dd if=/tmp/m5.img of=/dev/mtdblock4代替,不过dd无法跳过系统坏块,如果你的系统有坏块,将报错提示 io error。
系统备份
将自己的各个分区备份,出问题后可通过uboot恢复。例如要备份系统0, mtdblock4:
  • 备份系统。dd if=/dev/mtdblock4 of=/tmp/m4.img
  • 传输到电脑 。scp /tmp/m4.img [email protected]:m4.img
  • 删除临时文件 rm /tmp/m4.img
如果当前分区有坏块,可拆分为多个文件,备份。
后续
后续玩法探索
1、替换唤醒词,自定义唤醒词
2、拦截im消息,实现自定义命令
声明:本文只作为技术研究,您如果使用以上内容用作其他用途,请自行承担后果,与本人无关。

回复

使用道具 举报

0

主题

11

帖子

264

积分

中级会员

Rank: 3Rank: 3

积分
264
金钱
253
HASS币
0
发表于 2022-7-1 14:54:49 | 显示全部楼层
标记一下,看着很吊
回复

使用道具 举报

1

主题

45

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
金钱
155
HASS币
0
发表于 2022-8-25 02:08:34 | 显示全部楼层
期待能替换两个字和英文唤醒词,以及替换tts
回复

使用道具 举报

0

主题

18

帖子

98

积分

注册会员

Rank: 2

积分
98
金钱
80
HASS币
0
发表于 2022-10-27 21:30:24 | 显示全部楼层
学习一下
回复

使用道具 举报

2

主题

14

帖子

94

积分

注册会员

Rank: 2

积分
94
金钱
80
HASS币
0
发表于 2023-9-14 21:57:11 | 显示全部楼层
这个好高深,完全看不懂
回复

使用道具 举报

1

主题

34

帖子

164

积分

注册会员

Rank: 2

积分
164
金钱
130
HASS币
0
发表于 2023-10-2 16:30:56 | 显示全部楼层
6666666666666666666666666666666666666666666666666666666
回复

使用道具 举报

1

主题

34

帖子

164

积分

注册会员

Rank: 2

积分
164
金钱
130
HASS币
0
发表于 2023-10-2 16:49:09 | 显示全部楼层
新版本有知道怎么算出密码
回复

使用道具 举报

0

主题

33

帖子

120

积分

注册会员

Rank: 2

积分
120
金钱
87
HASS币
0
发表于 2024-3-4 15:52:49 | 显示全部楼层
楼主,音箱破解后,后续能实现替换唤醒词,自定义唤醒词吗?
回复

使用道具 举报

0

主题

33

帖子

120

积分

注册会员

Rank: 2

积分
120
金钱
87
HASS币
0
发表于 2024-3-4 15:56:23 | 显示全部楼层

楼主,音箱破解后,后续能实现替换唤醒词,自定义唤醒词吗?
回复

使用道具 举报

1

主题

34

帖子

164

积分

注册会员

Rank: 2

积分
164
金钱
130
HASS币
0
发表于 2024-3-13 04:44:16 来自手机 | 显示全部楼层
怎么算出结束地址大小
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-24 12:41 , Processed in 1.461647 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表