吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 47170|回复: 262
收起左侧

[原创] 一次小米手环BLE通信协议的逆向之旅

    [复制链接]
FinchK 发表于 2020-5-8 14:41
本帖最后由 FinchK 于 2021-4-11 10:04 编辑

0x0 前言

​        纯逆向新手,接触逆向两个月左右。

​        手头有一个小米手环4NFC版本,内置小爱同学,能够语音对话,进而控制智能家居,做一些操作如设置闹钟等。因对其实现原理好奇,并且想拓展其功能,遂逆向。百度只有Miband3之前的研究,到了Miband4的新功能,我应该还是第一个。

0x1 逆向前准备

​        首先,要想使用小米手环中的语音助手,手环必须和手机保持连接,并且小米运动APP要保持后台运行。很显然,小米手环并没有内置语音识别的功能,猜测其应该是将声音传感器的数据发送给手机,然后手机进行语音识别,自然语义处理之后再发送给手环。

​        而在安卓中,想要实现BLE(低功耗蓝牙)通讯,必须要调用

boolean android.bluetooth.BluetoothGatt.writeCharacteristic(BluetoothGattCharacteristic characteristic)

​        具体API可以参考Google的

​        我们就从这里开始入手。

0x2 开始逆向

​        我们使用Jadx打开小米运动APP,查看其源代码,发现大部分代码混淆得有点厉害,不过这不是问题。

​        我们直接使用代码搜索功能搜索“writeCharacteristic”,发现了我们想要的结果。

​        此处省略代码查找过程,最终我们找到了实际发送字节流的函数。

​        我们继续向上查找引用,或许可以直接通过静态分析就知道它的数据包结构呢?结果...

​        Jadx反编译失败了...Emm....不管了,直接Hook吧。

​        我们可以通过Hook发送数据包的函数,获取它到底发送了啥。当然也可以直接Hook安卓API,防止遗漏。这里我们这里选择了后者。

​        成功了!这些包的结构都很明显,大部分都是字符串和一些整数,且没有加密,通过多次对比和猜测就能知道,就不深入讲了。接下来我们重点分析小爱同学的通讯协议和小米手环认证算法。

0x3 小爱同学的通讯协议

​        为了抓到小爱同学的交互包,我们还需要Hook蓝牙的读取字节流的函数。在安卓里面,这个过程是通过Callback实现的,那我们需要Hook那个Callback函数。稍微一查就找到了:

com.xiaomi.hm.health.bt.O00000oO.O00000Oo.onCharacteristicChanged(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic bluetoothGattCharacteristic)

​        这样我们也能抓到从手环发到APP的包了:

​        因为我正向开发的经验还比较多,这里直接猜测就知道,前几个包仅涉及到一些状态的交换,如开始录音,切换UI等。后面的声音数据的解密才是重点。

​        我观察这些声音数据包,发现第一个字节代表数据包类型,第二个字节代表数据包序号,应该是防止乱序之类的(不知道BLE有没有乱序这一说)。接下来应该是声音数据,初步猜测是PCM,事实证明不是,还有一层编码。打印调用堆栈似乎是不可行的,我这里继续静态分析APP。

​        通过搜索一些关键词,我找到一些有意思的ENUM。

​        注意,这里向下追溯onCharacteristicChanged函数是没用的,因为大多数APP都是用Intent间接传递参数的,并不是直接调用解密函数。

​        

​        我们只要向上查找这个枚举的引用,就找到了解析语音数据包的代码。

​        嗯,看来是找对了。

​        这里是解密函数,可以看到他在遍历一个数组,先将元素写到一个文件中,接着又调用了另一个函数,我们跟进去看看。

​        这里果然调用了一个decode函数,并且通过字符串我们知道最后的格式应该是pcm,16k。解密之前应该是opus。

​        发现他调用了一个so,不过opus的解密代码是开源的,我们直接用开源库写一个demo试试。

​        成功了!这样我们就完成了从声音数据的捕获到声音数据的解密。

0x4 小米手环认证算法

​        小爱同学等相关功能在未认证的情况下是不能使用的,所以有一个认证过程。

​        这个网上也有相关的文章,静态动态结合分析就行了,不过提醒一点,那个验证包的一个参数貌似变了,跟我网上搜索的文章讲的不一样。主要就是AES算法的data和key。

0x5 心得与后记

​        分析这个APP很简单,整个过程花费了一个下午,也没啥复杂的加密流程,软件本身也没保护,但还是学到很多,比如:

  1. 从软件调用的API考虑,向上回溯查找

  2. 关键词查找

  3. 动态静态结合分析

  4. 掌握一些软件设计模式(软件工程这门学问),APP正向开发思路,能更快更好的猜想。

    其实,还有一个更简单的方法,那就是Hook那个打印日志的函数,等我一波骚操作后才发现,小米运动的日志是真详细(逃)。

    再贴一个和github老哥亲切交谈的图,貌似小米手环要走向国际化了呢。



IMG_20200508_143434.jpg

免费评分

参与人数 141吾爱币 +122 热心值 +124 收起 理由
Chyyyyy + 1 鼓励转贴优秀软件安全工具和文档!
anartya + 1 用心讨论,共获提升!
ww51yy + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hohov + 1 鼓励转贴优秀软件安全工具和文档!
manhere + 1 + 1 用心讨论,共获提升!
wkyy + 1 我很赞同!
zyzand + 1 谢谢@Thanks!
lizi5002 + 1 + 1 我很赞同!
bitpeach + 1 用心讨论,共获提升!
wa1111 + 1 + 1 用心讨论,共获提升!
筱原明里 + 1 + 1 用心讨论,共获提升!
Qiao + 1 用心讨论,共获提升!
robin35322 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lookerJ + 1 + 1 用心讨论,共获提升!
Ricky_Xiao + 1 厉害,佩服
啦啦啦666 + 1 我很赞同!
lsywy520 + 1 我很赞同!
leyuuu + 1 + 1 谢谢@Thanks!
叶一苇 + 1 我很赞同!
MUMUAA + 1 热心回复!
blcpu + 1 + 1 我很赞同!
alderaan + 1 + 1 热心回复!
BuddhaSL + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gztoosweet + 1 用心讨论,共获提升!
zek + 1 + 1 啊这。逆向看着比自己开发都累
boy590 + 1 + 1 我很赞同!
索隆 + 1 + 1 用心讨论,共获提升!
saya086 + 1 谢谢@Thanks!
icfoxes + 1 热心回复!
baitian0418 + 1 + 1 我很赞同!
回到南极 + 1 + 1 谢谢@Thanks!
sadj9876 + 1 + 1 谢谢@Thanks!
小布丁啦啦 + 1 + 1 热心回复!
mengjingzhimo + 1 + 1 我很赞同!
彤哥来啦 + 1 用心讨论,共获提升!
litchiate + 1 + 1 厉害了
泉水指挥官 + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
IsayIsee + 1 + 1 谢谢@Thanks!
h2995527 + 1 热心回复!
QAQ难搞哦 + 1 + 1 秀芹啊
Creeper666 + 1 + 1 我很赞同!
xwj4sb + 1 + 1 就冲你最后这个图得加分得加分
cxyelu + 1 + 1 我小米手环2,亮度已经低到在灯下面、阳光下面完全看不到的地步
no_dark + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
清炒藕片丶 + 1 + 1 看到最后面就不得不得给你赞了
思卿卿 + 1 我很赞同!
imaweno + 1 + 1 个个都是人才,说话又好听。
shi128862 + 1 + 1 谢谢@Thanks!
jsang + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
DW32 + 1 我很赞同!
最喜欢又又了 + 1 + 1 用心讨论,共获提升!
PerfectFJH + 1 就看懂了最后一张图
多德 + 1 我很赞同!
webber.yan + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
乐卤类小冲儿 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
whychobits + 1 + 1 谢谢@Thanks!
匿名网友哟 + 1 + 1 谢谢@Thanks!
19950120 + 1 + 1 我很赞同!
Big_Orange + 1 + 1 你的手环即将被没收
rubber_ball + 1 + 1 我很赞同!
纯粹520 + 1 我很赞同!
刚打电话 + 1 + 1 用心讨论,共获提升!
xiahhhr + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
网友tb503 + 1 + 1 谢谢@Thanks!
wjsjwr + 1 厉害!
nulu + 1 我很赞同!
淋哉哉 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
ALCATEL + 1 + 1 用心讨论,共获提升!
lonely_coder + 1 + 1 用心讨论,共获提升!
love514415 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
laohucai + 1 + 1 谢谢@Thanks!
YunYi1021 + 1 + 1 大佬
小小莱 + 1 + 1 谢谢@Thanks!
lintao199 + 1 + 1 用心讨论,共获提升!
梦溪笔谈2048 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
bradbox + 1 鼓励转贴优秀软件安全工具和文档!
onepercent + 1 + 1 谢谢@Thanks!
bullshit + 1 + 1 谢谢@Thanks!
SureFire2 + 1 能不能改手环内置的步数,让其翻倍(滑稽
liu2514 + 2 + 1 用心讨论,共获提升!
VERTMIN + 1 用心讨论,共获提升!
1759105749 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
yuweb + 1 + 1 吾爱破解都是人才
leewoosang + 1 + 1 我很赞同!
5rfn + 1 + 1 谢谢@Thanks!
dldl + 1 + 1 谢谢@Thanks!
stardust21 + 1 + 1 我很赞同!
w1zar6 + 1 + 1 用心讨论,共获提升!
yalolo + 1 + 1 老大这么牛逼
起个稀奇古怪的 + 1 + 1 用心讨论,共获提升!
rapheal + 1 热心回复!
rourou1105 + 1 + 1 热心回复!
都同学 + 1 + 1 谢谢@Thanks!
z_more + 1 + 1 热心回复!
198FOR + 1 + 1 我很赞同!
冰课玏好喝 + 1 + 1 我很赞同!
jnez112358 + 1 + 1 谢谢@Thanks!
何枝可依 + 1 厉害,不知道能不能从软件层面写入id卡数据,买写卡设备复制加密卡太特么贵.
难得清闲难得 + 1 + 1 我很赞同!
Owen_QAQ + 1 牛批

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

涛之雨 发表于 2020-5-9 17:11
姨姐很久前送我一个米3手环。。。
现在一直没法用。。。

(上面那是积灰,屏幕被我擦了一下)
打开(实际上也关不掉,只能等没电)就显示链接app升级。
手机app连接时显示请先恢复出厂设置,才能连接。。。
Screenshot_20200509_170920_com.xiaomi.hm.health.jpg
我。。。。(无语ing)
自从拿来升级后就成这样。
然后。。。
tw柳叶·飘絮 发表于 2020-5-8 16:06
wsb0626 发表于 2020-5-8 16:09
看到最后我也是笑了,真有趣的啊,吾爱破解都是人才 都是大实话。
syx594 发表于 2020-5-8 15:15
可以的,前来支持
索白 发表于 2020-5-8 15:19
围观大佬
kingwl 发表于 2020-5-8 15:27
牛皮!!!!!!!1
不写书怎周树人 发表于 2020-5-8 15:42
可以可以,太厉害了。
赤座灯里 发表于 2020-5-8 15:53
诶最后一张图和我在隔壁论坛看的不一样啊
17773441534 发表于 2020-5-8 15:57
np,膜拜大佬
yinyewangzi 发表于 2020-5-8 16:14
这技术可以啊,支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-25 02:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表