Modyfikacja danych statycznych w firmware'ie 9S12HY64 bez dezasemblacji
Zmiana wyświetlanych symboli na wyświetlaczu tarczy pomiarowej samochodowej z mikrokontrolerem MC9S12HY64 realizowana jest poprzez analizę ruchu I²C i modyfikację pliku SREC firmware'u. Metoda nie wymaga dezasemblacji kodu — skupia się na wyszukiwaniu podpisów w danych statycznych za pomocą narzędzia Ghidra. Celem jest zamiana znaków A na P oraz M na D, a także eliminacja artefaktów cyfr.
Analiza sprzętowa i protokół
Mikrokontroler 9S12HY64 podłączony jest do wyświetlacza przez 6-pinowy interfejs bez zewnętrznego sterownika. Próba ciągłości obwodów oraz dokumentacja referencyjna potwierdzają używanie protokołu I²C. Analizator logiczny Saleae rejestruje ruch między mikrokontrolerem a wyświetlaczem we wszystkich trybach przełącznika biegów.
Podsumowująca tabela ruchu wykrywa zmieniające się bajty jako potencjalne podpisy:
- Tryb A1: 5A C9 9A 8D...
- Tryb M1: 5A C9 9A 8D... (różnice w pierwszych bajtach)
Bajty oznaczone czerwonym kolorem są kandydatami do poszukiwania w firmware'ie, zakładając, że stanowią dwuwymiarową tablicę danych statycznych.
Wyszukiwanie podpisów w firmware'ie
Ghidra służy do wyszukiwania w formacie hex bez dezasemblacji architektury HCS12. Podpis 0x5A, 0xC9, 0x9A, 0x8D lokalizuje obszar pamięci. Format pakietów: numer bajtu wyświetlacza + dane.
Zgodność ruchu z pamięcią:
- Pierwszy bajt określa segment (A/M).
- Następne bajty to wzorce dla symboli.
Z nowej tarczy pobrano pakiety dla P i D:
- P: zmiana jednego bajtu.
- D: poprawka dwóch bajtów.
Porównanie pakietów:
| Tryb | Pakiet oryginalny | Pakiet docelowy |
|------|-------------------|----------------|
| A1 | 5A C9 9A 8D... | 5A XX XX 8D... (P) |
| M1 | 5A C9 9A 8D... | 5A YY ZZ 8D... (D) |
Modyfikacja pliku SREC
Struktura SREC: nagłówek, adres, dane, checksum. Zmiana bajtów wymaga ponownego obliczenia KS.
Skrypt Pythona do obliczania KS:
# Przykład skryptu (przepisany z GitHub)
def calc_srec_checksum(line):
# Suma bajtów z negacją
s = sum(bytes.fromhex(line[1:-1])) # Pomijając S i KS
return format((~s + 1) & 0xFF, '02X')
Zmiany:
- Dla P: modyfikacja 1. bajtu w linii.
- Dla D: 1. i 2. bajt w dwóch liniach.
Przeliczenie KS, wynik: częściowa zamiana z artefaktami cyfr.
Eliminacja artefaktów cyfr
Cyfry (1–5) tworzone są jako: 0. bajt + nibble z 12. bajtu (podstawa 0x80 + wartość). Wyszukiwanie podpisów cyfr w firmware'ie, zerowanie danych dla '4' (pozostawiając 1,2,3).
- Format: numer bajtu — dane.
- Ponowne obliczenie KS dla zmienionych linii.
Ostateczny firmware zapewnia pełną emulację P/D bez cyfr.
Co jest ważne
- Sniffing ruchu I²C pozwala zlokalizować dane statyczne bez analizy kodu.
- Wyszukiwanie hex w Ghidra jest skuteczne nawet dla nieznanych architektur (HCS12).
- Modyfikacja SREC wymaga dokładnego obliczenia KS dla poprawności.
- Metoda jest skalowalna na inne systemy wbudowane z protokołami szeregowymi.
- Technika minimalizuje ryzyko, unikając modyfikacji kodu wykonywalnego.
— Editorial Team
Brak komentarzy.