Usiłuję dokonać inżynierii wstecznej urządzenia USB (HID) i nie mogę naprawdę zrozumieć, jak to, co widzę w wireshark (usbmon + wireshark w systemie Linux lub Windows) odnosi się do protokołu USB ?. Przejrzałem protokół USB z www.usb.org.
Co pokazuje Wireshark?
1) Jedna linia na pakiet? (token, dane, uścisk dłoni)
2) Jedna linia na transakcję? (token + [dane] + handshake) (moje przypuszczenie)
3) Jedna linia na transfer kontrolny?
Kierunek transakcji jest również bardzo dziwny (do / z pól). Przynajmniej nie spełnia moich oczekiwań :-) ... A część danych wyliczenia, ukryty raport itp ... wydaje się czasem wyświetlać dane konfiguracji (8 bajtów), a czasem nie ... tak naprawdę nie wiem, czym jest URB ... nie ma wzmianki o tym w protokole USB, o ile mogłem zobaczyć ... Wygląda mi na to, że śledzenie wireshark / usbmon na wyższym poziomie stosu i próbuje wydedukować, co by było z drutu z tego ...
Przykład tego, co widzę, znajduje się poniżej, co widzimy tutaj ?.
a) Nie mogłem nawet znaleźć bmtype = 0x20 (ustawienia, ramka nr = 599) w specyfikacjach.
b) Ponieważ mam urządzenie HID, założyłem, że może to być konfiguracja raportu / funkcji (wyliczenie jest przekazywane na tym etapie). Mogę więc zgodzić się z kierunkiem (host-> urządzenie). ale gdzie są dane? Czy nie ma tutaj fazy danych? Co to jest ramka 600?
c) co to jest ramka 600? dane?
d) co to jest ramka 601? status ACK? ... ale czy dane i ACK mają to samo źródło?
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 ............
Oczywiście czegoś mi brakuje. Ogólne wyjaśnienie, w jaki sposób ekran Wireshark odnosi się do protokołu i (na jego podstawie) znaczenie powyższego śladu jest mile widziane!
Oryginalnie opublikowałem to na Stack Overflow, ale powiedziano mi, że nie było to bezpośrednio pytanie programistyczne. Mam nadzieję, że lepiej tutaj pasuje.
Dzienniki USB WireShark są wykonywane na poziomie systemu operacyjnego. W Linuksie jest on oparty na danych generowanych przez usbmon, który jest oparty na opisanej tutaj wewnętrznej strukturze URB Linuksa . Zatem przeglądanie komentarzy i dokumentów do jądra i WireShark zapewnia najlepszy wgląd w to, co to jest.
Z dokumentacji jądra dowiedziałem się, że pakiety to struktury usbmon, po których następują dane wysyłane i odbierane. Oto struktura (skopiowana stąd ):
źródło