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

 
 
19 страниц V  « < 7 8 9 10 11 > »   
Closed TopicStart new topic
> Защита секция кода во FLASH в ATmega, Как защититься от несанкционированного выполнения кода
bodja74
сообщение Feb 15 2008, 18:12
Сообщение #121


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(galjoen @ Feb 15 2008, 18:39) *
Не хотел никого обидеть. Я имел в виду, что хакеров-крекеров и так хватает. Это они в программах (для компьютера) таким способом защиту кода с помощью CRC ломают. И мою защиту так сломали (когда-то давным-давно когда я еще молодой-неопытный был).


Я бы на вашем месте гордился ,далеко не каждая прога заслуживает того ,что бы ее ломали. smile.gif

_Pasha

Думаю достаточно просто перед самим SPM повторно проверить наличие команды типа WRITE_EN .
У меня за год еще не разу бутлоадер не снес страницу ,а вот фузы - было один раз такое дело,нарерное из за того ,что там выполняемый код гораздо короче.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Feb 15 2008, 20:10
Сообщение #122


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(bodja74 @ Feb 15 2008, 21:12) *
Думаю достаточно просто перед самим SPM повторно проверить наличие команды типа WRITE_EN .
У меня за год еще не разу бутлоадер не снес страницу ,а вот фузы - было один раз такое дело,нарерное из за того ,что там выполняемый код гораздо короче.

WRITE_EN - это что за зверь? Код который в SPMCR пишется? Так "запись в младшие пять разрядов регистра SPMCR значений, отличных от 10001, 01001, 00101, 00011, 00001 не вызывает никакого эффекта". Т.е. команда spm и так не запустится. А если это код конкретной операции, и на каждую у вас своя команда spm - это не лучший вариант. ИМХО желательно, чтоб во всей FLASH всего 1 команда spm была - кол-во аварийно опасных при случайном изменении PC команд меньше будет.

Цитата(zltigo @ Feb 15 2008, 22:22) *

Да. Там меньше 45ns нет. Но может и потом появиться - просто атмел приятный сюрприз сделать хочет. А если xmega с периферией на половинной работать будет - кому тогда она нужна? Неужто атмел это не понимает.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Feb 15 2008, 20:32
Сообщение #123


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(galjoen @ Feb 16 2008, 00:10) *
WRITE_EN - это что за зверь? Код который в SPMCR пишется?

Нет ,допустим WRITE_EN - это команда принятая бутом например с компа ,и дает возможность перейти на подпрограмму загрузки и записи страницы флеш ,если ее опять профиксить перед самой SPMSR дающей команду на запись страницы в результате даже если мы случайно туда попадем - записи не будет.
Цитата
Так "запись в младшие пять разрядов регистра SPMCR значений, отличных от 10001, 01001, 00101, 00011, 00001 не вызывает никакого эффекта".


Это Вы мне ? biggrin.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 15 2008, 21:56
Сообщение #124


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(bodja74 @ Feb 15 2008, 23:32) *
Нет ,допустим WRITE_EN - это команда принятая бутом например с компа ,и дает возможность перейти на подпрограмму загрузки и записи страницы флеш ,если ее опять профиксить перед самой SPMSR дающей команду на запись страницы в результате даже если мы случайно туда попадем - записи не будет.


А как ее пофиксить за 4 такта ?
Если мы просто сравним один байт - этой защите грош цена, т.к. вероятность попадалова практически не изменяется. Если не трудно, проиллюстрируйте.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 15 2008, 22:38
Сообщение #125


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ Feb 15 2008, 23:55) *
Например на половинной скорости читать две команды, а исполнять по очереди. Ни конвеер ни кэш для такой системы не нужен. Хотя реализуется, естественно, сложнее. smile.gif

Дык, по теории - это уже конвеер..

Цитата(_Pasha @ Feb 15 2008, 17:30) *
Как защититься от случайного выполнения записи в boot-loader.
....
Код
...
        OUT SPMCR,R16
        SPM
        CLR NullReg

3. Как безопасно запихнуть в стек адрес входа ?
Вопрос открытый, хотя я загружал с порта в теле команды для записи страницы. Некрасиво, но луше не придумал.

Это фигня и в реальной жизни не спасет на самом деле.
Представьте, что в слуйчайный момент времени, в R16 находится случайное значение
и происходит случайный прыжек на sequence
OUT SPMCR, R16
SPM
и страница флеш отъехала.

Вывод - по настоящему защититься от слета флеш памяти можно:
1. удалив из кода все SPM команды.
2. проверять целостность программы и восстанавливать ее.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 15 2008, 23:20
Сообщение #126


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Часть темы вынес сюда:
http://electronix.ru/forum/index.php?showtopic=43447&hl=


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 16 2008, 07:15
Сообщение #127


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(defunct @ Feb 16 2008, 01:38) *
и происходит случайный прыжек на sequence
OUT SPMCR, R16
SPM

Дык я поэтому такой оптимистичный, что R16 перед этим колбасили так, что правильной команды spmcr не дождется smile.gif

Цитата
Вывод - по настоящему защититься от слета флеш памяти можно:
1. удалив из кода все SPM команды.
....


Нет,понятно, что лучшее средство от седины - это лысина. smile.gif Вопрос только о снижении вероятности налета на разрешенный spm. Т.е. юзать 4-х тактовый зазор.

Вот теперь понимаю свой просчет. Наверное, аукнется. Надо было, к примеру так:

Код
Somewhere:
        LDI  R17,Spmcr_value; abstract command
        MOV R18,R17
        NEG R18
        LDI  R19,2
        SUBI R18,2
Fl_write_by_boot:
        COM NullReg; assuming ==0 just before this cmd
        RET; pre-initialized stack content HERE

; the following procedure has no entry point
FL_write_entry:
        MOV R16,R17
        AND NullReg,R16
        OUT SPMCR,Nullreg
;*** adding validation rules ***
        ADD  NullReg,R18; decrease overall probability
        ADD  NullReg,R19; to uneven spm enables
        BRNE PC+2
        SPM
        CLR NullReg

Короче, жаль, что 1 такт съелся переходом
А еще можно привязаться, например, к тикающему таймеру. И пытаться код команды в SPMCR считать оттуда.

2 bodja74: Спасибо, мне все ясно.

2 all: Вот я считаю, что при соблюдении вышеозначенного порядка действий и достаточной сложности (вопрос открытый) инициализации вероятность налета на грабли можно снизить. Конкретнее скажу после инъекций забытой теории вероятности.smile.gif

P.S. Насчет безопасного формата данных cpi Rd,K - отдельное спасибо. Вот в пиках, например, такая фича архитектурой задана.

Сообщение отредактировал _Pasha - Feb 16 2008, 07:22
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 16 2008, 11:21
Сообщение #128


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



[
Цитата(Непомнящий Евгений @ Feb 15 2008, 08:24) *
требуют полного знания ассемблера

А Вы что ? Когда пишите программу не утруждаете себя детальнейшим изучением архитектуры MCU, одной из составляющей которой является система команд процессора..А? 07.gif

Я например не напишу ни строчки кода пока не буду уверен, что досконально понимаю архитектуру MCU

Цитата(galjoen @ Feb 15 2008, 14:20) *
Т.к. сам всегда CRC32 FLASH в основном цикле считаю (по слову за раз - см. мои предыдущие посты). Но ни разу не сработало.

А я случайные джампы ловил.. Достаточно потрыкать пьезозажигалкойс присоединённым в её "жалу" проводом

Цитата(_Pasha @ Feb 16 2008, 00:56) *
А как ее пофиксить за 4 такта ?

Писал же уже выше...Но Вы видно не читатель..Повторю для Вас:

OUT R17 , SPMCR
;---------------
SBRS R16 , 7 ; Проверяем флаг запроса на запись
RJMP CRASH
;-----------------
SPM


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 16 2008, 11:48
Сообщение #129


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Дон Амброзио @ Feb 16 2008, 14:21) *
Писал же уже выше...Но Вы видно не читатель..Повторю для Вас:

OUT R17 , SPMCR
;---------------
SBRS R16 , 7 ; Проверяем флаг запроса на запись
RJMP CRASH
;-----------------
SPM


smile.gif Дык Вы тоже не читатель, получается. BTW, интересно Ваше мнение по поводу написанного мной чуть выше.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 16 2008, 12:11
Сообщение #130


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(_Pasha @ Feb 16 2008, 09:15) *
Дык я поэтому такой оптимистичный, что R16 перед этим колбасили так, что правильной команды spmcr не дождется smile.gif

когда девайс слетает, и стоишь перед фактом ехать в командировку в мухосранск sad.gif, оптимизм быстро пропадает...
На удачу в таких случаях лучше не надеяться, шанс получить "правильное" значение для spmcr ничуть не меньше шанса "неправильного" значения.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Feb 16 2008, 12:12
Сообщение #131


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(bodja74 @ Feb 15 2008, 23:32) *
Нет ,допустим WRITE_EN - это команда принятая бутом например с компа ,и дает возможность перейти на подпрограмму загрузки и записи страницы флеш ,если ее опять профиксить перед самой SPMSR дающей команду на запись страницы в результате даже если мы случайно туда попадем - записи не будет.

1. А если мы попадем уже после этой самой проверки?
2. Команду на запись страницы во FLASH не запись в регистр SPMSR даёт, а команда spm. Запись в регистр SPMSR влияет только на то, что по spm делаться будет.
Цитата(_Pasha @ Feb 16 2008, 00:56) *
А как ее пофиксить за 4 такта ?
Если мы просто сравним один байт - этой защите грош цена, т.к. вероятность попадалова практически не изменяется. Если не трудно, проиллюстрируйте.

Вот:
Цитата(galjoen @ Feb 15 2008, 14:20) *
Если предположить, что аварийно опасных команд 8 шт. А у R17, в остальных частях программы, значения от 0 до FF равновероятны. То вероятность "не попорчивания" FLASH при случайном прыжке для AVR с 128 кБайт памяти будет: (1-(8/65536)/256)*100%=99.9999523%. Что существенно выше, чем надёжность CRC16 с производящим многочленом 0x11021, которая составляет 99.9984% для пакетов данных длиной более 17 бит (Р.Л. Хаммел "Последовательная передача данных").

Пример кода там-же.
Конечно если вы вероятность срабатывания защиты в 99.9999523% и в грош не ставите - тогда я пас.
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 16 2008, 12:16
Сообщение #132


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(defunct @ Feb 16 2008, 01:38) *
Это фигня и в реальной жизни не спасет на самом деле.
Представьте, что в слуйчайный момент времени, в R16 находится случайное значение
и происходит случайный прыжек на sequence
OUT SPMCR, R16
SPM
и страница флеш отъехала.


А если подумать головой?

RJMP CRASH
;--------------
Input_in_Code_Writing :
OUT R17 , SPMCR
;---------------
SBRS R16 , 7 ; Проверяем флаг запроса на запись
RJMP CRASH
;-----------------
SPM


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

А его выставляет совсем другой поток. И он(этот флаг) автоматом сбрасывается по тайм-ауту..

Так что....Ещё раз повторю: думать надо прежде чем писать программу

Цитата(_Pasha @ Feb 16 2008, 00:56) *
А как ее пофиксить за 4 такта ?
Если мы просто сравним один байт - этой защите грош цена, т.к. вероятность попадалова практически не изменяется.

В корне не согласен. Чтоб вероятность того, что одновременно в некотором байте будет записано строго определённое число (которое к тому же записывается туда на короткое время) и то что проц прыгнет точно в точку входа в процедуру записи мизерна (конечно если программу правильно спроектировать)


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 16 2008, 12:19
Сообщение #133


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Дон Амброзио @ Feb 16 2008, 14:13) *
А если подумать головой?

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

А его выставляет совсем другой поток. И он(этот флаг) автоматом сбрасывается по тайм-ауту..
Так что....Ещё раз повторю: думать надо прежде чем писать программу

Вот именно, думайте, думайте и еще раз думайте. Ваш код тоже не дает 100% гарантии защиты от перетирания флеша.
При случайном прыжке расклад регистров тоже случайный! Вы почему-то это упускаете из виду.

вероятность того что программный флаг при случайном прыжке взведен - 50%.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Feb 16 2008, 12:22
Сообщение #134


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Дон Амброзио @ Feb 16 2008, 15:16) *
RJMP CRASH
;--------------
Input_in_Code_Writing :
OUT R17 , SPMCR
;---------------
SBRS R16 , 7 ; Проверяем флаг запроса на запись
RJMP CRASH
;-----------------
SPM
Т.е. чтобы записать страницу мало того нужно войти в процедуру в строго определённой точке... Да плюс к тому ещё нужно чтоб флаг разрешения записи (не аппаратный, а программный) был выставлен.

А его выставляет совсем другой поток. И он(этот флаг) автоматом сбрасывается по тайм-ауту..

В принципе согласен. Только я бы переписал это так:
RJMP CRASH
;--------------
Input_in_Code_Writing :
OUT R17 , SPMCR
;---------------
CPI R16 , 1<<7 ; Проверяем флаг запроса на запись
BRNE CRASH
;-----------------
SPM
В этом случае вероятность срабатывания защиты в 128 раз повышается. См. мой предыдущий пост. А тактов - столько-же.
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Feb 16 2008, 12:44
Сообщение #135


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(galjoen @ Feb 15 2008, 14:20) *
А у R17, в остальных частях программы, значения от 0 до FF равновероятны.

А если проверять перед записью не один регистр, а два, то вероятность случайной записи можно уменьшить в 65536 раз

Пример код

RJMP CRASH
;----------------
OUT SPMCR , R16
;----------------------
; Проверяем, а допустима ли запись
CP R17, R18 ; 2 контрольных регистра разрешения записи
BREQ PC+0x02
RJMP CRASH
;-----------------
SPM

Вот и посчитаёте: какова вероятность, что в обоих регистрах R17 и R18 будет записано одно и тоже число

Цитата(defunct @ Feb 16 2008, 15:19) *
Ваш код тоже не дает 100% гарантии защиты от перетирания флеша.

Т.е. из-за 99,99% Вы и напрягаться не будете , чтоб подумать?

Цитата(defunct @ Feb 16 2008, 15:19) *
вероятность того что программный флаг при случайном прыжке взведен - 50%.

Это как написать программу, можно вообще сделать 100%. А у меня это вероятность менее 1%

Цитата(defunct @ Feb 16 2008, 15:11) *
когда девайс слетает, и стоишь перед фактом ехать в командировку в мухосранск sad.gif, оптимизм быстро пропадает...

Вот вот... И я про тоже.... Как замаячит такая перспектива я лучше "сломаю голову" над программой сидя дома за письменным столом, чем потом кайфовать где-нибудь на Таймыре или Чукотсуом полуострове срочно исправляя глючащее устройство

Цитата(Дон Амброзио @ Feb 16 2008, 15:36) *
Вот вот... И я про тоже.... Как замаячит такая перспектива я лучше "сломаю голову" над программой сидя дома за письменным столом, чем потом кайфовать где-нибудь на Таймыре или Чукотсуом полуострове срочно исправляя глючащее устройство

Потому что заказчику не объянишь, что это мол я не сделал ни каких программных защит-ловушек из -за того, что это: "слижком сложно", что "СИ-компилятор не поддерживает такие конструкции"

Но зато "счастливого" владельца глючящего девайса можете утешить тем, что программа написана на языке высокого уровня СИ (во крута biggrin.gif ) и что она переносима и не привязана к конкретным архитектурным особенностям данного процессора lol.gif


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post

19 страниц V  « < 7 8 9 10 11 > » 
Closed TopicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


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


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