Powrót do strony głównej

Rewers 9S12HY64: łatanie bez diz assemblera

Artykuł opisuje rewers firmware 9S12HY64 bez diz assemblera: sniffing I²C, wyszukiwanie sygnatur w Ghidra, łatanie SREC do zmiany wyświetlacza. Osiągnięto działający rezultat emulacji wskaźników. Podejście stosowalne do podobnych zadań.

Łatanie firmware 9S12HY64: od I²C do rezultatu
Advertisement 728x90

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:

Google AdInline article slot
  • 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ą:

Google AdInline article slot
  • 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 |

Google AdInline article slot

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

| 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

Advertisement 728x90

Czytaj dalej