2017-06-02 78 views
0

我試圖破譯由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設備發送的數據?

感謝

回答

0

我寫了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結構描述的有效載荷。

希望這會有所幫助。