Forum: Fahrzeugelektronik Firmware verstehen MC9S12


von Olli Z. (z80freak)


Angehängte Dateien:

Lesenswert?

Ich habe hier einen "Basteltacho" aus einem Ford Mondeo Bj. 2011 und 
versuche gerade dessen Firmware mit IDA zu disassemblieren. Nicht um ein 
spezielles Ziel zu verfolgen sondern zu lernen wie das Teil funktioniert 
und mit der Hardware interagiert. Der Tacho hat so div. LEDs und 
Schrittmotore für Anzeigenadeln, einen Piezo-Lautsprecher und ein 
monochromes LCD Matrix-Display mit Hintergrundbeleuchtung. Die gesamte 
Hardware rund um den µC scheint recht überschaubar, meist nur 
Treiber-Bautsteine, d.H. hier wird das meiste direkt von der CPU selbst 
gesteuert, inkl. dem LCD-Display.

Zuvor habe ich noch ein Firmware-Update aufgespielt, damit ich auch 
vergleichen kann wo welche Komponenten aus den Update-Dateien hin 
kommen. Für das Update wird der Bootloader aus "AM2T-14C025-BA" via 
CAN-Tester auf das KI geladen und ausgeführt. Dieser lädt dann die Daten 
aus "CS7T-14C026-BF", "CS7T-14C026-DE" und "CS7T-14C088-BE" in den 
internen Flash des Zentralprozessors, einem MC9S12XHZ512. Rein 
rechnerisch dürften diese Daten dort garnicht reinpassen, denn die MCU 
verfügt über keinen externen Flash (nur ein EEPROM für Tachostand und 
ein paar Konfig-Daten) sondern nur ihren internen mit 512KB. Die Daten 
zusammengenommen ergeben aber fast 770KB.

Mittels BDM habe ich die MCU mal ausgelesen, linear (flat) von 0x0000 
bis 0xFFFF. Da fehlen mir natürlich die Pages. Ich habe da noch nicht 
raus wie ich das mit dem Pages disassemblieren soll. Ich müsste ja immer 
wieder einen Teil der Firmware in den Speicherbereich 0x8000-0xBFFF 
legen. Bislang habe ich keinen Weg gefunden IDA das "Paging" selbst 
beizubringen, auch wenn es mit "Segmenten" ein ähnliches Konzept 
integriert hat.

: Bearbeitet durch User
von Roman B. (Firma: ****) (r_b)


Lesenswert?

Ich glaub das KI war von Visteon. das kann man am S/N am Gehäuse 
erkennen.

Dissasemblieren um das Ding zu verstehen ist ein sehr langer und 
aufwendiger Weg. Ich bezeichne das sogar als next to impossible - aber 
das ist nur meine subjektive Sicht. Was ist das Ziel? Sollte der Tacho 
woanders verbaut werden, braucht man eig. nur die original K-Matrix z.B. 
als DBC und die Pinbelegung des Hauptsteckers, daraufhin kann man sich 
eine Gateway basteln die alles Mögliche an Eingangswerten auf CAN 
umsetzt.

Besser wäre es mit einem Debugger live reinzugehen. Könnte aber sein, 
dass die Release-SW den Debugger bereits im Bootloader deaktiviert.

Zu deinem Anliegen, dass "CS7T-14C026-BF", "CS7T-14C026-DE" und 
"CS7T-14C088-BE" rein rechnerisch nicht hineinpassen. Vermutlich werden 
die Files nicht vollständig verwendet - so etwas kannst du gut sehen, 
wenn du nach dem Update die MCU wieder ausliest und das Ergebnis wieder 
mit den 3 Files vergleichst z.B. mit Beyond compare. Da kannst du gleich 
sehen, welche Binärsequenzen sich in dem Target befinden. Vorausgesetzt 
die 3 Files sind unverschlüsselt bzw. ungescrammt. Sehr oft sind solche 
Files ein Konglomerat verschiedener Varianten und der Bootloader erkennt 
welche Variante vorliegt und flasht nur die passenden Anteile.

Zu den Grundlagen des Tachos:
HW:
Der dicke Automotive-Stecker hat Stromversorgung (KL30 + KL31) dann 
eventuell KL15 Eingang, das wäre die Leitung vom Zündschlüssel (es sei 
denn die ist da bereits virtuell über CAN angebunden) Dann eventuell ein 
Paar analoge und/oder digitale I/Os, eins oder zwei CANs und eventuell 
LIN. Auf der Platine selbst, wie bereits richtig erkannt Treiber für 
Schrittmotoren und LEDs (Hintergrundbeleichtung, Warnlampen, 
Segmentanzeigen). Piezo. BTW. diese Schrittmotoren können nur 4 Schritte 
pro 360 Grad, also 45° pro Schritt. Die feine Auflösung geht über 
Microstepping. Oft ist die Achse aus Plexiglas, durch diese wird dann 
mit einer LED der Zeiger beleuchtet.
SW:
Die Software basiert auf einem OSEK OS bzw. Autosar. Das heißt es ist 
ein Multitasking-OS drauf. Ansonsten ganz viele Softwaretreiber für die 
Peripherie und darauf basierend entweder verschiedene Applikations-Tasks 
(inkl. Diagnose/UDS/ISOTP Stack etc.), falls noch OSEK, ansonsten jede 
menge SWCs, falls Autosar.

Funktionsprinzip:
KL30 +12V und KL31 GND liegen in der Regel permanent an. Über KL15 oder 
über CAN-Aktivität wird das KI aufgeweckt und Bootet. Danach reagiert es 
zyklisch auf Eigabewerte z.B. über CAN und zeigt dem Fahrer irgendwas 
an. Zusätzlich wird auch über CAN was zurückgesendet - mindestens 
Netzwerkmanagementsignale. (ist natürlich erstmal eine sehr sehr 
einfache Darstellung).

Der Kilometerstand im EEPROM ist sicherlich mit der ID des EEPROMS und 
des SX verschlüsselt und außer im KI, wahrscheinlich auch in anderen 
Stellen abgelegt. Die möglichen Manipulationen, die ich bisher bei 
diesen KIs gesehen habe, waren meistens Eingriffe kurz vor der Anzeige. 
D.h. kurz vorm Beschreiben des Registers, der im Display den KM-Wert 
anzeigt. Da fügt man einen Jump zu einem eigens geschriebenen stück 
Code, der den Wert erst verkleinert, bevor dieser geschrieben wird. 
Andere Manipulationen sind meistens auf Insiderwissen zurückzuführen. 
Die Nicht-Insider-Manipulationen sind über Diag auslesbar, weil der 
Diagtester plötzlich einen ganz anderen Wert zeigt.

Beispiel für Funktionen:
1. Vom Steuergerät ABS/ESP kriegt man vier verschiedene Raddrehzahlen 
(von den Zählrädchen). Die vier werte werden über eine Formel gemittelt 
und mit dem Lenkwinkelsensor verrechnet um so die Geschwindigkeit und 
die gefahrenen Kilometer zu errechnen. Die Geschwindigkeit wird über 
einen kleinen Softwarefilter gedämpft (damit der Zeiger nicht zappelt) 
und dem Fahrer mit einem Schrittmotor angezeigt.
2. Die Drehzahl wird vom Motorsteuergerät über CAN übermittelt und nach 
der Filterung im KI angezeigt.
3. Die Kühlwassertemperatur wird als sensorwert über CAN mitgeteilt und 
beim Überschreiten eines Schwellwertes (mit Hysterese) geht im KI eine 
Warnleuchte an und der Piezo piepst.
4. außer der UDS Diagnose läuft permanent Zyklisch die Überwachung 
verschiedener Sensoren und der Software selbst. Das ist für den Fahrer 
nicht außensichtig erkennbar. Aber im Fehlerfall piepst und leuchtet 
irgendwas und es wird ein DTC im EEPROM abgelegt. (Wobei die 
Engine-Check vom KI i.d.r. nur angezeigt wird, aber nicht im KI EEP 
abgespeichert).

: Bearbeitet durch User
von Dieter (Gast)


Lesenswert?

Roman B. schrieb:
>
> Dissasemblieren um das Ding zu verstehen ist ein sehr langer und
> aufwendiger Weg. Ich bezeichne das sogar als next to impossible - aber
> das ist nur meine subjektive Sicht.

Meinst Du dieses spezielle Steuergerät oder allgemein? Das ist alles 
"nur"
eine Sache der Erfahrung und hängt davon ab was man aus einer ECU 
Firmware
an Erkenntnis herausholen will. Geht es z.B. um den UDS Security Access
kommt man teilweise sehr schnell ans Ziel (wenn man darin Erfahrung hat,
das kann man nicht oft genug betonen).

von Roman B. (Firma: ****) (r_b)


Lesenswert?

Ich meine das wirklich Allgemein. Wobei ganz klar bei sehr kleinen ECUs, 
wie z.B. Anhängesteuergerät es wesentlich einfacher ist den zu 
"reverse-engineeren".

2011 klingt interessant - ist das noch Visteon oder Conti?

Den UDS Security Access kriegt man ausgehebelt, wenn man mit nem 
Debugger reingeht und versucht im CAN-Input einen Breakpoint auf die 
Message (oder irgendeinen Wert davon) zu setzen, die den Key enthält, 
der vom Tester an das KI geht. Es wird erstmal der Falsche Key sein, 
aber nach einigen 100 - 1000 Jumps ist irgendwo der Jump der if-then 
construktion, die entscheidet, ob der KEY korrekt war. Im assembler ist 
das dann BEQ/LBEQ für Branch equal/Long branch equal oder BCS/LBCS für 
carry flag jump oder ähnlich. Wenn man den Jump erst entdeckt hat, kann 
man vor der Decision den Zero-Flag oder den Carry Flag manipulieren. 
Damit springt er in die ensprechende Session auch wenn der Key falsch 
ist. Falls der Flashbereich nicht CRC geschützt ist, kann man versuchen 
so eine Stelle mit JMP o.ä. mit nem Hexeditor zu patchen, so dass die SW 
trotz eines falschen Keys immer in den Modus springt.

Das finden des Jumps ist eben etwas schwierig und aufwendig.

: Bearbeitet durch User
von Olli Z. (z80freak)


Lesenswert?

Roman B. schrieb:
> Dissasemblieren um das Ding zu verstehen ist ein sehr langer und
> aufwendiger Weg. Ich bezeichne das sogar als next to impossible - aber
Exakt. Ich denke das eine Firmware in dieser Größe nicht via 
Disassemblierung vollständig zu verstehen oder wieder in Quellcode 
zurückzuführen ist. Darum geht es mir auch garnicht. Ich finde es 
einfach faszinierend auf diese Weise in Hardware "einzutauchen" und gern 
würde ich bestimmte Komponenten verstehen und ggf. damit rumspielen. 
Auch um z.B. interne, versteckte Funktionen zu finden.

> braucht man eig. nur die original K-Matrix z.B. als DBC
An die man selbstverständlich nicht ran kommt, zumindest nicht legal. 
Sie ist auch nicht Bestandteil der Firmware sondern nur über 
entsprechende Funktionen implementiert.

>  und die Pinbelegung des Hauptsteckers, daraufhin kann man sich
Die wiederum ist das einfachste. Hier helfen die Schaltpläne vom 
Fahrzeug. Das habe ich alles. Auch CAN-Gateways und auch schon 
Simulationen dafür für z.B. Drehzahl usw. Aber es gibt doch noch einiges 
was ich nicht kenne.

> Besser wäre es mit einem Debugger live reinzugehen. Könnte aber sein,
> dass die Release-SW den Debugger bereits im Bootloader deaktiviert.
"Live" würde ja bedeuten, im Fahrzeug. Das mache ich nicht. Ggf. würde 
ich einen CAN-Mitschnitt abspielen. Das KI sollte keinen Unterschied 
erkennen ;-)

> Zu deinem Anliegen, dass "CS7T-14C026-BF", "CS7T-14C026-DE" und
> "CS7T-14C088-BE" rein rechnerisch nicht hineinpassen. Vermutlich werden
> die Files nicht vollständig verwendet - so etwas kannst du gut sehen,
Was sollte das aber für einen Sinn ergeben?
Ich kenne so einige Firmware-Files und die waren letztlich immer 
vollständig im Modul enthalten. Eher umgekehrt, das im Modul mehr ist 
als in der Firmware. Denn z.B. die Vector-Tabellen oder Bootloader sind 
da nicht enthalten. Die Firmware ist ja in der Regel als Update gedacht 
und nicht für eine initiale Betankung.

> wenn du nach dem Update die MCU wieder ausliest und das Ergebnis wieder
Genau das habe ich ja versucht. Durch das in der MCU verwendete Paging 
ist das aber nicht ganz trivial.

> die 3 Files sind unverschlüsselt bzw. ungescrammt. Sehr oft sind solche
Ne, das Zeug ist noch aus einer Zeit wo man sowas nicht gemacht hat. 
Auch die MCU hat keinen Ausleseschutz.

> Segmentanzeigen). Piezo. BTW. diese Schrittmotoren können nur 4 Schritte
> pro 360 Grad, also 45° pro Schritt. Die feine Auflösung geht über
45° pro Schritt? Das wäre ein wenig "grob" für eine 
Geschwindigkeitsanzeige, meinst Du nicht? ;-)
Aber die HW ist hier garnicht so interessant. Viel mehr interessiert 
mich die Software und wie das intern alles funktioniert.

> Die Software basiert auf einem OSEK OS bzw. Autosar. Das heißt es ist
> ein Multitasking-OS drauf. Ansonsten ganz viele Softwaretreiber für die
> Peripherie und darauf basierend entweder verschiedene Applikations-Tasks
> (inkl. Diagnose/UDS/ISOTP Stack etc.), falls noch OSEK, ansonsten jede
> menge SWCs, falls Autosar.

> Der Kilometerstand im EEPROM ist sicherlich mit der ID des EEPROMS und
Wo der liegt weiss ich bereits, auch wie man den berechnet.

> Andere Manipulationen sind meistens auf Insiderwissen zurückzuführen.
Das denke ich auch. Irgendwer hat da sein Wissen zu Geld gemacht.

> 1. Vom Steuergerät ABS/ESP kriegt man vier verschiedene Raddrehzahlen
> (von den Zählrädchen). Die vier werte werden über eine Formel gemittelt
Da fängt es an interessant zu werden. Die Radimpulse kommen ja von einem 
Zahnrad welches an einem Initiator (Hallsensor) vorbeilaufen. Diese 
gehen meist zum ABS-Modul und von dort kommen dann CAN-Botschaften die 
entsprechende Werte enthalten. Daraus lässt sich dann u.a. die 
Geschwindigkeit und zurückgelegte Entfernung berechnen.

von Olli Z. (z80freak)


Lesenswert?

Dieter schrieb:
> Roman B. schrieb:
>>
>> Dissasemblieren um das Ding zu verstehen ist ein sehr langer und
>> aufwendiger Weg. Ich bezeichne das sogar als next to impossible - aber
>> das ist nur meine subjektive Sicht.
>
> Meinst Du dieses spezielle Steuergerät oder allgemein? Das ist alles
> "nur"
> eine Sache der Erfahrung und hängt davon ab was man aus einer ECU
> Firmware
> an Erkenntnis herausholen will. Geht es z.B. um den UDS Security Access
> kommt man teilweise sehr schnell ans Ziel (wenn man darin Erfahrung hat,
> das kann man nicht oft genug betonen).

Eigentlich allgemein, aber als ein mögliches Beispiel ist dieses doch 
auch ganz gut. Es hat jede Menge externe Komponenten über die man ggf. 
auch verfügen kann (LEDs, etc.). Zudem habe ich das Teil zum basteln zur 
Verfügung. _Habe aber auch noch weitere Dinge...

UDS wäre schonmal ein gutes Thema...

Ich versuche so ran zu gehen das ich mit eine externe Komponente suche, 
z.B. eine LED und dann nachvollziehe wie diese HW-Technisch an die MCU 
gekoppelt ist. Dann versuche ich die Stellen im Code zu finden die mit 
dem Port arbeiten um dann ggf. die höheren Funktionen zu finden.

von Olli Z. (z80freak)


Lesenswert?

Roman B. schrieb:
> Ich meine das wirklich Allgemein. Wobei ganz klar bei sehr kleinen ECUs,
> wie z.B. Anhängesteuergerät es wesentlich einfacher ist den zu
> "reverse-engineeren".
Tja, ich hätte hier noch ein Parkpilot-System mit gleicher MCU, oder ein 
Komfortsteuergerät für Türschließung, auch mit diesem MCU-Typ.

> 2011 klingt interessant - ist das noch Visteon oder Conti?
Visteon.

> Den UDS Security Access kriegt man ausgehebelt, wenn man mit nem
> Debugger reingeht und versucht im CAN-Input einen Breakpoint auf die
> Message (oder irgendeinen Wert davon) zu setzen, die den Key enthält,
Die Security-Keys kann man bei diesen Modellen sogar noch per 
Brute-Force ermitteln. Die haben keine Intrusion-Detection, schalten 
nicht ab. Habe ich vor langer Zeit mal gemacht, nur so zum Spaß. Viel 
einfacher wäre es natürlich den Code zu finden und auf welche Tabellen 
dieser zurückgreift.

> der vom Tester an das KI geht. Es wird erstmal der Falsche Key sein,
> aber nach einigen 100 - 1000 Jumps ist irgendwo der Jump der if-then
> construktion, die entscheidet, ob der KEY korrekt war. Im assembler ist
Tja, genau das wäre mal was... mit einem Debugger habe ich so noch nicht 
viel gemacht, denn meist werden diese nur bei Verwendung mit eigenem 
Quellcode erklärt und zum Einsatz gebracht.

> Das finden des Jumps ist eben etwas schwierig und aufwendig.
Genau, wo anfangen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.