如何将HID USB描述符和USB框架绑在一起实际上发送了



我正在尝试通过HID设备(准确地说是Eaton电源(在USB总线上解密数据

使用Wireshark,我可以捕获USB流量。连接设备时,我可以看到发送的HID描述符。我可以对它进行解析,还要感谢外部参考(http://networkupstools.org/protocols/mge/nut_mge_usb_usb_devices_draft_aa.aa.pdf and http://wwwww.usb.org.org/develicers/develicers/develicers/devevelicer我有一些有关描述符不同字段的信息。

但是,我似乎无法将描述符链接到我实际上使用Wireshark捕获的框架内的数据:我真的无法在消息中与描述符绑定的消息中确定任何清晰的标题或图案。在这种情况下,我看到了很多URB控制响应消息,其中可能包含我想要的数据,但是哪个消息不清楚哪些信息。

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

谢谢

我稍后写了一些代码,以帮助我解码HID报告描述符并创建C语言结构定义以描述每个报告。我要做的是:

  • 使用Wireshark捕获USB数据
  • 过滤器上的" usb.request_in"
  • 选择"获取描述符响应隐藏报告"数据包
  • 右键单击"隐藏报告"并选择"复制"one_answers" ...作为十六进制流&quot"

现在运行解码软件并在" -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"上过滤"(,然后select select'urb_interrupt in;数据包。"剩余捕获数据"应包含一个C结构之一所述的有效载荷。

希望这会有所帮助。

最新更新