Способы защиты микроконтроллера

Микроконтроллер

Ес­ли ты занимал­ся мик­рокон­трол­лерами, то, конеч­но, слы­шал о битах кон­фигура­ции. Для раз­ных семей­ств они называ­ются по‑раз­ному: в AVR это фьюзы, а в PIC — кон­фигура­цион­ное сло­во. Сегод­ня мы раз­берем­ся с ними попод­робнее, а еще рас­смот­рим их при­мене­ние для защиты про­шив­ки в кон­трол­лере.

Ре­комен­дую озна­комить­ся с мо­ей прош­лой стать­ей «Какой микроконтроллер выбрать», в которой более под­робно опи­саны мик­рокон­трол­леры, о которых говорит­ся ниже.

AVR

В семей­стве AVR для нас­трой­ки при­меня­ются фьюзы. Фьюзы (от англ. fuse — пре­дох­ранитель) — это осо­бые биты в мик­рокон­трол­лере, которые, как и все биты, хра­нят информа­цию. Их основные осо­бен­ности сле­дующие:

  • они хра­нят­ся и про­шива­ются отдель­но от осталь­ной памяти;
  • из­меня­ются толь­ко извне;
  • уп­равля­ют работой мик­рокон­трол­лера на самом низ­ком уров­не.

Луч­ше все­го их мож­но объ­яснить на при­мере дозимет­ра РКСБ-104.

Дозиметр РКСБ-104
До­зиметр РКСБ-104

Ос­новная нас­трой­ка его выпол­нялась одним перек­лючате­лем на перед­ней панели. А вот более тон­кие нас­трой­ки тре­бова­ли снять защит­ную крыш­ку с зад­ней стен­ки и вос­поль­зовать­ся малень­кими перек­лючате­лями (белые посере­дине).

Задняя панель со снятой крышкой
Зад­няя панель со сня­той крыш­кой

В AVR эти биты для удобс­тва соеди­няют­ся в бай­ты: стар­ший, млад­ший, защит­ный и допол­нитель­ный. К каж­дому биту мож­но получить дос­туп по прин­ципу байт → бит. Млад­ший байт обыч­но отве­чает за так­тирова­ние, а стар­ший — за плюш­ки. Биты отли­чают­ся от чипа к чипу, поэто­му с каж­дым чипом в иде­але сто­ит раз­бирать­ся отдель­но с помощью докумен­тации.

Зна­чение битов в этом семей­стве инверти­рова­но: 1 зна­чит, что бит стерт, а 0 — что уста­нов­лен. Но вот прог­раммы для про­шив­ки МК работа­ют по‑раз­ному. Для раз­ных прог­рамм нуж­но уточ­нять логику работы с фьюза­ми.

Что могут фьюзы в этом семей­стве МК:

    • уп­равле­ние так­тирова­нием (час­тота генера­тора, внеш­ний или внут­ренний генера­тор);
    • раз­решение на чте­ние про­шив­ки мик­рокон­трол­лера (самое инте­рес­ное, но об этом поз­же);
  • уп­равле­ние тай­мерами;
  • за­щита EEPROM;
  • бо­лее спе­цифич­ные фун­кции, их надо уточ­нять к кон­крет­ному чипу.

Са­мые «популяр­ные» биты:

  • CKSEL — их четыре, и они отве­чают за так­тирова­ние;
  • SUT — их два, и они управля­ют режимом запус­ка так­тирова­ния;
  • CKOPT — кон­фигури­рует внут­ренний генера­тор;
  • RSTDISBL — режим работы нож­ки RESET МК;
  • SPIEN — раз­решение SPI;
  • EESAVE — защита EEPROM;
  • BOOTRST — адрес, отку­да начать исполнять код;
  • BODEN — кон­троль питания;
  • SELFPRGEN — раз­решение записи в память изнутри;
  • OCDEN — вот он, бит, раз­реша­ющий чте­ние про­шив­ки.

Счи­тыва­ют фьюзы обыч­но не вруч­ную, а с помощью спе­циаль­ных каль­кулято­ров. Вот один из них — Fusecalc.

Софт

При работе с фьюза­ми будь пре­дель­но вни­мате­лен. Неп­равиль­но выс­тавлен­ный бит может прев­ратить чип в «кир­пич». Перед про­шив­кой уточ­няй логику работы с фьюза­ми в тво­ей прог­рамме.

Linux

Я обыч­но работал с прог­раммой avrdude. При­веду пару команд без допол­нитель­ных парамет­ров (чип, прог­рамма­тор). Счи­тыва­ние про­шив­ки из чипа в файл:

Есть допол­нитель­ные парамет­ры и  -p. Пер­вый отве­чает за прог­рамма­тор, а вто­рой — за чип. В качес­тве при­мера — коман­да для про­шив­ки кон­трол­лера ATmega328p с помощью USBASP:

В коман­дах есть стран­ные стро­ки вида flash:<wbr />w:<wbr />flash_dump.<wbr />hex. Это стро­ки в спе­циаль­ном фор­мате для  avrdude. Для чего такое решение — не знаю ни я, ни кто‑либо еще.

Час­ти этих строк раз­делены дво­ето­чиями:

  • пер­вая часть — область памяти в МК (нап­ример flash или  lfuse);
  • вто­рая — нап­равле­ние ( w — write или  r — read);
  • третья — файл на локаль­ном устрой­стве (нап­ример файл с про­шив­кой);
  • пос­ледняя (опци­ональ­ная) — фор­мат фай­ла (нап­ример r — raw или  i — ihex, инте­лов­ский шес­тнад­цатерич­ный).

Бо­лее спе­цифич­ные слу­чаи при­мене­ния этой стро­ки выходят за рам­ки дан­ной статьи.

Windows

Окон­щики обыч­но поль­зуют­ся прог­рамма­ми с GUI. Нап­ример, AVRdude GUI.

Пер­вая вклад­ка пред­назна­чена для заг­рузки про­шив­ки. Мы видим и можем выб­рать целевое устрой­ство, фор­мат фай­лов про­шив­ки и пути к самим фай­лам. Один пред­назна­чен для прог­раммы, дру­гой — для энер­гонеза­виси­мой памяти.

Вто­рая вклад­ка кон­фигури­рует прог­рамма­тор: какая исполь­зует­ся модель и на каком пор­те она сидит.

Вклад­ка управле­ния защит­ными битами.

А вот наконец и фьюзы. Зада­ются они как бай­ты.

Как видишь, все прос­то, и исполь­зовать фьюзы мож­но, даже не откры­вая тер­минал!

На Arduino мож­но кон­фигури­ровать МК, не задумы­ваясь о работе фьюзов. Этим занима­ется Arduino IDE в авто­мати­чес­ком режиме.

STM

В семей­стве STM для задания кон­фигура­ции исполь­зуют­ся биты в спе­циаль­ных регис­трах. Информа­цию об этих регис­трах и их наз­начении ищи в докумен­тации. Менять зна­чения этих регис­тров мож­но и нуж­но на ходу, но, в отли­чие от AVR, кон­фигури­рует­ся тут не толь­ко самое низ­коуров­невое (так­тирова­ние, нап­ример), но и вся­кая мел­кая перифе­рия.

РЕКОМЕНДУЕМ:
Как разогнать микроконтроллер

Нас­тра­ивать надо мно­го, даже если про­ект в духе Hello world, поэто­му обыч­но это дела­ется не руч­ной записью регис­тров, а с помощью кра­сиво­го и мощ­ного соф­та.

Софт

STM32CubeMX — это офи­циаль­ное и бес­плат­ное прог­рам­мное обес­печение, соз­данное в ком­пании STMicroelectronics. У нее есть и дру­гая и тоже бес­плат­ная IDE для сво­их МК — Atollic TrueSTUDIO. Но нач­нем мы с «Кубика».

CubeMX
CubeMX

Ра­зоб­рать­ся с ним прос­то: соз­даешь про­ект, выбира­ешь кон­трол­лер – и пог­нали. Пор­ты нас­тра­ивают­ся пря­мо на инте­рак­тивной кар­тинке, а перифе­рия — с помощью меню сле­ва. Боль­шинс­тво опций под­писано: не надо боль­ше лазить в даташит и раз­бирать­ся с битами регис­тров. А в кон­це, по нажатию на соот­ветс­тву­ющую кноп­ку, прог­рамма сге­нери­рует код на язы­ке прог­рамми­рова­ния в виде под­клю­чаемо­го фай­ла.

Atollic TrueSTUDIO — это еще одна наворо­чен­ная IDE для мик­рокон­трол­леров STM. В ней мож­но и код писать, и отла­живать. А еще она хорошо сты­кует­ся с «Кубом».

Есть еще System Workbench for STM32 и, конеч­но, Arduino IDE с ее неис­числи­мыми модуля­ми.

Посторонним вход запрещен!

Ес­ли ты не хочешь исполь­зовать софт про­изво­дите­ля МК, мож­но все сде­лать руками. Бла­го это отно­ситель­но нет­рудно. При­веду при­мер кода из одно­го сво­его про­екта.

Эта фун­кция отве­чает за кон­фигура­цию UART. Как видишь, мож­но обой­тись и без вся­ких кубов (хотя на самом деле CubeMX на мой ноут прос­то не уста­новил­ся из‑за сла­бых харак­терис­тик).

Библиотеки

Про­шив­ки для STM, как пра­вило, пишут­ся с помощью спе­циаль­ных биб­лиотек. Есть как офи­циаль­ные, так и кас­томные (HAL и SPL). Про­ще говоря, это стан­дар­тный набор биб­лиотек. Мож­но, конеч­но, и без них — мне так даже боль­ше нра­вит­ся: луч­ше понима­ешь, как работа­ет твой код.

При­веду коман­ды для ком­пиляции и про­шив­ки STM8 из упо­мяну­того про­екта.

Здесь мы видим две прог­раммы — stm8flash для про­шив­ки и sdcc для ком­пиляции. Может, кому‑то при­годит­ся.

  • stm8flash — это прог­рамма c GitHub. По наз­начению — тот же AVRdude, толь­ко для STM8. Я исполь­зовал три аргу­мен­та: для ука­зания прог­рамма­тора, в моем слу­чае st-linkv2 (прог­рамма­тор ST-Link, под­робнее — в моей прош­лой статье), -p для ука­зания целево­го чипа (у меня это была плат­ка с AliExpess с чипом STM8S103F3); -w для нап­равле­ния работы (write, записать) и файл с про­шив­кой.
  • sdcc (small device C compiler) — ком­пилятор язы­ка C для «малень­ких» устрой­ств, то есть для мик­рокон­трол­леров. Это ана­лог GCC, но для МК.
  • —Werror — счи­тать все пре­дуп­режде­ния ошиб­ками. Стран­но, навер­ное, ведь обыч­но прог­раммис­ты забива­ют на пре­дуп­режде­ния, а тут такое. Еще есть --std-sdcc99 — это стан­дарт язы­ка. Я исполь­зовал этот, потому что он оши­бок не выдавал.

При низ­коуров­невом прог­рамми­рова­нии стан­дарты язы­ка С очень сущес­твен­ны и код может прек­расно ком­пилиро­вать­ся на одном и либо вооб­ще не ском­пилиро­вать­ся, либо работать неп­равиль­но на дру­гом стан­дарте. В этом воп­росе отталки­вай­ся от учеб­ников, по которым ты учил­ся прог­рамми­ровать. Как пра­вило, во вступ­лении написа­но, какой стан­дарт будет рас­смот­рен в кни­ге.

Ос­таль­ные аргу­мен­ты, кро­ме фай­ла кода, — это для какого МК ком­пилиро­вать код.

PIC

Тут уже вмес­то фьюзов исполь­зует­ся осо­бое кон­фигура­цион­ное сло­во дли­ной два бай­та. Это сло­во име­ет адрес в памяти, который нуж­но уточ­нять в докумен­тации. Там же мож­но най­ти струк­туру это­го сло­ва и наз­начение битов. Кста­ти, логика битов в этом семей­стве сме­шан­ная. Еди­ница может зна­чить как и «вклю­чено», так и «вык­лючено». Пов­торюсь, вни­матель­но читай докумен­тацию.

При­веду вырез­ку из до­кумен­тации на чип PIC16F627A.

Вырезка из документации
Вы­рез­ка из докумен­тации

Тут мы видим сле­дующие нас­трой­ки:

  • CP — защита flash-памяти, то есть про­шив­ки;
  • CPD — защита области с дан­ными;
  • LVP — низ­коволь­тная про­шив­ка;
  • и так далее.

Ра­бота­ет кон­фигура­цион­ное сло­во как ста­тичес­кая гло­баль­ная перемен­ная в язы­ке С. Есть учас­ток кода, который при про­шив­ке записы­вает­ся пря­мо на область памяти, отве­чающей за кон­фигура­цию мик­рокон­трол­лера. Менять его на ходу, конеч­но, нель­зя. Работа схо­жа с AVR-кон­трол­лерами.

Софт

Софт я уже опи­сывал в мо­ей прош­лой статье, поэто­му покажу лишь осо­бен­ности при кон­фигури­рова­нии этих самых кон­трол­леров.

Изображение взято из этой статьи: https://habr.com/ru/post/321542/
Изоб­ражение взя­то из этой статьи: https://habr.com/ru/post/321542/

Тут исполь­зует­ся язык ассем­бле­ра, и мы видим строч­ку __CONFIG <wbr />03FF4H. Воз­можно, это мак­рос или что‑то подоб­ное, но нам важен смысл — это чис­ло записы­вает­ся как кон­фигура­цион­ное сло­во и кодиру­ет в себе нас­трой­ки МК, в ком­мента­риях к коду они даже под­писаны.

И вот еще один при­мер кода.

Он написан на язы­ке JAL, который был соз­дан спе­циаль­но для прог­рамми­рова­ния это­го семей­ства МК. Этот код явно читабель­нее ассем­бле­ра. Чего уж говорить — поч­ти все читабель­нее ассем­бле­ра! Хотя PIC тра­дици­онно прог­рамми­руют­ся имен­но на нем.

Защита и взлом микроконтроллеров

Те­орию мы разоб­рали. Теперь погово­рим о защите. Как ты понял, у семей­ства AVR защитой слу­жит зна­чение фьюза бита. Если защита уста­нов­лена, кон­трол­лер не даст ска­чать про­шив­ку. А если сбро­сить биты защиты, это же воз­можно? Воз­можно, но и тут тебя ждет неболь­шая свинья: при сбро­се бита защиты МК чис­тит всю память.

Что же, через софт не получи­лось — пой­дем через железо. Элек­тро­ника не прог­рамми­рова­ние — тут есть что пощупать. Итак, обра­тим­ся к исто­рии: ког­да‑то дав­но сущес­тво­вали чипы памяти с УФ‑сти­рани­ем.

Чип M27c256B — память с УФ-стиранием
Чип M27c256B — память с УФ‑сти­рани­ем

На кор­пусе чипа было спе­циаль­ное окош­ко, которое обыч­но чем‑нибудь зак­леива­лось. Записы­ваешь дан­ные при прог­рамми­рова­нии встро­енны­ми средс­тва­ми, а вот сти­раешь с помощью спе­циаль­ного устрой­ства, по конс­трук­ции схо­жего с лам­пой для ноготоч­ков.

Лампа для коготков
Лам­па для когот­ков

От­кры­ваешь окош­ко, кла­дешь в при­бор мик­росхе­му — и через некото­рое вре­мя забира­ешь чис­тый чип. С лам­пой‑то все понят­но — мож­но у жены одол­жить. Глав­ное, что­бы не замети­ла, а то потом не объ­яснишь, что тебе лам­па нуж­на через окош­ко память сти­рать.

А вот с окош­ком что делать? На сов­ремен­ных чипах его нет. Если дыр­ки нет — надо ее сде­лать! Я знаю три метода: механи­чес­кий, химичес­кий и лазер­ный.

  1. При механи­чес­ком методе, как выразил­ся поль­ский бло­гер, szlifierka precyzyjna — пре­цизи­онной шлиф­машин­кой, то есть дре­мелем, надо твер­дос­плав­ной насад­кой прог­рызть дыроч­ку в кор­пусе.
  2. При химичес­ком методе при­меня­ется смесь кис­лот (цар­ская вод­ка, если я не оши­баюсь), и ей прот­равли­вает­ся все то же отвер­стие. Но раз­добыть азот­ную кис­лоту проб­лематич­но: ее обо­рот под кон­тро­лем, пос­коль­ку она исполь­зует­ся при про­изводс­тве взры­воопас­ных веществ, так что при­дет­ся поис­кать дру­гой спо­соб. Если, конеч­но, у тебя не заваля­лась баноч­ка азот­ной кис­лоты.
  3. Пос­ледний метод исполь­зует лазер. Им прос­то про­жига­ется окош­ко. Лазер мож­но най­ти на ЧПУ‑гра­верах, но хва­тит ли их мощ­ности — я не знаю.

Ко­роче, будем счи­тать, что окош­ко к под­ложке чипа ты про­делал.

Получится что-то похожее
По­лучит­ся что‑то похожее

Даль­ше нуж­но понять, где область, которую надо защитить, а где — которую сте­реть. По сути, нам надо облу­чить все, кро­ме Flash и EEPROM. Опре­делять, где что, тебе при­дет­ся инту­итив­но. Мож­но пос­мотреть каналы Lisin YT и CuriousMarc — там есть вскры­тие и изу­чение чипов. Мож­но пос­мотреть на типич­ные ошиб­ки и тех­нологию вскры­тия чипов.

Итак, что защитить, мы разоб­рались, даль­ше защища­ем чем‑нибудь све­торе­зис­тивным. Нап­ример, свя­той синей изо­лен­той. Ну а пос­ле суем чип в сти­ратель и ждем нем­ного.

Ес­ли что, про лам­пу для ног­тей — это шут­ка. Нуж­на лам­па с опре­делен­ной дли­ной вол­ны и мощ­ностью.

Все, исхо­да два: либо все сде­лано пра­виль­но и акку­рат­но и защита сня­та, либо что‑то пош­ло не так и тебе при­дет­ся искать, что имен­но.

PIC и STM

У кон­трол­леров PIC все так же, как и у AVR. Усло­вия те же, метод тот же.

У STM все нес­коль­ко инте­рес­нее. О методах защиты написа­но в до­кумен­тации. Если вкрат­це, они не зап­реща­ют счи­тывать чип, а соз­дают усло­вия, что­бы сде­лать это было невоз­можно.

Вместо напутствия

Преж­де чем ты побежишь красть про­шив­ки, пре­дуп­режу: даже если ты ее ска­чаешь, она будет в виде бинар­ного кода, который еще надо дизас­сем­бли­ровать, изу­чить и вос­ста­новить логику работы, а это ой как неп­росто. Поэто­му, на мой взгляд, лег­че взло­мать компь­ютер прог­раммис­та, который писал про­шив­ку, и ска­чать исходни­ки с него. Но это уже тема не моей статьи!

Понравилась статья? Поделиться с друзьями:
Добавить комментарий