红米音箱固件更新检查逻辑



前一篇,看到了https的协议内容,其中使用了 ota check 检查固件版本,但是实测返回出来的内容是一个只有3k不到的 HDR 开头的文件,猜测这个文件应该是一个加密或者压缩后的response,例如json。

ota这个命令在 /bin/ota,本身是个 shell 脚本,直接读内容,可以看到所有的命令调用的都是 matool 以及它的各个 symlink。其中命令

执行 ota ble,输出如下。(输出被我掐了,因为我怕直接进了更新,就没法调试了)

从charles里拿到rootfs的下载链接,找个linux下下来,直接 squashfuse rootfs_1.76.2_xxxxxx.bin /mnt/ 挂载了,可以看数据。

回过头来,研究协议和算法。

从 ota 这个脚本里看到,执行升级的时候,先把那个小文件下载为 /tmp/mico_ota.bin,再用 /bin/flash.sh /tmp/mico_ota.bin 。再从整个squashfs里找 “Start downloading” 这个字符串,发现在 /bin/skr 里。

再细看里边的代码,最终发现解包命令 miso -x xxx.bin,就在调用 skr 命令的前几行。解包完的目录里多了三个文件

其中 .json 文件里包含了 kernel 和 rootfs的下载链接。

再一个,检查更新的接口有个参数s,是一个签名参数。先ldd

再根据请求的关键词 countryCode,找到固件版本检查的接口构造方法在 libxiaomi_mico.so 里,ida 加载后发现一个 uuid “8007236f-a2d6-4847-ac83-c49395ad6d65”,

Google一搜,好多不同的小米设备都是用这个。大致算法如下



红米音箱固件更新检查逻辑 by @sskaje: https://sskaje.me/2021/04/redmi-play-firmware-upgrade-check/