首页
社区
课程
招聘
[原创]一个BLE智能手环的分析
2022-3-13 09:11 29021

[原创]一个BLE智能手环的分析

2022-3-13 09:11
29021

首先确定手环的 MAC 地址,使用 APP 进行扫描连接,连接成功就会显示设备的 MAC 地址:A4:C1:38:6A:1C:BF

接下来解除绑定,使用 TI 的 packet sniffer 进行蓝牙数据包的捕获,插入 CC2540 后选择好类型,开始捕获后再查找手环进行绑定,因为 BLE 会随机在 37、38、39 三个信道中选择一个,而  packet sniffer 只能监听一个信道,所以可能需要多试几次才能捕获到,其中 M->S 表示是手机发送给手环,S->M 是手环发送给手机

有些可疑的包标记一下,这两个都包含了当前的步数 100,即 0x64,且都是从手机端发送一个请求之后从手环发回来的

在捕获的最后阶段,我摁下了几次查找手环的命令,这应该是查找手环的震动效果

但是此时通过 gatttool 或者 nRFconnect 进行发送是不成功的,因为手环需要进行绑定才能通信,接下来使用 AndroidKiller 抓取 APP 的日志进行分析,查看 APP 是如何与手环进行通信的

打开 AndroidKiller 后连接手机,在 Android 中已找到设备中就可以看到手机了,然后点击日志

点击开始进行日志的捕获

这里进行 BLE 的连接

BLE 连接成功,此时虽然连接成功但是仍然没有绑定设备

向手环发送了一条指令:430000dc,猜测是用来进行绑定,可以先记录下来,后边通过 gatttool 进行验证

获取手环电量指令:27000074

获取步数、卡路里、距离等指令:2001000070

获取心率等指令:21010000c6

(这里只是根据值大致推测了一下,并没有逆向APP查看每个字段的范围)

获取体温数据指令:2c01000078(我还没测过体温,所以没啥数据)

查找手环指令:1008000000000001000000c00000000000000000,效果是三次长时间的震动

手环还支持将 APP 收到的消息推送到手环上显示,打开该功能后给手环支持的 APP 发送消息,手环就会显示收到的消息

查看一下这个过程的日志,可以发现如下信息:

首先是 0a020000020e,告诉手环要推送消息

然后是发送人的昵称:test,这里的指令为 0a050001746573743a

这里是发送的消息,1234,指令为 0a05000231323334

最后是指令 0a0100030e 表示消息都发送完了,手环可以显示了

除了前后两条指令,消息部分指令中间一部分可以很明显知道是 ASCII 的十六进制,但是整条指令的构成需要对 APP 进行逆向分析,通过日志前面的 tag 可以知道这是在 CmdHelper.java 中实现的,使用 jadx 打开 APP,找到CmdHelper,位置在 com->runmifit.android->util->ble->CmdHelper,找到 setMessage2,可以看到他接收的参数是一个整形一个字符串,根据日志的上下文可以推测是 IntelligentNotificationService传给他的参数,定位到 com->runmifit.android->sevice->IntelligentNotificationService,发现只有两个地方调用了 setMessage2,一个传 1 一个传 2

此时再回来看一下 setMessage2 中参数 i 的用途,猜测这个是用来区分是发送人昵称还是消息的字段

setMessage2 函数主要作用是构造一个 bArr2 数组给 spliteData 函数,这里主要看以下 bArr2 的构成

这里的 i2 是之前计算的长度,它加了5个字节作为构造出的指令的长度,bArr2[0] = 10; 开头是固定的 0a,然后两个是用来存放长度+1 的,然后是区分昵称还是消息的字段,接着把消息拼接上,最后是一个 completeCheckCode,往上面翻一下定位到该函数

他只是把传进去的数组挨个遍历加起来然后乘上 86 再加上 90,得到的结果取末尾一字节,作为一个校验。因为昵称和消息内容都是用 setMessage2 函数生成的,所以构成方法一致

至此,消息指令的构成就分析完了,试着来构造一个消息:sec 发送的 hacked

sec 的 ascii 码分别是73 65 63,长度是 3+1=4,计算最后的校验位 0a+04+01+73+65+63=14A 即十进制的 330,330*86+90=28470,也就是 6F36,取末尾一字节 36

所以昵称的指令为:0a04000173656336,同理消息的指令为:0a0700026861636b6564fc

接下来使用 gatttool 进行验证,需要蓝牙适配器支持 ble 通信,使用命令 hciconfig hci0 up 将蓝牙适配器激活

gatttool -I -b A4:C1:38:6A:1C:BF 进入交互模式,其中 -I 表示进入交互模式,-b 指定 MAC 地址,进入后使用 connect 进行连接,输入 help 可以查看帮助

输入 characteristics 查看所有的特征,我们要使用的句柄是 0x11

首先发送 430000dc 进行绑定,然后就可以发送其他的指令。例如获取手环步数、查找手环让手环震动、获取手环心率等,我们先给手环推送一下之前分析的消息,测试一下判断的是否正确

可以看到我们自定义的消息成功被推送到了手环上并显示出来

另外既然是通过 BLE 通信的,那么打开消息通知和关闭消息通知肯定也是有对应的指令的,通过 APP 日志也可以找出来

附:

021000320500010001010001ff000000000000e2     打开消息推送

021000320500010001010000ff0000000000008c     关闭消息推送


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞3
打赏
分享
打赏 + 50.00雪花
打赏次数 1 雪花 + 50.00
 
赞赏  Editor   +50.00 2022/03/29 欢迎大家多多投稿优质文章,赢取“雪花”奖励~
最新回复 (9)
雪    币: 12052
活跃值: (15379)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2022-3-14 14:58
2
0
感谢分享
雪    币: 6551
活跃值: (2566)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flyingx 2022-3-14 22:21
3
0
雪    币: 247
活跃值: (469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yyy2k3 2022-3-17 09:28
4
0
mark 学习一下
雪    币: 3
活跃值: (588)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Qira 2022-3-17 11:24
5
0
楼主可以讲讲app 这块 怎么找到收发数据的点的
雪    币: 2059
活跃值: (13085)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
yichen115 8 2022-3-17 13:38
6
0
Qira 楼主可以讲讲app 这块 怎么找到收发数据的点的
主要是这个APP他能够输出日志,可以直接看到发送的指令,还有就是日志前面是有对应的类的名字
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_dwzxntzz 2022-3-17 23:10
7
0
学习一下
雪    币: 3906
活跃值: (5528)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
badboyl 2 2022-9-14 09:53
8
0
为什么我的CC2540抓不到,LZ。
雪    币: 2059
活跃值: (13085)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
yichen115 8 2022-9-14 21:10
9
0
badboyl 为什么我的CC2540抓不到,LZ。
BLE有三个广播信道(37、38、39),随机选取一个信道使用,建立连接时根据一些设定好的参数跳频通信,BLE Sniffer只有抓到连接的包,才可以跟着跳频通信抓取后面的包。CC2540只能同时抓一个广播信道,因此有可能抓不到连接的那个包,就没法跟着跳频继续抓后面的包。想要稳一点可以买个nRF52840烧一个sniffer的固件,这个是目前我知道的最实惠的同时抓三个广播信道的方法了,还有个叫Hollong的设备比较贵
雪    币: 3906
活跃值: (5528)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
badboyl 2 2022-9-16 13:51
10
0
yichen115 BLE有三个广播信道(37、38、39),随机选取一个信道使用,建立连接时根据一些设定好的参数跳频通信,BLE Sniffer只有抓到连接的包,才可以跟着跳频通信抓取后面的包。CC2540只能同时抓一 ...
明白了,感谢LZ耐心解答。
游客
登录 | 注册 方可回帖
返回