使用 usbpcap/wireshark 通过 GATT 流量解码捕获的 HID

Posted

技术标签:

【中文标题】使用 usbpcap/wireshark 通过 GATT 流量解码捕获的 HID【英文标题】:decoding captured HID over GATT traffic with usbpcap/wireshark 【发布时间】:2017-08-03 08:01:58 【问题描述】:

我正在尝试对使用 USB HID over GATT 与主机通信的 BLE 设备进行逆向工程。我可以使用 usbpcap 捕获流量,但是当将结果加载到 Wireshark 时,数据包似乎包含表示通过无线传输的数据的字节(即设备描述符),但数据包没有根据 USBHID 协议解码。一切都被解码为 USB,并且只包含 URB_INTERRUPT_IN、URB_BULK 输入/输出和 URB_CONTROL_OUT,而我正在寻找诸如 GET DESCRIPTOR 请求/响应设备之类的东西。我可以采取额外的步骤来正确格式化和解析数据包吗?

【问题讨论】:

【参考方案1】:

有几个特性在使用。您有一个包含报表地图的特征。这通常只在设备配对时读取一次。此地图包含稍后通过报告通知发送的数据的布局/规范。这主要是将 USB 规范中的规范“复制粘贴”到 BLE 中。

现在,当您运行 HID-over-GATT 并且您的蓝牙控制器通过 USB 与主机通信时,您将在 usbpcap 中看到包含 L2CAP 数据的 ACL 数据,其中包含 GATT 数据,而后者又包含报告HID 的数据。然后主机上的蓝牙堆栈将对此进行解码并将其输入内核的 HID 解析器。

我建议您改为将 HID-over-GATT 设备连接到 android 手机,然后查看 HCI 窥探日志会发生什么,这可以在 Wireshark 中解码(但它不会解析您的 HID 数据) .

【讨论】:

是的,我认为 BLE 堆栈将描述符切成小块。我最终成功地通过在配对序列期间使用 USBPCAP 嗅探数据包来获取描述符,然后搜索字节序列 05:01:09(大多数描述符都是这样开始的),标记它,然后搜索 c0:c0:c0(许多描述符以其中一个或多个结尾),标记,导出相同源之间的字节,剥离数据包之间的公共头字节,然后合并其余部分。尝试了几次,但效果很好!

以上是关于使用 usbpcap/wireshark 通过 GATT 流量解码捕获的 HID的主要内容,如果未能解决你的问题,请参考以下文章

linux vscode通过cmake或g++调试程序

CMake通过工具链升级进行增量编译

通过ipv6访问 g o o g l e

是否可以通过#define 将 g++ 设置为遵循 C++11 ISO (-std=c++11)?

如何通过Eclipse将'-pthread'选项添加到g ++?

除了使用纯虚拟外,如何通过基类从派生类中获取成员