2017-06-02 20 views
0

バスに送られたHID USBディスクリプタとUSBフレームを結びつけるためにどのように使用し一緒に実際に私は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コントロールレスポンスメッセージがかなりたくさん表示されます。これには、必要なデータが含まれている可能性がありますが、どのメッセージにどの情報が不明であるかが含まれています。

USB HIDデバイスから送信されたデータをリバースエンジニアリングして解析する方法はありますか?

おかげ

答えて

0

は、私は私がHIDレポート記述子をデコードし、各レポートを記述するためにC言語の構造体の定義を作成するのに役立つようにしばらく前bit of codeを書きました。私は何だろうと、次のとおりです。

  • "usb.request_in" にWiresharkの
  • フィルタを使用してUSBデータを取り込む「HID右クリックして "GET DESCRIPTORレスポンスHIDレポート" パケット
  • を選択「コピー」と「ヘックスストリームとして...」を選択してください。

デコードソフトウェアを実行し、 "-c"オプションの後に16進ストリームを貼り付けてください。たとえば、次のようになります。

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構造のうちの1つによって記述されたペイロードを含むべきである。

これが役に立ちます。

関連する問題