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

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как заполнить свободную память?, программная защита
namelos
сообщение Sep 25 2007, 12:38
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Доброе время суток, господа эмбеддеры.
Написал программу в AVRStudio-WinAVR 20070525(avr gcc 4.1.2) . В целях защиты хотелось бы заполнить сводное место Flash-памяти "rjmp 0" и посчитать CRC всего кода программы для проверки целостности. Подскажите пожалуйста, как мне это реализовать. Если можно поподробнее. Заранее спасибо.

Сообщение отредактировал namelos - Sep 25 2007, 13:31
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 25 2007, 12:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
namelos
сообщение Sep 25 2007, 13:00
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Цитата
А в чем защита если заполнить всю память джампами?

Использование джампов параллельно WDT, полагаю, снизит вероятность подвисания контроллера. Или Вы думаете, уважаемый GDI, что только WDT уже достаточно?

Сообщение отредактировал namelos - Sep 25 2007, 13:31
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Sep 25 2007, 13:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 namelos - а что для вас означают слова - "..подвисание контроллера.."?
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 25 2007, 14:26
Сообщение #5


кекс
******

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



Цитата(namelos @ Sep 25 2007, 16:00) *
Использование джампов параллельно WDT, полагаю, снизит вероятность подвисания контроллера.

Не снизит оно ровным счетом ничего.
Заполнять свободное пространство джампами нет смысла, потому что опкод FFFF, которым заполнен флеш, к зацикливанию не может привести, а следовательно PC самостоятельно выйдет на адрес 0.
Проверку целостности должна выполнять программа-компаньен (загрузчик) размещенная в boot секции, и реагировать на сбой флеша соответвенно - давать возможность перезашить чип.
Но в подавляющем большинстве случаев - достаточно только WDT.
Go to the top of the page
 
+Quote Post
namelos
сообщение Sep 25 2007, 14:58
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Цитата(defunct @ Sep 25 2007, 18:26) *
Проверку целостности должна выполнять программа-компаньен (булоадер) размещенная в boot секции, и реагировать на сбой флеша соответвенно - давать возможность перезашить чип.

Уважаемый defunct,
Сразу появляется вопрос, как организовать проверку целостности? Что проверять, всю программную часть или только часть?
По вашим суждениям я понял, что заполнение свободной памяти не имеет смысла, но к сожалению не услышал как это сделать. Как я предствляю, заполнить память возможно только изменением hex-файла с дописанием бинерной команды rjmp 0. Есть ли способ попроще?

2 Kuzmi4, под "подвисанием" контроллера- понимаю зацикленную работу контроллера, например при получении в PC aдреса сводного байта памяти с неизвестным содержанием.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Sep 25 2007, 15:02
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



В приведённом вами примере собачка - идеальный вариант...
Go to the top of the page
 
+Quote Post
namelos
сообщение Sep 25 2007, 15:09
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Цитата(Kuzmi4 @ Sep 25 2007, 19:02) *
В приведённом вами примере собачка - идеальный вариант...

Согласен, но прочитав о программной защите с помощью джампа на свободной памяти, задумался как добраться до нее. Да и резервная защита не помешает.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Sep 25 2007, 15:37
Сообщение #9


Знающий
****

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



Какова гарантия ,что не слетят начальные адресса кода ? smile.gif ,не поможет ни собака ни джампер.
Вообще у меня флеша как правило слетала полностью.

Забивать НЕХ запаритесь ,rjmp - это команда относительного перехода ,тоесть каждая последующий адресс перехода в ней на 1 больше,если охота попасть в одну и туже точку.
Вообще такие проблемы решаются как правило ваянием простенькой утилитки на компе в течении 30-60 минут smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 25 2007, 16:31
Сообщение #10


кекс
******

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



Цитата(namelos @ Sep 25 2007, 17:58) *
Сразу появляется вопрос, как организовать проверку целостности? Что проверять, всю программную часть или только часть?

У меня проверяется вся секция основной программы.
Как это делается -
Есть программа упаковщик (на PC), и программа bootloader распаковщик в MK.
упаковщик открывает Hex файл, добавляет к нему одну страничку флеш со служебной информацией (дата/время создания, код железа для которого предназначена прошивка, версия, название, CRC и т.п.), шифрует все это дело. В МК зашивается bootloader, лочится секция бутлоадера и основной программы. Потом запакованный ранее файл шьется в МК уже средствами бутлоадера (расшифровывается внутри МК). Bootloader при старте МК провереяет CRC секции основной программы, с CRC записанной в служебной страничке флеш. Если совпадает - передает управление на адрес 0, если не совпадает - включает красный светодиод (если есть) и ждет команд сверху.

Цитата
По вашим суждениям я понял, что заполнение свободной памяти не имеет смысла, но к сожалению не услышал как это сделать.

перепаковать Hex в Bin, добавить требуемую информацию, и перепаковать Bin обратно в Hex.

Цитата
Как я предствляю, заполнить память возможно только изменением hex-файла с дописанием бинерной команды rjmp 0. Есть ли способ попроще?

Если только добавить заполнитель, то возможно есть соответвующая опция линкера, но я этим особо не интересовался.
Go to the top of the page
 
+Quote Post
fmdost
сообщение Sep 25 2007, 16:46
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(namelos @ Sep 25 2007, 16:38) *
В целях защиты хотелось бы заполнить сводное место Flash-памяти "rjmp 0"

Надо бы не
Код
jamp 0

а
Код
$ jamp $

Тогда собачка сделает сброс по таймауту, и это будет настоящий(правильный) сброс.
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 26 2007, 07:27
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Да зачем это делать то? Стертая флешь имеет вполне определенное значение в ячейках, как уже упоминалось 0xFFFF - это команда SBRS R31,7, если программа каким то образом попадет на незашитую область, то просто дойдет до конца памяти программ и попадет на нулевой адрес, если раньше не сработает собака и все не перезагрузит. Зачем изобретать велосипед и бороться с несуществующими проблемами? Другое дело что после подобной перезагрузки(что собакой, что джампом) в ОЗУ будут какие то значения, которые там были на момент сбоя и как это повлияет на дальнейшую работу программы не известно, на и отсюда есть выход - инициализировать переменные перед использованием.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 26 2007, 08:43
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GDI @ Sep 26 2007, 10:27) *
Другое дело что после подобной перезагрузки(что собакой, что джампом) в ОЗУ будут какие то значения, которые там были на момент сбоя и как это повлияет на дальнейшую работу программы не известно
С точки зрения программы содержимое ОЗУ можно рассматривать как такой же случайный мусор, как и при включении питания.
Цитата(GDI @ Sep 26 2007, 10:27) *
, на и отсюда есть выход - инициализировать переменные перед использованием.
Инициализировать надо в любом случае. Ибо при включении питания там тоже может быть что угодно. При написании на С об этом заботится компилятор, точнее модуль cstartup, и он сделает все, что положено (обнулит глобальные переменные, в инициализированные запишет начальные значения). А если код на асме, то инициализировать надо вручную, но все равно это это надо делать в любом случае, даже если не предполагается такой программный рестарт.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Sep 26 2007, 12:12
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Сергей Борщ @ Sep 26 2007, 12:43) *
С точки зрения программы содержимое ОЗУ можно рассматривать как такой же случайный мусор, как и при включении питания.Инициализировать надо в любом случае.

У меня не инициализировались при включении/RESETe регистровые пары X и Y, пока не написал обнуление вручную - "многа думаль". Это было на 90S8515.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 26 2007, 14:39
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Maik-vs @ Sep 26 2007, 15:12) *
"многа думаль". Это было на 90S8515.
Достаточно заглянуть в даташит - там нигде не сказано, что регистры ядра обнуляются при ресете или включении питания. Для регистров периферии такая информация есть, для ядра и ОЗУ - естественно нет, ибо зачем их обнулять аппаратно?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

6 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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