Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
Защита кода от команд WRITECODE и READCODE
DIKTATOR Дата: Пт, 24.12.2010, 21:02  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Здравствуйте! Я снова здесь.
Пик18Ф4550. пбп последняя версия с сайта пикбейсик.

На картинке красным цветом показано что защита области памяти с
0 до 3FF работает, и программатором область не читается.
Область называется bootblock тоесть защита загрузочной области.(CPB,EBTRB и WRTB)

Синим выделено что программа

Code
readmenu2:
for SPper1 = 0 to 16000
readcode SPper2,b0
SPper2 = SPper2 + 1       
outloop125:
USBService
USBOut 3, b0, 1, outloop125            'отправить прочитанный байт в рс232 эмулятор
next
SPper2 = 0
Goto idleloop

Спокойно считывает то что является возможной коммерческой разработкой(хлебушек).
У пользователя устройства будет возможность записи своей программы в свободную
область памяти программ.
Есть ли какието способы настроить невозможность записи в занятую спец программой
область памяти ?

Добавлено (24.12.2010, 20.58.20)
---------------------------------------------
Вот часть компилированного куска кода writecode $5010,$12
Дизассемблер винпик800

Code
   
   0x0CA0 : 0x0E10   movlw   0x10     ;адрес записи 2-й байт
   0x0CA2 : 0x6EF6   movwf   0xF6     , ACCESS
   0x0CA4 : 0x0E50   movlw   0x50     ;адрес записи 2-й байт
   0x0CA6 : 0x6EF7   movwf   0xF7     , ACCESS
   0x0CA8 : 0x0E12   movlw   0x12     ;записываемый байт
   0x0CAA : 0xEC09   call    0x000012 , 0    ; 1st word
   0x0CAC : 0xF000                    ; 2st word

Обратите внимание на
0x0CA2 : 0x6EF6 movwf 0xF6
0x0CA6 : 0x6EF7 movwf 0xF7
Они постоянны везде, в любом компилированном коде.
0x6EF6 0x6EF7 замечал только при использовании writecode и readcode.
F6 и F7 это специальные регистры записи ?
Возможно старший и младший байт адреса для записи и для чтения.

Правильно ли я могу мыслить?
Если да то можно сказать абсолютная защита сделана))))

Добавлено (24.12.2010, 21.02.39)
---------------------------------------------

Code
   
   0x0012 : 0x6AF8   clrf    0xF8     , ACCESS
   0x0014 : 0x6EF5   movwf   0xF5     , ACCESS
   0x0016 : 0x000C   TBLWT*
   0x0018 : 0x28F6   incf    0xF6 , W , ACCESS

Вот ещё кусок кода на который ссылается call 0x000012 но он мне жизнь не облегчил.

Прикрепления: 8042273.png (211.3 Kb)


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
ЯНДЕКС Дата: 24.12.2010
DAlexV Дата: Сб, 25.12.2010, 14:51  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

C возвращением DIKTATOR, что касаемо F6 и F7
Quote (DIKTATOR)
Обратите внимание на 0x0CA2 : 0x6EF6 movwf 0xF6 0x0CA6 : 0x6EF7 movwf 0xF7 Они постоянны везде, в любом компилированном коде. 0x6EF6 0x6EF7 замечал только при использовании writecode и readcode. F6 и F7 это специальные регистры записи ? Возможно старший и младший байт адреса для записи и для чтения.
Это у нас байты адреса при табличном чтении(записи) памяти программ(TBLPTRH 0xFF7 и TBLPTRL 0xFF6). Так же есть еще регистр TABLAT (0xFF5) через который принимаются, передаются данные из Flash памяти программ. Посмотри про слово конфигурации с COFIG5L по COFIG7H. Там есть защита блоков от табличного чтения(EBTR) или записи(WRT). Но есть одно но, если запретить чтение/записть в память программ то и Bootloader не сможет получить к ним доступ.
Успехов wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Сб, 25.12.2010, 14:51
DIKTATOR Дата: Пн, 27.12.2010, 00:04  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Спасибо за ответ.

Quote (DAlexV)
Посмотри про слово конфигурации с COFIG5L по COFIG7H. Там есть защита блоков от табличного чтения(EBTR) или записи(WRT). Но есть одно но, если запретить чтение/записть в память программ то и Bootloader не сможет получить к ним доступ.

Да. это плохо.

Тогда можно сделать так, но будет ли работать.
Программа бутлоадера при принятии любых данных с USB, будет сканировать в реальном времени
каждое принятое слово(16бит) на присутствие кодов 6EF6 и 6EF7.

Логическая структура программы:
1.Принять данные по юсб.
2.Если в слове присутствует 6EF6 или 6EF7, остановить работу бутлоадера.
3.Если всё нормально записать полученный код.

Очень примерное написание программы: (не пинать)

Code
SPper2 = 4000 'адрес начала прошивки пользователя

idleloop:
   USBService
   cnt = 8   
   USBIn 3, buffer, cnt, idleloop
     
if buffer = 6EF6 then newper1
if buffer = 6EF7 then newper1

writecode SPper2,buffer
SPper2 = SPper2 + 1       'добавление нового адреса для записи     
goto idleloop   

newper1:
end

Добавлено (27.12.2010, 00.04.10)
---------------------------------------------
Ещё хорошо былобы чтоб команды записи и чтения в прошивке пользователя были доступны.
Можно добавить дополнительные ветвления if проверяющие на какой адрес записывается или
читается информация, но может возникнуть лазейка для обхода защиты.

Пример проверки наличие команды записи/чтения и проверка адреса

Code
idleloop:
   USBService
   cnt = 8   
   USBIn 3, buffer, cnt, idleloop
     
if buffer = 6EF6 then newper1      'если обнаружена команда, то проверить адрес приняв следующее слово
if buffer = 6EF7 then newper1      'если обнаружена команда, то проверить адрес приняв следующее слово

errno:
peremen1 = 0
writecode SPper2,buffer
SPper2 = SPper2 + 1       'добавление нового адреса для записи     
goto idleloop

newper1:
   USBService
   cnt = 8   
   USBIn 3, buffer, cnt, newper1
     
   newper2:
      if buffer = peremen1 then err              'проверить адрес, если совпадёт то прекратить выполнение программы
      peremen1 = peremen1 + 1                  'адреса с 0 по 3800 которые заняты бутлоадером
      if peremen1 = 3800 then errno
goto newper2

err:
end

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

peremenCrack = 9999
peremen1 = 10000 - peremenCrack
readcode peremen1, peremen2

или ещё проще

peremen1 = 5
readcode peremen1, peremen2

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


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.

Сообщение отредактировал DIKTATOR - Пн, 27.12.2010, 00:14
DAlexV Дата: Пн, 27.12.2010, 09:01  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (DIKTATOR)
Вобщем не пойму как мне нормальную защиту сделать оставив возможность записи и чтения пользователю в разрешённой области.

Смотря какую цель преследовать. Если обновление (Software Upgrade) и находишься на небольшом удалении от заказчика, то просто обмен процами или обновление на месте(приехал, обновил и до свидания). Все данные которые передаются через PC можно отследить, в том числе и обновление. Далее уже дело времени. Либо писать свой собственный BootLoader с хитрой системой записи(2 байта в одну страницу, 2 в другую что бы сбить с толку) либо готовить и закрывать кусок кода в котором будет реализована основная часть работы программы не меняющаяся от версии(обмен по USB с возможностью обновления в разрешенную область) То есть: Блок 0-закрыт, остальные открыты(для обновления). Программа через PC обновляет Soft. Внутри закрытого от лишних глаз блока принимаются данные и происходит накопление контрольной суммы(CRC). После обновления сравнивается CRC которую вычислил проц и ту которую имеет PC. Если не совпало, то проц затирает то что записал как чуждое ему(не родная прошивка). Это достаточно заморочное решение. Первое гораздо проще.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
DIKTATOR Дата: Пн, 27.12.2010, 12:13  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 76
Репутация: 2   ±
Замечания:   ±
На сайте с 24.07.2008

Статус: Offline

Первый вариант точно не подходит.
Защиту разрабатываю для всех своих разработок имеющих бутлоадер. Разработки серийные, то-есть это не 5 не 20 штук.
Защита делается не для того чтобы продукт имел большую цену, а для того чтоб этот товар производился только в одной
компании, и цены минимально возможные будут так-как покупателей я думаю будет много.
Просто уже нарывались на китайцев с точными копиями своих устройств спустя 2-3 месяца.

Разработка сложная но она того стоит, темболее я думаю что можно сделать так что и лазеек не будет.
Как я писал выше, биты конфигурации я ставил как на фотографии на первом посте, программатор прошивку в указанном блоке
прочитать не может, а вот команды readcode и writecode работают полностью. Вот и получается что бутлоадер может писать
и читать где угодно(программатор нет) но при этом фильтровать приходящие по USB writecode и readcode.
На фотографии биты CPB, EBTRB, WRTB установлены как включено. В пик18Ф4550 это блок ботлоадер области с адресом до 3ff
Можно пока остановиться на полном запрете чтения и записи со стороны пользователя используя следующий код:

Code
start1:

if buffer = $6EF6 then errusb  'перейти в передачу информации об ошибке
     goto writon1               'перейти в запись флеш, ошибок нет

if buffer = $6EF7 then errusb  'перейти в передачу информации об ошибке
     goto writon1               'перейти в запись флеш, ошибок нет
      
writon1:
''''записать информацию в память программ
goto start1

      
errusb:
''''передать в программу на ПК об ошибке записи

Работу кода пока не проверял, просто привёл пример алгоритма.

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


Используйте симулятор ПРОТУЕС !!! Реальная вещь!!
Я снова тут, но не всегда свободен.
DAlexV Дата: Пн, 27.12.2010, 16:42  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (DIKTATOR)
Защита делается не для того чтобы продукт имел большую цену, а для того чтоб этот товар производился только в одной компании, и цены минимально возможные будут так-как покупателей я думаю будет много. Просто уже нарывались на китайцев с точными копиями своих устройств спустя 2-3 месяца.
За 1500$ китайцы послойно снимут программу с чипа, это у них хорошо отлажено smile . Не первый раз встречаю данные слова. Что же касаемо кода, то принцип верен. Если Bootloader собственного производства.
Quote (DIKTATOR)
не сильно ли это может навредить привлекательности устройства. Сама разработка направлена на начинающего пользователя.
При условии что не знаю что за программа, не могу сказать. По собственному опыту - чем проще тем лучше. Не любит оконечный пользователь заморочек. А защищаться нужно по любому. Хотя против послойного снятия только титановый корпус спасет (ненадолго) smile


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
  • Страница 1 из 1
  • 1
Поиск: