Część II - opis formatu plików potrzebnych do zaprogramowania mikrokontrolerów NY8AE51F/NY8A051H.
Nyquest do zapisu danych generowanych przez kompilator wybrał pliki z rozszerzeniem BIN.
Nie są to jednak proste pliki jakich byśmy się spodziewali. Dane w nich zapisane są w formacie RIFF. Pliki RIFF składają się z bloków.
Najpierw mamy identyfikator bloku głównego "RIFF" (4 Bajty), po nim długość pola danych bloku głównego (4 Bajty), potem identyfikator podformatu "NQST" (4 Bajty).
Potem zaczynają się bloki. 4 Bajty identyfikator bloku, 4 Bajty długość, x Bajtów danych.
Nas interesuje blok "xdat" który zawiera 1040 słowa z zawartością pamięci MTP/OTP (1KW programu + 16W "fusebitów").
Tu zaczyna się zabawa.
Żeby nie było za łatwo, Nyquest postanowił zaszyfrować dane.
Aby rozgryźć sposób kodowania postanowiłem wygenerować najprostszy możliwy program. 1024 NOPy
Dane okazały się dość losowe. Zapisałem sobie zawartość do późniejszego porównania i wygenerowałem kolejne BINy. Tym razem zmieniłem jedną instrukcję, raz na początku, raz na końcu.
Na moje szczęście okazało się że zmiana jednej instrukcji powoduje zmianę tylko 2B. Co ciekawe, w odwrotnej kolejności. Zmiana na końcu programu była na początku bloku danych a na początku programu na końcu bloku danych.
Postanowiłem zXORować dane z plikiem z samymi NOPami. Wyglądało to już lepiej, ale dalsze testy ujawniły kolejne szyfrowanie. Bity w słowach były pomieszane.
Zanim rozszyfrowałem sposób mieszania wygenerowałem sporo "programów" z kodem typu "movia 0x00", "movia 0x01", "movia 0x02"...
Zmarnowałem parę kartek na rysunki ze strzałkami, aż po kilku poprawkach znalazłem sposób mieszania. Niestety to nie koniec. Mieszanie okazało się zależne od tego gdzie w pamięci występuje słowo.
Kolejne kilka kartek strzałeczek i miałem już wszystko.
Funkcję dekodującą przedstawiam poniżej:
Kod: C / C++
Prawdopodobnie dało by się odkryć sposób generacji danych do XORowania, ale stwierdziłem że to tylko ~2KB i nie chce mi się tracić na to czasu.
"nop_bin" dla procków z 2KW pamięci jest nieco inny. Wygląda na to, że rozmiar pamięci ma wpływ na generowane dane.
Fajne? Ranking DIY
