Der Titel ist zugegeben etwas reißerisch, beschreibt aber ganz gut die geplante Vorgehensweise die uns evtl. mal in die Lage versetzt die Abläufe und Funktionen im Navi nicht nur zu verstehen sondern auch auf unsere Bedürfnisse anpassen zu können. Es geht also weniger um die Elektronik und Reparatur sondern die Software im Gerät. Hierbei sollten wir uns erstmal nur dem Ford Navigationssystem FX widmen. Der Aufbau des NX und MCA sind nahezu identisch mit dem FX, also kann man sicher auch das Wissen darauf adaptieren. Es sei noch erwähnt das diese Gerätebasis auch im VW-Konzern als "RNS310" verwendet wird, wie auch bei Opel und sicher weiteren Herstellern.
Hacking hat immer viel mit Wissen zu tun und so bleibt es nicht aus sich mit einigen Dingen sehr intensiv auseinandersetzen zu müssen. Wer sich vom Thema angesprochen fühlt und dazu was beitragen kann ist herzlich willkommen! Gern unterstütze ich durch Zusendung eines Testkandidaten, denn FXe hab ich ein paar hier rumliegen.
Los gehts...!
Demontage und identifizierung der Komponenten
Das FX besteht grundlegend aus zwei Teilen, einem Hauptgehäuse mit dem Mainboard und einem Frontteil mit einem Grapfikboard:
Das Mainboard lässt sich durch lösen sämtlicher Schrauben komplett vom Gehäuse entfernen. Das Grafikboard kann abgenommen werden nachdem man die Steckkontakte für das LCD-Display und seine Hintergrundbeleuchtung gelöst hat.
Sowohl auf dem Mainboard als auch auf dem Grafikboard befindet sich ein Mini-Computer, bestehend aus einer CPU, RAM, Flash und IO-Bausteinen. Im Wiki gibt es bereits eine Seite mit der Erklärung der darauf befindlichen Bauteile sowie Datenblätter: https://mk4-wiki.denkdose.de/grundlagen/aud…avi_fx/teardown
Hier mal eine schematische Darstellung des gesamten Radios:
Hintertürchen finden
Das System kenn zwei Arten die interne Software zu aktualisieren:
1.) Per SD-Karte
Hierauf sind Navigationsdaten, aber auch Sprachdateien enthalten. Möchte man die Systemsprache ändern bedarf dies zum Teil einer SD-Card. Ohne SD scheint es immer eine eingestellte Sprache (z.B. "Deutsch") zu geben und einen Fallback "Englisch". Weiterhin kann die SD noch ein Update für den Navigationsrechner enthalten.
2.) Per CD
Damit werden Firmwareupdates eingespielt, oder aber auch Navigationsdaten wie sie auf der SD drauf sind.
Für beide Updatedatearten gilt, das der Datenträger bestimmte Dateien enthält die vom System beim einlegen des selbigen als Update-Software erkannt und speziell behandelt werden. Beim Firmwareupdate wird vermutlich zunächst ein spezielles Update-Programm vom Datenträger in den Arbeitsspeicher des Mini-Computers gelesen und zur Ausführung gebracht. Dieses wiederum übernimmt dann das einlesen und speichern vom Rest des Updates. Einige Komponenten verfügen über internen Flash-Speicher, andere über externen. Klar dürfte sein, das diese mit den neuen Daten überspielt werden. Das Problem bei einem abgebrochenen Update ist, das System wieder in einen Zustand zu bekommen in dem es den Updater einlesen und ausführen kann. Das könnte u.U. durch andere Schnittstellen erfolgen, die direkten Zugang zum RAM oder Flash haben. Dabei ist es wichtig zu wissen ob man über den extern aufgelöteten oder den Chip-internen Flash/RAM spricht. Was genau wo drin steckt ist noch unklar, aber der Zugriff darauf wird sich deutlich unterscheiden.
Den Update-Mechanismus sehe ich als Chance das System mit eigener Software zu bespielen. Sicher wird es sich aber gegen "Fremde" Inhalte schützen. Wie dieser Schutz aussieht ist noch zu klären, denkbar ist vieles bis hin zu digitalen Signaturen, aber wenigstens Prüfsummen oder "shared secrets" (Passwörter).
Letztlich muss sich das was auf einer Update-SD drauf ist in Teilen ja wieder in den Flash-Speichern des Radio wiederfinden.
3.) Per Download-Schnittstelle
Der Hersteller muss ja auch irgendwann mal eine initiale Betankung durchgeführt haben. Dies geschieht in der Regel im fertig montierten Zustand, kurz vor der Qualitätskontrolle. Oft kommen hier standardisierte Schnittstellen wie JTAG zum Einsatz. Die Entwickler erfinden dabei auch nicht das Rad neu, bedienen sich also oft den für die Chips vorgesehenen Techniken wie sie auch auf den Entwicklungsboards zum Einsatz kommen. Oft werden auch Beispieldesigns der Chip-Hersteller fast 1zu1 übernommen, weil es Entwicklungskosten spart.
Da im Gerät verschiedene Mikrocontroller werkeln kann man sich gut vorstellen das es nicht nur eine Schnittstelle gibt. Neben der Initialbetankung mit Software dienen diese aber auch der Qualitätskontrolle und Fehlerdiagnose. Diese Form von Schnittstellen bieten einem Zugang zu Hard- und Software und ggf. auch um mit dem System in Dialog zu treten.
Software Reverse Engineering
Das was man auf den Flash-Speichern der Mikrocontroller oder den aufgelöteten Chips findet ist reiner Maschinencode, also quasi das Endprodukt einer Entwicklung. Sowas programmiert heutzutage niemand mehr direkt, es wird in Hochsprachen wie "C" entwickelt und mittels Compiler zunächst in Assembler (eine maschinennahe Sprache) und schließlich in Maschinencode (den CPU-Befehlen) übersetzt. Dieser wird dann wie eine Datei in einen Flashspeicher hochgeladen und beim start einer CPU ausgeführt.
Noch komplizierter wird das bei einem FPGA. Das sind im prinzip nur programmierbare Logikbausteine. Ein FPGA bekommt keine Software sondern eine Konfiguration mit deren Hilfe sich der Baustein zu einem IC, einem Mikrocontroller oder gar einer CPU macht. Auch hier wird mit einer Entwicklungsumgebung die Funktion "programmiert", in einen Binärstrom gewandelt und anschließend in den Chip hochgeladen.
Zugriff auf diese Entwicklungsumgebungen und den Quellcode haben wir nicht. Im besten Fall haben wir die Möglichkeit die einzenen Flash-Speicher auszulesen. "Im besten Fall" bedeutet, wenn dies nicht vom Chip verhindert wird. Bei externen Flash-Chips ist das sehr unwahrscheinlich, bei internen eher die Regel. Auch könnten Chips eine Sperre gegen das überschreiben des aktuellen Inhalts mit neuer Software besitzen. Bei sicherheitskritischen Chips gibt es sogar sowas wie eine "Selbstzerstörung" bzw. Lockdown bei unlegitimiertem Zugriff.
Haben wir dann, wie auch immer einen solchen Flash-Inhalt als Datei auf unserem PC bleibt die einzige Möglichkeit um zu verstehen was da im Gerät passiert, mit Hilfe eines Decompilers aus dem Maschinencode wieder Assembler zu machen und diesen zu studieren. Aufgrund der Arbeitsweise von Compilern und der Zuhilfenahme von Bibliotheken können aus einigen wenigen Zeilen C-Code hunderte von Assembler-Anweisungen resultieren. Das zu "verstehen" ist wahrlich große Kunst und ein immenser Zeitaufwand. Eine solche Form des Reverse-Engineering wird kaum einer durchführen...
Effektiver ist es eine Debug-Schnittstelle zu verwenden. Hierbei stehen die CPU und eine Software auf dem PC mittels einer speziellen Schnittstelle in Kontakt. Über den PC kann man die CPU anweisen Befehle schrittweise auszuführen, oder bis zur nächsten Sprunganweisung (Funktion) oder nach einer solchen, usw. Dabei kann man sich die Registerwerte und Speicherstellen anzeigen lassen und auch beeinflussen. Auch ist es möglich beim Zugriff auf bestimmte Speicherstellen die Befehlsausführung zu stoppen. So lassen sich z.B. kontextbezogene Funktionen finden oder welche die auf Daten wie Texte, Bilder, etc. zugreifen.
Jedes Programm hat eine Hauptschleife. In ihr werden üblicherweise zunächst die Zustände der Eingabekanäle geprüft, dann diese Daten verarbeitet und ggf. Unterfunktionen angesprungen und am Ende die Ausgabekanäle gesetzt. Danach beginnt das ganze wieder von neuem. Auch wenn das Gerät nichts zu tun scheint, werkelt es in ihm ganz gewaltig. Funktionen die länger brauchen werden schrittweise durchgeführt, also bei jeder Iteration etwas mehr, bis die Ausführung vollständig ist.
Diese Loop lässt sich mit einem Debugger gut ermitteln und nachvollziehen. Von hier ausgehend kann man dann wichtige Unterfunktionen finden, z.B. beim drücken einer Taste, nach dem Eingang einer CAN-Botschaft, vor dem ausgeben einer Nachricht, etc. Durch loggen auf Speicherstellen bekommt man wiederrum mit, welche Funktion z.B. auf einen Meldetext oder eine Grafik zugreift.
Wie bekommt man dann eigene Funktionen ins System?
Das ist die große Frage! Mangels Quellcode kann man die Software nicht abhändern, neu compilieren und aufspielen, man kann nur etwas "umbiegen" und ggf. erweitern. Ein Beispiel: Wir möchten die Funktion einer Taste unter bestimmten Bedingungen ändern. D.H. die integrierte Funktion soll nicht oder nur in bestimmten Betriebsbedingungen ausgeführt werden. Hat man den Einsprungpunkt für die Tastenbehandlungsroutine gefunden, kann man an dieser Position einen Sprungbefehl setzen der zu einem ganz anderen Speicherpunkt führt. An diese Stelle platziert man seine eigene Software die entscheidet ob die besagte Taste gedrückt wurde und was nun zu tun ist. Soll die Standardfunktion ausgeführt werden, springt man einfach wieder an die ursprüngliche Stelle zurück. Ansonsten führt man den eigenen Programmcode aus und kehrt zum Aufrufer zurück.
Das klingt sooo einfach, ist in der Praxis aber nur mit viel Hintergrundwissen möglich. Denn man muss die möglichen Nebeneffekte eines solchen Aufrufes kennen und ggf. nachstellen.
Das eigene Programm kann man dann durchaus in C schreiben und für den jeweiligen Prozessor übersetzen. Als Ablagestelle bietet sich ein unbelegter Bereich im Flash an. Einen solchen gibt es praktisch immer, da kein Programm einen Speicher völlig belegt, das wäre Zufall. Meist halten sich die Entwickler auch noch großzügig Platz für eigene Erweiterungen oder Debug-Code der später rausfliegt. Um einen solchen Code inkl. der Veränderungen am bestehenden dann im Gerät zum laufen zu bekommen muss man natürlich wissen ob über den Speicher irgendwo Checksummen gebildet und geprüft werden. Ganz nebenbei sind hervorragende Programmierkentnisse natürlich Pflicht.
Zuletzt muss man noch einen Weg finden die geänderten Inhalte wieder in die Flash-Speicher hochzuladen.
Wo anfangen?
Puh, das klingt alles wenig vielversprechend... Stimmt! Niemand hat gesagt das hacken einfach ist
Um sich nicht gleich am Anfang wegzuschießen sollte man einen Weg finden die Flash-Speicher auszulesen und wieder mit der richtigen Software befüllen zu können, quasi eine Art Backup anzulegen. Die externen Chips könnte man dazu auslöten und mit einem Lesegerät auslesen. Beschreiben sollte ebenso gehen. Die internen Flashes werden kniffliger. Hier muss man das Datenblatt studieren und einen Weg finden der vom Chip vorgesehen ist. Das wird von Chip zu Chip unterschiedlich sein.
Basierend darauf lassen sich die Auswirkungen von einem Firmwareupdate per CD gut überprüfen. Ein Binärvergleich köntne aufschluß geben wo welche Teile/Dateien des Updates im Gerät landen. Durch unkritische Änderungen, z.B. Buchstaben eines Meldungstextes, kann überprüft werden ob die Updatedaten manipulationssicher sind.
Testaufbau
Als Equipment sollte man neben einem PC über ein Labornetzteil verfügen. Das FX lässt sich mit einer Betriebsspannung von 9-16V betreiben (es ist sowohl unter- als auch überspannungsgesichert) und hat eine Stromaufnahme von ca. 1,2A (ohne Lautsprecher und GSP). Das Netzteil sollte also dauerhaft wenigstens 2A liefern können ohne dabei abzurauchen
Ohne CAN-Bus fällt das Gerät nach ca. 1h in den Tiefschlaf. Um "ausgeschalteten" (Geräteknopf) bzw. "Pin-Abfrage" Modus deutlich schneller.
Um an alle Teile gut ranzukommen empfiehlt es sich das Gehäuse weitestgehend zu entfernen. Das CD-Laufwerk muss nicht zwingend angeschlossen sein, man kann aber das kurze Flachbandkabel problemlos durch ein längeres ersetzen und somit das Laufwerk seitlich platzieren.
Als Schnittstelle zum Gerät konnte ich bislang die JTAG-Ports von Mainboard und Grafikboard ermitteln. Als JTAG-Adapter kommt erstmal alles in Frage. Ich selbst verfüge über einen Segger J-Link Edu (ca. 50,- €) und einem USB-Blaster II Clone (ca. 10,- €).
Ein Speicheroszi, Logikanalyzer und natürlich einem Flash-Chip Reader für große Chips wären sehr hilfreich. Ebenso wie entsprechendes Lötgerät um die Chips ggf. aus- und wieder einlöten zu können.
Erste Ergebnisse
Mit dem Segger J-Flash ist es mir bereits einmal gelungen die Firmware aus dem Mainboard-Flash via JTAG herunterzuladen. Ich weiss aber inzwischen das es eine USB-Download-Schnittstelle im Gerät gibt, nur noch nicht wie man diese benutzt. Womöglich geht das nur mittels spezieller Treiber und Software.
Ebenso verfügt das Grafikboard über eine JTAG-Schnittstelle.