Pular para o conteúdo
Todos os conceitos

Teclado USB numa captura

Um teclado USB manda cada tecla em 8 bytes, e uma captura do barramento USB mostra tudo o que foi digitado.

O Wireshark não captura só rede. No Linux, o módulo usbmon grava o tráfego do barramento USB, e o arquivo .pcapng resultante abre no Wireshark como qualquer captura. Um teclado é um dispositivo HID (Human Interface Device): de tempos em tempos o computador pergunta "alguma tecla?", e o teclado responde numa transferência do tipo interrupt (é daí que vem a ideia de "mapear as interrupções").

No modo mais simples (boot protocol), cada resposta tem 8 bytes:

Byte Conteúdo
0 modificadores, um bit por tecla: 01 Ctrl esq., 02 Shift esq., 04 Alt esq., 20 Shift dir.
1 reservado (sempre 0)
2 a 7 até 6 teclas apertadas ao mesmo tempo, pelo código da tabela HID

Na tabela HID, 04 é a e vai até 1d = z; 1e a 27 são 1 a 0; 28 é Enter, 2a Backspace, 2c espaço. Um relatório só de zeros é a tecla sendo solta. Para listar no terminal:

tshark -r captura.pcapng -Y 'usb.transfer_type == 0x01 && usb.endpoint_address.direction == 1 && usbhid.data' -T fields -e usbhid.data
byte 0 byte 1 bytes 2 a 7: até 6 teclas 02 modificadores 00 reservado 04 00 00 00 00 00 0 0 0 0 0 0 1 0 80 40 20 10 08 04 02 01 Shift esq. 04 tabela HID a + Shift A 00 00 00 00 00 00 00 00 = tecla solta
No relatório 02 00 04 00 00 00 00 00, o byte 0 tem o bit do Shift esquerdo ligado e o byte 2 é a tecla a; com Shift, sai A. Um relatório só de zeros é a tecla sendo solta.

Para traduzir, conte só as teclas novas em cada relatório (quem digita rápido aperta a próxima antes de soltar a anterior) e aplique o Shift. Em Python, o essencial é um dicionário: {0x04: "a", 0x05: "b", ...} e ch.upper() quando mod & 0x22. A tabela completa está na especificação HID Usage Tables (abre em nova aba), seção Keyboard/Keypad.

Aparece nestes desafios