Здравствуйте! Возникла необходимость собрать похожий девайс, но со своей спецификой. Допустим, имеется
заказчик (или несколько), который собирает железо, а программировать его некому. Программист (я) находится
в другом городе. По предоплате заказчик работать отказывается, предлагает проценты от продаж железа.
По опыту такие заказчики платят проценты только пока программа нуждается в доработках. Поэтому нужно
собрать автономный программатор со счетчиком числа прошивок и защищенной передачей на целевой кристалл,
чтобы нельзя было скопировать прошивку. Должна быть возможность "пополнения" числа прошивок
или вообще работы с другими прошивками после соответствующей оплаты.
По этой теме есть следующие соображения:
1. Загружаем с компа и храним зашифрованную прошивку на борту в отдельной флеш-микросхеме.
На целевой кристалл шьем AES бутлодер и затем уже через него - основную программу.
ДЫРА: 2. Для того чтобы расшифровать прошивку, бутлодер должен знать ключ. Бутлодер должен
зашиваться незашифрованным в чистый контроллер. Его можно перехватить по SPI во время программирования.
Как тогда сохранить в секрете ключ?
Временное решение. Сделать бутлодер трудно-поддающимся дизассемблированию (КАК?) и прошивать
в чистый микроконтроллер незащищенным. Но никому об этом не сказать. )))
3. В прошивке должны быть идентификатор(ID прошивки) и число допустимых программирований
этой прошивки - все это зашифровано. ID прошивки нужен для того, чтобы вести список прошивок и какую
сколько раз зашивали.
4. Список и счетчики прошивок храним внутри контроллера-программатора.
ДЫРА: Если у программатора
снесет крышу и придется его перепрограммировать - потеряется таблица прошивок, тогда можно будет повторно
использвать прошивки, которые до этого могли быть уже прошиты максимальное число раз.
РЕШЕНИЕ: Программа-обновлялка для ПК, которая загружает новую прошивку на борт программатора - работает только
при наличии связи через сеть интернет. Сначала отсылает программисту (мне) таблицу прошивок из контроллера.
А потом только передает программатору новую прошивку. Тогда при новых компиляциях программы загрузчика
можно сразу туда включать эту таблицу.
5. В клиентских программах, также как и в программаторе, выставляем фьюзы на запрет чтения и записи
и внутри программы периодически их проверяем!
Хацкеры обычно разными способами сбивают эти фьюзы и читают прошивку. Если прога будет
их контролировать - можно попытаться стереть саму себя в случае обнаружения попытки взлома.
ДЫРА: Если сбить
фьюзы и сразу войти в режим программирования (подтянут ресет), т.е. не дать проге запуститься - то она не
успеет сама себя удалить и может быть считана!
НЕ РЕШЕНА! Остается надеяться, что в последних версиях контроллеров фьюзы нормально переносят фокусы
с питанием, а также надежно спрятаны от лазеров/ножыков во внутренних слоях кристалла.
ДЫРА: 6. Можно прошивать одновременно несколько контроллеров, включив их параллельно!
РЕШЕНИЕ: Можно перед прошивкой проверять серийный номер контроллера (а у AVR он есть?) Бутлодеры, у которых
серийник не совпал - просто перестанут принимать данные. Если серийника нет - по тихому загружать его в составе
бутлодера, каждый раз инкрементируя. Опять-же надо контролировать чтобы не шили параллельно несколько кристаллов.

Какие еще тут есть дыры (уязвимости, а не технологические отверстия) и способы их решения?