Estou tentando fazer engenharia reversa de um dispositivo usb (HID) e não consigo descobrir como o que vejo no wireshark (usbmon + wireshark no linux ou windows) se relaciona com o protocolo usb ?. Eu olhei para o protocolo usb em www.usb.org.
O que mostra o wireshark?
1) Uma linha por pacote? (token, dados, aperto de mão)
2) Uma linha por transação? (token + [dados] + aperto de mão) (meu palpite)
3) Uma linha por transferência de controle?
A direção da transação também é muito estranha (para / de campos). Pelo menos, não corresponde às minhas expectativas :-) ... E a parte dos dados da enumeração, relatório oculto etc. ... às vezes parece ser exibida com os dados de configuração (8 bytes) e às vezes não ... realmente sei o que é URB ... não há menção disso no protocolo usb, tanto quanto pude ver ... Parece-me que o wireshark / usbmon rastreia em um nível de pilha mais alto e tenta deduzir o que seria no fio disso ...
Um exemplo do que eu posso ver é dado abaixo, o que vemos aqui?
a) Não consegui encontrar bmtype = 0x20 (da configuração, quadro No = 599) nas especificações.
b) Como eu tenho um dispositivo HID, assumi que isso poderia ser uma configuração de relatório / recurso (a enumeração é passada neste estágio). Então eu poderia concordar com a direção (host-> dispositivo). mas onde estão os dados? Ou não há fase de dados aqui? O que é o quadro 600 então?
c) qual é o quadro 600? os dados?
d) qual é o quadro 601? um status ACK? ... mas os dados e ACK têm a mesma fonte?
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, estou perdendo alguma coisa. Uma explicação geral sobre como a tela do wireshark se relaciona com o protocolo e (com base nele) é bem-vindo o significado do rastreamento acima!
Originalmente, eu postei isso no Stack Overflow, mas me disseram que não era diretamente uma questão de programação. Espero que se encaixe melhor aqui.