Algorithmus für Kilometerstand im Convers+ geknackt

  • Aus reinem Interesse und Spaß am tüfteln habe ich mir mal den Kilometerstand vom Convers+ vorgenommen.

    Letztlich ist es mir gelungen die Kodierung desselben zu knacken, sprich den Verschlüsselungs/Entschlüsselungs-Algorithmus :vain:

    Nur so zur Einstumming ein paar Bilder:

    So hat ihn vermutlich noch niemand gesehen...

    Ups, wieder Zeit für nen Zahnriemenwechsel! ;)

    Zur Technik:

    =>

    Das Convers+ (IPC) speichert seinen Kilometerstand in einem externen EEPROM (3) vom Typ 24C16 ab. Dieses hat eine Kapazität von 2 KByte und schafft mindestens 1 Million Schreibzyklen. Neben dem Gesamtkilometerzähler ist dort auch der Tageskilometerzähler und viele andere Parameter und Daten vom Convers+ gespeichert.

    Der Zentralprozessor (1) ist ein MAC7116 von Freescale, ein typischer Vertreter in Automotive-Elektronik-Komponenten. Der EEPROM ist via I2C mit diesem verbunden. Beim Booten, also wenn Strom aufs IPC gelegt wird liest der Prozessor den Inhalt des EEPROMs ein und prüft ob alles passt. In den darin enthaltenen Werten weiss das IPC dann wie und was es anzuzeigen hat (Sprache, Meilen/KM, Fahrzeugoptionen, Kilometerstände, usw.).

    Während der Fahrt erhält die Firmware ein Signal über den MS-CAN Bus welches anzeigt, welche Wegstrecke zurückgelegt wurde. Und das geht so:

    Das BCM sendet in CAN ID 040 alle 50 ms einen Wegstreckenwert in Byte D6 (wenn man die Bytes von rechts nach links aufbaut, also D7..D0, das vorletzte). Ändert sich der Wert nicht, steht das Fahrzeug. Bewegt es sich, egal ob forwärts oder rückwärts, ist der Wert der nachfolgenden Nachricht höher als der vorherige. Da es sich um einen 1-Byte Wert handelt (Wertebereich 0x00 bis 0xFF) findet oberhalb 0xFF ein Überlauf zu 0x00 statt, d.h. der Wert beginnt wieder ab 0x00 so als hätte man die Stellen ab Position drei weggeschnitten. Die Differenz der Änderung ist gleichzeitig ein Maß für die Geschwindigkeit, dennoch wird dieses Byte ausschließlich für die Entfernungsdarstellung verwendet.

    Ich habe mir, nachdem ich das Byte aus CAN-Logs mittels der Binärbaum-Methode isoliert hatte, einen kleinen Generator programmiert, der ein CANHacker Tracefile erzeugt in dem nur diese ID und die für Zündung gesendet wird. Damit habe ich ermittelt das Differenzwerte bis 0xC8 vom IPC akzeptiert werden, größere Werte aber keine Änderung zur Folge haben und diese vermutlich unplausibel wären.

    Somit konnte ich den Kilometerzähler hochlaufen lassen und die Werte des EEPROM immer wieder einlesen und vergleichen. Dabei viel mir auf das nach einem Poweron die Nachkommastelle des Tageskilometerzählers immer 0 war, egal was vorher da stand. Es wurde auf, bzw. abgerundet. Damit hatte ich die Vermutung das der Kilometerstand nur relativ selten abgespeichert wird, was auch die Beschreibbarkeitszyklen des EEPROM anders garnicht hergäben.

    Relativ schnell war damit klar das sich der Speicherort für den Kilometerstand 20 Bytes ab der EEPROM-Adresse 0x774 befand:

    Ein zusätzlicher, 4 Byte langer an Position 0x788. Hiermit kam ich aber nicht endgültig ans Ziel, nur nahe dran. Ich tüftelte eine ganze Weile mit Bekannten an der Verschlüsselung. Entscheidend war das Disassemblen der IPC-Firmware, die den wahren Algorithmus dann preis gab.

    Der Kilometerstand wird in fünf 4 Byte-Gruppen kodiert. Jede 4 Byte Gruppe ist mit einer Prüfsumme (CRC) und einem Parity-Bit (Gerade/Ungerade Anzahl von 1-Bits im Wert) gesichert. Die Prüfsummen kommen aus einer CRC-Table mit 16 Einträgen aus dem 1 MByte großen Firmwareteil (hier z.B. "7M2T-14C026-AG") des IPC:

    Ich will das Verfahren anhand eines Beispiels erläutern. Ich nehme folgende Daten aus einem EEPROM wo das IPC den Kilometerstand 249.510 km anzeigt:

    Code
    0x774: 0x79, 0xD9, 0xFF, 0x26,
    0x778: 0x79, 0xD9, 0xFF, 0xA2,
    0x77C: 0x79, 0xD9, 0xFF, 0x23,
    0x780: 0x79, 0xD9, 0xFF, 0xA4,
    0x784: 0x79, 0xD9, 0xFF, 0x25

    Zuerst lesen wir das erste WORD (2 Byte, Big Endian) ab Adresse 0x774 = 0x79D9 und das zweite WORD ab Adresse 0x776 = 0xFF26 in einen Buffer. Zur Berechnung der CRC gehen wir so vor:

    Das ganze wird dann noch 4mal wiederholt, jeweils für die folgenden 4 Byte-Gruppen. Am Ende haben wir dann:

    Code
    # km1sum=0x2611
    # km2sum=0x00B9
    DWORD dw = (km1sum * 0x80) + km2sum  # dw=0x130A39
    WORD km = (dw / 5) + 1  # km=0x3CEA6 = 249510

    Mehr ist es nicht ;)

    Somit ist dann auch klar das nur alle 200 Meter ein Kilometerstand ins EEPROM gespeichert wird, daher die Division durch 5.

    Durch den Trick, einen die sich häufig ändernden niedrigen Werte des Kilometerstandes über 5 Speicherstellen zu verteilen, erhöht sich die Beschreibbarkeit des EEPROM um diesen Faktor. Somit wird faktisch eine Million Kilometer Gesamtreichweite sichergestellt. Die im IPC angezeigten Werte liegen im RAM desselben und halten natürlich immer den aktuellen Wert.

    Um nun aus einem Wunsch-Kilometerstand die richtige Bytefolge zu machen muss man den Algorithmus nur "rumdrehen". Lesen und schreiben lässt sich das EEPROM mit jedem X-Beliebigen I2C Programmer für wenige Cent auf Ebay. Je nach Programmer auch ohne den EEPROM auszulöten. Darüber hinaus ist es auch möglich diesen mittels UDS über den CAN-Bus zu ändern. Hierzu schreibt man einen Fake-Bootloader fürs IPC, gaukelt ein Update vor und lässt den Bootloader im RAM ausführen. Dieser ändert dann das ab IO-Map Adresse 0x6000000 gemappte I2C EEPROM ab, macht einen Reset und schwub, hat man seinen gewünschten Kilometerstand.

    Naja, zumindest im IPC. Der wird aber aus Sicherheitsgründen wohl noch in ein paar anderen Modulen abgelegt. Das aber nur dazu wie einfach es ist einen Tacho zu manipulieren.

    "Lernen ist Erfahrung. Alles andere ist einfach nur Information."

    Albert Einstein

  • Sorry, vielleicht nochmal etwas einfacher:

    Beispieldaten ab 0x774:  79 D9 FF 26 79 D9 FF A2 79 D9 FF 23 79 D9 FF A4 79 D9 FF 25

    Nimm die ersten 2 Byte (rot) ab Offset 0x774 des EEPROM-Inhaltes als ein Hex-Wert. Dividiere den Wert mit 0x10 und multipliziere das mit 5 und anschließend mit 0x80. Dann hat man den hohen KM-Wert.

    Als nächstes nimm jeden grünen Wert bitwise-und 0x7F und addiere 1. Addiere alle fünf Resultate zu einem Wert. Dann hat man den niedrigen KM-Wert.

    Nun addiere beide KM-Werte, dividiere das Ergebnis durch 5 und addiere 1 um den KM-Wert zu erhalten.

    Code: Select all

    Code
    KM_HIGH = (0x79D9 / 0x10) * 5 * 0x80 = 0x13 0880
    KM_LOW = 0x27 + 0x23 + 0x24 + 0x25 + 0x26 = 0xB9
    KM = (0x130880 + 0xB9) / 5 + 1 = 0x3CEA6 (=249.510km)

    "Lernen ist Erfahrung. Alles andere ist einfach nur Information."

    Albert Einstein

  • Ich hatte mir gerade noch überlegt ob es besser lesbar ist, wenn ich die 3D Brille aufsetze. Aber nein das ist bestimmt wieder nur ein Bot, Spam oder so was:doublethumbsup:

    Wenn man tot ist, ist das für einen selber nicht schlimm, weil man ja tot ist ... schlimm ist es für die anderen .... genauso ist das übrigens wenn man doof ist! :D

  • Wer nicht ausbauen will um die Kilometer zu korrigieren, oder keinen IC hat oder sich den Aufwand soaren will, kann sich natürlich auch gerne bei mir melden. Per OBD geht es nämlich (für ein paar Euro) auch. Etwa wenn man ein gebrauchtes Convers+ einbauen möchte.

  • Wer nicht ausbauen will um die Kilometer zu korrigieren, oder keinen IC hat oder sich den Aufwand soaren will, kann sich natürlich auch gerne bei mir melden. Per OBD geht es nämlich (für ein paar Euro) auch. Etwa wenn man ein gebrauchtes Convers+ einbauen möchte.

    Guck an, das versteh' ich! :doublethumbsup:

  • Ich gebs auf :dash:

    Ich fürchte ihr habt mich total falsch verstanden. Das ist ein Grundlagenartikel, keine Anleitung und ich mach auch kein Youtube Video davon :miffy:

    "Lernen ist Erfahrung. Alles andere ist einfach nur Information."

    Albert Einstein

  • Wir sind Mondeofahrer nix Ingenieure :dash::doublethumbsup:

    Wenn man tot ist, ist das für einen selber nicht schlimm, weil man ja tot ist ... schlimm ist es für die anderen .... genauso ist das übrigens wenn man doof ist! :D

  • Das iss mir hier zu hoch , mir rappeln noch die Ohren von Rammstein gestern Abend

    Gruß Tom :fahrenlenkrad:

    ____________________________________________________________
    Dieser Beitrag wurde bereits 1.694.000 mal editiert, zuletzt von »digdog« (Heute, 01:96)

  • Fällt mir doch gerade Brüderlein und Schwesterlein ein:doublethumbsup:

    Wenn man tot ist, ist das für einen selber nicht schlimm, weil man ja tot ist ... schlimm ist es für die anderen .... genauso ist das übrigens wenn man doof ist! :D

  • Voll easy, hätte ich dir vorher schon sagen können!

  • Ändert sich der Wert nicht, steht das Fahrzeug. Bewegt es sich, egal ob forwärts oder rückwärts, ist der Wert der nachfolgenden Nachricht höher als der vorherige

    Mit anderen Worten der Weg ist ja gefahren, ob nun vorwärts oder rückwärts, der Zählerstand wird in jedem Fall erhöht. Ist das so zu verstehen?

    Darüber hinaus ist es auch möglich diesen mittels UDS über den CAN-Bus zu ändern.

    Mit der entsprechenden Hardware kein Problem, Methoden gibts einige, das stimmt.

    Der wird aber aus Sicherheitsgründen wohl noch in ein paar anderen Modulen abgelegt.

    Das wäre doch eine Idee für ein neues Projekt, sprich das Herausfinden in welchen Modulen:gamer_:thinking:

    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Bedienungsanleitung :thinking: "

  • Ich gebs auf :dash:

    Ich fürchte ihr habt mich total falsch verstanden. Das ist ein Grundlagenartikel, keine Anleitung und ich mach auch kein Youtube Video davon :miffy:

    ist ja auch nicht böse gemeint. :pleasantry:

  • Mit anderen Worten der Weg ist ja gefahren, ob nun vorwärts oder rückwärts, der Zählerstand wird in jedem Fall erhöht. Ist das so zu verstehen?

    Das wäre doch eine Idee für ein neues Projekt, sprich das Herausfinden in welchen Modulen

    Ja, genau, der Wert erhöht sich einfach. Würde man also diesen Wert mittels CAN-Filter zwischen dem IPC blockieren, sprich statisch setzen, würde sich der KM-Zähler nicht erhöhen. Würde man ihn manipulieren, dann ggf. langsamer als tatsächlich und zwar ohne das die sonstigen Anzeigen darunter leiden, wie Geschwindigkeit, etc. :)

    "Lernen ist Erfahrung. Alles andere ist einfach nur Information."

    Albert Einstein

  • CAN-Filter

    Also quasi zwischen dem 24C16-Chip und dem Sensor die "Falltür" runterlassen für die gezählten Werte der Wegstrecke während die gemessenen Werte der Geschwindigkeit sozusagen ja einen anderen "Weg" (andere Codefolge) zum Tacho und nicht zu dem besagten Chip nehmen.

    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Bedienungsanleitung :thinking: "

  • Ne, zwischen Fahrzeug und IPC auf CAN Ebene, ganz ohne Eingriff ins Gerät.

    "Lernen ist Erfahrung. Alles andere ist einfach nur Information."

    Albert Einstein

  • Das ist mir schon klar. Aber prinzipiell könnte es doch so oder so ähnlich laufen.

    "Jetzt, wo ich weiß wie es geht, versteh ich auch die Bedienungsanleitung :thinking: "

  • Weiß nicht ob ich da jetzt irgendwo einen Denkfehler habe, aber ist es wirklich so sinnvoll eine Anleitung zu geben wie man den Kilometerstand manipuliert?

  • Weiß nicht ob ich da jetzt irgendwo einen Denkfehler habe, aber ist es wirklich so sinnvoll eine Anleitung zu geben wie man den Kilometerstand manipuliert?

    Ist jetzt irgendwie kein Geheimnis, das der Kilometerstand sich "anpassen" lässt.

    Go4IT hat hier jetzt nur mal den Algo offengelegt. Wer den Tachostand manipulieren will konnte das auch schon vorher.

    Gruß Tom :fahrenlenkrad:

    ____________________________________________________________
    Dieser Beitrag wurde bereits 1.694.000 mal editiert, zuletzt von »digdog« (Heute, 01:96)

  • Zu wissen DAS es geht und WIE ist schön nochmal ein Unterschied ?

    Aber das sollte keine Kritik sein, wer manipulieren will macht das auch ohne die Anleitung hier das stimmt schon.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!