Skip to content

BLE Wireshark 抓包

BLE 抓包完全教程:nRF52840 Dongle + Wireshark

Section titled “BLE 抓包完全教程:nRF52840 Dongle + Wireshark”

基于 nRF Sniffer for Bluetooth LE v4.1.1 + nrfutil v7 + Wireshark 适用于 Windows 10/11(全新环境从零开始)


从官网下载并安装 Wireshark(v3.4.1 或更高稳定版):

https://www.wireshark.org/download.html

安装时保持默认选项即可。

从 Nordic 官网下载 nrfutil 可执行文件:

https://www.nordicsemi.com/Products/Development-tools/nRF-Util

下载后将 nrfutil.exe 放到一个固定目录,例如 D:\tools\nrfutil.exe, 或将其所在目录加入系统 PATH 环境变量(方便全局调用)。

打开命令行,进入 nrfutil.exe 所在目录,执行:

# 安装 ble-sniffer 插件
nrfutil.exe install ble-sniffer

# 安装 device 插件(用于列出设备和烧录固件)
nrfutil.exe install device

无需安装 Python,新版 nrfutil 的 Wireshark 插件是原生可执行文件,不依赖 Python。


二、初始化配置(首次使用执行一次)

Section titled “二、初始化配置(首次使用执行一次)”
nrfutil.exe ble-sniffer bootstrap

此命令自动完成两件事:

  • 下载 sniffer 固件到 %USERPROFILE%\.nrfutil\share\nrfutil-ble-sniffer\firmware\
  • 在 Wireshark 的 Personal Extcap 目录安装以下文件:
    • nrfutil-ble-sniffer-shim.exe
    • nrfutil-ble-sniffer-hci-shim.exe
    • nrfutil-ble-sniffer-shim-config.json

将 nRF52840 Dongle 插入电脑,执行:

nrfutil.exe device list

找到 Traits 包含 nordicDfu 的设备,记录其序列号,例如:

C55ED95B17E7
Product         nRF52 Connectivity
Ports           COM22
Traits          nordicDfu, nordicUsb, serialPorts, usb

序列号即第一行的字符串(C55ED95B17E7),每个 Dongle 不同。

<序列号> 替换为上一步查到的实际值:

nrfutil.exe device program \
  --firmware "%USERPROFILE%\.nrfutil\share\nrfutil-ble-sniffer\firmware\sniffer_nrf52840dongle_nrf52840_4.1.1.zip" \
  --serial-number <序列>

烧录成功后,Dongle 会重新枚举 USB,再次执行 device list 确认:

Product         nRF Sniffer for Bluetooth LE
Traits          nordicUsb, serialPorts, usb

注意: 烧录后 COM 端口号可能改变,以新端口为准。

一次烧录,永久有效:固件保存在 Dongle 中,换电脑使用时不需要重新烧录, 只需在新电脑上重新执行第一、二章的软件安装步骤。


打开 Wireshark,按 F5 或点击 Capture > Refresh Interfaces

主页接口列表中应出现:nRF Sniffer for Bluetooth LE COMxx

若未出现,检查 extcap 目录(Help > About Wireshark > Folders > Personal Extcap path) 中是否存在 nrfutil-ble-sniffer-shim.exe,若没有,重新执行 bootstrap

View > Interface Toolbars > nRF Sniffer for Bluetooth LE

工具栏字段说明:

字段说明
Interface选择 Dongle 对应的 COM 口
Device设备列表(默认 All advertising devices)
Key加密密钥类型(用于解密加密连接)
Value密钥值
Adv Hop广播信道跳频顺序(默认 37,38,39)

  1. 双击 nRF Sniffer for Bluetooth LE COMxx 接口开始捕获
  2. 工具栏 Device 下拉保持 All advertising devices
  3. 附近所有 BLE 设备广播包实时显示
  1. 启动抓包,等待目标设备出现在 Device 下拉列表
  2. 从列表中选择目标设备(显示名称或 MAC 地址)
  3. 用 Central 设备(手机等)连接该 Peripheral
  4. Wireshark 捕获完整连接过程(广播 → 连接建立 → 数据交互)

5.3 RSSI 过滤(减少附近无关设备干扰)

Section titled “5.3 RSSI 过滤(减少附近无关设备干扰)”

在 Capture Filter 栏输入(只抓信号 >= -70dBm 的包):

rssi >= -70

无需任何额外操作,sniffer 自动解密。

  1. 工具栏 Key 下拉选择 Legacy Passkey
  2. Value 框输入 6 位 Passkey,按 Enter
  3. 在配对设备上输入相同 Passkey 完成配对
  1. Key 下拉选择 Legacy LTKSC LTK(取决于绑定类型)
  2. Value 框输入 LTK(十六进制,0x 开头,大端序)
  3. Enter,然后触发两设备建立加密连接

6.4 LE Secure Connections(非 debug 模式)

Section titled “6.4 LE Secure Connections(非 debug 模式)”
  1. Key 下拉选择 SC Private Key
  2. 输入 32 字节 Diffie-Hellman 私钥(0x 开头,大端序)
  3. Enter,然后发起配对

btle.advertising_address == aa:bb:cc:dd:ee:ff

MAC 地址不区分大小写,AA:BB:CC:DD:EE:FFaa:bb:cc:dd:ee:ff 等价。

btle.advertising_address == aa:bb:cc:dd:ee:ff || btle.advertising_address == 11:22:33:44:55:66
btle.advertising_address && btle.advertising_address != aa:bb:cc:dd:ee:ff
btle.advertising_address == aa:bb:cc:dd:ee:ff && btle.length != 0

BLE 设备名称字段因 Wireshark 版本和抓包插件不同,字段名有差异:

环境字段名说明
标准 Wiresharkbtcommon.eir_ad.entry.local_name通用字段
nRF Sniffer 插件btcommon.eir_ad.entry.device_name实测有效

不确定用哪个时,展开包详情找到设备名字段,右键 → Apply as Filter,让 Wireshark 自动生成正确字段名。

btcommon.eir_ad.entry.device_name == "dev_001a2b3c4d"
btcommon.eir_ad.entry.local_name == "MyDevice"

8.2 包含某段字符串(模糊匹配)

Section titled “8.2 包含某段字符串(模糊匹配)”
btcommon.eir_ad.entry.device_name contains "mydevice_"

contains 区分大小写。

btcommon.eir_ad.entry.device_name matches "(?i)mydevice_"

matches 使用正则表达式,(?i) 表示忽略大小写。

8.4 正则匹配以某前缀开头的名称

Section titled “8.4 正则匹配以某前缀开头的名称”
btcommon.eir_ad.entry.device_name matches "^mydevice_"

8.5 原始字节匹配(通用兜底方案)

Section titled “8.5 原始字节匹配(通用兜底方案)”

当以上字段均报错时,直接搜索数据帧中的原始内容:

frame contains "dev_001a2b3c4d"
  • 不依赖解析器层级,任何版本和插件均可用
  • 区分大小写
  • 缺点:可能误匹配非名称字段中的同名字节序列

结合 MAC 缩小范围:

frame contains "mydevice_" && btle.advertising_address

9.1 MAC 地址 OR 名称(二选一命中即显示)

Section titled “9.1 MAC 地址 OR 名称(二选一命中即显示)”
btle.advertising_address == aa:bb:cc:dd:ee:ff || btcommon.eir_ad.entry.device_name contains "mydevice_"

9.2 只显示有名称的广播包(过滤匿名设备)

Section titled “9.2 只显示有名称的广播包(过滤匿名设备)”
btcommon.eir_ad.entry.device_name

单独写字段名表示”该字段存在”,等价于该字段不为空。


在顶部过滤栏输入表达式,按回车或点击右侧箭头应用:

  • 输入时变绿色 = 语法正确
  • 红色 = 语法错误(常见原因:使用了中文引号 "" 而非英文引号 ""

点击过滤栏右侧的书签图标Save this filter,填写名称后保存,下次可直接从下拉列表选用。

不用手写过滤器,可以直接从包内容点击生成:

  1. 在包列表点击一个广播包
  2. 展开包详情:Bluetooth Low Energy Link Layer > Advertising Data > Entry
  3. 右键点击 Device NameLE Bluetooth Device Address 的值
  4. 选择 Apply as Filter > Selected(或 Prepare as Filter 先预览)

Wireshark 会自动填入正确的过滤表达式。

菜单 Analyze → Display Filter Expression

  • 搜索 btcommon 可列出所有蓝牙相关字段
  • 可视化选择字段、操作符和值,适合不熟悉字段名时使用

10.5 把 MAC / 名称设为列(方便一览)

Section titled “10.5 把 MAC / 名称设为列(方便一览)”

默认列表不显示 MAC 地址和设备名,可以添加为列:

  1. 点击任意一个广播包
  2. 展开详情找到 Advertising AddressDevice Name
  3. 右键 > Apply as Column

之后列表里会直接显示每条广播包对应的 MAC 和名称,无需逐条展开查看。

通过列首选项手动添加广播名称列

Section titled “通过列首选项手动添加广播名称列”

Wireshark 的列首选项列表(Edit > Preferences > Columns)中没有直接对应蓝牙广播名称的内置字段,需要使用 Custom 类型手动指定:

  1. Edit > Preferences > Columns,点击左下角 + 新增一列
  2. Title 填写 Device Name,Type 选择 Custom
  3. Fields 填写:
    btcommon.eir_ad.entry.device_name
  4. 点击 OK 保存

广播名称在包详情中的路径:

Bluetooth Low Energy
  └── Advertising Data
        ├── Complete Local Name    ← 完整广播名
        └── Shortened Local Name  ← 缩短的广播名

也可以在包详情中右键 Device Name 字段 → Apply as Column,让 Wireshark 自动完成上述操作。


十一、命令行抓包(不用 Wireshark GUI)

Section titled “十一、命令行抓包(不用 Wireshark GUI)”
nrfutil.exe ble-sniffer sniff --port COMxx --output capture.pcap

输出 pcap 文件,可用 Wireshark 离线分析,也可配合 tshark 实时过滤:

tshark -r capture.pcap -Y 'btcommon.eir_ad.entry.device_name contains "mydevice_"'

问题解决方法
Wireshark 中看不到 nRF Sniffer 接口按 F5 刷新;重新执行 ble-sniffer bootstrap
COM 端口 >= COM200设备管理器 > 端口 > 属性 > 高级,改为 <200 的端口号
没有收到任何包重新插拔 Dongle;执行 device list 确认固件已烧录
包显示异常Analyze > Enabled Protocols 确认 NORDIC_BLE 已启用
工具栏不显示View > Interface Toolbars > nRF Sniffer for Bluetooth LE
过滤栏变红(字段不存在)nRF Sniffer 环境改用 device_nameframe contains
过滤栏变红(语法错误)检查是否使用了中文引号,改为英文引号 ""

目的过滤器
所有 BLE 包btle
只看广播包btle.advertising_address
指定 MACbtle.advertising_address == aa:bb:cc:dd:ee:ff
排除指定 MACbtle.advertising_address != aa:bb:cc:dd:ee:ff
隐藏空数据包btle.length != 0
名称精确匹配(nRF Sniffer)btcommon.eir_ad.entry.device_name == "dev_001a2b3c4d"
名称精确匹配(标准)btcommon.eir_ad.entry.local_name == "MyDevice"
名称包含字符串btcommon.eir_ad.entry.device_name contains "mydevice_"
名称正则(忽略大小写)btcommon.eir_ad.entry.device_name matches "(?i)mydevice_"
只显示有名称的设备btcommon.eir_ad.entry.device_name
名称原始字节匹配(通用兜底)frame contains "dev_001a2b3c4d"
仅数据信道包(连接数据)nordic_ble.channel < 37
ATT 属性协议包btatt
SMP 安全配对包btsmp

固件目录:    %USERPROFILE%\.nrfutil\share\nrfutil-ble-sniffer\firmware\
Extcap 目录: %APPDATA%\Roaming\Wireshark\extcap\