Zurück zur Startseite

Reverse 9S12HY64: Patchen ohne Disassembler

Der Artikel beschreibt das Reverse Engineering der 9S12HY64-Firmware ohne Disassembler: I²C-Sniffing, Signatursuche in Ghidra, SREC-Patchen zur Änderung der Anzeige. Erzieltes funktionierendes Ergebnis der Indikator-Emulation. Der Ansatz ist auf ähnliche Aufgaben anwendbar.

9S12HY64-Firmware patchen: von I²C zum Ergebnis
Advertisement 728x90

Patching statischer Daten in 9S12HY64-Firmware ohne Disassemblierung

Die Anzeige von Indikatoren auf einem Automotive-Instrumentencluster basierend auf dem MC9S12HY64-Mikrocontroller wird durch Analyse des I²C-Verkehrs und das Patchen der SREC-Firmwaredatei verändert. Dieser Ansatz vermeidet die vollständige Disassemblierung des Codes und konzentriert sich stattdessen auf die Identifizierung von Signaturen im statischen Datenbereich mittels Ghidra. Ziel ist es, die Zeichen A durch P und M durch D zu ersetzen, wobei digitale Artefakte eliminiert werden.

Hardwareanalyse und Protokoll

Der 9S12HY64-Mikrocontroller ist über eine 6-polige Schnittstelle direkt mit dem Display verbunden, ohne externen Treiber. Durch Schaltungsanalyse und Referenzdokumentation wird das I²C-Protokoll bestätigt. Ein Saleae-Logikanalysator erfasst den Datenverkehr zwischen MCU und Display in allen Getriebestellungen.

Eine Zusammenfassungstabelle des Verkehrs zeigt veränderliche Bytes, die als potenzielle Signaturen dienen:

Google AdInline article slot
  • Modus A1: 5A C9 9A 8D...
  • Modus M1: 5A C9 9A 8D... (Variationen in den ersten Bytes)

Rot markierte Bytes werden im Firmware-Image gesucht und gelten als Repräsentation einer 2D-Array-Struktur für statische Nachrichteninhalte.

Lokalisierung von Signaturen in der Firmware

Ghidra wird für einen Hex-Suchvorgang verwendet, ohne dass eine HCS12-Disassemblierung erforderlich ist. Die Signatur 0x5A, 0xC9, 0x9A, 0x8D identifiziert einen spezifischen Speicherbereich. Nachrichtenformat: Display-Byte-Nummer + Daten.

Zuordnung von Verkehr zu Speicher:

Google AdInline article slot
  • Erstes Byte identifiziert den Segmenttyp (A/M).
  • Folgende Bytes definieren Zeichenmuster.

Aus der Firmware eines neuen Clusters wurden Nachrichten für P und D extrahiert:

  • P: Ersatz durch ein Byte.
  • D: Korrektur durch zwei Bytes.

Nachrichtenvergleich:

| Modus | Ursprüngliche Nachricht | Ziel-Nachricht |

Google AdInline article slot

|-------|------------------------|----------------|

| A1 | 5A C9 9A 8D... | 5A XX XX 8D... (P) |

| M1 | 5A C9 9A 8D... | 5A YY ZZ 8D... (D) |

Patchen der SREC-Datei

SREC-Struktur: Header, Adresse, Daten, Prüfsumme. Änderungen an Bytes erfordern eine Neuberechnung der Prüfsumme (KS).

Python-Skript zur Berechnung der KS:

# Beispiel-Skript (angepasst von GitHub)
def calc_srec_checksum(line):
    # Summe der Bytes mit Inversion
    s = sum(bytes.fromhex(line[1:-1]))  # S und KS ausschließen
    return format((~s + 1) & 0xFF, '02X')

Änderungen:

  • Für P: Änderung des ersten Bytes in einer Zeile.
  • Für D: Anpassung des ersten und zweiten Bytes in zwei Zeilen.

Neuberechnung der KS; resultierende Firmware zeigt teilweise Ersetzung mit digitalen Artefakten.

Beseitigung digitaler Artefakte

Ziffern (1–5) werden generiert als: 00-Byte + Nibble aus dem 12. Byte (Basis 0x80 + Wert). Suche nach Signaturen in der Firmware für Ziffern, Nullsetzen der Daten für '4' (behalten von 1, 2, 3).

  • Format: Byte-Nummer – Daten.
  • Neuberechnung der KS für geänderte Zeilen.

Endgültige Firmware liefert vollständige Emulation von P/D ohne Ziffernartefakte.

Wichtige Erkenntnisse

  • I²C-Traffic-Sniffing ermöglicht die Lokalisierung statischer Daten ohne Code-Analyse.
  • Ghidra-Hex-Suche funktioniert effektiv auch bei unbekannten Architekturen wie HCS12.
  • SREC-Patchen erfordert präzise Handhabung der Prüfsumme für Validität.
  • Ansatz ist skalierbar auf andere eingebettete Systeme mit seriellen Protokollen.
  • Methode reduziert Risiko, da ausgeführter Code nicht modifiziert wird.

— Editorial Team

Advertisement 728x90

Weiterlesen