Wie man ein Auto hackt - ein schneller Crashkurs

Das Ziel dieses Artikels ist es, Sie dazu zu bringen, Autos zu hacken - schnell, billig und einfach. Zu diesem Zweck werden wir als Beispiel die Drehzahlanzeige fälschen.

Das Folgende ist keineswegs ein erschöpfendes Tutorial. Stattdessen sollen gerade genug Informationen bereitgestellt werden, um Sie zum Laufen zu bringen. Wenn Sie tiefer graben möchten, können Sie die Must-Reads am Ende überprüfen.

Wenn Sie dieses Tutorial im realen Leben durchführen möchten, benötigen Sie einen Linux-Computer (oder eine virtuelle Linux-Maschine) und ein CAN-to-USB-Gerät (auf das wir später noch eingehen werden).

Ein Auto ist ein Netzwerk

Ein Auto besteht aus mehreren Computern zur Steuerung von Motor, Getriebe, Fenstern, Schlössern, Lichtern usw. Diese Computer werden als elektronische Steuergeräte (ECU) bezeichnet und kommunizieren über ein Netzwerk miteinander.

Wenn Sie beispielsweise die Taste an Ihrem Lenkrad drücken, um die Lautstärke des Radios zu erhöhen, sendet die Lenkrad-ECU einen Befehl zum Erhöhen der Lautstärke an das Netzwerk. Die Radio-ECU sieht diesen Befehl und handelt entsprechend.

In einem Auto gibt es mehrere Netzwerke, im Allgemeinen mindestens zwei:

  • Eine für kritische Daten wie Motor- und Antriebsstrangmeldungen
  • Und eine für weniger kritische Daten wie Radio und Türschlösser

Das kritische Netzwerk verwendet ein schnelles und zuverlässiges Protokoll, während das nicht kritische Netzwerk ein langsameres, weniger zuverlässiges, aber billigeres Protokoll verwendet. Die Anzahl der Netze sowie die miteinander vernetzten Steuergeräte hängen von Automarke, Modell und Jahr ab. Ein Steuergerät kann auch mit mehreren Netzwerken verbunden sein.

Verbindung zu einem Netzwerk herstellen

Auf einige Netzwerke kann über den OBD-II-Port zugegriffen werden. OBD-II ist für alle Pkw und leichten Nutzfahrzeuge vorgeschrieben, die nach 1996 in den USA und nach 2004 in Europa gebaut wurden.

Der Stecker befindet sich in Reichweite des Fahrersitzes. Möglicherweise müssen Sie eine Plastikabdeckung abheben, diese ist jedoch immer ohne Werkzeug zugänglich.

Der OBD-II-Standard erlaubt fünf Signalisierungsprotokolle. Es ist Sache des Herstellers, zu entscheiden, welches verwendet werden soll. CAN ist das beliebteste und wird diskutiert. Der Zugriff erfolgt über die Pins 6 und 14 des OBD-II-Steckers. Wenn Ihr Auto über einen CAN-Bus verfügt, sehen Sie Metallkabel an den Stiften wie in der Abbildung oben.

Der CAN-Bus ist ein zuverlässiger Hochgeschwindigkeitsbus, mit dem kritische Daten gesendet werden. Leider sind die Datenpakete auf dem Bus nicht standardisiert, sodass Sie sie umkehren müssen, um zu wissen, was sie bedeuten. Der OBD-II-Standard lässt auch Platz für herstellerspezifische Pins, die für herstellerspezifische Protokolle verwendet werden können. Dies erleichtert dem Händler die Diagnose von Problemen.

In meinem Auto (GM) habe ich einen Standard-CAN-Bus an Pin 6 und 14 und einen herstellerspezifischen Eindraht-CAN-Bus an Pin 1. Der Standard-CAN-Bus ist ein zuverlässiges Hochgeschwindigkeitsprotokoll (500 kbps), das auch als bezeichnet wird Hochgeschwindigkeits-CAN (HS-CAN). Es wird für kritische Daten verwendet. Der Single-Wire-CAN-Bus (SW-CAN) oder GMLAN ist langsamer (33,3 kbps) und weniger zuverlässig, aber billiger, da nur ein Draht verwendet wird. Dieser Bus wird für unkritische Daten verwendet.

Wenn Sie eine herstellerspezifische PIN sehen und nicht wissen, welches Protokoll verwendet wird, klicken Sie auf "OBD-Pinbelegung" von Google. Es gibt auch CAN mit niedriger Geschwindigkeit (LS-CAN) und CAN mit mittlerer Geschwindigkeit (MS-CAN). MS-CAN befindet sich im Allgemeinen an den Pins 3 und 11 und läuft bei Ford- und Volvo-Fahrzeugen mit 125 kbit / s.

Werkzeuge

Sie benötigen sowohl ein Gerät, das CAN-Daten interpretieren kann, als auch Software zur Analyse der Daten

Hardware

Um CAN-Pakete empfangen und senden zu können, benötigen Sie ein Gerät, das dazu in der Lage ist. Sie werden häufig auf ELM327-basierte Geräte stoßen. Während diese ihren Nutzen haben, sind sie für das Hacken schrecklich. Sie sind viel zu langsam, um den CAN-Bus zu überwachen.

Es gibt auch High-End-Geräte wie Kvaser, Peak oder EMS Wünsche. Diese werden die Arbeit erledigen, sind aber übertrieben und ziemlich teuer.

Bei einigen High-End-Geräten müssen Sie auch Software erwerben. Der USB2CAN ist eine native CAN-Schnittstelle für Linux, die ein hervorragendes Preis-Leistungs-Verhältnis bietet.

Sie können auch Cantact oder CANUSB verwenden. Dies sind jedoch keine nativen CAN-Geräte unter Linux und verwenden ein ASCII-basiertes Protokoll. Dies bedeutet, dass ihre Einrichtung etwas komplizierter ist und eine geringere Leistung aufweist. Andererseits werden sie von mehreren Betriebssystemen gut unterstützt.

Ich verwende CANalyze, das ich für meine Bedürfnisse entwickelt habe. Es ähnelt USB2CAN insofern, als es eine erschwingliche native CAN-Schnittstelle ist, jedoch einen neueren Mikrocontroller verwendet, Open Source ist und mit Open Source-Tools erstellt werden kann. Der Rest dieses Tutorials setzt voraus, dass Sie eine native CAN-Schnittstelle verwenden.

Software

Um mit dem Gerät zu kommunizieren, müssen Sie das can-utils-Paket auf Ihrem Linux-Computer installieren. Sie können dies tun, indem Sie Folgendes in die Linux-Eingabeaufforderung eingeben:

sudo apt-get install can-utils

Can-utils macht das Senden, Empfangen und Analysieren von CAN-Paketen extrem einfach. Dies sind die Befehle, die wir verwenden werden.

  • cansniffer zeigt nur die Pakete an, die sich ändern
  • Candump Dump alle empfangenen Pakete
  • cansend sende ein Paket

Linux verfügt über CAN-Unterstützung, die über SocketCAN in den Kernel integriert ist. Dies macht es einfach, eigene zusätzliche Programme zu schreiben. Sie können mit dem CAN-Bus genauso interagieren wie mit jedem anderen Netzwerk, dh über Sockets.

CAN-Bus

Bevor Sie mit dem Rückwärtsfahren beginnen, sollten Sie sich mit der Funktionsweise des CAN-Busses vertraut machen. Es besteht aus 2 Drähten und verwendet Differenzsignalisierung. Da es sich um einen Bus handelt, können mehrere Geräte an diese beiden Drähte angeschlossen werden. Wenn ein CAN-Frame auf dem Bus gesendet wird, wird er von allen Steuergeräten empfangen, aber nur verarbeitet, wenn dies für das Steuergerät nützlich ist. Wenn mehrere CAN-Frames gleichzeitig gesendet werden, gewinnt der mit der höchsten Priorität. Ein CAN-Frame besteht aus 3 Teilen, die für uns relevant sind.

  • Arbitration-ID Die ID einer Nachricht. Ein Steuergerät verwendet es, um zu entscheiden, ob der empfangene Rahmen verarbeitet oder ignoriert werden soll. Es repräsentiert auch die Priorität der Nachricht. Eine niedrigere Zahl hat eine höhere Priorität. Wenn Sie beispielsweise ein Ingenieur sind, der das Netzwerk entwirft, geben Sie dem Rahmen für die Auslösung von Airbags eine sehr hohe Priorität oder eine niedrige Arbitrierungs-ID. Auf der anderen Seite würden Sie Daten, die für die Türschlösser bestimmt sind, eine niedrigere Priorität oder eine höhere Schieds-ID geben.
  • Datenlängencode (DLC) Gibt die Länge des Datenfelds in Bytes an. Ein CAN-Frame kann höchstens 8 Datenbytes enthalten.
  • Datenfeld Enthält bis zu 8 Datenbytes.

CAN-Bus umkehren

Der allgemeine Ansatz zum Umkehren des CAN-Busses besteht darin, das Verhalten zu generieren, das Sie nachahmen möchten, und die Nachricht zu finden, die dieses Verhalten verursacht. Nehmen wir zum Beispiel an, das Spurhalteassistenzsystem (LKAS) Ihres Autos ist Mist und Sie haben Ihr eigenes gemacht.

Damit es die Lenkung steuern kann, müssen Sie wissen, welche Nachrichten gesendet werden sollen. Um dies herauszufinden, müssen Sie das Original-LKAS einschalten, den CAN-Bus überwachen und die Pakete identifizieren, die für das Drehen des Lenkrads verantwortlich sind. Sobald Sie diese Pakete identifiziert haben, können Sie diese Pakete von Ihrem eigenen LKAS auf den CAN-Bus senden lassen, um das Lenkrad zu steuern.

In unserem Fall möchten wir den Drehzahlmesser fälschen, also müssen wir die Drehzahl ändern, indem wir mit eingeschaltetem und neutralem Auto auf das Gas treten und dann versuchen, das Paket zu finden, das für die Änderung der Drehzahl verantwortlich ist.

Installieren

Stecken Sie das CAN-Gerät in den OBD-II-Anschluss des Fahrzeugs und in den USB-Anschluss des Computers. Rufen Sie die CAN-Schnittstelle auf, indem Sie in Ihrer Linux-Eingabeaufforderung Folgendes ausführen:

sudo ip link set can0 up type can bitrate 500000

Dadurch wird die can0Schnittstelle (immer can0wenn nur ein Gerät angeschlossen ist) mit einer Bitrate von 500 kbit / s angezeigt, was Standard ist.

Identifizieren

Wenn das Auto ausgeschaltet ist, schlafen die Steuergeräte normalerweise, sodass Sie das Auto einschalten oder in den Zubehörmodus versetzen müssen. Sie können CAN-Rohdaten anzeigen, indem Sie dies in Ihrer Linux-Eingabeaufforderung ausführen:

candump can0

Dadurch werden CAN-Daten auf den Bildschirm gedruckt, sobald sie empfangen werden. Dies ist jedoch sehr unorganisiert und es ist sehr schwierig zu erkennen, welche Pakete einem bestimmten Ereignis entsprechen. Sie können Strg + C drücken, um das Programm zu stoppen. Um die Daten besser lesbar zu machen, verwenden wir cansniffer, der die Pakete nach Arbitrierungs-ID gruppiert und nur die Pakete anzeigt, die sich ändern. Um es zu starten, führen Sie den Befehl in Ihrer Linux-Eingabeaufforderung aus:

cansniffer -c can0

wo -ckoloriert die sich ändernden Bytes und can0ist die Schnittstelle zum Schnüffeln. Das Entfernen der konstanten Pakete dauert einige Sekunden.

Sie sollten etwas Ähnliches wie das Bild unten sehen, obwohl die Zahlen wahrscheinlich völlig unterschiedlich sein werden.

Die erste Spalte (Delta) zeigt die Rate in Sekunden, mit der die Pakete mit dieser Arbitrierungs-ID empfangen werden. Die zweite Spalte (ID) enthält die Arbitrierungs-ID. Die verbleibenden alphanumerischen Spalten (Daten…) enthalten die Datenbytes. Wenn die Daten eine ASCII-Darstellung haben, ist sie rechts zu sehen, andernfalls handelt es sich um einen Punkt.

Wenn Sie bei laufendem Motor Gas geben, um die Drehzahl zu erhöhen, werden möglicherweise neue CAN-Meldungen auf dem Bildschirm angezeigt und / oder vorhandene werden geändert.

Wir müssen eine CAN-Nachricht finden, in der die sich ändernden Bytes mit der Änderung der Drehzahl korrelieren. Wir können wahrscheinlich erwarten, dass der Wert mit zunehmender / abnehmender Drehzahl zunimmt / abnimmt.

Der erste CAN-Frame in cansniffer, der mit der Drehzahl zu variieren scheint, ist der Frame mit der Arbitrierungs-ID C9. Es gibt wahrscheinlich mehrere potenzielle Pakete, die mit der Drehzahl variieren. Dies ist nur das erste.

In dieser Nachricht ändern sich 4 Bytes (rot gefärbt), aber nicht alle geben die Drehzahl an. Variationen im dritten Byte 07scheinen nicht mit variierenden Drehzahlen zu korrelieren. Das letzte Byte 1Btut es.

Sobald wir jedoch den Fuß vom Gas nehmen, geht es zu 00. Dies würde anzeigen, dass es die Drosselklappenposition und nicht die Drehzahl darstellt.

Schließlich gibt es die zwei Bytes 21 C0, die einer Änderung der Drehzahl zu entsprechen scheinen. Mehr noch, es variiert als 16-Byte-Ganzzahl, dh wenn das zweite Byte C0überläuft, wird das erste Byte 21um eins erhöht. Es scheint auch, dass dies 21ungefähr 2000 U / min entspricht. Dies ist gut zu beachten, wenn Sie die Nachricht wiedergeben.

Wiederholung

Wenn Sie einen Kandidaten haben, senden Sie ihn mit dem folgenden Befehl in Ihrer Linux-Eingabeaufforderung an den CAN-Bus:

cansend can0 0C9#8021C0071B101000

Dabei hat der Frame das Format #{data} und muss durch Ihre eigene CAN-Nachricht ersetzt werden.

Ihr Auto kann dafür laufen oder sich im Zubehörmodus befinden. Stellen Sie sicher, dass Sie ein Paket verwenden, das Sie erhalten haben, als der Motor nicht im Leerlauf war. Andernfalls wird sich beim Abspielen im Leerlauf nichts ändern.

Wenn Sie das Paket nur einmal senden, werden Sie wahrscheinlich keine Änderungen am Kombiinstrument feststellen. Dies liegt daran, dass die ursprüngliche Nachricht weiterhin kontinuierlich in Intervallen von 0,2 Sekunden von der ECU auf dem Bus gesendet wird, sodass Ihre Nachricht einfach ignoriert wird.

Denken Sie daran, dass der Preis in der ersten Spalte von cansniffer angegeben ist. Es gibt zwei Möglichkeiten, dies zu umgehen, abgesehen vom Trennen des Steuergeräts, das diese Nachrichten generiert. Eine Möglichkeit besteht darin, die Pakete mit einer viel höheren Frequenz als die aktuell gesendeten zu senden. Sie können dies tun, indem Sie in Ihrer Linux-Eingabeaufforderung Folgendes ausführen:

while true; do cansend can0 0C9#8021C0071B101000; sleep 0.002; done

und Ersetzen der CAN-Nachricht durch die von Ihnen identifizierte. Drücken Sie Strg + C, um den Vorgang zu beenden.

Eine andere Möglichkeit besteht darin, den Bus zu überwachen und jedes Mal, wenn Sie das Paket erkennen, das Sie fälschen möchten, sofort danach Ihr eigenes Paket zu versenden. Dies kann durch Ausführen in Ihrer Linux-Eingabeaufforderung erfolgen:

candump can0 | grep " 0C9 " | while read line; do cansend can0 0C9#8021C0071B101000; done

Hier müssen Sie die CAN-Nachricht ersetzen und 0C9durch die von Ihnen identifizierte CAN-Nachricht bzw. deren Arbitrierungs-ID. Sie können mit beiden Ansätzen experimentieren, um herauszufinden, welcher besser funktioniert.

Wenn sich der Drehzahlmesser ändert, haben Sie ihn gefunden! Wenn nicht, identifizieren Sie die nächste Nachricht, die mit RPM korreliert, und spielen Sie sie erneut ab.

Fuzzing

Nachdem Sie den CAN-Frame haben, mit dem die Drehzahl im Kombiinstrument eingestellt wird, können Sie mit den von Ihnen gesendeten Daten spielen, um zu sehen, was passiert. Wir haben festgestellt, dass sich die beiden Bytes, die der Drehzahl entsprechen, wie eine 16-Bit-Ganzzahl verhalten. Um den Drehzahlmesser auf 8.000 U / min einzustellen, führen wir in Ihrer Linux-Eingabeaufforderung Folgendes aus:

while true; do cansend can0 0C9#0080000000101000; sleep 0.002; done

und das Ergebnis ist…

Das ist es! Sie können jetzt versuchen, den Tacho, das Radio, die Lichter, die Türschlösser usw. auf dieselbe Weise zu steuern.

Mögliche Probleme

  • Während der CAN-Bus das beliebteste Netzwerk ist, ist er nicht das einzige Netzwerk. Wenn Sie die gesuchte Nachricht auf dem CAN-Bus nicht finden können, versuchen Sie es mit einem anderen Netzwerk. Insbesondere unkritische Nachrichten wie Radio, Licht und Türschlösser befinden sich wahrscheinlich in einem anderen Netzwerk.
  • Wie bereits erwähnt, hängen die genauen Daten, die über CAN übertragen werden, von der Marke, dem Modell und dem Jahr des Fahrzeugs ab. Einige Autos verwenden einen Zähler in der CAN-Nachricht, um sicherzustellen, dass dieselbe Nachricht nicht mehrmals verarbeitet wird. Dies ist etwas schwieriger, aber Sie sollten in der Lage sein, dies mit den bereitgestellten Informationen zu tun. Einige Autos verwenden auch eine Prüfsumme, um die Integrität der Daten sicherzustellen. Die Berechnung dieser Prüfsumme kann schwierig sein. Wenn Sie einen Toyota haben, lesen Sie Adventures in Automotive Networks and Control Units, S. 10, Checksum-Toyota. Jeder sollte wirklich die ganze Zeitung lesen.
  • Wenn Sie das identifizierte Paket auf dem Bus wiedergeben, wechselt Ihr CAN-zu-USB-Gerät möglicherweise in den Status „Bus aus“. Dies ist Teil des CAN-Standards und tritt auf, wenn auf dem Gerät zu viele Fehler aufgetreten sind. Dies ist in der Regel der Fall, wenn im Bus viel Verkehr herrscht. Um dies zu umgehen, können Sie mit Verzögerungen und Timing spielen. Versuchen Sie möglicherweise, die Nachricht sofort nach dem Versetzen des Fahrzeugs in den Zubehörmodus wiederzugeben, warten Sie ein wenig, versuchen Sie es mit eingeschaltetem Fahrzeug usw. Wenn Sie die Steuergeräte identifiziert haben Wenn Sie mit dem Bus verbunden sind, können Sie auch die Sicherung ziehen, um das Senden von Nachrichten zu verhindern und den Verkehr auf dem Bus zu verringern.

Muss lesen

  • Auto-Hacker-Handbuch
  • Charlie Millers und Chris Valaseks Forschung, ja alles
  • Forschung der University of California in San Diego und der University of Washington.

Schauen Sie sich auch Open Garages und deren Videos an.