百摩网
当前位置: 首页 生活百科

小米手环2连上手机不能使用(小米手环2传输协议被破解)

时间:2023-05-23 作者: 小编 阅读量: 8 栏目名: 生活百科

那代码可以连接到手环,发布通知,并获取一次拍摄心脏测量。其中一些更复杂并且通过请求/通知循环工作,例如实时心率监视器和授权。现在打开开发设置并找到"启用BleutoothHCIsnooplog"并启用它。这是当前时间的设备的响应找到合适的数据包和编码可能需要一些时间。

本文笔者翻译自hacker博客,原文地址(略)

这个故事源于我在Facebook一个帖子,帖子中讨论了运动健身追踪器都缺乏API接口的问题,还有为啥不用它帮助数据专家为做一个炫酷的东西。

帖子发出之后,我的好基友Volodymyr Shymanskyy就响应来帮助我,并在github上找了Leo Soares项目,为我的健身追踪器小米手环2找了一些代码。他尝试运行它,但是连接出现了一些链接问题,所以他花了几个小时修复了他。之后,他提交了个commit,并给了我链接。

那满足了我的初步需求,已经相当OK了。那代码可以连接到手环,发布通知,并获取一次拍摄心脏测量。但这对我来说还有点不够,因为我想从传感器获得实时原始数据,以便在我的数据科学实验中使用(想要做一个健身运动预测器)。

正文才开始......

在此之前,我没有任何使用蓝牙设备的经验,所以首先我试着了解了所有这些东西是如何组织和工作的。事实证明,也没啥难得。

每个蓝牙设备都会启动几个的服务,每个服务都有特征,并且一些特征具有描述符(如果特征有多个参数或工作类型(阅读|通知))。某些特性只有读/写访问权限,比如当前时间,电池状态或修订信息。其中一些更复杂并且通过请求/通知循环工作,例如实时心率监视器和授权。基本上,你需要知道这一切的,才能开始使用它。

您还需要两个应用程序来帮助调试蓝牙设备:Wireshark和BLE debugger。你还需要需要访问安卓手机开发者选项(对不起,对于iOS家伙我还不知道如何做到这点)。

首先,您需要从手机应用程序中取消小米手环2的配对。

现在让我们看看手环有什么服务和特征。让我们打开BLE debugger,开始扫描,你会看到类似这样的东西:

将设备的MAC地址保存下,后续操作会用到它。

现在让我们连接上它,看看它跑了什么服务和特征。

以上两个简单的操作中,我们已经获得了一些有用的设备信息。

另一种方法是使用控制台工具hcitool和gatttool。

Scan:

sudo hcitool lescan

连接并获取服务和描述符:

sudo gatttool -b YOUR_MAC -I -t random

> connect

> primary

> Char-Desc

在某些情况下,BLE栈可能会出现故障,您可以打开/关闭蓝牙或运行以下命令:

sudo hciconfig hci0 reset

数据嗅探

为了我们的手机<->基带通信中嗅探数据,我们需要启用蓝牙在开发设置记录日志。要做到这一点,您需要先打开安卓手机上的开发人员设置。

以下是操作的详细步骤:

在Android 4.1及更低版本上,开发者选项屏幕默认可用。在Android 4.2及更高版本中,您必须按如下所示启用此屏幕:

1.打开手机设置。

2.(仅适用于Android 8.0或更高版本)选择系统。

3.滚动到底部并选择关于手机。

4.滚动到底部并点击Build number 7次。

5.返回到上一屏幕以查找底部附近的开发人员选项。

现在打开开发设置并找到"启用Bleutooth HCI snoop log"并启用它。这样,所有蓝牙通信都会被被记录。然后你需要找到名为btsnoop_hci.log的文件(在我手机中(Android 7.0)它位于/mtklog/btlog/btsnoop_hci.log)

认证

现在我们还要要执行一下步骤来获取有关认证(配对)如何工作的一些信息。

1.打开蓝牙和HCI日志。

2.将您的设备与小米安卓程序配对。

3.关闭蓝牙。

4. 下载btsnoop_hci.log到你的电脑。

5.用Wireshark打开它。

6.找到第一个处理0x0055的ATT协议请求

你会看到如图的界面:

这是验证步骤:

配对设备

主要服务UUID

0000fee1-0000&ndash;1000&ndash;8000&ndash;00805f9b34fb

认证特征 (Char) UUID

00000009&ndash;0000&ndash;3512&ndash;2118&ndash;0009af100700

通知描述符 (Des) 处理

0x2902 (所有的过程都一样)

1.通过向Des发送2个字节请求 \x01\x00来设置auth通知(以获得响应)。

2.用命令将16字节的加密密钥发送给Char,并附加2字节\x01\x00KEY。

3.通过发送2个字节\x02\x00到Char来向设备请求带有命令的随机密钥。

4.从设备响应中获取随机密钥(最后的16个字节)。

5.使用我们的16字节密钥,用AES/ECB/ NoPadding(来自Crypto.Cipher import AES)对此随机数进行加密,并将其发送回Char(\x03\x00 编码数据)

认证

1.通过发送2个字节\x02 \x00到Char来向设备请求带有命令的随机密钥。

2.从设备响应中获取随机密钥(最后16个字节)。

3.使用我们的16字节密钥和使用AES / ECB / NoPadding(来自Crypto.Cipher import AES)对此随机数进行加密,并将其发送回Char(\ x03 \ x00编码数据)

实时数据

这在认证过程中稍微复杂一些,因为我没有看到在这个过程中犯了一个错误:)并且因为这个心率监视器在15秒后关闭。

硬件服务(HRDW)UUID

0000fee0-0000-1000-8000-00805f9b34fb

心脏监护仪服务(HMS)UUID

0000180d-0000-1000-8000-00805f9b34fb

心率测量特征(HRM)UUID

00002a37-0000-1000-8000-00805f9b34fb

心脏监护仪控制特性(HMC)UUID

00002a39-0000-1000-8000-00805f9b34fb

传感器特性(SENS)UUID

00000001-0000-3512-2118-0009af100700

通知描述符(DES)句柄

0x2902(所有过程都一样)

1.关闭当前监听的测量。

2. 通过向HMC发送请求\x15\x02\x00进行一次性测量。

3. 通过向HMC发送请求\x15\x01\x00进行连续测量。

4.通过向SENS发送命令到\x01\x03\x19来启用陀螺仪和心脏原始数据

5.通过向HRM写入DES \x01\ x00启用通知

6.通过向HMC发送请求\x15\x01\x01来启动连续的心脏测量

7.发送命令到SENS \x02(不知道为什么需要这指令)

8.然后,在每12秒收到一次通知时,需要将\x16 ping发送到HCM

解析数据

这是最枯燥部分,因为基本上你需要找出如何解包来自设备的打包数据。

它的一部分可以从日志中解析出来,有些不能。

这是当前时间的设备的响应

找到合适的数据包和编码可能需要一些时间。就我的例子而言,我需要找到相邻的数据包中相似的字节出现次数,有些重复的数据包。

Raw heart: 02102d8c348c448c458c3d8c428c488c 16

Raw heart: 0218468c418c3d8c468c3f8c398c418c 16

Realtime heart: 93

Raw heart: 0220408c448c3f8c428c498c3c8c3d8c 16

Raw heart: 02283d8c398c488c3e8c468c488c328c 16

Realtime heart: 99

Raw heart: 0230438c408c378c3a8c318c458c388c 16

Realtime heart: 102

Raw heart: 02404f8c408c458c428c4d8c558c4d8c 16

Raw heart: 02483e8c3b8c3f8c348c398c318c428c 16

Realtime heart: 98

Raw heart: 02504c8c428c5e8c4f8c588c498c558c 16

Raw heart: 0258478c458c3c8c4e8c3f8c468c4d8c 16

Realtime heart: 100

Raw heart: 0260518c4d8c4f8c4b8c4f8c528c458c 16

Raw heart: 0268408c3f8c538c4d8c408c548c598c 16

Realtime heart: 102

Raw heart: 0278418c508c4e8c548c588c468c498c 16

Raw heart: 0280368c328c2e8c3c8c338c308c3f8c 16

Realtime heart: 101

从中我们可以看到清晰的数据,重复368c 328c 2e8c 3c8c 338c 308c 3f8c,数据包长度为16字节。因此,如果我们用2个字节的无符号短数据解压缩,那么我们可以得到7个心脏传感器的原始测量结果。我们也看到第二个字节只是迭代,我认为它只是测量之间的时间差异(我指的是响应的时间差)

Raw gyro: 01de49ffd9ff3c004cffd8ff3b004dffdcff4400

Raw gyro: 01df4cffd6ff44004dffd8ff40004cffd1ff4700

Raw gyro: 02e1103231323d3274328e329632af32c732cf32

Raw gyro: 01e34fffd7ff56004bffc7ff590049ffccff4c00

Raw gyro: 01e443ffccff43004effcdff40005bffd4ff4c00

Raw gyro: 01e558ffc9ff5f005effbfff66005fffb0ff5900

Raw gyro: 01e64cffacff60005cffa7ff410066ffc9ff4600

Raw gyro: 01e760ffdcff4b0051ffe4ff4f0034ffdeff5300

Raw gyro: 02e903365c36813663361036543688374139fe3a

Raw gyro: 01eb4bffc3ff50004fffc1ff430047ffbbff4100

Raw gyro: 01ec3effb2ff3c0050ffbfff560047ffccff7300

Raw gyro: 01ed4fffe0ff78005cffebff8e0056fff6ff8300

Raw gyro: 01ee7efffbffa1008bff0f00bc00b1ff1900b800

Raw gyro: 01ef9bff0c00d10095fff3ffd600b7ff0800df00

Raw gyro: 02f12445314600479e473348aa481c499749244a

Raw gyro: 01f3c3ff1600fe00beff1800f200a6ff0800e700

Raw gyro: 01f4a9fff8ffd300a7fff3ffd700a9fff1ffdf00

Raw gyro: 01f5b1fff8ffe800b4fff1fff700acfffcffef00

Raw gyro: 01f67ffff7ffc0006bfff4ffb00078ffe9ffb600

Raw gyro: 01f786ffecffc0006ffff0ffbc0060fff1ffc000

Raw gyro: 02f9ca4cbb4c784c964ca84c784c854c444c1b4c

Raw gyro: 01fb7cff0f00bb007eff2700ae0083ff30009800

Raw gyro: 01fc79ff1800b00076ff0f00bc0068ff0900d900

Raw gyro: 01fd78ff07000c01f6fffbff19011c000b00f600

Raw gyro: 01fe4b001100d30054000700c3004300efffeb00

Raw gyro: 01ff1f00d0ff1701fbffe8ff1b01e3ffffff1101

Raw gyro: 0201214b014bec4ad04aba4acb4abe4aba4abd4a

Raw gyro: 0103efffecfffc00e3fff3fff300defff3fffc00

Raw gyro: 0104e3fff0fff400e6ffefff0301dbffe9ff0c01

Raw gyro: 0105e3fff0ff0301e6ffe6fffc00dcffecfffc00

Raw gyro: 0106dffff0fff700dbffeefff600d6fff0fff400

Raw gyro: 0107dfffecffff00e1fff0ff0301defff3fffc00

至于陀螺仪,就有点困难。但是我的想法是它应该与心脏数据类似的方式打包,但在这种情况下,我们对每个应该签名的陀螺仪轴进行3次测量,数据包长度为20个字节。因此,12 x,y,z测量不会覆盖所有包,但3将会保留前2个字节(与之前的包相同)。所以我这样试了,过不然工作是正常的。

代码

代码,你可以找到我的github仓库(creotiv/MiBand2)下载案例的代码。这很简单,老司机自己去搜索好了,在此就不多赘述。

    推荐阅读
  • 郑州皇家一号开业了多久(郑州皇家一号的覆灭路)

    2013年11月11日夜晚11点左右,“皇家一号”被一千多名警方包围,当地警方至少出动了十五辆大巴车。2013年11月12日河南省公安厅正式确认“皇家一号”夜总会被查处一事。警方从“皇家一号”内部电脑里获取的数据显示,其一年营业额超过2亿元。2015年5月26日,由河南省新乡市红旗区检察院提起公诉的郑州“皇家一号”案一审公开宣判。最终,陈加贵、王国付被判处无期徒刑,其余涉案人员被判处有期徒刑,处以罚款。

  • 通信行业头部厂家(通信LOGO隐秘史设备商篇)

    2018年,华为推出了第三代LOGO,也就是现在的LOGO。另外,HUAWEI字体有所调整,更加硬朗锐利。尤其是E,变化明显。不带渐变的纯色logo,只授权用于消费者领域。当年,华为内部一度想要修改品牌名称,但是因为种种原因,没有改成,所以继续沿用至今。网友也经常戏称其为“大队长”。期间,略有改动,但整体变化不大。

  • 天津小台胞姐弟录给台北的祖父母(天津小台胞姐弟录给台北的祖父母)

    蔡文珊、蔡元熹姐弟幼时与祖父母的合影。蔡文珊、蔡元熹姐弟生长在一个两岸婚姻家庭。幼时姐弟俩跟随在台湾岛内的祖父母生活,上小学后随父母来到大陆生活,目前就读于天津市一所小学。2005年,两人结婚后,丈夫正式到大陆扎根。目前她是一名医生,丈夫在外企工作。中秋节的核心文化内涵是团圆。受疫情影响,郭女士一家已经有两年多没有回过台湾。她希望疫情结束后,能够经常回台北看望公婆,或者把他们接到身边,多尽孝心。

  • 海王星到底有多大呢(海王星原来不是蓝色的)

    而韦伯望远镜未来的观测可以发现它们是如何形成的,以及它们的构成。韦伯未来的观测应该能够揭开海卫一表面的组成,并可能显示出地质活动的变化。自2021年12月25日升空以来,詹姆斯韦伯太空望远镜创造了很多“第一”,比如说最清晰的海王星照片,还有迄今为止最深、最清晰的遥远宇宙红外图像。韦伯是有史以来最强大的太空望远镜,它于去年12月首次发射,自今年7月份以来一直在发布深空照片,已经提供了大量前所未有的数据。

  • 多效唑在芝麻上的应用,可以控制株高吗

    同时合理的为芝麻喷施多效唑,还有利于它后期的开花结果,也可以避免芝麻茎杆过高而出现的倒伏现象。

  • 梦幻西游无双版平民攻略(梦幻西游无双版平民玩法详解)

    梦幻西游无双版平民攻略跟着主线走,支线也顺带做了,这个经验市固定的。别的其他任务师门什么的先一概不做,等到主线支线没得做了再做,毕竟这些经验都和等级有关。读书中间触发答题不会问的精灵,都对经验才多。龙宫夺宝还是手动模式的好,要比自动多收获很多宝贝。装备的获得不像梦幻,系统送的装备一直打造就好。前期装备材料千万不要和,钨金有就用都装备上,不浪费。

  • 如何做鸡胗好吃(鸡胗的做法)

    鸡胗的做法食材:鸡胗500g、蒜苔一小把、辣椒几根、料酒适量、大蒜六七瓣、生抽适量、姜片六七片、耗油适量、盐适量、鸡精适量准备鸡胗洗净,切成片一小把蒜苔切成小段几根辣椒切丁备用把切好的鸡胗凉水下锅,倒入一点料酒。

  • 谁的青春不乱爱泰剧里的cp(泰腐谁的青春不乱爱)

    mark到医学院找pha一起吃饭的时候,就在路上遇到了kit,其实那时候mark就已经对kit有了感觉,想跟他成为“好朋友”。于是,大少爷mark就恬不知耻地称呼kit为学弟,并且问他知不知道pha学长在哪!其实,mark只是故意惹kit生气而已,这一段看下来,两个人真的挺甜挺搞笑的。

  • 屁多肝不好吃什么调理(屁多肝不好吃什么调理介绍)

    下面内容希望能帮助到你,我们来一起看看吧!屁多肝不好吃什么调理屁多肝不好的人可以通过饮食来调理改善,木瓜、草莓、葡萄等水果都能够调理改善肝脏功能,对于肝细胞损伤还能够起到一定的修复作用。另外要注意多喝水,大量饮水也能够修复肝细胞,同时要注意多吃一些绿色的蔬菜,蔬菜中的维生素和微量元素是非常丰富的。这些营养元素对于肝脏疾病能够起到辅助治疗的效果,所以饮食的选择一定要多样化。

  • 忍者必须死3月光宝盒怎么领取(月光宝盒怎么领取)

    下面更多详细答案一起来看看吧!忍者必须死3月光宝盒怎么领取首先,我们进入游戏的主界面,所有的各种活动都集中在游戏的界面左侧,我们点击其中的月光宝盒。点击打开月光宝盒之后,系统会弹出提醒,我们可以任意选择一把钥匙。确定之后,我们当即就能够获得一定的奖励,在后面的时间也可以获得奖励。