Зашита от считывания прошивки stm32
Сегодня мы будем защищать прошивку на stm32 от считывания кул-хакерцами. Дабы не тянуть резину, вот кусок кода:
Как не сложно догадаться, кусок использует библиотеку от stm. Такой кусок кода использовать очень удобно — контроллер сам устанавливает свою защиту при первом запуске, а первый запуск легко организовать после прошивки. Вот она, свобода от тирании фьюзов!
Да, я знаю, насчет холивора насчет «библиотека vs непосредственное обращение к регистрам». Моя позиция тут такова — если нужна большая скорость, или осталось совсем мало памяти, но нужно непосредственное обращение к регистрам. Если и скорость не важна и памяти много, лучше использовать библиотеку — так программа пишется быстрее и получается более читаемая.
Для снятия защиты нам понадобится программа st-link utility. Скачать ее можно вот тут.
Запускаем программу и выбираем вот этот пункт, либо просто жмем ctrl-b:

В поле «состояние защиты от чтения выбираем выключено». И нажимаем кнопку Apply:

Вместе с битом защиты стирается и вся память:

Защищайтесь, мы за безопасный эмбед.
#ifdef NDEBUG
if (FLASH_GetReadOutProtectionStatus() == RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
}
#endif
Как не сложно догадаться, кусок использует библиотеку от stm. Такой кусок кода использовать очень удобно — контроллер сам устанавливает свою защиту при первом запуске, а первый запуск легко организовать после прошивки. Вот она, свобода от тирании фьюзов!
Да, я знаю, насчет холивора насчет «библиотека vs непосредственное обращение к регистрам». Моя позиция тут такова — если нужна большая скорость, или осталось совсем мало памяти, но нужно непосредственное обращение к регистрам. Если и скорость не важна и памяти много, лучше использовать библиотеку — так программа пишется быстрее и получается более читаемая.
Снять защиту
Контроллер то мы защитили. Но вот беда — нужно поправить нашу программу, а при установленной защите ничего с контроллером сделать нельзя — ни прочитать ни записать. Как снять защиту? Сразу предупреждаю — ребята из ST все сделали правильно и вместе с защитой уничтожается вся прошивка.Для снятия защиты нам понадобится программа st-link utility. Скачать ее можно вот тут.
Запускаем программу и выбираем вот этот пункт, либо просто жмем ctrl-b:

В поле «состояние защиты от чтения выбираем выключено». И нажимаем кнопку Apply:

Вместе с битом защиты стирается и вся память:

Защищайтесь, мы за безопасный эмбед.
17 комментариев
Осталось пересесть с AVR на ARM, но это уже другая история.
Прочитать можно вот тут.
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();
Кужа его вставлять, в.с или .h?
#include <stm32f0xx_flash.h> в CooCox нужна?
У меня компелируется, но не защищает.
Выдает ошибки компиляции, если пишу в main() только 3 строчки:
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //включаем тактирование порта GPIOA
GPIO_InitTypeDef gpio;
;GPIO_StructInit(&gpio); // скорее всего комментируя эту строку привеза к залочке
gpio.GPIO_Pin = GPIO_Pin_4;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Speed = GPIO_Speed_Level_1;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&gpio);
Имею теперь вечную моргалку на STM, даже две.
1. В «St-link utility» в «Settings» установить «Connect Under Reset»
2. Удерживать RESET в 0
3. Нажать «Erase Chip»
4. Отпустить RESET
С подключенным RESET к программатору чип не стирался.