Я пытаюсь выполнить обратное проектирование устройства usb (HID) и не могу понять, как то, что я вижу на wireshark (usbmon + wireshark на Linux или Windows), связано с протоколом usb ?. Я посмотрел протокол USB от www.usb.org.
Что показывает wireshark?
1) Одна строка на пакет? (токен, данные, рукопожатие)
2) Одна строка на транзакцию? (жетон + [данные] + рукопожатие) (мое предположение)
3) Одна строка на контрольную передачу?
Направление транзакции также очень странное (в / из полей). По крайней мере, это не соответствует моим ожиданиям :-) ... И часть данных перечисления, скрытый отчет и т. Д. ... иногда отображается с настройками (8 байт), а иногда нет ... на самом деле не знаю, что такое URB ... в протоколе usb нет упоминаний об этом, насколько я вижу ... мне кажется, что wireshark / usbmon отслеживает на более высоком уровне стека и пытается определить, что будет на проводе от этого ...
Пример того, что я вижу, приведен ниже, что нам здесь увидеть?
а) Я не мог даже найти bmtype = 0x20 (из установки, кадр № = 599) в спецификации.
б) Поскольку у меня есть устройство HID, я предположил, что это может быть отчет / функция конфигурации (перечисление передается на данном этапе). Так что я мог согласиться с направлением (хост-> устройство). а где данные? Или здесь нет фазы данных? Что такое кадр 600?
в) что такое кадр 600? данные?
г) что такое кадр 601? ACK статуса? ... но тогда данные и ACK имеют один и тот же источник?
No. Time Source Destination Protocol Length Info
599 67.996889 host 2.0 USB 36 URB_CONTROL out
Frame 599: 36 bytes on wire (288 bits), 36 bytes captured (288 bits)
USB URB
USBPcap pseudoheader length: 28
IRP ID: 0xfffffa800a1e2610
IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
URB Function: URB_FUNCTION_CLASS_DEVICE (0x001a)
IRP information: 0x00, Direction: FDO -> PDO
URB bus id: 1
Device address: 2
Endpoint: 0x00, Direction: OUT
URB transfer type: URB_CONTROL (0x02)
Packet Data Length: 8
Control transfer stage: Setup (0)
[Response in: 601]
[bInterfaceClass: Unknown (0xffff)]
URB setup
bmRequestType: 0x20
0... .... = Direction: Host-to-device
.01. .... = Type: Class (0x01)
...0 0000 = Recipient: Device (0x00)
bRequest: 0
wValue: 0x0000
wIndex: 0
wLength: 16
0000 1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 1a 00 ...&............
0010 00 01 00 02 00 00 02 08 00 00 00 00 20 00 00 00 ............ ...
0020 00 00 10 00 ....
No. Time Source Destination Protocol Length Info
600 67.997889 2.0 host USB 44 URB_CONTROL out
Frame 600: 44 bytes on wire (352 bits), 44 bytes captured (352 bits)
USB URB
USBPcap pseudoheader length: 28
IRP ID: 0xfffffa800a1e2610
IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
URB Function: URB_FUNCTION_CONTROL_TRANSFER (0x0008)
IRP information: 0x01, Direction: PDO -> FDO
URB bus id: 1
Device address: 2
Endpoint: 0x00, Direction: OUT
URB transfer type: URB_CONTROL (0x02)
Packet Data Length: 16
Control transfer stage: Data (1)
[Request in: 599]
[Time from request: 0.001000000 seconds]
[bInterfaceClass: Unknown (0xffff)]
CONTROL response data
0000 1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 08 00 ...&............
0010 01 01 00 02 00 00 02 10 00 00 00 01 05 04 0d 56 ...............V
0020 fb 82 c0 1d 10 18 cc 02 00 00 00 01 ............
No. Time Source Destination Protocol Length Info
601 67.997889 2.0 host USB 28 GET STATUS Status
Frame 601: 28 bytes on wire (224 bits), 28 bytes captured (224 bits)
USB URB
USBPcap pseudoheader length: 28
IRP ID: 0xfffffa800a1e2610
IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
URB Function: URB_FUNCTION_CONTROL_TRANSFER (0x0008)
IRP information: 0x01, Direction: PDO -> FDO
URB bus id: 1
Device address: 2
Endpoint: 0x00, Direction: OUT
URB transfer type: URB_CONTROL (0x02)
Packet Data Length: 0
Control transfer stage: Status (2)
[Request in: 599]
[Time from request: 0.001000000 seconds]
0000 1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 08 00 ...&............
0010 01 01 00 02 00 00 02 00 00 00 00 02 ............
Очевидно, я что-то упустил. Общее объяснение того, как отображение Wireshark относится к протоколу и (на его основе), значение вышеупомянутого следа приветствуется!
Первоначально я разместил это в Stack Overflow, но мне сказали, что это не был напрямую вопрос программирования. Надеюсь, это подходит лучше здесь.
Журналы WireShark USB сделаны на уровне операционной системы. В Linux он основан на данных, которые генерирует usbmon и основан на внутренней структуре URB Linux, описанной здесь . Таким образом, просмотр комментариев и документов ядра и WireShark позволяет лучше понять, что это такое.
Из документации по ядру я обнаружил, что пакеты представляют собой структуры usbmon, за которыми следуют отправленные и полученные данные. Это структура (скопированная отсюда ):
источник