Estoy tratando de realizar ingeniería inversa en un dispositivo usb (HID) y realmente no puedo entender cómo lo que veo en wireshark (usbmon + wireshark en linux o windows) se relaciona con el protocolo usb. He mirado el protocolo usb de www.usb.org.
¿Qué muestra wireshark?
1) ¿Una línea por paquete? (token, datos, apretón de manos)
2) ¿Una línea por transacción? (ficha + [datos] + apretón de manos) (supongo)
3) ¿Una línea por transferencia de control?
La dirección de la transacción también es muy extraña (hacia / desde los campos). Al menos, no coincide con mis expectativas :-) ... Y la parte de datos de la enumeración, el informe oculto, etc. ... a veces parece mostrarse con los datos de configuración (8 bytes) y en ocasiones no ... No Realmente no sé qué es URB ... no hay mención de eso en el protocolo usb por lo que pude ver ... Me parece que cableshark / usbmon rastrean en un nivel de pila más alto e intenta deducir lo que sería en el cable de eso ...
Un ejemplo de lo que puedo ver se da a continuación, ¿qué vemos aquí?
a) Ni siquiera pude encontrar bmtype = 0x20 (de la configuración, frame No = 599) en las especificaciones.
b) Debido a que tengo un dispositivo HID, supuse que podría ser una configuración de informe / función (la enumeración se pasa en esta etapa). Entonces podría estar de acuerdo con la dirección (host-> dispositivo). ¿Pero dónde están los datos? ¿O no hay fase de datos aquí? ¿Qué es el cuadro 600 entonces?
c) ¿Qué es el marco 600? ¿los datos?
d) ¿Qué es el cuadro 601? un estado ACK? ... pero entonces los datos y ACK tienen la misma fuente?
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 ............
Obviamente me estoy perdiendo algo. ¡Una explicación general sobre cómo la pantalla de Wirehark se relaciona con el protocolo y, (basado en él), el significado de la traza anterior es bienvenida!
Originalmente publiqué esto en Stack Overflow, pero me dijeron que no era directamente una pregunta de programación. Espero que encaje mejor aquí.
Los registros USB de WireShark se realizan a nivel del sistema operativo. Con Linux se basa en los datos que genera usbmon, que se basa en la estructura interna URB de Linux que se describe aquí . Entonces, mirar los comentarios y documentos de kernel y WireShark proporciona la mejor idea de lo que es.
Lo que he encontrado en los documentos del kernel es que los paquetes son estructuras usbmon seguidas de los datos enviados y recibidos. Esta es la estructura (copiada de aquí ):
fuente