看我如何逆向智能手环控制无人机

发表于 讨论求助 2023-05-10 14:56:27

一年前,我买了一个智能手环,型号为SONY SmartBand SWR10。就像大部分智能手环一样,它对我没什么用一直放在抽屉里。

背景

突然有一天我有了个很好的灵感——朋友邀请我加入他们的“NASA太空”APP黑客马拉松队伍,而我选择了“不要撞我的无人机”这个课题,它包括无人机控制和飞行信息方向的解决方案,于是我决定用我的手环来控制无人机。

 当黑客马拉松开始时,我去寻找我的手环相关的开发API和开发工具,我很惊讶它居然没有任何相关资料。论坛上也有用户说SONY只提供了一些闭源的SDK给他们的程序员,而我的黑客马拉松只允许开源的解决方案。事实上我认为创建我自己的接口并不困难。

思路

于是我启动了我的手环应用,然后打开“蓝牙HCI监听日志”。这个功能可以嗅探所有的流量并将其导入到SD卡中。

我打开日志: 

然后用WireShark打开。

 这好像是在运行蓝牙低能耗协议,并且比 GATT协议更特殊,这是一个双向协议。手机有一个“GATT服务”,外围设备会接收“GATT特征码”而它包含所有二进制数据。 

我选择了第一个UUID (00000208–37cb-11e3–8682–0002a5d5c51b) 然后在谷歌搜索。我希望搜索到一些传统的标准GATT服务,但我却发现了一些有趣的东西。

瞬间我觉得我可以完成了——我发现了别人对这个协议的逆向。同时也证实了我是对的,这个项目包含了连接,握手,电池状态读取,连接保持的工作原理实现。但是,加速计数据很奇怪。我将加速计上的数据挂载到MPAndroidChart,实时的图表显示如下:

分析

虽然输出与倾斜高度相关,但是值是完整的。在阅读实现代码之后,32位的整数值好像包含3个10位的值。这是合理的,因为大部分的加速计有10位的精度(大部分ADC)。数据证明了这一点,看前两部分:

 但是解析这3个10位的数据也很奇怪,每几个倾斜的值都会在511到-512之间变化,没有偏移能够改变它(没有整数溢出产生)。所以,我觉得SONY是不是用了什么传统的二进制打包方法,或者他们有编码算法和压缩算法。

我尝试用ProtobufMsgPackThrift  来解析,但是都没用。这时我只有一天来讲加速计跟我的无线飞行器关联到一起。但就在我绝望时,在查看他们的APP反编译结果的半小时后,我发现了下面这些东西:

 前半部分的[0,512]是反的,这就是我获得这些峰值的原因。我用简单的异或对其进行调整。我把他们调整到[-1,1范围],现在要做的就是把加速计和无线控制器建立连接(你可以在GitHub上找到实现)。

最终我完成了这个项目,并且赢得了奖项。

*参考来源:medium.com ,FB小编老王隔壁的白帽子翻译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)


发表
26906人 签到看排名