web-dev-qa-db-fra.com

Comment puis-je écrire des données brutes sur un périphérique USB?

J'essaie d'écrire des données brutes sur un périphérique USB connecté à mon ordinateur. J'utilise Kali Linux et j'ai trouvé le bon fichier de fichier: "/ dev/USB/003/013". Cependant, lorsque j'essaie d'écrire des données à cela, je reçois une erreur.

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

J'ai aussi essayé d'utiliser Cat:

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

Dans le cas précédent, le fichier "test" existe et a des données dedans. Il semble que le système ne soit pas incapable d'écrire sur le descripteur de fichier, même s'il est là.

Après avoir recherché, je suis arrivé à la conclusion que vous avez:

A. Besoin d'un pilote USB qui s'interface avec l'appareil.

B. Utilisez une passe SCSI pour écrire des données directement sur les points d'extrémité de l'appareil.

Je suis nouveau à la programmation USB et, bien que je puisse essayer, je n'ai jamais écrit de conducteur auparavant. Tout conseil ou aide serait apprécié.

Est-il possible d'écrire des données brutes sur l'appareil comme je l'ai essayé à l'origine? Sinon, pourriez-vous expliquer certaines options à votre disposition?

9
Brian Sizemore

Les périphériques USB sont beaucoup plus complexes que simplement des tuyaux que vous lisez et écrivez. Vous devrez écrire du code pour les manipuler. Vous n'avez pas besoin d'écrire un chauffeur de noyau. Voir http://libusb.info (née libusb.org) et http://libusb.sourceforge.net/api-1. . Cela prétend travailler avec Linux, OSX, Windows, Android, OpenBSD, etc. sous Mac OS X Il existe des fonctions de niveau utilisateur dans kit d'E/S qui vous permettra d'accéder à USB. Sous Windows, vous pourrez peut-être utiliser WinUSB, mais c'est compliqué.

Voici un petit diagramme que j'ai attiré une fois pour m'aider à comprendre l'architecture de USB:

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

Résumé: Chaque appareil a une adresse (attribuée par l'O/S et sujette au changement), et jusqu'à (je pense) 32 points de terminaison.

Dans l'appareil est une ou plusieurs "interfaces". Par exemple, une came Web peut fournir une interface "caméra" et une interface "microphone". Une imprimante multifonction fournirait plusieurs interfaces.

L'extrémité 0 est utilisé pour le contrôle et la configuration du périphérique, et les autres doivent accéder aux différentes interfaces. Chaque interface a zéro ou plus (généralement plus) points de terminaison.

Les points de terminaison peuvent être l'un des différents types de transfert:

  • Les transferts de contrôle sont utilisés pour interroger et configurer le périphérique. Chaque appareil est nécessaire pour prendre en charge un ensemble minimal de relevés de contrôle. Je crois que les transferts de contrôle ne sont utilisés que avec le point final 0.
  • Les transferts en vrac envoient ou reçoivent des données à la bande passante complète
  • Transferts interrompre (je ne suis pas vraiment sûr de savoir comment cela est différent des transferts en vrac; USB n'a pas d'interruption). Les exemples incluent le clavier et la souris
  • Les transferts isochrones envoient ou reçoivent des données à la bande passante complète avec des exigences en temps réel mais sans fiabilité. Utilisé pour les applications audio/vidéo.

Vous pouvez également noter: un périphérique USB peut avoir plusieurs configurations, qui contrôlent quelles interfaces sont disponibles et ainsi de suite. La modification d'une configuration de périphérique est presque comme la débranchement du périphérique et de brancher un autre appareil à sa place.

Toutes ces informations sont définies dans les descripteurs de périphériques, des descripteurs de configuration, des descripteurs d'interface, des descripteurs de point final, etc., qui peuvent être interrogés via le point d'extrémité zéro.

(En interne, les données ne sont pas un flux d'octets, il est emballé dans des paquets dont les formats exacts font partie de la spécification USB. Pour la plupart, vous n'avez pas besoin de vous inquiéter de cela que les contrôleurs et les pilotes géreront cette partie pour tu.)

En pratique, en fonction de votre bibliothèque d'API et de votre système d'exploitation, vous devez détecter le périphérique, lire les différents descripteurs pour déterminer ce que vous traitez, définissez éventuellement sa configuration (si le système d'exploitation le permet), ouvrez l'interface, et ouvrez les points finaux.

Pour les points d'extrémité en vrac, vous pouvez lire et écrire des données brutes. Pour les transferts de contrôle, la bibliothèque de l'API fournira des appels de fonction. Je n'ai jamais utilisé d'interruption ni de transferts isochrones; Je suis sûr que votre bibliothèque d'API aura la documentation pertinente.


Plus d'infos: "Fonction" est une collection d'interfaces qui travaillent ensemble. Ce n'est pas à l'origine partie de la spécification USB et il appartient au pilote de périphérique de savoir quelles interfaces doivent être regroupées. Le groupe de travail USB a défini des classes de périphérique qui prennent en charge les fonctions. Ceci est fait via le descripteur d'association d'interface (IAD).

16
Edward Falk