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:
- 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:
- 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 |
|-------|------------------------|----------------|
| 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
Noch keine Kommentare.