尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Windows蓝牙抓包实战:BTVS与Wireshark协同抓取HCI数据包

Windows蓝牙抓包实战:BTVS与Wireshark协同抓取HCI数据包 1. 为什么要在 Windows 上抓蓝牙数据包蓝牙抓包这件事说简单也简单说麻烦也是真麻烦。有线网络抓包你插上网线、打开 Wireshark 选个网卡就能干活但蓝牙不一样——它走的是 2.4GHz 射频数据在空中飞你没法像抓以太网帧那样直接截下来。所以想在 Windows 上把蓝牙数据抓明白得靠一套专门的组合拳BTVSBluetooth Virtual Sniffer Wireshark。BTVS 是 Wireshark 官方生态里的蓝牙抓包组件全称 Bluetooth Virtual Sniffer它本身不是一个独立抓包软件而是一个虚拟嗅探器驱动层。它的作用是让 Wireshark 能够通过一个虚拟接口去接收来自蓝牙协议栈的 HCIHost Controller Interface数据。简单说BTVS 负责接数据Wireshark 负责看数据。这套方案能解决什么问题举几个我实际遇到的场景蓝牙耳机连上电脑后频繁断连想看看是链路层超时还是配对参数有问题自己开发的 BLE 设备比如基于 HC-05、ESP32 的模块和 Windows 通信异常需要确认 GATT 特征值读写到底有没有发出去蓝牙键盘、鼠标的 HID 报告描述符解析不对想抓原始 HCI 包对照协议规范做蓝牙 A2DP 音频调试想观察 AVDTP 信令流程和 SCO/eSCO 链路的建立过程这些场景下光靠设备端的日志往往看不全因为很多问题出在协议栈交互层面只有把空中的 HCI 包完整抓下来才能定位到根因。适合谁来参考这篇内容如果你是有一定网络基础、做过 Wireshark 抓包、现在想切入蓝牙协议分析的开发者或测试工程师那这篇就是给你写的。完全没接触过抓包的新手也能跟着走但需要你对协议分层这个概念有个基本认知——蓝牙协议栈从下到上大致是物理层、链路层、L2CAP、RFCOMM/SDP/ATT/GATT、应用层抓包抓的主要是 HCI 这一层往上的数据。需要提前说明的是BTVS 这套方案抓的是本机蓝牙协议栈和控制器之间的 HCI 数据不是空中射频抓包。如果你想抓的是两台设备之间空中的蓝牙通信比如手机和耳机之间的那需要专门的蓝牙嗅探硬件BTVS 做不到。这一点很多人一开始会搞混我在后面会详细解释两者的区别。2. 环境准备与工具选型2.1 软件清单与版本选择先把要用的东西列清楚避免装到一半发现缺东西。工具作用推荐版本备注Wireshark协议分析主界面4.2.x 或更高安装时务必勾选 BTVS 组件BTVS蓝牙虚拟嗅探驱动随 Wireshark 一起安装独立安装包也可单独下载Visual Studio Redistributable运行库依赖2015-2022 x64部分系统缺失会导致 BTVS 启动失败蓝牙适配器驱动提供 HCI 接口厂商官方驱动建议用原厂驱动别用系统自带通用驱动Wireshark 的安装包在官网直接下载即可安装过程中有一个关键步骤在组件选择界面一定要把 Bluetooth Virtual Sniffer (BTVS) 勾上。默认安装有时候不勾这个装完你会发现 Wireshark 的捕获接口列表里根本没有蓝牙相关的虚拟接口白折腾半天。提示如果你已经装过 Wireshark 但没勾 BTVS不用卸载重装重新运行安装包选择 Modify 把 BTVS 组件补上就行。2.2 蓝牙适配器的选择与驱动确认这一步是整套方案能不能跑通的关键也是最容易踩坑的地方。BTVS 要能工作前提是你的蓝牙适配器驱动暴露了 HCI 接口并且这个接口能被 BTVS 识别。市面上很多蓝牙适配器用的是 Windows 自带的通用蓝牙驱动Microsoft Bluetooth Driver这种驱动虽然日常用没问题但它对 HCI 层的暴露不完整BTVS 经常抓不到数据或者只能抓到部分。我的经验是优先选带原厂驱动的蓝牙适配器。比如一些采用 CSR 芯片的方案装了原厂驱动后会额外提供一个 HCI 接口BTVS 就能正常挂上去。判断方法很简单装好驱动后打开设备管理器看蓝牙设备下面有没有多出一个类似 Bluetooth HCI 或者厂商自定义的接口设备。怎么确认你的适配器能不能用可以这样测试打开 Wireshark点 捕获 菜单下的 选项在接口列表里找有没有名字带 Bluetooth 或 BTVS 的虚拟接口如果有说明 BTVS 已经识别到了如果没有大概率是驱动问题如果列表里空空如也先别急着换适配器试试这几步更新蓝牙驱动到最新版、重启 BTVS 服务在服务管理器里找 Bluetooth Virtual Sniffer 相关服务、以管理员身份运行 Wireshark。2.3 系统层面的准备工作Windows 上跑 BTVS 有几个系统设置需要注意关闭蓝牙省电模式在设备管理器里找到蓝牙适配器右键属性电源管理选项卡把允许计算机关闭此设备以节约电源的勾去掉。这个设置不关抓包过程中适配器可能被系统挂起导致数据中断。确认蓝牙服务正常运行services.msc 里检查 Bluetooth Support Service 和 Bluetooth Handsfree Service 是否在运行。管理员权限BTVS 需要访问底层驱动接口Wireshark 必须以管理员身份运行否则接口列表里看不到蓝牙虚拟接口。这些准备工作看着琐碎但少做一步后面就可能卡住。我见过太多人卡在接口列表里没有蓝牙这一步最后发现就是没以管理员身份运行。3. BTVS 与 Wireshark 的协同工作原理3.1 蓝牙协议栈分层与抓包位置要理解 BTVS 抓的是什么得先搞清楚蓝牙协议栈的分层结构。从下往上大致是这样物理层PHY负责射频信号的调制解调2.4GHz 频段链路层Link Layer负责链路建立、跳频、纠错HCI 层Host 和 Controller 之间的接口层这是关键L2CAP 层逻辑链路控制和适配负责多路复用上层协议RFCOMM串口仿真、SDP服务发现、ATT/GATT低功耗属性协议、AVDTP音频分发等BTVS 抓的是HCI 层的数据。HCI 是主机Host也就是 Windows 蓝牙协议栈和控制器Controller蓝牙芯片之间的通信接口。所有上层协议的数据最终都要经过 HCI 层封装成 HCI 包再交给控制器发出去。所以抓 HCI 层等于抓到了所有上层协议的总入口。这就像你在公司前台装了个摄像头所有进出公司的人都要经过前台你就能看到所有人的进出记录。HCI 层就是这个前台。3.2 BTVS 的工作机制BTVS 全称 Bluetooth Virtual Sniffer它的本质是一个虚拟嗅探驱动。它做的事情是在系统里注册一个虚拟的蓝牙嗅探接口通过这个接口从蓝牙协议栈的 HCI 层旁路复制一份数据把复制到的 HCI 数据以特定格式通常是 btsnoop 格式提供给 Wireshark注意旁路复制这个词——BTVS 不会干扰正常的蓝牙通信它只是把流经 HCI 层的数据复制一份出来。所以你可以一边正常用蓝牙耳机听歌一边抓包互不影响。Wireshark 这边通过 BTVS 提供的虚拟接口接收数据然后用内置的蓝牙协议解析器dissector把 HCI 包逐层解析出来展示成人类可读的协议树。3.3 与空中射频抓包的区别这里必须澄清一个常见误区。很多人以为 BTVS 能抓空中的蓝牙数据其实不是。BTVS 抓的是本机 HCI 数据只能看到本机蓝牙协议栈和控制器之间的交互看不到其他设备之间的通信空中射频抓包需要专用硬件比如一些支持蓝牙嗅探的专用适配器能捕获 2.4GHz 频段的射频信号解析出空中的蓝牙包举个例子你想抓手机和蓝牙耳机之间的通信BTVS 做不到因为手机和耳机都不在你的电脑上。但如果你想抓你的电脑和蓝牙耳机之间的通信BTVS 就能抓到——因为通信的一端是你的电脑数据会经过你电脑的 HCI 层。这个区别决定了 BTVS 的适用边界。做本机蓝牙设备调试、协议栈问题排查BTVS 够用做空中协议分析、多设备交互研究得上专用硬件。4. 完整实操流程从安装到抓取第一个包4.1 Wireshark 与 BTVS 的安装配置假设你从零开始完整走一遍安装流程。第一步去 Wireshark 官网下载 Windows 安装包。选 64 位版本除非你的系统是 32 位的现在很少见了。第二步运行安装包一路 Next 到组件选择界面。这个界面有几个关键勾选项Wireshark GUI主程序必装TShark命令行版建议装后面做批量分析有用Bluetooth Virtual Sniffer (BTVS)核心组件必装USBPcapUSB 抓包组件可选但做 USB 蓝牙适配器调试时有用第三步安装路径建议用默认的避免中文路径导致某些组件加载异常。第四步安装完成后重启电脑。这一步别省BTVS 是驱动级组件不重启可能加载不完整。第五步验证安装。以管理员身份打开 Wireshark点捕获→选项看接口列表里有没有蓝牙相关的虚拟接口。有的话安装就成功了。4.2 蓝牙适配器驱动配置与接口确认如果接口列表里没有蓝牙接口按这个顺序排查确认适配器驱动设备管理器里看蓝牙适配器的驱动提供商。如果是 Microsoft说明用的是通用驱动BTVS 可能识别不了。去适配器厂商官网下载原厂驱动装上。检查 BTVS 服务services.msc 里找 Bluetooth Virtual Sniffer 服务确认状态是正在运行。如果是停止状态手动启动并设置为自动启动。重新扫描接口Wireshark 里点捕获→刷新接口列表或者重启 Wireshark。权限确认确保 Wireshark 是以管理员身份运行的。我实测下来最常见的失败原因就是驱动问题。通用驱动虽然能让蓝牙正常工作但对 HCI 层的暴露不完整BTVS 抓不到数据。换成原厂驱动后问题基本都能解决。4.3 开始抓包第一个 HCI 包的捕获环境配好后抓包本身反而简单了。步骤如下以管理员身份打开 Wireshark在接口列表里选中蓝牙虚拟接口名字通常带 Bluetooth 或 BTVS点击左上角的蓝色鲨鱼鳍图标开始捕获此时让蓝牙设备产生一些活动比如连接一个蓝牙耳机、用蓝牙键盘敲几个键观察 Wireshark 主界面应该能看到 HCI 包不断刷出来如果抓到了包你会看到类似这样的结构Frame 1: 64 bytes on wire HCI_H4: Packet type: HCI Event (0x04) HCI Event: Command Complete ...HCI 包的类型主要有几种HCI Command (0x01)主机发给控制器的命令HCI ACL Data (0x02)异步无连接数据承载上层协议HCI SCO Data (0x03)同步连接数据主要用于语音HCI Event (0x04)控制器发给主机的事件通知抓包时你会看到这几种包交替出现构成完整的蓝牙通信流程。4.4 抓包过滤器的设置技巧抓到的包一多界面就乱了。这时候需要过滤器来聚焦。Wireshark 的过滤器分两种捕获过滤器抓包前设置减少抓到的数据量和显示过滤器抓包后设置只显示符合条件的包。蓝牙抓包常用的显示过滤器过滤器作用btatt只显示 ATT/GATT 协议包bthci_cmd只显示 HCI 命令bthci_evt只显示 HCI 事件btrfcomm只显示 RFCOMM 协议包btsdp只显示 SDP 协议包btl2cap只显示 L2CAP 协议包bthci_acl只显示 ACL 数据包比如你想看 BLE 设备的属性读写用btatt过滤界面立刻就清爽了。想追踪配对流程用bthci_evt看事件序列。捕获过滤器这边BTVS 接口支持的过滤选项相对有限一般不建议在捕获阶段过滤因为蓝牙包本身数据量不大先全抓下来再用显示过滤器筛选更灵活。注意蓝牙抓包的数据量可能比你想象的大。一个蓝牙耳机连接过程可能产生几百个包音频传输时每秒上千个包。长时间抓包记得设置环形缓冲区避免把内存吃满。5. 典型抓包场景与协议解析实战5.1 BLE 设备连接与 GATT 读写分析这是最常见的场景之一。假设你在开发一个 BLE 设备用 Windows 去连接它想确认 GATT 特征值的读写流程是否正确。抓包后用btatt过滤器筛选你会看到这样的流程ATT_OP_READ_BY_GROUP_TYPE_REQ客户端请求读取服务列表ATT_OP_READ_BY_GROUP_TYPE_RSP服务端返回服务ATT_OP_READ_BY_TYPE_REQ请求读取特征值ATT_OP_READ_BY_TYPE_RSP返回特征值ATT_OP_WRITE_REQ写请求ATT_OP_WRITE_RSP写响应在 Wireshark 里展开每个包能看到具体的 Handle、UUID、Value。比如写请求里能看到你写入的数据读响应里能看到设备返回的数据。我调试 ESP32 BLE 设备时就是靠这个确认了特征值的 UUID 配置是否正确。有一次设备死活连不上抓包发现是服务端返回的 UUID 和客户端请求的对不上改一下固件就好了。这种问题光看代码是看不出来的必须抓包。5.2 蓝牙音频 A2DP 与 SCO 链路观察做蓝牙音频调试时关注的是 AVDTP 信令和 SCO/eSCO 链路。A2DP 音频流的建立流程大致是AVDTP Discover发现对端支持的流端点AVDTP Get Capabilities获取流端点能力AVDTP Set Configuration配置音频编码参数SBC、AAC 等AVDTP Open打开流AVDTP Start开始传输用btavdtp过滤器能看到这些信令包。展开后能看到编码格式、采样率、声道数等参数。SCO 链路主要用于通话场景。当蓝牙耳机从音乐模式A2DP切换到通话模式HFP时会建立 SCO 链路。抓包时能看到 HCI_SCO_Data 类型的包出现以及相关的 HCI 命令和事件。这个切换过程经常出问题比如切换后没声音、切换延迟大。抓包能帮你确认是信令没发出去还是链路建立失败还是音频数据没传过来。5.3 蓝牙键盘 HID 报告解析蓝牙键盘、鼠标走的是 HID over GATTBLE或 HID over RFCOMM经典蓝牙。抓包后能看到 HID 报告描述符和报告数据。用bthid过滤器筛选能看到HID Report Descriptor描述设备支持哪些报告HID Report实际的按键、鼠标移动数据展开 HID Report能看到具体的按键码。比如你按了 A 键报告里会有一个字节的值对应 A 的键码。这个在调试自定义 HID 设备时特别有用能确认设备发出的报告格式是否符合预期。5.4 配对与绑定流程的完整追踪蓝牙配对是个多步骤流程涉及大量 HCI 命令和事件。抓包后能看到完整的配对序列HCI_Inquiry设备发现HCI_Create_Connection建立连接HCI_Authentication_Requested请求认证HCI_Link_Key_Request/Reply链路密钥交换HCI_PIN_Code_Request/ReplyPIN 码交换传统配对HCI_IO_Capability_Request/ReplyIO 能力交换安全简单配对用bthci_evt和bthci_cmd过滤器交替看能追踪整个配对流程。如果配对失败抓包能告诉你卡在哪一步——是密钥交换失败还是认证超时还是用户确认环节出了问题。6. 常见问题与排查技巧实录6.1 接口列表里找不到蓝牙虚拟接口这是最高频的问题。排查顺序确认 BTVS 已安装控制面板→程序和功能看 Wireshark 安装项里有没有 BTVS 组件确认以管理员身份运行右键 Wireshark 图标选以管理员身份运行确认 BTVS 服务在运行services.msc 里检查确认蓝牙适配器驱动设备管理器里看驱动提供商重启电脑驱动级组件有时候需要重启才能生效如果以上都做了还是没有大概率是适配器驱动不兼容。换一个带原厂驱动的适配器试试。6.2 抓到的包不完整或时断时续可能的原因蓝牙适配器省电模式去设备管理器关掉省电选项USB 接口供电不足换一个 USB 口最好直连主板后置接口驱动不稳定更新到最新版驱动系统负载过高关闭其他占用蓝牙的程序6.3 Wireshark 解析蓝牙包显示为Malformed或无法解析这种情况通常是协议解析器的问题Wireshark 版本过旧升级到最新版蓝牙解析器一直在更新包本身不完整抓包过程中数据丢失导致包结构不完整非标准协议设备用了私有协议Wireshark 不认识可以尝试在 Wireshark 里右键包选 Decode As手动指定协议解析器。6.4 抓包时蓝牙设备频繁断连抓包本身不应该影响蓝牙通信但如果出现断连可能是BTVS 驱动和蓝牙驱动冲突尝试更新其中一个资源占用过高抓包会占用一定 CPU 和内存低配机器可能扛不住适配器过热长时间抓包适配器可能过热降频6.5 常见问题速查表问题现象可能原因解决方法接口列表无蓝牙接口BTVS 未装/未以管理员运行/驱动不兼容补装 BTVS、管理员运行、换原厂驱动抓不到包适配器省电/驱动问题关省电、更新驱动包不完整数据丢失/缓冲区满设环形缓冲区、减少抓包量解析失败版本旧/私有协议升级 Wireshark、Decode As设备断连驱动冲突/资源不足更新驱动、降低负载6.6 几个我踩过的坑坑一以为 BTVS 能抓空中包。刚开始做蓝牙抓包时我想抓手机和耳机之间的通信折腾半天发现 BTVS 根本抓不到。后来才明白 BTVS 只能抓本机 HCI 数据。这个认知偏差浪费了我不少时间。坑二用通用驱动。Windows 自带的蓝牙驱动日常用没问题但 BTVS 识别不了。换成适配器厂商的原厂驱动后接口立刻就出来了。坑三忘了关省电模式。抓包抓到一半数据断了排查半天发现是适配器被系统挂起了。关掉省电模式后再没出现过。坑四抓包时间太长导致内存爆掉。蓝牙音频传输时数据量很大我开着抓包去吃饭回来发现 Wireshark 卡死了。后来学会了设置环形缓冲区限制抓包文件大小。7. 进阶技巧与效率提升7.1 用 TShark 做命令行抓包与批量分析Wireshark 图形界面适合交互式分析但如果你要批量处理或者自动化TShark 更方便。抓包到文件tshark -i Bluetooth -w bluetooth_capture.pcapng读取文件并过滤tshark -r bluetooth_capture.pcapng -Y btatt -V统计 HCI 命令分布tshark -r bluetooth_capture.pcapng -Y bthci_cmd -T fields -e bthci_cmd.opcode | sort | uniq -c | sort -rn这些命令在批量分析时特别有用比如你想统计一次抓包里各类 HCI 命令的数量分布命令行几秒钟就出结果。7.2 抓包文件的保存与分享抓包文件默认保存为 pcapng 格式这个格式兼容性好Wireshark 各版本都能打开。如果要分享给同事分析注意几点文件可能很大长时间抓包的文件可能几百 MB分享前先过滤精简可能含敏感信息蓝牙包里的设备地址、名称等信息分享前确认是否需要脱敏附上抓包说明告诉对方抓包时的场景、操作步骤方便对方理解7.3 结合设备端日志做交叉验证抓包只是手段定位问题往往需要结合设备端日志。比如你抓包发现某个 ATT 写请求发出去了但没收到响应这时候去看设备端日志确认设备有没有收到这个请求、处理时有没有报错。两边对照问题定位就快了。我调试 BLE 设备时习惯一边开着 Wireshark 抓包一边开着设备端的串口日志。抓包看协议层日志看应用层两边一对照大部分问题都能快速定位。7.4 蓝牙抓包的边界与替代方案最后说清楚 BTVS 方案的边界避免你在不合适的场景浪费时间只能抓本机 HCI 数据抓不了其他设备之间的通信抓不了空中射频细节比如跳频序列、射频功率等对适配器有要求不是所有适配器都能用如果你的需求超出了 BTVS 的能力范围考虑这些替代方案专用蓝牙嗅探硬件能抓空中射频包但价格较高设备端日志很多蓝牙芯片支持输出 HCI 日志通过串口或 USB 读取协议分析仪专业设备功能强大但成本高选方案的原则很简单先明确你要抓什么、在哪抓、抓到后要分析什么再选对应的工具。BTVS 适合本机蓝牙调试这个定位搞清楚就不会走弯路了。我在实际项目里BTVS 配合 Wireshark 这套组合用了两三年覆盖了大部分本机蓝牙调试需求。它的优势是免费、集成度高、和 Wireshark 无缝配合劣势是对适配器有要求、抓不了空中包。把它的能力边界摸清楚用起来就很顺手了。
返回列表