【问题标题】:How to tie together an HID USB descriptor and the USB frames actually sent on the bus如何将 HID USB 描述符与总线上实际发送的 USB 帧联系在一起
【发布时间】:2022-02-12 11:43:54
【问题描述】:

我正在尝试破译 HID 设备(准确地说是伊顿电源)在 USB 总线上发送的数据

使用 Wireshark,我可以捕获 USB 流量。连接设备后,我可以看到正在发送的 HID 描述符。我可以解析它,感谢外部引用(http://networkupstools.org/protocols/mge/NUT_MGE_USB_Devices_Draft_AA.pdfhttp://www.usb.org/developers/docs/devclass_docs/pdcv10.pdf),我得到了一些关于描述符不同字段的信息。

但是,我似乎无法将描述符链接到我使用 Wireshark 实际捕获的帧内的数据:我无法真正找出与描述符相关的消息中的任何明确的标题或模式。 在这种情况下,我看到一大堆 URB Control Response 消息,其中可能包含我想要的数据,但哪个消息包含哪些信息不清楚。

有没有人有某种方法来逆向工程和解析 USB HID 设备发送的数据?

谢谢

【问题讨论】:

    标签: usb wireshark hid


    【解决方案1】:

    不久前我写了一个bit of code 来帮助我解码 HID 报告描述符并创建 C 语言结构定义来描述每个报告。我会做的是:

    • 使用 Wireshark 捕获 USB 数据
    • 过滤“usb.request_in”
    • 选择“GET DESCRIPTOR Response HID Report”数据包
    • 右键单击“HID 报告”并选择“复制”和“...作为十六进制流”

    现在运行解码软件并将十六进制流粘贴到“-c”选项之后。例如:

    rexx rd.rex -c 05010906a101854b050719e029e7250175019508810275089501810326ff0019002aff0081007501950305081901290325019102750595019103c005010902a1010901a100854d09301581257f750895018106c0c0
    

    默认情况下,它将打印 C 结构(见下文)。如果您还想解码 HID 报告描述符,请使用“-d”选项。

    //--------------------------------------------------------------------------------
    // Keyboard/Keypad Page inputReport 4B (Device --> Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
      uint8_t  reportId;                                 // Report ID = 0x4B (75) 'K'
                                                         // Collection: Keyboard
      uint8_t  KB_KeyboardKeyboardLeftControl : 1;       // Usage 0x000700E0: Keyboard Left Control, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardLeftShift : 1;         // Usage 0x000700E1: Keyboard Left Shift, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardLeftAlt : 1;           // Usage 0x000700E2: Keyboard Left Alt, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardLeftGui : 1;           // Usage 0x000700E3: Keyboard Left GUI, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardRightControl : 1;      // Usage 0x000700E4: Keyboard Right Control, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardRightShift : 1;        // Usage 0x000700E5: Keyboard Right Shift, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardRightAlt : 1;          // Usage 0x000700E6: Keyboard Right Alt, Value = 0 to 1
      uint8_t  KB_KeyboardKeyboardRightGui : 1;          // Usage 0x000700E7: Keyboard Right GUI, Value = 0 to 1
      uint8_t  pad_2;                                    // Pad
      uint8_t  KB_Keyboard;                              // Value = 0 to 255
    } inputReport4B_t;
    
    
    //--------------------------------------------------------------------------------
    // LED Indicator Page outputReport 4B (Device <-- Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
      uint8_t  reportId;                                 // Report ID = 0x4B (75) 'K'
                                                         // Collection: Keyboard
      uint8_t  LED_KeyboardNumLock : 1;                  // Usage 0x00080001: Num Lock, Value = 0 to 1
      uint8_t  LED_KeyboardCapsLock : 1;                 // Usage 0x00080002: Caps Lock, Value = 0 to 1
      uint8_t  LED_KeyboardScrollLock : 1;               // Usage 0x00080003: Scroll Lock, Value = 0 to 1
      uint8_t  : 5;                                      // Pad
    } outputReport4B_t;
    
    
    //--------------------------------------------------------------------------------
    // Generic Desktop Page inputReport 4D (Device --> Host)
    //--------------------------------------------------------------------------------
    
    typedef struct
    {
      uint8_t  reportId;                                 // Report ID = 0x4D (77) 'M'
                                                         // Collection: Mouse Pointer
      int8_t   GD_MousePointerX;                         // Usage 0x00010030: X, Value = -127 to 127
    } inputReport4D_t;
    

    现在您已经清楚地了解了可能正在流动的报告,您可以返回到 Wireshark 跟踪(仍然在“usb.request_in”上过滤)并选择“URB_INTERRUPT in”数据包。 “剩余捕获数据”应包含 C 结构之一所描述的有效负载。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 2012-11-08
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2014-06-24
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多