转载

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

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

背景

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

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

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

思路

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

我打开日志:  

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

然后用 WireShark 打开。

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

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

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

https://github.com/fbarriga/sony-smartband-open-api

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

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

分析

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

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

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

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

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

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

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

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

原文  http://www.freebuf.com/geek/104799.html
正文到此结束
Loading...