Wie kann ich Rohdaten auf ein USB-Gerät schreiben?

9

Ich versuche, Rohdaten auf ein an meinen Computer angeschlossenes USB-Gerät zu schreiben. Ich verwende Kali Linux und habe den richtigen Dateipfad gefunden: "/ dev / usb / 003/013". Wenn ich jedoch versuche, Daten darauf zu schreiben, wird eine Fehlermeldung angezeigt.

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

Ich habe auch versucht, Katze zu verwenden:

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

Im vorherigen Fall ist die Datei 'test' vorhanden und enthält Daten. Es scheint, dass das System nicht in den Dateideskriptor schreiben kann, obwohl es dort ist.

Nach Recherchen bin ich zu dem Schluss gekommen, dass Sie entweder:

A. Benötigen Sie einen USB-Treiber, der mit dem Gerät verbunden werden kann.

B. Verwenden Sie einen SCSI-Durchgang, um Daten direkt auf die Endpunkte des Geräts zu schreiben.

Ich bin neu in der USB-Programmierung und obwohl ich ein Spiel zum Ausprobieren bin, habe ich noch nie einen Treiber geschrieben. Jeder Rat oder jede Hilfe wäre dankbar.

Ist es möglich, Rohdaten wie ursprünglich versucht auf das Gerät zu schreiben? Wenn nicht, können Sie mir einige Optionen erläutern, die mir zur Verfügung stehen?

Brian Sizemore
quelle
1
Ich bin nicht besonders gut mit Shell-Skripten vertraut, aber wie wäre es, wenn Sie es echo "test" > /dev/bus/usb/003/013stattdessen versuchen printf? Auch dies könnte eine weitere Frage, die helfen könnten.
Paradox
2
USB-Geräte sind weitaus komplexer als nur Pipes, die Sie lesen und schreiben. Sie müssen Code schreiben, um sie zu manipulieren. Sie müssen keinen Kerneltreiber schreiben. Siehe libusb.org libusb.sourceforge.net/api-1.0 . Dies ist möglicherweise Linux-spezifisch.
Edward Falk
@EdwardFalk Wenn Sie eine Antwort mit dieser enthalten, dann werde ich es als die Lösung akzeptieren. Danke für den Tipp!
Brian Sizemore
Sicher; Ich werde auch ein bisschen mehr Infos einwerfen.
Edward Falk

Antworten:

16

USB-Geräte sind weitaus komplexer als nur Pipes, die Sie lesen und schreiben. Sie müssen Code schreiben, um sie zu manipulieren. Sie müssen keinen Kerneltreiber schreiben. Siehe http://libusb.info (geb. libusb.org) und http://libusb.sourceforge.net/api-1.0 . Dies soll mit Linux, OSX, Windows, Android, OpenBSD usw. funktionieren. Unter Mac OS X gibt es Funktionen auf Benutzerebene im E / A-Kit , mit denen Sie auf USB zugreifen können. Unter Windows können Sie möglicherweise WinUSB verwenden, dies ist jedoch kompliziert.

Hier ist ein kleines Diagramm, das ich einmal gezeichnet habe, um die Architektur von USB zu verstehen:

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

Zusammenfassung: Jedes Gerät hat eine Adresse (vom O / S zugewiesen und Änderungen vorbehalten) und bis zu (glaube ich) 32 Endpunkte.

Innerhalb des Geräts befinden sich eine oder mehrere "Schnittstellen". Beispielsweise kann eine Webkamera eine "Kamera" -Schnittstelle und eine "Mikrofon" -Schnittstelle bereitstellen. Ein Multifunktionsdrucker würde mehrere Schnittstellen bereitstellen.

Endpunkt 0 wird zur Steuerung und Konfiguration des Geräts verwendet, und die anderen dienen zum Zugriff auf die verschiedenen Schnittstellen. Jede Schnittstelle hat null oder mehr (normalerweise mehr) Endpunkte.

Endpunkte können eine von mehreren Übertragungsarten sein:

  • Steuerübertragungen werden zum Abfragen und Konfigurieren des Geräts verwendet. Jedes Gerät muss einen Mindestsatz von Steueranweisungen unterstützen. Ich glaube, dass Kontrollübertragungen nur mit Endpunkt 0 verwendet werden.
  • Massenübertragungen senden oder empfangen Daten mit voller Bandbreite
  • Interrupt-Übertragungen (Ich bin mir nicht sicher, wie sich dies von Massenübertragungen unterscheidet; USB hat keine Interrupts). Beispiele sind Tastatur und Maus
  • Isochrone Übertragungen senden oder empfangen Daten mit voller Bandbreite mit Echtzeitanforderungen, jedoch ohne Zuverlässigkeit. Wird für Audio- / Videoanwendungen verwendet.

Ebenfalls erwähnenswert: Ein USB-Gerät kann mehrere Konfigurationen haben, die steuern, welche Schnittstellen verfügbar sind und so weiter. Das Ändern einer Gerätekonfiguration ist fast so, als würde man das Gerät ausstecken und an seiner Stelle ein anderes Gerät einstecken.

Alle diese Informationen sind in Gerätedeskriptoren, Konfigurationsdeskriptoren, Schnittstellendeskriptoren, Endpunktdeskriptoren usw. enthalten, die über Endpunkt Null abgefragt werden können.

(Intern sind Daten kein Bytestrom, sondern werden in Pakete gepackt, deren genaue Formate Teil der USB-Spezifikation sind. Zum größten Teil müssen Sie sich darüber keine Gedanken machen, da die Controller und Treiber diesen Teil verwalten Du.)

In der Praxis müssen Sie abhängig von Ihrer API-Bibliothek und Ihrem Betriebssystem das Gerät erkennen, die verschiedenen Deskriptoren lesen, um herauszufinden, womit Sie es zu tun haben, optional die Konfiguration festlegen (sofern das Betriebssystem dies zulässt), die Schnittstelle öffnen, und öffnen Sie die Endpunkte.

Für Massenendpunkte können Sie Rohdaten lesen und schreiben. Für Steuerübertragungen stellt die API-Bibliothek Funktionsaufrufe bereit. Ich habe noch nie Interrupt- oder isochrone Übertragungen verwendet. Ich bin sicher, dass Ihre API-Bibliothek die entsprechende Dokumentation enthält.


Weitere Informationen: "Funktion" ist eine Sammlung von Schnittstellen, die zusammenarbeiten. Es ist ursprünglich nicht Teil der USB-Spezifikation, und es liegt am Gerätetreiber, zu wissen, welche Schnittstellen zusammengefasst werden sollen. Die USB-Arbeitsgruppe hat Geräteklassen definiert, die Funktionen unterstützen. Dies erfolgt über den Interface Association Descriptor (IAD).

Edward Falk
quelle
1
Aktualisierte libusb URL ist libusb.info
JellicleCat
Warum hat es sich bewegt?
Edward Falk
Was ist, wenn ich ein Rebell bin und nicht konforme Pakete senden möchte, wie bei einem Protokollmissbrauchsangriff?
AJMansfield
1
Ich stimme dem zu, weil es eine wirklich schöne Zusammenfassung von USB ist.
Amr Bekhit
1
Wollten Sie EP2 zweimal in Ihrem Diagramm verwenden?
DeepDeadpool