如何联系在一起的HID USB描述符和USB帧总线

如何联系在一起的HID USB描述符和USB帧总线

问题描述:

我试图破译由HID设备的USB总线上发送数据的实际发送(伊顿电源要准确)如何联系在一起的HID USB描述符和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控制响应消息,这些消息可能包含我想要的数据,但哪些消息包含哪些信息不清楚。

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

感谢

我写了bit of code而回,以帮助我解码HID报告描述符和创建C语言结构定义来描述每个报告。我会做的是:

  • 捕获使用Wireshark的
  • 过滤器上的“usb.request_in”
  • 选择“获取描述响应HID报告”数据包中的USB数据
  • 右键单击“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”包选择可能报告一个清晰的概念。 “剩余捕获数据”应该包含其中一个C结构描述的有效载荷。

希望这会有所帮助。