我正在尝试通过HID设备(确切地说是伊顿电源)解密USB总线上发送的数据
使用Wireshark,我可以捕获USB流量。连接设备后,我可以看到正在发送的HID描述符。我可以解析它,并且由于外部引用(http://networkupstools.org/protocols/mge/NUT_MGE_USB_Devices_Draft_AA.pdf和http://www.usb.org/developers/docs/devclass_docs/pdcv10.pdf),我得到了关于描述符的不同字段的一些信息。
但是,我似乎无法将描述符链接到我实际使用Wireshark捕获的帧内的数据:我无法在消息中找到任何与描述符绑定的清晰标题或模式。 在这种情况下,我看到了很多URB控制响应消息,它可能包含我想要的数据,但哪条消息包含哪些信息不清楚。
有没有人有某种方法来反向工程和解析USB HID设备发送的数据?
由于
答案 0 :(得分:0)
我前一段时间写了bit of code来帮助我解码HID报告描述符并创建C语言结构定义来描述每个报告。我会做的是:
现在运行解码软件并在“-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结构之一所描述的有效负载。
希望这有帮助。