Większość mikrokontrolerów ma obecnie metody specyficzne dla części lub producenta w celu ochrony wbudowanego kodu oprogramowania układowego. Zazwyczaj odbywa się to przez zablokowanie obwodów, które normalnie umożliwiają odczyt pamięci kodu. (Musisz znaleźć szczegółowe informacje na temat części w arkuszu danych lub na stronie internetowej producenta w odpowiednich uwagach dotyczących aplikacji).
Po zablokowaniu nie jest możliwe odczytanie pamięci kodu przy użyciu normalnych technik. Zapewnia to odpowiedni poziom ochrony, aby uniemożliwić większości hakerów przeglądanie kodu maszynowego wbudowanej aplikacji.
Wiele urządzeń MCU ma obecnie wbudowaną pamięć FLASH do zapisywania kodu programu. Poprzednio zapisany i chroniony program przechowywany w pamięci FLASH można zwykle zastąpić nowym kodem, ale operacja kasowania pełnego układu FLASH wymaga odblokowania mechanizmu zabezpieczającego. Po skasowaniu część będzie działać tak, jak przed oryginalną blokadą zabezpieczającą. Jeśli zostanie załadowany nowy program, ogólnie możliwe jest ponowne zablokowanie części w celu ochrony nowo załadowanego kodu maszynowego.
Dyskusja na temat ochrony kodu w mikrokontrolerach nie byłaby kompletna bez wspomnienia, że zwykle nie ma gwarancji, że jakikolwiek schemat ochrony oferowany przez producenta części jest głupi. Producenci stwierdzą nawet, że systemy ochrony nie są w 100% głupie. Jednym z powodów tego jest fakt, że istnieje cały przemysł czarnorynkowy, gdzie za opłatą staranni hakerzy będą czytać kod z chronionej części dla każdego, kto chce zapłacić. Opracowali różne schematy, które pozwalają na odczyt kodu z pamięci ROM lub FLASH na chronionych mikrokontrolerach. Niektóre z tych schematów są niewiarygodnie sprytne, ale w niektórych rodzinach działają lepiej niż w innych. Pamiętaj więc o tym, a następnie staraj się chronić swój program przed wścibskimi oczami.
Gdy ktoś ma już binarny obraz kodu maszynowego odczytanego z mikrokontrolera, bez względu na to, czy był to chroniony mikrokontroler, czy nie, może przetworzyć kod maszynowy za pomocą narzędzia zwanego deasemblerem. Spowoduje to zamianę danych binarnych z powrotem na kod języka asemblera, który można przestudiować, aby dowiedzieć się, jak działają algorytmy programu. Dokonywanie dokładnego demontażu kodu maszynowego jest żmudnym zadaniem, które może wymagać ogromnej ilości pracy. W końcu proces może prowadzić do kodu asemblera, jak opisałem. Jeśli twój program został napisany w języku wysokiego poziomu, takim jak C, C ++ lub Basic, kod asemblera będzie reprezentował tylko skompilowany i połączony wynik twojego programu. Zasadniczo nie jest możliwe przywrócenie skradzionego kodu aż do poziomu języka wysokiego poziomu.
Oznacza to, że pisanie oprogramowania wbudowanego aplikacji w języku wysokiego poziomu jest korzystne. Zapewnia kolejną warstwę, która utrudnia pełne uruchomienie inżynierii wstecznej programu. Jeszcze większą korzyść można uzyskać dzięki zastosowaniu najnowocześniejszych rozwiązań w optymalizacji kompilatorów do kompilacji wbudowanej aplikacji, ponieważ optymalizatory o najwyższej wydajności mogą dosłownie zmienić program w ogromną miskę spaghetti pełną dziesiątek wezwań do bardzo trudnych podprogramów do rozszyfrowania w dezasemblerze.
Większość doświadczonych programistów wbudowanych powie Ci, abyś użył dowolnego schematu ochrony, który jest oferowany na MCU w twojej aplikacji ... ale nie polegać na nim do końca drogi dla twojego produktu. Powiedzą ci, że najlepszym sposobem na wyprzedzenie konkurencji jest ciągłe uaktualnianie produktu, tak aby stare wersje były przestarzałe i nie były interesujące do czasu, gdy hakerzy mogli sklonować Twój kod. Zmień kod, dodaj nowe funkcje, od czasu do czasu obracaj kartami komputerowymi, aby zamieniać wszystkie wejścia / wyjścia i wszelkie inne rzeczy, o których możesz pomyśleć. W ten sposób możesz wygrać wyścig za każdym razem.