记一下咕咕机蓝牙协议分析过程

感谢 Claude,完成了我的一个 8 年的心愿。

PS:这里面只记录过程,没有实际协议分析。

之前做 CTF 的时候,发现 Claude 在二进制分析方面特别强。做完 CTF 后,突然想起来家里还有个咕咕机 G4 在吃灰,就想着能不能拿来分析一下玩玩。

纯属突发奇想。

硬件

咕咕机是一代网红热敏打印机,最早知道的时候应该是 T2,是一个纯 WiFi 热敏打印机;我买的是 G4,是一个纯蓝牙热敏打印机。买了 8 年了只打了不到三卷纸。

没用起来的原因,主要是它官网只提供了 iOS 和 Andriod 的 SDK,没提供 Python SDK,我自己不会 iOS 和 Andriod 开发,所以没办法把它用起来。网上其他资源大多是在用老版本产品的 HTTP API,我用不了。

SDK

官网提供了 iOS 和 Android SDK,并配有使用说明。但没有说蓝牙协议的细节。

由于没有加密,所以直接让 Claude 分析了一下,结果差不多就出来了。

iOS 用的是 BLE,但是 Android 用的是传统蓝牙。

海外 Android

海外 Android 版没有任何加固。下载后可以让 Claude 直接分析。分析结果表明,它和 SDK 是一致的。可以说就是 SDK 的包装。

国内 Android

下载下来最新版,发现有 360 加固。配置脱壳环境比较麻烦,就放弃了。但 JNI 部分没有加密,可以直接看。

本来想,「3.0.X 版本有加固,那么老版本有没有可能无加固呀?」,就简单遍历了一下。发现 1.X 版本也有 360 加固,但是中间的 2.X 版本比较奇怪:2.2.0 、 2.3.0 、 2.4.0 三个版本没加固。

原来世界是个巨大的草台班子。

Claude 分析发现,它用的接口与 SDK/海外 Android 似乎不同。所以我就没仔细看下去了。

固件

既然国内和海外的 Android 包都可以看到源码了,那就顺带找一下固件吧,万一隐藏了什么 APP 里没用到的功能呢。

分析发现,海外版和国内版的「查找固件升级」的思路完全不同:海外版就很直接且草台,测试网域名可用,生产网域名反而用不了,版本号直接拼接就好了;国内版有各种加密,密码那里还没直接写明文,得在字符串里删几个字母,然后 split 一下,获取到的结果也需要重新解密一下。

有几个机型的固件似乎已经不再提供了。

Demo

好了,现在需要的信息齐了,那么就可以搞点好玩的了——比如写个 Web Demo 啥的。 Claude 也给直接写了,并且还带协议分析。

不过写的时候,Claude 一直在说只能用传统蓝牙。传统蓝牙的问题在于,Mac 上打印一次就挂了,打不了其他东西了,必须重启 Mac 、重启机器才行。

但是明明在分析 SDK 和固件的时候说可以用 BLE 的。于是就强行让 Claude 改成 BLE,顺带 Claude 也找到了 UUID 。打开 Chrome,配对蓝牙,打印,「咕~~~」,打印出来了。

之后又给图片打印功能加了一点简单编辑:放大缩小,旋转镜像,还加了抖动。目前打印效果还行。

当前 Bug

打印图片的时候,只能一包一包来打,一包大概 1 秒,走纸大概 3 毫米,比较慢。

其他似乎都能 work 。

后续应用

之后可能考虑做这样搞:

  • 搞模板:比如经典的「左边是图片,右边有标题和简短正文」的卡片布局。然后渲染成图片来打印。
  • 搞自动化:比如接入 HomeAssistant,每小时发握手来保活(目前最长关机时间是 4 小时),每天早上打印个「今日天气」的小票,提升仪式感。

其他就没想到啥了。

总之应该不会再吃灰 8 年了。