对小米Mi Band 2的破解

xiaohui 逆向破解 2019年3月14日发布
Favorite收藏

导语:Mi Band 2(小米手环2)是小米公司在2016年6月2日正式发布的一款运动追踪产品,它支持运动计步、睡眠监测、久坐提醒、心率监测(可实时监测)、来电提醒、屏幕解锁(Android系统)、振动闹钟和免密支付等功能。

Mi Band 2(小米手环2)是小米公司在2016年6月2日正式发布的一款运动追踪产品,它支持运动计步、睡眠监测、久坐提醒、心率监测(可实时监测)、来电提醒、屏幕解锁(Android系统)、振动闹钟和免密支付等功能。

要想让你的MiBand 2和手机绑定,具体过程有以下5步:

1.首先在手机的应用商店里下载小米运动APP,并打开手机蓝牙。

2.用手机号注册登录小米帐号,或直接登录小米账号,并进入手环的绑定页面里。

3.开始搜索手环,蓝牙搜索需要时间,需耐心等待片刻。

4.出现“请点击手环”的提示后,在手环上点击触摸按键。

5.绑定完成会出现√,这样手环就绑定完成啦!

破解MiBand2设备前的准备

本文所讲的破解,正是利用了以上与手机绑定过程中的蓝牙连接过程。

对Mi Band 2的破解还得从发表的一篇博文开始谈起,当时我在文中谈到有关运动追踪产品的监控问题。后来,我的朋友Volodymyr shymansky 帮助我在Github上找到了Mi Band 2的代码。根据这些代码,我就可以顺利进入连接到Mi Band 2,运行通知,并开启心脏测量等功能。但这并不是我的本来目的,我地目的是要从传感器获取实时原始数据,以便我了解Mi Band 2的真实追踪情况。简而言之,我想开发一个健身运动的预测工具,所以我决定破解我的健身追踪器。

由于我没有任何破解低功耗蓝牙的经验,所以首先我试着了解这项技术的工作原理,以及它们之间的不同功能是如何组合在一起的。事实证明,这很简单,以下就是我总结的一些经验:

1.每个低功耗蓝牙都有一些特定的服务对象;

2.每个服务对象都有一些自己的特点;

3.其中一些特点含有特定的描述符(如果特征具有多个参数或类型为读取或通知类型);

4.某些特性仅具有读或写访问权限(例如,当前时间,电池状态或修订信息);

5. 有些特征比较复杂,需要使用请求或通知循环(例如实时心率监视器或授权);

除了了解以上这些基本的原理外,你还需要两个可以帮助你调试低功耗蓝牙的应用程序:Wireshark协议分析器和BLE蓝牙调试工具。为此你需要进入你的Android手机开发者选项来进行相应设置,由于本文我讨论在iOS中的情况,所以感兴趣的iOS用户请自行找到相同的设置选项。

wireshark是一款专用于网络封包的工具,比较适用于网络管理和安全工程这个职业。通过使用Wireshark免费开源分析,为当前和未来的网络工程师,网络架构师,应用工程师,网络顾问和其他IT专业人员提供有关故障排除,保护,分析和维护高效,高效的网络基础架构的最佳实践的教育工具。BLE蓝牙调试工具是一款好用的蓝牙串口调试工具,用户能够在线对蓝牙设备进行数据的接受以及显示,能够在手机上进行数据的传送,支持一键扫描连接,能够直接打印数据,是一个非常实用的工具。

准备好调试工具,并设置好对应的选项,就可以开始进行破解MiBand2设备了。

破解MiBand2设备

首先,你需要从手机应用程序取消配对的Mi Band2设备。

现在让我们看看Mi Band2的服务特性,打开BLE调试器开始扫描,你会看到以下的场景。

1.jpeg

将你的设备MAC地址保存在某个地方,稍后我们要用到它。现在让我们连接到Mi Band2,看看它有哪些服务和特性。

2.png

通过这两个简单的操作,我们已经获得了有关Mi Band2设备的一些有用信息。不过获取信息的另一种方法是使用命令行工具,如hcitool和gatttool。

首先,要通过以下命令从命令行运行BLE扫描。

sudo hcitool lescan

连接到低功耗蓝牙的Mac地址并检索服务和描述符:

sudo gatttool -b YOUR_MAC -I -t random
> connect
> primary
> char-desc

在某些情况下,BLE堆栈可能出现故障,你可以打开或关闭蓝牙设备或运行以下命令。

sudo hciconfig hci0 reset

如何嗅探数据

为了嗅探手机与低功耗蓝牙通信时的数据,我们需要在开发设置中启用蓝牙日志。要执行此操作,你需要先在Android设备上启用开发人员设置。为此,请按照以下步骤操作。

注意:在Android 4.1及更低版本中,默认情况下可以使用“开发人员选项”。而在Android 4.2及更高版本中,你必须按如下步骤,才能启用“开发人员选项”:

1.在Android设备上打开“设置”应用;

2.选择系统(该操作只需要在Android 8.0或更高版本的设备上才有);

3.滚动到底部,然后选择“关于手机”的选项;

4.滚动到底部,然后选择“版本号”选项,点击7次;

5.返回上一操作屏幕,在底部附近找到“开发人员”选项。

现在打开“开发”设置并找到“Enable Bleutooth HCI snoop log” 选项,启用它。在此之后,来自设备与所有外部蓝牙设备的所有蓝牙通信将被记录下来。你可以通过访问名为btsnoop_hci.log的文件来查看日志(在我的Android 7.0设备,日志位于/mtklog/btlog/btsnoop_hci.log。

身份验证

现在,我们需要执行以下步骤来获取有关身份验证(配对)如何工作的一些信息。

1.打开蓝牙和HCI日志;

2.将你的设备与Xiaomi Android App配对;

3.关闭蓝牙;

4.将你的btsnoop_hci.log下载到你的PC;

5.用Wireshark打开它;

6. 找到处理0x0055的第一个ATT协议请求(0x0055代表安徽华米信息技术有限公司,小米可穿戴设备就是该公司生产的);

此时,你看到的场景如下所示。

3.png

这个请求是验证过程的第一步,从上图中可以看出,句柄UUID的值是:

1.配对设备:

主要服务UUID是0000fee1-0000-1000-8000-00805f9b34fb

2.验证特征(Char)UUID

00000009-0000-3512-2118-0009af100700

3.通知描述符(Des)句柄

0x2902

以下是身份验证步骤:

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

2.使用命令将16字节加密密钥发送到验证特征,并将2字节\ x01 \ x00 + KEY附加到其中;

3.通过向验证特征发送2个字节\ x02 \ x00,使用命令从设备请求随机密钥;

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

5.使用AES/ECB/NoPadding加密算法(从Crypto.Cipher导入AES),并用我们的16字节密钥加密此随机数,最后将其发送回验证特征(\ x03 \ x00 +编码数据)

实时数据的获取

身份验证过程有点复杂,更糟糕的是,心率监测器在15秒后就自动关闭了。以下是从Mi Band2获取的UUID值:

1.硬件服务(HRDW)UUID

0000fee0-0000-1000-8000-00805f9b34fb

2.心脏监测服务(HMS)UUID

0000180d-0000-1000-8000-00805f9b34fb

3.心率测量特征(HRM)UUID

00002a37-0000-1000-8000-00805f9b34fb

4.心脏监测控制特性(HMC)UUID

00002a39-0000-1000-8000-00805f9b34fb

5.传感器特性(SENS)UUID

00000001-0000-3512-2118-0009af100700

6.通知描述符(DES)句柄

0x2902

以下是如何执行的一些常见操作:

1.要关闭当前听力监听测量;

2. 向HMC \x15\x02\x00发送一次测量请求;

3.向HMC \ x15 \ x01 \ x00发送请求以进行连续测量;

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

5.通过向DES \ x01 \ x00写入请求来启用HRM通知;

6.通过向HMC \ x15 \ x01 \ x01发送请求,开始连续的心脏测量;

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

8.然后在收到通知时,我们需要每隔12秒向HCM发送一个值为\ x16的ping

解析数据

要解析数据,你就需要了解如何解压缩来自设备的数据。

有些数据是可以从日志中解析的,有些则不能。找到正确的数据包和编码可能需要一些时间,以我的设备为例,我试图在彼此相邻的数据包中找到类似的字节,可以发现有些字节在数据包中重复出现。

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个字节的无符号整型(unsigned short)解压,那么我们就会得到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次测量,这些测量值都是被签名过的。

代码下载

你可以像在Github上找到测试代码,其中还有使用示例。

本文翻译自:https://hakin9.org/how-i-hacked-my-xiaomi-miband-2-fitness-tracker%E2%80%8A-%E2%80%8Aa-step-by-step-linux-guide-by-andrey-nikishaev/如若转载,请注明原文地址: https://www.4hou.com/reverse/16759.html
点赞 2
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论