Como posso gravar dados brutos em um dispositivo USB?

7

Estou tentando gravar dados brutos em um dispositivo USB conectado ao meu computador. Estou usando o Kali Linux e encontrei o caminho de arquivo correto: "/ dev / usb / 003/013". No entanto, quando tento gravar dados nele, recebo um erro.

root@kali:~/usb# printf "test" > /dev/bus/usb/003/013
bash: printf: write error: Invalid argument

Eu também tentei usar cat:

root@kali:~/usb# cat test > /dev/bus/usb/003/013 
cat: write error: Invalid argument

No caso anterior, o arquivo 'teste' existe e contém dados. Parece que o sistema é incapaz de escrever no descritor de arquivo, mesmo que esteja lá.

Depois de pesquisar, cheguei à conclusão de que você ou:

Precisa de um driver USB que interfira com o dispositivo.

Use uma Passagem SCSI para gravar dados diretamente nos pontos de extremidade no dispositivo.

Sou novo em programação USB e, embora seja fácil de usar, nunca escrevi um driver antes. Qualquer conselho ou ajuda seria apreciado.

É possível gravar dados brutos no dispositivo como eu tentei originalmente? Se não, você poderia explicar algumas opções disponíveis para mim?

    
por Brian Sizemore 29.06.2016 / 19:19

1 resposta

13

Os dispositivos USB são muito mais complexos do que simplesmente canos que você lê e escreve. Você terá que escrever código para manipulá-los. Você não precisa escrever um driver de kernel. Veja link (née libusb.org) e link . Isso alega trabalhar com Linux, Mac OS X, Windows, Android, OpenBSD, etc. No Mac OS X, existem funções no nível do usuário em Kit I / O que permite acessar o USB.

Aqui está um pequeno diagrama que eu desenhei uma vez para me ajudar a entender a arquitetura do USB:

                 ╭──────────────────────────────────────╮
    ┌──────┐     │   device     ┌─────┐  ┌───────────┐  │
    │ Port ├──┐  │            ┌─┤ EP0 ├──┤ control   │  │
    └──────┘  │  │ ┌────────┐ │ └─────┘  │┌─────────┐│  │
              ├────┤addr = 2├─┤ ┌─────┐  ││         ││  │
              │  │ └────────┘ ├─┤ EP1 ├──┼┤interface││  │
              │  │            │ └─────┘  ││   #0    ││  │
              │  │            │ ┌─────┐  │├─────────┤│  │
              │  │            ├─┤ EP2 ├──┼┤         ││  │
              │  │            │ └─────┘  ││interface││  │
              │  │            │ ┌─────┐  ││   #1    ││  │
              │  │            └─┤ EP2 ├──┼┤         ││  │
              │  │              └─────┘  │└─────────┘│  │
              │  │                       └───────────┘  │
              │  ╰──────────────────────────────────────╯
              │
              │
              :

Resumo executivo: cada dispositivo tem um endereço (atribuído pelo O / S e sujeito a alterações) e até (eu acho) 32 pontos de extremidade.

Dentro do dispositivo há uma ou mais "interfaces". Por exemplo, uma web cam pode fornecer uma interface de "câmera" e uma interface de "microfone". Uma impressora multifuncional forneceria várias interfaces.

O endpoint 0 é usado para controlar e configurar o dispositivo, e os outros devem acessar as várias interfaces. Cada interface tem zero ou mais (geralmente mais) pontos de extremidade.

Os pontos de extremidade podem ser um dos vários tipos de transferência:

  • Transferências de controle são usadas para configurar o dispositivo. Cada dispositivo é necessário para suportar um conjunto mínimo de instruções de controle.
  • Transferências em massa enviam ou recebem dados em largura de banda total
  • Interrompe as transferências (não sei ao certo como isso é diferente das transferências em bloco; o USB não tem interrupções). Exemplos incluem teclado e mouse
  • As transferências isócronas enviam ou recebem dados em largura de banda total com requisitos em tempo real, mas sem confiabilidade. Usado para aplicativos de áudio / vídeo.

Também vale a pena notar: um dispositivo USB pode ter várias configurações, que controlam quais interfaces estão disponíveis e assim por diante.

Todas essas informações são apresentadas em descritores de dispositivos, descritores de configuração, descritores de interface, descritores de endpoint, etc., que podem ser consultados por meio do terminal zero.

Por fim, os dados não são um fluxo de bytes, são agrupados em pacotes, cujos formatos exatos fazem parte da especificação USB. A boa notícia é que o libusb ou o kit de E / S gerenciarão essa parte para você.

Mais informações: "Function" é uma coleção de interfaces que funcionam juntas. Não é originalmente parte da especificação USB, e cabe ao driver de dispositivo saber quais interfaces devem ser agrupadas. O Grupo de Trabalho USB definiu classes de dispositivos que suportam funções. Isso é feito através do Descritor de Associação de Interface (IAD).

    
por 30.06.2016 / 16:49