Linux: USB abgehört

Der Universal Serial Bus (kurz USB) ist – wie sein Name schon verrät – universell, um vielfältige Geräte an einen Host anschließen zu können. Die paketorientierte Kommunikation läuft dabei nach einem Master/Slave-Prinzip ab. Bei der Entwicklung von USB-Gerätetreibern für das Host-System ist es sehr hilfreich, den USB-Bus beobachten zu können. Linux bring hierfür die wichtigen Boardmittel bereits mit.

Effektives Boardmittel: usbmon

Mit dem Modul „usbmon“ ist der Linuxkern bestens ausgestattet, um den Datenverkehr auf dem USB-Bus mitzulesen. Die Ausgaben des Moduls können recht einfach von der Kommandozeile gesammelt werden. Hierzu müssen lediglich das debugfs gemountet und das Modul usbmon geladen werden:

# mount -t debugfs none_debugs /sys/kernel/debug
# modprobe usbmon

Nun kann geprüft werden, ob die Debug-Sockets für die USB-Busse existieren:

# ls /sys/kernel/debug/usb/usbmon
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u

In dem Verzeichnis befinden sich für jeden Bus Systemdateien, über welche der Datenverkehr beobachtet werden kann.
Dabei existieren zwei Ausgabeformate, das lt-Format und das lu-Format. Das lu-Format enthält gegenüber dem lt-Format zusätzliche Informationsfelder, z.B. für ISO Frame-Deskriptoren und Intervalle. Das konkrete Datenformat ist in der usbmon-Dokumentation im Linuxkernel zu finden.
Über den Socket 0u können alle Busse zugleich überwacht werden. Durch Umleitung der Standardausgabe in eine Datei lassen sich die Daten aufzeichnen.

cat /sys/kernel/debug/usb/usbmon/0u > capture.mon

Zum Vorfiltern der Daten läßt sich herausfinden, auf welchem Bus das zu untersuchende Gerät angeschlossen ist:

# cat /proc/bus/usb/devices

Visualisierung mit dem Virtual USB Analyzer

Die aufgezeichneten Pakete können mit dem Open Source Virtual USB Analyzer untersucht werden. Seine Stärke ist die grafische Darstellung der Zeitlinie. Wichtig ist es hierbei, dass die aufgezeichneten Dateien im lu-Format vorliegen und mit der Endung .mon versehen sind, da sie sonst nicht im usbmon-Format erkannt werden. Mit der Endung .mon.gz dürfen sie auch gzip-komprimiert sein.

Virtual USB Analyzer (Screenshot)

Virtual USB Analyzer (Screenshot)

USB-Sniffen mit Wireshark

Der populäre Protokoll-Sniffer Wireshark beherrscht dank der libpcap neben vielfältigen Netzwerkprotokollen ebenfalls das Mitlesen und Interpretieren des Datenverkehrs auf dem USB-Bus über die usbmon-Schnittstelle. Die Analyse der Pakete wird durch die GUI sehr vereinfacht.

Wireshark (Screenshot)

Wireshark (Screenshot)