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


一年前,我买了一个智能手环,型号为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是不是用了什么传统的二进制打包方法,或者他们有编码算法和压缩算法。

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

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

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

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

优质内容筛选与推荐>>
1、生产环境的redis高可用集群搭建
2、C. Mobile phones
3、C语言条件运算符
4、[导入]自娱自乐
5、Windows Form, Ok, Cancel button


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号