感谢 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 也给直接写了,并且还带协议分析。其实不要这个分析也行,主要功能是装 X 。
不过写的时候,Claude 一直在说只能用传统蓝牙,可能是受 Android 的思路影响太深了。传统蓝牙的问题在于,Mac 上打印一次就挂了,打不了其他东西了,必须重启 Mac 、重启机器才行。
但是明明在分析 SDK 和固件的时候说可以用 BLE 的。于是就强行让 Claude 改成 BLE,顺带 Claude 也找到了 UUID 。打开 Chrome,配对蓝牙,打印,「咕~~~」,打印出来了。
之后又给图片打印功能加了一点简单编辑:放大缩小,旋转镜像,还加了抖动。加这些功能之前,图片转 BMP 的速度巨慢,加上这些功能之后速度反而快不少。
当前 Bug
目前版本的抖动算法,打印效果还行,就是颜色有点浅。
打印图片的时候,只能一包一包来打,一包大概 1 秒,走纸大概 3 毫米,比较慢。
其他似乎都能 work 。
后续应用
之后可能考虑做这样搞:
- 搞模板:比如经典的「左边是图片,右边有标题和简短正文」的卡片布局。然后渲染成图片来打印。
- 搞自动化:比如接入 HomeAssistant,每小时发握手来保活(目前最长关机时间是 4 小时),每天早上打印个「今日天气」的小票,提升仪式感。
其他就没想到啥了。
总之应该不会再吃灰 8 年了。
发表回复