BLE蓝牙协议:抓包实战(HCI+空口)

admin 2026-03-12 23:18:58 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍BLE蓝牙协议的两种抓包方法:HCI层抓包和空口抓包。HCI抓包通过Android原生hcidump获取CPU与蓝牙芯片间的明文数据;空口抓包使用nRFSniffer配合Wireshark捕获射频信号获取完整数据。文章详解抓包原理、环境配置及操作步骤,强调跳频机制下需锁定目标MAC地址才能截获完整通信,为IoT设备安全测试提供实用指导。 综合评分: 84 文章分类: IoT安全,安全工具,实战经验


cover_image

BLE 蓝牙协议:抓包实战 (HCI + 空口)

原创

M3ng9e M3ng9e

萌蘖向阳成参天

2026年3月12日 00:06 广东

在对智能 IoT 设备进行安全测试时,比如汽车的无钥匙进入系统、智能手环、智能门锁等等设备核心通信交互都使用了 BLE(低功耗蓝牙)技术。

因此,进行 BLE 流量抓取与分析,是破解 IoT 设备的第一步

蓝牙的来历

“蓝牙”(Bluetooth)一词取自一千多年前丹麦国王哈拉尔的名字Harald Bluetooth。传说这位国王特别喜欢吃蓝莓,吃到牙齿都变成蓝色了,因而当时的欧洲人民称这位国王的牙齿为蓝牙。

1998年爱立信联合5家厂商联合宣布一种短距离无线通信新技术。由于是这几家大公司一起合作制定的技术,与哈拉尔统一挪威与丹麦的经历类似,所以这项新技术便以“蓝牙”命名。

蓝牙和BLE

蓝牙通常是指在两个电子设备之间无线传输数据的技术。

随着物联网的发展,经典蓝牙太“重”,它在小型终端设备中的实施将占用更多的电量和系统资源。

因此,蓝牙4.0标准引入了低功耗蓝牙(Bluetooth Low Energy,BLE),这个蓝牙技术是专门针对系统资源、电量有限的智能设备的。

BLE具有极其省电,连接速度快的特点,在日常生活里汽车的无钥匙进入、智能手表、智能灯泡、智能门锁、体脂秤、Apple AirTag等等很多很多都是使用BLE进行通信的。

蓝牙的协议栈

BLE协议架构总体上分成3块,从下到上分别是控制器(Controller)、主机(Host)和应用(Application),三者既可以在同一芯片内实现,也可以分不同芯片内实现。

  1. 控制器(Controller): 通常在底层蓝牙射频芯片内实现,主要包含物理层(PHY)和链路层(LL)。它与硬件强相关,负责最底层的 2.4GHz 无线电波收发、跳频机制以及维持物理层面的连接。
  2. 主机(Host): 通常运行在设备的主 CPU 中(如手机的安卓系统内)。它包含了 L2CAP、SMP、GAP、GATT 等核心协议栈,负责上层数据的拆包组装、设备发现策略、以及配对加密体系的管理。
  3. 应用层(Application): 运行在最顶层,调用 Host 提供的接口来实现真正的业务逻辑(比如决定什么时候发送“开锁”指令,或者解析收到的“心率”数据)。

image-20260311213521174

本文主要是介绍抓包,大家可以阅读书籍或者查阅资料去了解学习这个协议栈架构,或且听下回分解。

如何抓包?

我们使用智能设备的时候,通常都是使用手机去对设备进行控制,比如汽车解锁,手环的查找。

在手机里,蓝牙功能其实是由两个完全独立的部门合作完成的。

  1. 应用层–>Host(主机 / 手机CPU)

    APP 发送一条指令,主 CPU 会生成这段最原始的明文数据

  2. Host–>Controller(控制器 / 蓝牙底层芯片)

    主CPU把数据再交给蓝牙芯片,蓝牙芯片将指令打包、加密、调频,然后通过天线转换成 2.4GHz 的无线电磁波发射出去。

那么既然数据经过了主机到控制器(HCI层),控制器和另外一个设备之间又通过无线电磁波发射出去(空口)。那么这个时候我们对其过程中的HCI层和空口进行抓包,两者互相进行补充,就可以抓取到完整的BLE通信数据了。

进行安卓 HCI 抓包,抓的是CPU和蓝牙芯片之间的通讯,是为了绕过底层的硬件加密,直接拿到 App 层面最干净、最原始的“明文应用数据”,但是无法获取到物理层和链路层的的数据包。

进行空口抓包,获取到物理层和链路层的的数据包,完全不接触交互双方设备,通过空中抓包获取原始的信号数据,因此包含了所有的信息。

Android手机HCI层抓包

通过Android原生自带的hcidump功能抓低功耗蓝牙,由于比较简单,这里就直接一笔带过了,具体遇到问题的可以去查阅资料。

开启Android开发者模式

打开“关于手机”,点击版本号,一直点到提示“开发者模式”

抓包

  1. 用测试机(已root),“开发者选项”中,找到并开启 “启用蓝牙 HCI 信息收集日志”
  2. 非常重要: 开启该选项后,必须关闭并重新打开一次手机蓝牙,日志才会开始记录。
  3. App进行操作,操作完成后数据包会写入/data/misc/bluetooth/logs目录中
adb shell
su
cd /data/misc/bluetooth/logs
ls
cp btsnoop_hci_xxx /sdcard/

adb pull /sdcard/btsnoop_hci_xxx .

导出后,拖入wireshark就可以进行BLE通信的分析了。

Tips:在有些案例里,可以到看到日志路径是这个 /sdcard/btsnoop_hci.log,我抓包就比较疑惑,问了AI才知道,/sdcard/btsnoop_hci.log是较老的安卓系统(Android 7 及以前)的路径,/data/misc/bluetooth/logs/btsnoop_hci.log是较新的安卓系统(Android 8 及以后,一直到现在的 Android 14/15),这是 Google 官方现在的标准存放路径。

空口抓包

第一次听到“空口”这个词,什么意思呢?顾名思义就是空气接口

“空口抓包”(Over-The-Air, OTA Sniffing)抓的是真正在空气中传播的 2.4GHz 射频物理波。

空口蓝牙抓包的方案有多种,我使用的方案是nRF Sniffer+wireshark

(一些方案可以参考:https://www.yuque.com/hxfqg9/iot/kr08tpbk2ckry8ez   yichen师傅的文章)

设备

为什么空口抓包需要用设备?

低功耗蓝牙使用短波特高频无线电波,经由2.4~2.485GHz的ISM频段来进行通信。蓝牙有两种通信信道——广播信道和数据信道。

在数据传输时,设备间会使用跳频算法在数据信道间跳频。如果想要捕获到数据信道中的数据,则需使用专业蓝牙设备进行跳频追踪。

image-20260310182437297

我自己使用的设备是E104-BT5040UA,成本是45RMB,产品链接是https://www.ebyte.com/product/1206.html

芯片是采用的nRF52840,抓包固件默认为nrfsniffer3.0版本,可以在手册里看到https://www.ebyte.com/downpdf/1206.html

image-20260311163928035

image-20260311163403061

image-20260311163413716

抓包环境配置

抓包环境直接按照文档一步步来即可,很简单。

https://www.ebyte.com/pdf-down/2975.html

Tips:这里我踩了一个坑,我使用的官网的nrfutil工具安装的nrfutil ble-sniffer bootstrap,官网的版本是4,而我的设备固件是3,Wireshark 插件版本和板子里的固件版本必须一致,如果用的是其他的新设备可以用nrf官网的nrfutil工具配置。

抓包

环境配置好之后,wireshark就具有了这个插件。

image-20260311164552636

然后插上设备,点击刷新接口列表,在下面可以找到我们的设备,点击进去,抓包环境配置好的话应该可以看到很多广播包不断发送。

image-20260311164730813

image-20260311164813397

将目标设备(这里我用的小米手环)手环重新绑定,就在wireshark可以识别到,选择目标设备的mac,开始捕获。

思考:为什么要专门选择目标设备的 MAC 地址?

因为蓝牙连接后会开启“狡兔三窟”般的“跳频机制”。抓包设备只有一个接收器,如果不指定 MAC 地址,它就只能在3个广播频道瞎逛,永远抓不到连接后的数据;只有选中了特定 MAC,设备才能精准截获 CONNECT_IND 这个包,并根据里面的“暗号”算出跳频轨迹,跟着设备一起在 37 个数据频道里跳频,从而抓到后续的完整通信数据。

image-20260311165134226

可以看到设备在不断发送广播

image-20260311165738492

接下来对目标设备和手机进行绑定

image-20260311171438233

image-20260311171549057

再观察数据包,可以看到数据和之前的广播数据不一样了,并且有一个关键节点CONNECT_IND,建立连接。(可以wireshark Ctrl+F搜索字符串CONNECT_IND),接下来就可以对抓取到的通信包进行分析了。

image-20260311205119509

Tips:

wireshark使用时显示的问题:有人会发现,为什么我抓到包后wireshark看着和一些大佬界面不太一样,没有目的端,界面看着差别很大,这个是wireshark的右下角配置文件的问题,可以选择Default默认配置,也可以用Nordic的nRF_Sniffer官方的配置文件,自己选择即可。

image-20260311210550451

参考资料:

  1. 《智能汽车网络安全权威指南》
  2. https://www.yuque.com/hxfqg9/iot/kr08tpbk2ckry8ez

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:萌蘖向阳成参天 M3ng9e M3ng9e《BLE 蓝牙协议:抓包实战 (HCI + 空口)》

    评论:0   参与:  0