1. 简介
作为该专题的第二篇文章,将以一款智能灯泡为例,对BLE设备的分析方法进行简单介绍,同时对上一篇文章中的BLE基础知识做一个回顾。
本篇选用LifeSmart智能灯泡为研究目标。LifeSmart公司有一款app可以对旗下的各种智能设备进行控制,本篇选用的BLE智能灯泡同样可以用该app调节灯泡的亮度和颜色等。备注:LifeSmart公司的各种产品可以在淘宝直接买到,其app也有公开的下载链接。
App的控制界面如图1.1所示
图1.1 App控制界面
按照LifeSmart的使用逻辑,每个BLE灯泡都必须完成绑定之后,才能正常使用。我们本次的分析目的是,不经过绑定过程,而直接控制灯泡,如改变颜色或者亮度等。
2. 分析过程
2.1 获取BLE通信内容的方法
要分析app如何对灯泡进行控制,最直观的方法就是观察一下手机app通过BLE给智能灯泡发送了什么数据。我们有三种常用方法用于获取这些BLE通信内容:
1)HCI Log。由Android系统提供,蓝牙的所有日志都包含内在,内容十分全面,但是需要完成一次蓝牙通信之后从手机中导出阅读。
2)app分析。通过逆向分析app,查看app打印的日志,或者Hook关键函数,也能够获取蓝牙通信的内容。
3)BLE嗅探。通过BLE嗅探工具,直接嗅探周围BLE通信的数据,但如果BLE通信有加密则无法嗅探有价值的内容。
在本篇的案例中,我们直接采用第二种方法,即app分析。因为该app并没有屏蔽日志输出,所以程序运行时会直接将日志打印出来,我们只要分析并阅读日志就可以完成绝大部分工作。
2.2 app日志分析
本篇的分析目标比较简单,其app日志直接打印出了每次BLE通信的内容,因此我们只要查看其日志,就可以分析手机与灯泡之间的通信内容。
App日志可以通过DDMS、ADB或其他工具查看,如AndroidKiller等,我们直接选择一种比较简单的方式,即通过AndroidKiller查看。AndroidKiller是一款免费的用于Android APK逆向分析的可视化工具,虽然已经很久不更新了,但依旧很好用。
调整灯泡亮度时,Android Killer打印出来的日志如图2.1所示
图2.1 调整亮度时的App日志
多次通过app调整灯泡亮度后,将相关的日志逐条挑出,然后并列放在一起做对比分析,如图2.2所示。
图2.2 App日志总结
图2.2中,可以看到App打印出了以下信息:
灯泡地址:类似于网卡的MAC地址,每个灯泡都有一个独一无二的地址;
Service UUID和Characteristic UUID:正如本专题第一章所述,BLE通信实际上是对Service和Characteristic的读写,而Service和Characteristic用其相应的 UUID标识;
消息内容:二进制形式的BLE通信内容,多次调整亮度之后,通过对比每次通信内容,可以发现有一个字节数值的大小与亮度百分比成正比。
3. 结果实现
有了第二章的分析结果,本章将尝试在任意未绑定BLE灯泡的手机上,通过发送BLE消息的以控制灯泡亮度。
3.1 nRF Connect介绍
nRF Connect是一款由Nordic Semiconductor公司开发的用于调试BLE设备的免费app,分为iOS和Android两个版本。这里使用Android版本的nRF Connect进行后续工作。nRF Connect有三个常用功能:
A、扫描周围设备,并显示设备信息。如图3.1所示,
图3.1 nRF Connect Scan界面
在Scanner界面下,点击右上角的SCAN按钮开始扫描。在本专题第一篇文章中,我们介绍了Master和Slave的各种状态,nRF Connect扫描时,Android手机作为Master,会接收周围各个Slave发出的广播包,这些广播包里包含了Slave的信息。点击扫描到的设备会展示nRF Connect从该设备的广播包里解析出来的信息,在详细信息页面中点击RAW按钮,会显示该设备广播包的原始二进制数据。
B、与BLE设备进行通信
在Scanner界面下,点击CONNECT按钮即可向设备发起连接,连接建立之后就可以进行通信了,如图3.2所示。
图3.2 与BLE设备进行通信
读取Characteristic即为手机接收BLE设备的消息,写入Characteristic则代表向BLE设备发送消息。
C、作为Advertiser发送广播包
此外,nRF Connect还可以作为Slave,进入Advertiser状态,向周围不断地发送广播,如图3.3所示。
图3.3 模拟Advertiser状态
在Advertiser状态下会持续发送广播包,广播包中包含了对于本设备的简单描述信息,nRF Connect可以模拟其中5个基本信息,如TX power、Manufacturer Data等。
3.2 控制灯泡亮度
结合日志的分析结果,可以使用nRF Connect完成灯泡亮度的控制,具体的操作步骤如下:
1)在nRF Connect中,通过设备的MAC地址,找到需要操作的灯泡,如图3.4所示;
图3.4 在Scanner状态下找到灯泡
2)与灯泡建立BLE连接,并找到需要写入的Service和Characteristic的UUID,如图3.5所示;
图3.5 与灯泡建立BLE连接
3)以hex形式,向Characteristic写入控制灯泡亮度的通信数据,如图3.6所示。
图3.6 向Characteristic写入数据
我们直接将灯泡亮度设置为0%,如图3.7所示,点击SEND之后,可以看到灯泡的亮度随之出现了变化
图3.7 调整灯泡亮度为0
4. 总结
我们在这篇文章中,从app日志入手,分析了智能灯泡的BLE通信内容,随后使用nRF Connect直接与灯泡进行BLE通信,从而实现控制灯泡亮度的目的。上述分析表明,LifeSmart与BLE智能灯泡之间并没有严格的绑定关系,所谓的“绑定”步骤,仅仅是app本地登记一下需要控制的智能灯泡,方便了下次操作,但BLE智能灯泡本身并不知道自己被绑定给了谁。
本篇作为《胖猴小玩闹》专题的入门文章,分析就到此结束了。本系列后续文章中,我们会遇到更复杂的情况,如加壳、加密等等,届时会介绍更多的工具和方法,欢迎各位读者和我们一起探索。
此外,为了激发大家的学习兴趣,给大家提供更多的动手实践机会。这里我们提出一个小问题,请感兴趣的读者可以将答案发送到胖猴实验室的邮箱([email protected]),我们会挑选1-3位读者送上这篇文章中用到的智能灯泡,方便大家课外练习(由于还没回公司,尚不确定有几个灯泡,但至少有1个,就是图3.7中的那个)。
今日问题是:请模拟一个Apple设备的广播,要求如图4.1中红框部分,Manufacturer Data部分的Company显示为Apple.Inc,其他信息不做要求。将Advertisers设置界面(即图3.3所示界面,不同版本的nRF Connect,该界面可能略有不同)的截图发送到胖猴的邮箱即可。
图4.1 广播模拟示例
作者:Light & Yimi Hu @ PwnMonkeyLabs
本文为 胖猴实验室 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址