Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: lpc2114/2124 Защита программы от считывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
electroveni
Делаю девайс на lpc2124, прога почти готова макет уже пашет. А фирма заказчик не совсем "чиста на руку". Есть там паренек, который жаждет "слизать" девайс и получать прибыль за мой счет.
Суть проблемы:
Сколько не рылся в документации не могу найти защиты программы от считывания. Поэтому возникают
сл. вопросы:
1. Есть ли штатная защита и как ее включить.
2. Если нет, можно ли организовать программно.
3. Если нет, то аппаратно.

Буду благодарен за любые идеи по этим вопросам.

P.S.
Девайс возможно будет дорабатываться после испытаний, поэтому вариант обкусывания ножек, не совсем подходит.
zltigo
Цитата(electroveni @ Jul 12 2006, 08:42) *
Сколько не рылся в документации не могу найти защиты программы от считывания.

Ну зачем-же обанывать на счет "рылся" :-(
Конечно есть. Конечно устанавливается программно и блокирует JTAG и ISP (кроме возможности
стереть все нафиг). Конечно есть раздел в документе по ISP.
Alechek
Цитата(zltigo @ Jul 12 2006, 12:01) *
Конечно есть раздел в документе по ISP.

Еще б место под галочку было в филипсовкой флеш утилите....
Или она по умолчанию залочивает чтение???
vesago
Если в Кейле

Код
#pragma NOINIT                                                            
const unsigned long code_protection __at 0x1FC = 0x87654321;


В яре на сахаре видал на асме.
zltigo
Цитата(Alechek @ Jul 12 2006, 09:23) *
Цитата(zltigo @ Jul 12 2006, 12:01) *

Конечно есть раздел в документе по ISP.

Еще б место под галочку было в филипсовкой флеш утилите....
Или она по умолчанию залочивает чтение???

Галочка не возможна в принципе - сначала место должно быть зарезервировано, а это уже
в стартапе ручками должно быть сделано. В принцпе проcто сразу собирается release прошивка
с установленным 87654321 и все - заодно прошивальщики не смогут забыть поставить "галочку". При большом желании можете добавить ключик в гораздо более удобный в альтернативный ISP, исходники которого имеются.
electroveni
"Ну зачем-же обанывать на счет "рылся" :-(
Конечно есть. Конечно устанавливается программно и блокирует JTAG и ISP (кроме возможности
стереть все нафиг). Конечно есть раздел в документе по ISP."

Я не обманываю, может проглядел, а может в той документации которая у меня это не указано(у меня ведь далеко не вся).

Если не затруднит можно подробней как включить, или скажите в каком описании написано сам попробую разобраться.
Я в IAR работаю.
zltigo
Цитата(electroveni @ Jul 12 2006, 09:40) *
а может в той документации которая у меня это не указано(у меня ведь далеко не вся).

У же в user manual (полагаю, что есть :-) )сие упомянуто черным по белому.
Код
20.7 Code Read Protection (CRP)
Code read protection is enabled by programming the flash address location 0x1FC (User
flash sector 0) with value 0x8765 4321 (2271560481 Decimal). Address 0x1FC is used to
allow some room for the fiq exception handler. When the code read protection is enabled
the JTAG debug port, external memory boot and the following ISP commands are
disabled:
• Read Memory
• Write to RAM
• Go
• Copy RAM to Flash
The ISP commands mentioned above terminate with return code
CODE_READ_PROTECTION_ENABLED. The ISP erase command only allows erasure
of all user sectors when the code read protection is enabled. This limitation does not exist
if the code read protection is not enabled. IAP commands are not affected by the code
read protection.
Important: CRP is active/inactive once the device has gone through a power cycle.
electroveni
Цитата(zltigo @ Jul 12 2006, 09:45) *
Цитата(electroveni @ Jul 12 2006, 09:40) *

а может в той документации которая у меня это не указано(у меня ведь далеко не вся).

У же в user manual (полагаю, что есть :-) )сие упомянуто черным по белому.
Код
20.7 Code Read Protection (CRP)
Code read protection is enabled by programming the flash address location 0x1FC (User
flash sector 0) with value 0x8765 4321 (2271560481 Decimal). Address 0x1FC is used to
allow some room for the fiq exception handler. When the code read protection is enabled
the JTAG debug port, external memory boot and the following ISP commands are
disabled:
• Read Memory
• Write to RAM
• Go
• Copy RAM to Flash
The ISP commands mentioned above terminate with return code
CODE_READ_PROTECTION_ENABLED. The ISP erase command only allows erasure
of all user sectors when the code read protection is enabled. This limitation does not exist
if the code read protection is not enabled. IAP commands are not affected by the code
read protection.
Important: CRP is active/inactive once the device has gone through a power cycle.


Вы правы, простите проглядел. :-(
Как я понял, по адресу 0x1FC во флеш нужно записать число 0x8765 4321.
Простите за назойливость, а как это правильно сделать?
Например в начале до main написать const unsigned long ... =0x8765 4321.
А как указать компилятору что константу записать по адресу 0x1FC?
zltigo
Цитата(electroveni @ Jul 12 2006, 10:00) *
Простите за назойливость, а как это правильно сделать?

Разместить именно это число именно по этому адресу. Один из вариантов приводился выше. Либо
что-то типа:
Код
                ORG    0x1FC
                dc32    0         // Protect Label place - protect if 0x87654321


в startup.s79
electroveni
Вот спасибо ОГРОМНОЕ всем!!! cheers.gif
Буду пробовать.
P.S.
Простите иногда тормажу по дикому sad.gif .
KRS
На самом деле это не аппаратная защита просто бутлоадер, который на филипсе всегда стартует первым (я его дизассемблировал от LPC2129 правда, но для остальных он такой же) первым делом запрещает JTAG (путем записи в PIN CONNECT BLOCK) потом проверяет это слово и если оно не равно 0x8765 4321 восстанавливает регистры PIN CONNECT BLOCK
Поэтому важно случайно при нинициализации чипа не разрешиь JTAG обратно.
electroveni
Получилось!!! Получилось!!!
biggrin.gif
Теперь при попытке читать флеш или рам lpc2000 Flash Utility выдает ошибку
Cannot communicate with test board
Но приэтом может проситать ID процессора командой
Read Device ID.
А сделал так:
в программе где описываются глобальные переменные (до main),
написал следующее

#pragma location=0x1FC
const unsigned long code_protection = 0x87654321;

Спасибо всем ответевшим!!!
biggrin.gif biggrin.gif biggrin.gif

Тему можно считать исчерпаной.
GetSmart
На самом деле есть такой потайной регистр в LPC-шках, в который ботлоадер просто копирует слово из адреса 0x1FC. И именно этот регистр аппаратно блокирует отладку и чтение флэша. Это значит, что потом при желании можно снова разблокировать защиту. Я вот думаю, если записать по адресу 0x1FC поверх старых 0x87654321 скажем все нули, то защита исчезнет?
KRS
Цитата(GetSmart @ Jul 12 2006, 13:56) *
На самом деле есть такой потайной регистр в LPC-шках, в который ботлоадер просто копирует слово из адреса 0x1FC. И именно этот регистр аппаратно блокирует отладку и чтение флэша. Это значит, что потом при желании можно снова разблокировать защиту. Я вот думаю, если записать по адресу 0x1FC поверх старых 0x87654321 скажем все нули, то защита исчезнет?

Да нет там потайного регистра!
Бутлоадер просто отключает JTAG при помощи PINSEL2 регитсра и все.
А перед выполнением команд проверяет была ли защита флеша или нет!

Можно в программе разрешить отладку по JTAG даже если защита была включена просто установить нужные биты в PINSEL2 регистре.
zltigo
Цитата(KRS @ Jul 12 2006, 13:06) *
Да нет там потайного регистра!

Подтверждаю - нету. Чисто софтовая защита на существующих и документированных возможностях железа.
GetSmart
Даю выдержку из ботлоадера LPC2138:
Код
0x7FFFD000 E59FF018  LDR    PC, [PC, #+24]      ; [0x7FFFD020] =0x7FFFD1BC
.................
0x7FFFD1BC E59F0018  LDR    R0, [PC, #+24]      ; [0x7FFFD1DC] =SCCSPR (0xE01FC184)
0x7FFFD1C0 E51F1014  LDR    R1, [PC, #-20]       ; [0x7FFFD1B4] =0x1FC
0x7FFFD1C4 E5912000  LDR    R2, [R1, #+0]
0x7FFFD1C8 E5802000  STR    R2, [R0, #+0]
0x7FFFD1CC E51F2188  LDR    R2, [PC, #-392]     ; [0x7FFFD04C] =RAMEND (0x40007FFF)
0x7FFFD1D0 E242D01F  SUB    SP, R2, #0x1F
0x7FFFD1D4 E59FE004  LDR    LR, [PC, #+4]        ; [0x7FFFD1E0] =0x7FFFD3AB
0x7FFFD1D8 E12FFF1E  BX     LR

Лично я обнаружил недокументированный регистр SCCSPR с адресом 0xE01FC184. Однако, что он делает пока не выяснил.
goodwin
Круто - недокументированный регистр "SCCSPR" smile.gif
Или бутлодырь в исходниках, и там так обзывается?
GetSmart
Оказывается он и в ПДФ-е (LPC213x User Manual(rev.01-24.06.2005).pdf) есть:
Цитата
Code Security/Debugging
CSPR Code Security Protection Register RO 0 0xE01FC184

А об этой штуке кто-нить знает:
Цитата
Reset
RSID Reset Source Identification Register R/W 0 0xE01FC180

Непонятны описания полей и всё остальное. У себя найти не могу.
zltigo
Цитата(GetSmart @ Jul 12 2006, 23:21) *
Даю выдержку из ботлоадера LPC2138:

Бутлоадеры у 213x и прочих разные. У прочих даже такой регистр не используется.

Цитата
А об этой штуке кто-нить знает:

Reset
RSID Reset Source Identification Register R/W 0 0xE01FC180
Непонятны описания полей и всё остальное. У себя найти не могу.


Ну полагаю RSIR

Код
RSIR Function Description Reset
Value
0 POR
Assertion of the POR signal sets this bit, and clears all of the other bits in this register. But
if another Reset signal (e.g., External Reset) remains asserted after the POR signal is
negated, then its bit is set. This bit is not affected by any of the other sources of Reset.
see text
1 EXTR Assertion of the RESET signal sets this bit. Ths bit is cleared by POR, but is not affected by
WDT or BOD reset.
2 WDTR This bit is set when the Watchdog Timer times out and the WDTRESET bit in the Watchdog
Mode Register () is 1. It is cleared by any of the other sources of Reset.
3 BODR
This bit is set when the 3.3V power falls below 2.6V. If the voltage continues to decline o the
level at which POR is asserted (nominally 1V), this bit is cleared, but if the voltage comes
back up without reaching that level, this bit remains 1. This bit is not affected by External
Reset nor Watchdog Reset.
7:4 Reserved Reserved, user software should not write ones to reserved bits. 0


Ну и что здесь непонятного?
GetSmart
Вот спасибо. А то я поиском не нашёл. Очепятки есть даже у буржуев.

А как убедительно звучало:
Цитата(zltigo)
Подтверждаю - нету...

Пока я выдержку не привёл. Есть он или его нету пока не ясно. В других ботлоадерах он может и в другом месте прописываться. У меня вот других процов нет и я сам проверить не могу. А то, что регистр бессмысленный это ну очень маловероятно.
Применительно к процессорам с внешней памятью (не к 213х) должны быть ещё некоторые типы защиты. Например, выполнение из внешней флэш, или из внешней рамы, и может что ещё.
zltigo
Цитата(GetSmart @ Jul 13 2006, 01:20) *
А как убедительно звучало:

0. А что? Регистр не документирован :-)?
1.Посмотрите на типы процессоров, о которых спрашивал автор.
2.Бутлоадеры для них (в отличие от 2x3x серии, или уже и их выложили? ) лежат на официальном
сайте. Таким образом можете их поизучать и не имея чипа....
Я еще думал, а какого черта для 2x3x серии другие боотлоадеры замутили, теперь, видимо, получил ответ - завели регистр с временными воротами для блокировок JTAG и начали им пользоваться.
3.Для большинства "прочих" чипов прошивка "защищенного" боотлоадера вообще появилась много
много позже выпуска "железа".
KRS
А я еще нашел в бутлоадере 211x 212x недокументированную команду T
позволяет загружать память параллельно формат такой
T <addr> <len> <width> <strobe>
первые 2 параметра такие же как и у команды W (должны быть выравнены)
width должна быть 8 или 16
strobe если 0 строба нет, не 0 есть

загружает через PORT0 пины с 8 по 15 для ширины 8 или с 8 по 23 для ширины 16
пин 24 - строб захватывает по rising edge (если strobe!=0)

если strobe=0 то просто читает из порта и записывает в память, но считывает порт каждый раз только без синхронизации (можно константой память забить)
KRS
Еще при исследовании бутлоадера я нашел уязвимость!! excl.gif
Проверил на 2 чипах LPC2129 версия 1.63 и LPC2119 версия 1.64.
На LPC2103 версия 2.2 не работает (возможно, другое распределение памяти), я не разбирался.
В общем сегодня, послыкой определнной строки мне удалось отключить защиту и считать flash

Послал письмо инеженру Филипс, который был на семинаре у нас в прошлом году.
Может быть у них есть новые версии бутлоадера. Хотя можно и этот исправить
Harbour
для более -менее секьюрных вещей lpc лучше не применять. Есть инфа что флешка читается в не зависимости от содержимого бутлодера и справедливо это для всех ихних чипов.
zltigo
Цитата
В общем сегодня, послыкой определнной строки мне удалось отключить защиту и считать flash

Собствено для реального применения баги ИХ бутлоадера не имееют особоло значения,
поскольку обычно стоит вопрос и об дистанционном обновлении прошивок, то по любому надо иметь свой загрузчик и заменять им родной.
KRS
Цитата(Harbour @ Jul 14 2006, 15:35) *
для более -менее секьюрных вещей lpc лучше не применять. Есть инфа что флешка читается в не зависимости от содержимого бутлодера и справедливо это для всех ихних чипов.

А откуда такая инфа?

Мне пришол ответ от Philips что изучат проблему и к сентябрю выпутстят новый бутлоадер
GetSmart
Цитата(KRS)
В общем сегодня, послыкой определнной строки мне удалось отключить защиту и считать flash

Круто!
Я так и знал, что что-то там не в порядке. Халтурщики же они. Делают очень дешёвые и средне глючные чипы. Но именно дешевизна и прильщает при такой огромной производительности.
KRS
Цитата(GetSmart @ Jul 14 2006, 17:06) *
Цитата(KRS)
В общем сегодня, послыкой определнной строки мне удалось отключить защиту и считать flash

Круто!
Я так и знал, что что-то там не в порядке. Халтурщики же они. Делают очень дешёвые и средне глючные чипы. Но именно дешевизна и прильщает при такой огромной производительности.


Да чипы у них действительно быстрые и дешевые, да и появляются часто раньше конкурентов.
У меня сейчас в 2 проектах LPC2103 он вообще 3 бакса стоит
Кстати вот на следующей неделе попробую покапаться в его бутлоадере.
А то у меня возникли сомнения что защита у них лучше, просто в даташите громко названо Code Read Protection, а реализация мне кажется такая же.
GetSmart
zltigo правильно сказал - надо писать свои ботлоадеры для надёжной защиты. Хотя, надёжна ли она будет на 100%?
KRS
Цитата(GetSmart @ Jul 14 2006, 18:07) *
zltigo правильно сказал - надо писать свои ботлоадеры для надёжной защиты. Хотя, надёжна ли она будет на 100%?

У LPC работа с FLASH не документирована, только через IAP, а IAP вместе бутлоадером и записывается, причем насколько я знаю через IAP нельзя переписать сектор в котором она же и находится.
Бутлоадер можно конечно переписать и даже улучшить, написан он кстати кривовато, и явно на С.
Но вот записать его во FLASH стандартными средствами не удастся.

Кстати сам бутлоадер вызыват IAP причем тем способом который описан в даташите, напрмую функции не дергает.
GetSmart
Я слышал, ботлоадер можно перешить через JTAG.

А как программить флэш без помощи IAP можно разобраться посмотрев ботлоадер. Я смотрел, всё легко и просто. Документируют или нет - их проблемы.
Harbour
Цитата(KRS @ Jul 14 2006, 14:59) *
Цитата(Harbour @ Jul 14 2006, 15:35) *

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

А откуда такая инфа?

Мне пришол ответ от Philips что изучат проблему и к сентябрю выпутстят новый бутлоадер

Дык, причем же тут бутлодырь если он даже выполнятся не успевает, принцип снятия защиты состоит в приостановке в нужный момент главного клока. дальше думаю понятно.
KRS
Цитата(Harbour @ Jul 14 2006, 18:24) *
Дык, причем же тут бутлодырь если он даже выполнятся не успевает, принцип снятия защиты состоит в приостановке в нужный момент главного клока. дальше думаю понятно.


Так если клок остановить клок JTAG тоже остановится.

А так не успеть остановить чип!!
вот начало бутлоадера, никаих переходов первые команды отключают JTAG
надо успеть остановить чип до выполнения 3 команды!
насколько я понимаю это невозможно! Ноги DBG_BREAK у филипса нет, а посылка по JTAG займет больше вермени...

Код
intvect:00000000                 LDR     R2, =0xE002C014
intvect:00000004                 MOV     R3, #0
intvect:00000008                 SWP     R0, R3, [R2]
GetSmart
Да ладно!
Нет ничего невозможного. I think I can do it!
Только вот ботлоадер какой-то вымышленный.
KRS
Цитата(GetSmart @ Jul 14 2006, 19:03) *
Да ладно!
Нет ничего невозможного. I think I can do it!
Только вот ботлоадер какой-то вымышленный.

Не вымышленный это из версии 1.63 для LPC2129
кстати 1.64 так же начинается

а вот у LPC2103 начало немного другое
Код
  00000000  E59F4034  LDR          R4, [PC, #+52]
  00000004  E3A05002  MOV          R5, #0x2          
  00000008  E5845000  STR          R5, [R4, #+0]    
  0000000C  E3A05003  MOV          R5, #0x3          
  00000010  E5845004  STR          R5, [R4, #+4]    
  00000014  E59F201C  LDR          R2, [PC, #+28]          ; [0x38] =0xE002C014
  00000018  E3A03000  MOV          R3, #0x0          
  0000001C  E1020093  SWP          R0, R3, [R2]      
  00000020  E2822028  ADD          R2, R2, #0x28
  00000024  E1021093  SWP          R1, R3, [R2]


JTAG отрубается 10ой командой
zltigo
Цитата(GetSmart @ Jul 14 2006, 18:07) *
Хотя, надёжна ли она будет на 100%?

100% гарантию дает только страховой полис..
Но по крайней мере он будет явно тупее и в его кодах никто копаться не будет.

Цитата(KRS @ Jul 14 2006, 17:13) *
У LPC работа с FLASH не документирована, только через IAP, а IAP вместе бутлоадером и записывается, причем насколько я знаю через IAP нельзя переписать сектор в котором она же и находится.

А достаточно легкого патча для перехода на свой bootloader после первых "правильных" команд. IAP останется.
В самой прошивалке ничего страшного нет, но недокументированность работы с FLASH навевает мысли на возможность смены его производителем в любой момент и соответственно возникновению ненужных проблем с очередным чипом или даже партией. Завшивка или через JTAG или просто ручками
подправить в штатной boot обновлялке.
GetSmart
Цитата(zltigo)
100% гарантию дает только страховой полис..
Но по крайней мере он будет явно тупее и в его кодах никто копаться не будет.

В страховом полисе? :-D
Harbour
Цитата(KRS @ Jul 14 2006, 17:33) *
Цитата(Harbour @ Jul 14 2006, 18:24) *

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


Так если клок остановить клок JTAG тоже остановится.

А так не успеть остановить чип!!
вот начало бутлоадера, никаих переходов первые команды отключают JTAG
надо успеть остановить чип до выполнения 3 команды!
насколько я понимаю это невозможно! Ноги DBG_BREAK у филипса нет, а посылка по JTAG займет больше вермени...


У жтага свой клок, и он никак не связан с девайсом.
KRS
Цитата(Harbour @ Jul 15 2006, 03:59) *
У жтага свой клок, и он никак не связан с девайсом.

Это не так, достаточно посмотреть
ARM7TDMI-S Technical Reference Manual
клоки должны быть синхронизированы.
KRS
Покапался в бутлоадере для 2103
там бага исправлена! Филипс явно знает про ошибку, бутлоадер один в один практически, только одна функция исправлена, добавлена проверка.
Код конечно жуть, неоптимальный!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.