реклама на сайте
подробности

 
 
> Автономный микропрограмматор BootProg для прошивки boot-а (а может и не только), "Схема" из 5-и деталей + программа. Может заинтересует...
Dimonira
сообщение Nov 9 2008, 21:12
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Начну с того, для чего это потребовалось и "откуда ноги растут".
Три года назад сделал по заказу девайсы на ATMega16, софт к ним. Девайсы имели интерфейс с компьютером по RS-232 и я заложил в схему возможность запуска boot-загрузчика (перемычку). Но тогда по запарке, а может из экономии денег (не помню точно), заказчик решил не делать boot-загрузчик и прошивать девайсы только программатором. За три года много девайсов разошлось по миру и никому не требовалось что-то менять в девайсах.
Но тут вдруг в Германии нашлись потребители, которые захотели-таки немного "заточить" девайсы под себя. И встал вопрос а как быть? Ну, софт доработать не проблема, а как его заменить в девайсах? И при этом не открыть прошивку, т.е. не отдать её в чужие руки в открытом виде. Ехать кому-то в Германию с программатором, софтом и т.п. накладно. Отдать прошивку (если они сами найдут программатор) нельзя, мало ли что. Девайсы то по железу простые, скопировать раз плюнуть. Просить чтобы прислали девайсы сюда тоже накладно, долго, проблемы таможни и т.д. Что делать?
И тут появилась идея автономного (т.е. без компьютера) микропрограмматора. Это маленькое устройство, которое подключается к разъёму ISP девайса (питается от него же) и программирует его после включения питания. Тогда мы им высылаем этот маленький программатор и они с его помощью "оприходуют" все свои девайсы. Для простоты было решено таки программировать AES-boot загрузчик, а потом уже с компьютера заливать в девайсы новую версию софта (а потом и следующие обновления, если будут). К тому же загрузчик мал по размеру (менее 2К), так что нет проблемы его "запихать" в память контроллера микропрограмматора. Конечно, возможность "перехвата" кода остаётся - если "снять" весь обмен по ISP в момент программирования. Но всё же это потребует некоторых "спец" средств, которых может не быть под рукой. Да и желание "связываться" может отпадёт. Для "надёжности" ещё решено применить счётчик программирований, - задать количество девайсов, которые можно будет прошить микропрограмматором. Счётчик будет в eeprom, декрементироваться после каждого удачного программирования. При обнулении счётчика - в отказ.

Теперь о железе микропрорамматора. Это 5-ть деталей: контроллер ATMega48V (в DIP-корпусе), светодиод, резистор 470 Ом (или около того), панелька 28 ног для контроллера и разъём ISP (в моём случае 6 пин) для втыкания в целевой девайс. Схему тут не привожу, т.к. её рисовать дольше чем написать текстом: выводы земли и питания с ISP разъёма подаются на ноги котроллера 8,22 и 7,20 соответственно; сигналы MOSI, MISO, SCK на одноимённые выводы контроллера - 17,18,19; сигнал RESET - на вывод 16; светодиод катодом на вывод 6 и анодом через резистор на плюс питания (нумерация ног для DIP-корпуса!). Тактирование делается внутренним RC-генератором, на который контроллер "настроен" с завода. Я только сбросил фуз-бит делителя на 8, чтобы контроллер начал работать на тактовой 8 МГц. Панелька нужна для того чтобы вынуть контроллер и зашить его в программаторе. Но можно доработать схему для того чтобы шить контроллер не вынимая, - для этого надо добавить переключатель, который переключает сигнал RESET с разъёма ISP между выводами 16 и 1 контроллера. Я так не делал, чтобы избежать каких-либо проблем с немцами или при пересылке, - вдруг перемычка сорвётся, будет переставлена и т.д., надо чтобы всё было "железно".

Как работает. Подключаем к ISP разъёму, включаем питание целевого девайса, начинается программирование. Поскольку оно очень быстрое, то индикация сделана только "по результатам". Если не удалось войти в режим программирования, то длинная вспышка светодиода и такая же пауза, попытки войти в режим программирования циклически повторяются. Если контроллер девайса не тот, который должен прошиваться (не тот ID кристалла), то короткая вспышка с длинной паузой. Если истёк счётчик прошиваний, то короткая вспышка и короткая пауза. Если всё в норме, то постоянное свечение. В последних трёх случаях микропрограмматор в итоге зацикливается на высветке.

Софт микропрограмматора сделан путём кастрации софта из моей темы про программатор Dimoniprog (тут). Для упрощения все ожидания завершения программирования флеша или фузов с локами сделаны просто на задержках.
Для использования проекта в своих целях надо адаптировать под нужный целевой кристалл (код кристалла, задержки, значения фузов и локов). Это делается настройками определений в начале файла isp.c. У меня всё настроено для программирования целевого кристалла ATMega16. Возможно, для надёжности следует уточнить коды команд интерфейса сериального программирования по даташиту целевого кристалла (хотя это вроде у всех АВР Атмелов однохренственно). В файле main.c надо задать счётчик возможных программирований и вставить код своего boot-загрузчика. Внимание! В приводимом исходнике main.c код загрузчика по понятным причинам искажён (потому работать и не будет) и приводится для наглядности. Код загрузчика (для тех кто в танке) берётся из Application Note AVR231.
Для того чтобы легко получить код своего загрузчика в виде исходного текста, я наваял програмку Hex2Src, которая принимает через командную строку имя файла загрузчика, например, boot.hex (можно не только в intel-hex формате, но и в motorola и tektronix). После запуска будет создан файл с тем же именем, но расширением .c. Из него надо взять нужное и с небольшими правками перенести в файл main.c. Думаю, трудностей возникнуть не должно.
После внесения всех правок компилируем проект BootProg. Поскольку в проекте используется eeprom, то выходной файл компилятора задан в simple формате. Так что для получения из него файла кода в hex-формате надо применить POSTLINK команду. Для простоты я её добавляю в оболочку IAR через "Configure Tools...". Надо ввести следующее:
Код
Menu Text: Postlink
Command: $TOOLKIT_DIR$\bin\POSTLINK.BAT
Argument: $TARGET_FNAME$ $TOOLKIT_DIR$\bin\POSTLINK.EXE
Initial Directory: $TARGET_DIR$

И поставить галку "Redirect to Output window". Сам файлик POSTLINK.BAT (оригинальный в директории BIN софта IAR) надо подменить на поправленный, который можно взять из темы тут.
После компиляции вызываем из меню "Tools" команду "Postlink". В результате получаем hex-файл прошивки ATMega48V. Зашиваем флеш, а зашивать eeprom нет необходимости - инициализация счётчика загрузок делается программно. Микропрограмматор готов!
---------------------------------------------------
Сделал я сей девайс и пришли другие идеи. Ведь такая штука может быть нужна не только для случая подобного моему. Например, вот ещё. Если увеличить память (другой контроллер взять), то можно шить не только загрузчик, но и вообще весь софт в целевой девайс. Тогда, допустим, это может быть востребовано на производстве - клепают девайсы и тут же шьют, ни компьютеров не надо, ни программаторов (надо только счётчик загрузок выкинуть). Один раз зашил где-то этот микропрограмматор, а потом только переливай.
Или вот ещё мысль. Можно сделать микропрограмматор (опять же если взять с большей памятью) на разные целевые кристаллы, - каждому своя "заливка". При этом, например, выбирать что заливать по коду кристалла, который считывается вначале. Или выбирать перемычками. Тогда будет "походный автономный заливатель" на несколько девайсов.
Прикрепленные файлы
Прикрепленный файл  BootProg.rar ( 21.69 килобайт ) Кол-во скачиваний: 128
Прикрепленный файл  Hex2Src.rar ( 39.33 килобайт ) Кол-во скачиваний: 99
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Waso
сообщение Oct 28 2010, 10:05
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



Здравствуйте! Возникла необходимость собрать похожий девайс, но со своей спецификой. Допустим, имеется
заказчик (или несколько), который собирает железо, а программировать его некому. Программист (я) находится
в другом городе. По предоплате заказчик работать отказывается, предлагает проценты от продаж железа.
По опыту такие заказчики платят проценты только пока программа нуждается в доработках. Поэтому нужно
собрать автономный программатор со счетчиком числа прошивок и защищенной передачей на целевой кристалл,
чтобы нельзя было скопировать прошивку. Должна быть возможность "пополнения" числа прошивок
или вообще работы с другими прошивками после соответствующей оплаты.

По этой теме есть следующие соображения:


1. Загружаем с компа и храним зашифрованную прошивку на борту в отдельной флеш-микросхеме.
На целевой кристалл шьем AES бутлодер и затем уже через него - основную программу.

ДЫРА: 2. Для того чтобы расшифровать прошивку, бутлодер должен знать ключ. Бутлодер должен
зашиваться незашифрованным в чистый контроллер. Его можно перехватить по SPI во время программирования.
Как тогда сохранить в секрете ключ?

Временное решение. Сделать бутлодер трудно-поддающимся дизассемблированию (КАК?) и прошивать
в чистый микроконтроллер незащищенным. Но никому об этом не сказать. )))

3. В прошивке должны быть идентификатор(ID прошивки) и число допустимых программирований
этой прошивки - все это зашифровано. ID прошивки нужен для того, чтобы вести список прошивок и какую
сколько раз зашивали.

4. Список и счетчики прошивок храним внутри контроллера-программатора.

ДЫРА: Если у программатора
снесет крышу и придется его перепрограммировать - потеряется таблица прошивок, тогда можно будет повторно
использвать прошивки, которые до этого могли быть уже прошиты максимальное число раз.

РЕШЕНИЕ: Программа-обновлялка для ПК, которая загружает новую прошивку на борт программатора - работает только
при наличии связи через сеть интернет. Сначала отсылает программисту (мне) таблицу прошивок из контроллера.
А потом только передает программатору новую прошивку. Тогда при новых компиляциях программы загрузчика
можно сразу туда включать эту таблицу.

5. В клиентских программах, также как и в программаторе, выставляем фьюзы на запрет чтения и записи
и внутри программы периодически их проверяем!
Хацкеры обычно разными способами сбивают эти фьюзы и читают прошивку. Если прога будет
их контролировать - можно попытаться стереть саму себя в случае обнаружения попытки взлома.

ДЫРА: Если сбить
фьюзы и сразу войти в режим программирования (подтянут ресет), т.е. не дать проге запуститься - то она не
успеет сама себя удалить и может быть считана!

НЕ РЕШЕНА! Остается надеяться, что в последних версиях контроллеров фьюзы нормально переносят фокусы
с питанием, а также надежно спрятаны от лазеров/ножыков во внутренних слоях кристалла.

ДЫРА: 6. Можно прошивать одновременно несколько контроллеров, включив их параллельно!

РЕШЕНИЕ: Можно перед прошивкой проверять серийный номер контроллера (а у AVR он есть?) Бутлодеры, у которых
серийник не совпал - просто перестанут принимать данные. Если серийника нет - по тихому загружать его в составе
бутлодера, каждый раз инкрементируя. Опять-же надо контролировать чтобы не шили параллельно несколько кристаллов.

1111493779.gif Какие еще тут есть дыры (уязвимости, а не технологические отверстия) и способы их решения?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dimonira   Автономный микропрограмматор BootProg для прошивки boot-а (а может и не только)   Nov 9 2008, 21:12
- - zltigo   Цитата(Dimonira @ Nov 10 2008, 00:12) Кон...   Nov 10 2008, 07:37
- - Josh   ЦитатаДля работы на производстве оптимальный вариа...   Nov 10 2008, 08:24
- - Dimonira   Граждане! При желании можно скопировать всё и ...   Nov 10 2008, 09:09
|- - Maik-vs   Цитата(Dimonira @ Nov 10 2008, 12:09) ......   Nov 10 2008, 11:23
|- - Dimonira   Цитата(Maik-vs @ Nov 10 2008, 14:23)...   Nov 10 2008, 17:30
- - muravei   Цитата(Dimonira @ Nov 10 2008, 00:12) это...   Nov 10 2008, 18:12
- - DVF   Удобная штука для производства. При передаче опера...   Nov 11 2008, 07:22
|- - Огурцов   Ценно! Для себя. Поэтому AES тут не нужен. А в...   Nov 11 2008, 07:48
- - Dimonira   Дык AES будет нужен потом, когда будет заливаться ...   Nov 11 2008, 10:27
|- - Огурцов   Так SPI же на таргет все равно открытый - Вы сами ...   Nov 11 2008, 12:33
- - Dimonira   Ну так ведь речь зашла о назначении AES, а он не с...   Nov 11 2008, 18:25
|- - Огурцов   Не, это ж банально - стоимость взлома защиты должн...   Nov 11 2008, 22:01
|- - Dimonira   Цитата(Огурцов @ Nov 12 2008, 01:01) Имхо...   Nov 12 2008, 05:51
- - Dimonira   Немного доработал програмку преобразования кода в ...   Nov 14 2008, 17:49
- - Dimonira   Новости по результатам реализации нового варианта ...   Nov 15 2008, 21:47
|- - ReAl   Цитата(Dimonira @ Nov 15 2008, 23:47) Кст...   Nov 16 2008, 07:07
|- - Dimonira   Цитата(ReAl @ Nov 16 2008, 10:07) Обижаеш...   Nov 16 2008, 09:31
|- - MrYuran   Цитата(Waso @ Oct 28 2010, 14:05) Какие...   Oct 28 2010, 10:43
|- - Waso   Цитата(MrYuran @ Oct 28 2010, 17:43) Здес...   Oct 28 2010, 16:46
|- - MrYuran   Цитата(Waso @ Oct 28 2010, 20:46) Спасибо...   Oct 29 2010, 06:31
- - ArtemKAD   ЦитатаХацкеры обычно разными способами сбивают эти...   Oct 28 2010, 18:27
|- - ReAl   Цитата(ArtemKAD @ Oct 28 2010, 21:27) Рез...   Oct 28 2010, 19:10
- - ArtemKAD   ЦитатаИ от блин температуры будет блин зависеть бл...   Oct 28 2010, 20:54
- - ReAl   Ну если нужно порсто случайное число, то да. Мне п...   Oct 29 2010, 06:03
- - Waso   Цитата(ArtemKAD @ Oct 29 2010, 01:27) Лич...   Oct 29 2010, 06:19


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016