J'essaie de faire de l'ingénierie inverse sur un dispositif usb (HID) et je n'arrive pas vraiment à comprendre comment ce que je vois sur wireshark (usbmon + wireshark sur linux, ou Windows) se rapporte au protocole usb . J'ai examiné le protocole usb sur www.usb.org.
Que montre Wireshark ?
1)Une ligne par paquet ? (jeton, données, poignée de main)
2)Une ligne par transaction ? (jeton + [données] + poignée de main) (à mon avis)
3)Une ligne par transfert de contrôle ?
Le sens de la transaction est également très étrange (vers/depuis les champs). En tout cas, cela ne correspond pas à mes attentes :-) ... Et la partie données de l'énumération, du rapport caché, etc... semble parfois s'afficher avec les données de configuration (8 octets) et parfois non... Je ne sais pas vraiment ce qu'est URB... il n'y a aucune mention de cela dans le protocole usb pour autant que je puisse voir... Il me semble que wireshark/usbmon trace à un niveau supérieur de la pile et essaie de déduire ce qui serait sur le fil à partir de cela...
Un exemple de ce que je peux voir est donné ci-dessous, qu'est-ce qu'on peut voir ici ?
a)Je n'ai même pas pu trouver bmtype=0x20 (de la configuration, frame No=599)dans les specs.
b)Comme j'ai un périphérique HID, j'ai supposé qu'il pouvait s'agir d'une configuration de rapport/fonction (l'énumération est passée à ce stade). Je suis donc d'accord avec la direction (hôte->appareil). Mais où sont les données ? Ou bien il n'y a pas de phase de données ici ? Qu'est-ce que la trame 600 alors ?
c)qu'est-ce que le cadre 600 ? les données ?
d)qu'est-ce que la trame 601 ? un ACK d'état ?... mais alors les données et l'ACK ont la même source ?
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 ............
Il est évident que quelque chose m'échappe. Une explication générale sur la façon dont l'affichage de Wireshark est lié au protocole et, (sur cette base), la signification de la trace ci-dessus est la bienvenue !
J'ai initialement posté cette question sur Stack Overflow, mais on m'a dit que ce n'était pas directement une question de programmation. J'espère qu'elle trouvera mieux sa place ici.