NASA的Hackathon学童如何逆向设计健身手链以控制无人机



一年前,我购买了SONY SmartBand SWR10健身追踪器。与大多数其他健身追踪器一样,该小工具在我的生活中并未发挥重要作用,它的主要职业是躺在我的桌子上。但是,这是一个有趣的电子设备,当一个朋友邀请我加入他在NASA Space Apps hackathon上的团队时,我决定使用跟踪器。我们选择了“不要使我的无人机崩溃”部分,我们需要在其中创建一个控制无人机的解决方案。决定使用此跟踪器来控制无人机。



黑客马拉松一开始,我就开始为开发人员寻找手镯或工具的API,但没有发现任何东西。一些论坛用户说,SONY有一个专有的SDK,提供给决定与该公司合作的开发人员,但根据黑客马拉松的条款,只能使用开源解决方案。因此,我认为是时候创建自己的无人机控制界面了。我启动了跟踪器应用程序,并打开了“蓝牙HCI监听日志”功能。此功能使您可以嗅探流量并将转储保存到SD卡。

我找到了日志: 〜adb
shell echo $ EXTERNAL_STORAGE
/
sdcard〜adb pull /sdcard/btsnoop_hci.log


并在WireShark中将其打开:



看起来数据传输是使用低功耗蓝牙协议或更确切地说是通过GATT协议执行的。这是双向数据传输,其中电话充当服务器“ GATT服务器”,外围设备接收“ GATT特性”,其中可以包含任何二进制数据。

我选择了第一个UUID(00000208–37cb-11e3–8682–0002a5d5c51b),并在Google上进行了搜索。我原本希望找到常规的标准化GATT服务,但发现了一些更有趣的东西

我决定我们发现了某人的Git存储库,该存储库是由对该协议进行反向工程的人员创建的。这在一定程度上是正确的:该项目包含几个工作功能,包括连接,响应手的动作,读取电池状态以及保持连接处于活动状态。但是加速度计的实现很奇怪。我将加速度计数据添加到MPAndroidChart,我得到了:



尽管关于坡度的信息是正确的,但未显示这些值。研究功能代码后,发现32位单精度数字包含三个10位值。这是有道理的,因为大多数加速度计都以10位精度工作(就像大多数ADC,模数转换器一样)。这是源数据,请注意前两位:

ACC数据:0b00101110 0b10110101 0b10111100 0b10111000
ACC数据:0b00111010 0b11110001 0b00011101 0b11101011
ACC数据:0b00111110 0b01110110 0b10100110 0b10011001
ACC数据:0b00001011 0b11011101 0b10111101 0b00111001


但分析数据作为三个10位值是相当奇怪的,每隔数度倾斜的变化值511 -512,并且偏移量没有变化(此外,这里没有整数溢出问题)。因此,我决定SONY可以使用某种专有的二进制打包方法,或者该公司将使用算术编码和压缩。

我尝试了Protobuf,MsgPack,Thrift和多个解析器,但没有任何效果。我只有一天将设备连接到无人机的Wi-Fi。我已经拼死了,我尝试使用DEX来反编译公司的应用程序,半个小时后结果如下:

//大约
1:iconst_0 512 iconst_1 1023
2:r1 xor iconst_0
3:istore_0
4:iload_0
5:ifneq 8
6:r1 xor iconst_1
7:istore_0


if((数据&0x200)!= 0){
数据=-((数据^ 1023)+1);
}
return((((float)(-data))* 15.625f)/ GRAVITY_FACTOR;


前半部分[0,512]反转了,因此出现了上述情况。我使用常规XOR修复了问题,并且解决了。我添加了重力因子,结果[-1.1]为±1 g,接下来要做的就是使用加速度计数据来控制无人机。

Source: https://habr.com/ru/post/zh-CN394095/


All Articles