Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: И еще раз по защите Flash
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
toweroff
Может чего-то не понял, но из мануала, например, по LPC2101/02/03:


Code security

This feature of the LPC2101/02/03 allow an application to control whether it can be
debugged or protected from observation.
If after reset on-chip bootloader detects a valid checksum in flash and reads 0x8765 4321
from address 0x1FC in flash, debugging will be disabled and thus the code in flash will be
protected from observation. Once debugging is disabled, it can only be enabled by
performing a full chip erase using the ISP.


то есть, тостаточно прописать некую константу по адресу 0x1FC со значением 0x87654321, линкер ее там разместит, при прошивке данное значение ляжет куда надо и все, можно не заморачиваться?

Если так, то как правильно записать?

Код
code unsigned int protect=0x87654321 _at_ 0x1FC


Оно?
KRS
Цитата(toweroff @ May 18 2009, 23:06) *
то есть, тостаточно прописать некую константу по адресу 0x1FC со значением 0x87654321, линкер ее там разместит, при прошивке данное значение ляжет куда надо и все, можно не заморачиваться?

Главное объяснить линкеру что класть нужно именно туда. И есть еще момент в том что эта константа очень неудачно расположена т.е. надо что бы в этом месте не было кода. Т.е. основной код можно расположить с адреса 0x200. Но тогда остается место между векторами и 0x1FC, там можно, например, разместить обработчик прерывания...
toweroff
нашел... поиск рулит... (а то я чавой-та на синтаксис х51-го полез smile.gif )

#pragma location=0x1FC /* защита от копирования */
const long CodeSecure = 0x87654321;
#pragma required = CodeSecure

Остаются следующие вопросы:

1. В старших моделях (например 2468) это значение нужно записать в регистр CSPR в течение 256 первых тактов. Но как поправить бутлоадер, чтобы он это сделал?
Далее в мануале на эту модель говорится, что, после проверки целостности flash, бут пишет значение ячейки 0x1FC в регистр CSPR и ключевое значение оного блокирует кристалл от дебага и вообще доступа к содержимому. В чем принципиальное отличие этих двух путей? Можно ли во втором случае дорваться к прошивке через вообще что-то (бут, жтаг, ...)?

2. В модели 2478 есть вообще три уровня защиты:

There are three levels of the Code Read Protection.

CRP1 disables access to chip via the JTAG and allows partial flash update (excluding
flash sector 0) using a limited set of the ISP commands. This mode is useful when CRP is
required and flash field updates are needed but all sectors can not be erased.

CRP2 disables access to chip via the JTAG and only allows full flash erase and update
using a reduced set of the ISP commands.

Running an application with level CRP3 selected fully disables any access to chip via the
JTAG pins and the ISP. This mode effectively disables ISP override using P2[10] pin, too.
It is up to the user’s application to provide (if needed) flash update mechanism using IAP
calls or a call to reinvoke the ISP command to enable flash update via UART0.


Что это за "уменьшенный" и "ограниченный" набор команд ISP?
Правильно ли я понимаю, что в третьем варианте, если я не предусмотрю своего механизма обновления, такой чип в случае необходимости перепрошивки нужно будет выкинуть в помойку и впаять новый?

Прошу прощения за назойливость, вызвана пока неопытностью и необходимостью реализации, которая невозможна без понимания физики процесса smile.gif


Цитата(KRS @ May 19 2009, 01:22) *
Главное объяснить линкеру что класть нужно именно туда. И есть еще момент в том что эта константа очень неудачно расположена т.е. надо что бы в этом месте не было кода. Т.е. основной код можно расположить с адреса 0x200. Но тогда остается место между векторами и 0x1FC, там можно, например, разместить обработчик прерывания...


ух, чуть-чуть не успел smile.gif я так понимаю, что как раз прагмы и укажут линкеру на то, что там будет только это значение и ничто иное?
KRS
Цитата(toweroff @ May 19 2009, 01:37) *
1. В старших моделях (например 2468) это значение нужно записать в регистр CSPR в течение 256 первых тактов. Но как поправить бутлоадер, чтобы он это сделал?
Далее в мануале на эту модель говорится, что, после проверки целостности flash, бут пишет значение ячейки 0x1FC в регистр CSPR и ключевое значение оного блокирует кристалл от дебага и вообще доступа к содержимому.

Это бутлоадер сам и делает. При включении чипа всегда бутлоадер стартует он первым делом и врубает защиту. Так что обычно ничего специально делать не надо, только нужны код в 0x1FC прописать.

Цитата(toweroff @ May 19 2009, 01:37) *
Что это за "уменьшенный" и "ограниченный" набор команд ISP?
Правильно ли я понимаю, что в третьем варианте, если я не предусмотрю своего механизма обновления, такой чип в случае необходимости перепрошивки нужно будет выкинуть в помойку и впаять новый?

Ограниченый набор - JTAG вырублен, а писать флеш можно весь, кроме 0 страницы. в даташите хорошо описано ( чисто софтовое ограничение бутлоадер не воспринимает другие команды)
В третьем варианте - действительно чип можно выкинуть.

Цитата(toweroff @ May 19 2009, 01:37) *
ух, чуть-чуть не успел smile.gif я так понимаю, что как раз прагмы и укажут линкеру на то, что там будет только это значение и ничто иное?

Я честно говоря не эксперементировал так с линкером у меня просто основной сегмент кода начинается с 0x200, а в начале инициализация (свой сегмент) или данные какие либо.
Тут просто линкер должен найти функцию(функции) которая полностью влезет до 0x1FC потом дырка на 4 байта потом опять можно код размещать. ( В любом случае надо что бы сегмент кода состоял из двух частей, с дыркой в 4 байта и это надо объяснять линкеру)
toweroff
Цитата(KRS @ May 19 2009, 02:08) *
Я честно говоря не эксперементировал так с линкером у меня просто основной сегмент кода начинается с 0x200, а в начале инициализация (свой сегмент) или данные какие либо.
Тут просто линкер должен найти функцию(функции) которая полностью влезет до 0x1FC потом дырка на 4 байта потом опять можно код размещать. ( В любом случае надо что бы сегмент кода состоял из двух частей, с дыркой в 4 байта и это надо объяснять линкеру)


спасибо, все более-менее проясняется smile.gif

по линкеру - где это ему говорить? и как?
KRS
Цитата(toweroff @ May 19 2009, 02:50) *
по линкеру - где это ему говорить? и как?

так это от линкера зависит smile.gif
Например в сатром IAR ( 4.xx) в xcl файле
Код
-Z(CODE)PROTECT=001FC-001FF

А в своем asm стратапе у меня используется так
Код
#ifdef FIRMWARE_PROTECT
        RSEG PROTECT:CODE:ROOT(2)
      dc32 0x87654321
#endif

Но можно и как у вас в С файле, только указать #pragma location="PROTECT", указать

А если 5.xx IAR там принцип тот же, только icf надо править, там посложнее.
buba
Цитата(KRS @ May 19 2009, 12:34) *
А если 5.xx IAR там принцип тот же, только icf надо править, там посложнее.


А я как раз искал, как прописать это именно в студии 5.хх. Нашёл:
http://supp.iar.com/Support/?note=36121&am...m=search+result
Lexy_one
Подскажите!
Вопрос №1:
Есть вопрос по поводу CRP3.
Можно ли послее ее установки как нибудь разлочить процессор.

Например не получиться ли следующий алгоритм:
В процессоре живет бутлоадер использующий IAP.
в бутлоадаре предусмотрена команда стирания IAP с сектора 0 до последнего...
и при визове ее сотрется ли весь проц и соответственно защита CRP3 ???

и еще можно ли таким путем стирать все уровни защиты (CRP1,CRP2,CRP3).

Вопрос №2:
Можно ли при установленной защите (CRP1,CRP2,CRP3) читать флеш с сектора 0 по физическим адресам
например так:

pInt8U DevPrgVers = (pInt8U)DEV_PRG_VERS_ADDR;
Int8U DeviceVers[8];
for(Int8U i=0; i<8 ; i++) DeviceVers[i] = DevPrgVers[i] ;


P.S. процессор lpc2368
goodwin
1. Сотрется. Пробовал. Еще при старте, когда работает только внутренний RC генератор. Замыкаешь, например, пару выводов между собой на определенное время. При выполнении условия, вызываешь процедуру IAP стирания фсего флэш.
2. Можно.
Lexy_one
Тогда я не пойму что это за защита, если можно защищенную флеш прочитать?
Допустим прошить вместо заводской прошывки свою и прочитать всю защищенную область, выкинув ее допустим в ком порт???
и все .... защита взломана? у вас и заводская прошывка и защищенная область???!!!
или можно еще както побороться?
zuy
Цитата(Lexy_one @ Jul 20 2011, 09:00) *
Тогда я не пойму что это за защита, если можно защищенную флеш прочитать?
Допустим прошить вместо заводской прошывки свою и прочитать всю защищенную область, выкинув ее допустим в ком порт???
и все .... защита взломана? у вас и заводская прошывка и защищенная область???!!!
или можно еще както побороться?

Возможность уже запущенной программы иметь доступ к памяти контроллера никакого отношения к защите прошивки от копирования не имеет.
Предположим у вас есть устройство с загрузчиком в 0-м секторе, который грузит прошивку с 1-го и дальше и запускает ее.
Это, я думаю, стандартная схема.
Как вы прошьете вместо заводской прошивки свою при зашитах CRP2, CRP3 ?
Предположим, что прошили, как вы ее планируете запустить при любом уровне CRP ?
Lexy_one
Цитата(zuy @ Jul 20 2011, 09:22) *
Как вы прошьете вместо заводской прошивки свою при зашитах CRP2, CRP3 ?
Предположим, что прошили, как вы ее планируете запустить при любом уровне CRP ?


ну через бутлоадер...
снимаем лог лоадера.. просматриваем файл прошывки... и пишем свою прогу страници на 3...
и шьем через зашитый бутлоадер...

тут я вижу только вариант кодирования исходника для прошывки.!!!
goodwin
"тут я вижу только вариант кодирования исходника для прошывки.!!!"
Дык само-собой...
zuy
Цитата(Lexy_one @ Jul 20 2011, 12:35) *
тут я вижу только вариант кодирования исходника для прошывки.!!!

Ну вот, мы вас и подвели к правильному решению.
Конечно все кодируется, а иначе какой смысл вообще в защите флеша, если можно скачать незакодированную прошивку из инета sm.gif
Lexy_one
А вот подскажите...
Для кодирования вы изобретаете свои алгоритмы или все таки используете какие либо стандартные подходы?
scifi
Цитата(Lexy_one @ Jul 21 2011, 12:43) *
А вот подскажите...
Для кодирования вы изобретаете свои алгоритмы или все таки используете какие либо стандартные подходы?

Или я что-то неправильно понял, или для защиты от запуска "левой" прошивки можно не шифровать "законную" прошивку, а добавлять к ней кроптостойкий_хэш(код + секретный_ключ) и проверять его в загрузчике.
Lexy_one
Цитата
Или я что-то неправильно понял...

Имелось ввиду полное кодирование прошывки. Хотя можно наверно и секретный ключ в прошивку вставлять....
Вот это конкретно и интересует... Кто какими методами пользуется, их достоинства и недостатки.

Вот я например думаю, если польностью код прошивки закодировать своим алгоритмом, а загрузчик его должен перекодировать - то такую кодировку очень будет сложно взломать.

Но не хочется "изобретать велосипед", хотелось бы услышать мысли тех, кто этим занимался, возможно есть более простые и надежные методы защиты прошивки.
zuy
Цитата(Lexy_one @ Jul 21 2011, 19:10) *
Вот я например думаю, если польностью код прошивки закодировать своим алгоритмом, а загрузчик его должен перекодировать - то такую кодировку очень будет сложно взломать.

Но не хочется "изобретать велосипед", хотелось бы услышать мысли тех, кто этим занимался, возможно есть более простые и надежные методы защиты прошивки.

То какой используется алгоритм, каждый выбирает сам для конкретного проекта оценивая вероятность попытки взлома, каие средства потенциальный взломщик может на этот процесс затратить и т.п.
У нас - обычно это один из широко известных алгоритмов.

Если вам нужен сильно взломоустойчивый код, то безсмысленно самому изобретать алгоритм. Я не думаю, что вы такой сильный математик/криптограф, чтобы придумать криптоалгоритмы сильнее существующих невзломанных.
Уровень взломостойкости защиты должен определяться не секретностью алгоритма, а только секретностью ключа.
scifi
Цитата(Lexy_one @ Jul 21 2011, 19:10) *
Но не хочется "изобретать велосипед", хотелось бы услышать мысли тех, кто этим занимался, возможно есть более простые и надежные методы защиты прошивки.

Повторю то, что говорио zuy: стойкость защиты выбирается в зависимости от надобности.
Если технические средства защиты очень эффективны, то слабое звено - это человек. Подкуп, шантаж и т. д.
Я думаю, у вас ситуация не так серьёзна. Возьмите шифр попроще. Например, TEA.
Окончательный проект криптосистемы желательно обсудить со специалистами. В криптографии очень легко сделать глупую ошибку, из-за которой самый стойкий шифр окажется бесполезным.
Lexy_one
Цитата
Я думаю, у вас ситуация не так серьёзна


Да действительно мне не нужен очень сложный алгоритм кодирования, просто я раньше никогда не сталкивался с задачей кодирования... поэтому и поднял данный вопрос, ожидая советов более опытных людей...
А на счет ТЕА - спасиба посмотрю....

Цитата
Окончательный проект криптосистемы желательно обсудить со специалистами


К сожалению спросить не у кого... приходится подимать вопрос здесь...

P.S. спасиба за советы... пойду поднимать МАТ часть sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.