LiVit

STM32F030 защита прошивки от считывания

27 posts in this topic

LiVit    12

Добрейшего всем времени суток!

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

Почитав мануал на проц, погуглив, почитав комментарии в stm32F0xx_flash.h, я написал следующий код:

    #include "stm32F0xx_flash.h"
    if (RESET == FLASH_OB_GetRDP())        //checking protection status
    {
        FLASH_OB_Unlock();    //unblock the Option Byte
        if (FLASH_COMPLETE == FLASH_OB_RDPConfig(OB_RDP_Level_1))     FLASH_OB_Launch();
        FLASH_OB_Lock();
    }

Казалось бы, всё сделано так, как рекомендовано. Тем не менее, этот код не работает.

Гугль показал, что данная тема волнует не только меня, но и других камрадов. 

В общем, правильное решение выглядит так:

    #include "stm32F0xx_flash.h"    
    if (RESET == FLASH_OB_GetRDP())        //checking protection status
    {
        FLASH_Unlock();    //unblock the FLASH (!!)
        FLASH_OB_Unlock();    //unblock the Option Byte
        if (FLASH_COMPLETE == FLASH_OB_RDPConfig(OB_RDP_Level_1))     FLASH_OB_Launch();
        FLASH_OB_Lock();
        FLASH_Lock();
    }

Обратите внимание, - перед тем, как разблокировать Option Byte, необходимо разблокировать саму флэшь.

Edited by LiVit

Share this post


Link to post
Share on other sites
mmc1    0

Эта процедура не дает считать флеш или затирает ее при попытке чтения?

Share this post


Link to post
Share on other sites
LiVit    12
В 20.06.2018 в 13:24, mmc1 сказал:

Эта процедура не дает считать флеш или затирает ее при попытке чтения?

Как следует из кода, включается Read Protection level 1 (OB_RDP_Level_1). Это означает, что считать код нельзя (ну, в STM так думают). 

Однако, чип можно стереть, установив при помощи программатора уровень защиты 0.

 

Если нужна более продвинутая защита, следует установить уровень 2 (OB_RDP_Level_2), это должно привести к полной залочке программы - изменить или стереть её уже невозможно.

 

Если вы хотите, чтобы при попытке прочитать программу она самоликвидировалась, вам следует прописать это в обработчике прерывания MemManage_Handler() или FLASH_IRQHandler() - надо уточнить в мануале.

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Создание беспроводных устройств на системах-на-кристалле семейства SimpleLink компании TI»

Компания Компэл, совместно с Texas Instruments приглашают 26 июня принять участие в вебинаре, где инженер по применению беспроводных технологий компании TI расскажет, как на новых беспроводных системах можно реализовать несколько полезнейших в повседневной жизни функций для ваших устройств. С развитием элементной базы TI становится возможной реализация более удобных, функциональных и безопасных систем, недоступных ранее. Вебинар проводит инженер по применению беспроводных технологий в TI Мари Хернес(будет дублированный перевод).

Подробнее...

optima    235
В 16.06.2018 в 16:08, LiVit сказал:

 FLASH_Lock();

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

Share this post


Link to post
Share on other sites
LiVit    12
4 часа назад, optima сказал:

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

Это естественно.

Для разлочивания используйте FLASH_Unlock();

Edited by LiVit

Share this post


Link to post
Share on other sites

Видео вебинара «Уникальный подход MORNSUN к разработке DC/DC-преобразователей. Что на выходе?»

На сайте КОМПЭЛ доступны материалы вебинара, посвященные последнему поколению DC/DC преобразователей с фиксированным входом R3 от MORNSUN. Вы можете посмотреть видеозапись, ознакомиться с презентацией и ответами на вопросы.

Подробнее...

Oxford    37

Кто-то смог прочитать залоченую от чтения прошивку что ли?

Edited by Oxford

Share this post


Link to post
Share on other sites
optima    235

К примеру, чтение залоченого 103 камня стоит 120000. Если надо то без проблем прочитают!

Share this post


Link to post
Share on other sites
Oxford    37

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

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

За 120000 софт проще написать новый. Я например могу за меньшие деньги софт написать с нуля.

 

Edited by Oxford

Share this post


Link to post
Share on other sites
optima    235
4 часа назад, Oxford сказал:

Я например могу за меньшие деньги софт написать с нуля.

Вряд ли! можешь, но только ровно на столько сколько хватит твоих знаний. И проблема тут не только в знании железа и языков программирования. Существует множество железа в котом используются разнообразные не документированные  протоколы обмена!

К примеру, пульт управления промышленным кондиционером по can шине,  вы можете в совершенстве знать как работает can протокол но не можете знать ни используемые ID, ни DATA,  ни что в себе они несут, даже скорость обмена под вопросом. От сюда вопрос как вы будете писать?  Попросите вам предоставить рабочий комплект? И таких примеров множество!

Share this post


Link to post
Share on other sites
Oxford    37

Чушь не порите ей больно. А что за пульт такой ценный? И что в нем уникального?

Так вряд ли или можешь.

 

 

Edited by Oxford

Share this post


Link to post
Share on other sites
optima    235
1 час назад, Oxford сказал:

Тот сайт что вы нашли на бабки кидает

Это вы нашли, я его не искал!

1 час назад, Oxford сказал:

если есть конкретная работа обращайтесь будем работать.

Нет уж увольте! как ни будь без вас!

1 час назад, Oxford сказал:

Наша команда вам поможет.

Нет у вас ни какой команды!

1 час назад, Oxford сказал:

не надо фантазировать

 

Edited by optima

Share this post


Link to post
Share on other sites
Oxford    37

Лучше бы на вопрос ответили что за пульт было бы полезнее чем сопли ваши читать. Займитесь делом лучше.

Ломатель прошивок.

Edited by Oxford

Share this post


Link to post
Share on other sites
optima    235

Я вам привел простой пример а вы и распустили сопли! так что по соплям это к вам, вот и займитесь лучше делом, нежели отвечать вопросом на вопрос! 

Share this post


Link to post
Share on other sites
LiVit    12

Угомонитесь, горячие финские пааарни. Вопрос был про залочивание семейства 030. Вопрос успешно решен.

По поводу readout protection и его вскрытия -  инфа в инете, желающие - найдут. По крайней мере, когда я искал решение проблемы с залочкой, первым делом выскакивали статьи по преодолению этой защиты )))

https://www.usenix.org/conference/woot17/workshop-program/presentation/obermaier - как пример.

Не исключаю, что производитель пофиксил эту проблему. Но скорее всего -нет.

Share this post


Link to post
Share on other sites
BARS_    996
17 часов назад, optima сказал:

вы можете в совершенстве знать как работает can протокол но не можете знать ни используемые ID, ни DATA,  ни что в себе они несут, даже скорость обмена под вопросом.

Разбираем пульт, подключаем логический анализатор, сливаем обмен данными вместе со скоростью, ID и т.п. Пишем свое ПО. В чем сложность то? Эка невидаль, протокол обмена слить. Сложности появятся лишь в том случае, когда на протокол наложено шифрование. Но для того, чтобы кто-то стал заморачиваться с шифрованием ПРОВОДНОГО протокола, он как минимум должен управлять ядерными каким-то вооружением. Так что не наводите панику.

Share this post


Link to post
Share on other sites
optima    235
2 часа назад, BARS_ сказал:

Так что не наводите панику.

А кто ее наводит?

2 часа назад, BARS_ сказал:

Эка невидаль, протокол обмена слить.

Вы на одном континенте а заказчик на другом, с пальца будете протокол сливать?

Как минимум

21 час назад, optima сказал:

Попросите вам предоставить рабочий комплект? И таких примеров множество!

 

Share this post


Link to post
Share on other sites
BARS_    996
57 минут назад, optima сказал:

Вы на одном континенте а заказчик на другом,

Либо заказчик сам сливает протокол (подключить 3 провода кто угодно сможет), либо я еду и делаю это. В чем проблема? Конечная отладка в любом случае будет на железе.

Share this post


Link to post
Share on other sites
optima    235

Либо, либо, все это болтовня!  за частую у заказчика нет рабочего комплекта!

В рабочем случае, снимите вы или заказчик трассу с CAN шины приблизительно такого вида

Time            ID        DLC    Data                    Comment
02,020   00018002   5    07 88 00 01 00          ASCII:     
02,296   0600BC02   6   5B 10 00 08 34 26       ASCII:[   4&
02,300   0600BC02   7   5B 00 00 E0 07 04 09    ASCII:[      
02,402   02014004    8   01 04 0F 00 00 00 00 00 ASCII:        
02,406   02FF4004   8    00 00 D8 01 01 01 02 01 ASCII:        
02,412   02FF4004   8    FF 7F D8 01 01 02 02 01 ASCII:        
02,592   03014004   8    01 00 00 00 00 01 00 00 ASCII:        
02,854   06014004   8    00 00 00 00 00 00 00 00 ASCII:        
02,858   0500BC02   3    0D 30 00                ASCII:m0 
02,864   0000BC02   3    6D 30 00                ASCII:m0 
02,868   05FF4004   8    FF FF 0F 00 B0 13 0B 17 ASCII:        
02,959   05FF4004   8    FF FF 0F 00 B0 13 0B 17 ASCII:        
03,187   05FF4004   8    FF FF 0F 00 B0 13 0B 17 ASCII:        
03,369   05FF4004   8    FF FF 0F 00 B0 13 0B 17 ASCII:        
03,371   05014400   8    10 15 71 12 07 20 00 00 ASCII:  q     
03,373   02014004   8    01 04 0F 00 00 00 00 00 ASCII:        
03,379   02FF4004   8    00 00 D8 01 01 01 02 01 ASCII:        
03,383   02FF4004   8    FF 7F D8 01 01 02 02 01 ASCII:      

Дальше что? без рабочего комплекта под рукой, который заказчик не может предоставить! Это просто куча не нужных данных.

А отладку на железе сделать никто не даст,  комплект единственный и в работе!

Вы за 120к готовы сколько раз слетать к заказчику к примеру во Владик?

А Oxford по ходу может, только не слетать а языком почесать!

В 07.08.2018 в 17:25, Oxford сказал:

За 120000 софт проще написать новый. Я например могу за меньшие деньги софт написать с нуля.

Поэтому не надо говорить гоп, пока не перепрыгнул.

Share this post


Link to post
Share on other sites
BARS_    996
5 минут назад, optima сказал:

Дальше что? без рабочего комплекта под рукой, который заказчик не может предоставить! Это просто куча не нужных данных.

Ну не надо сказок. Это будут сообщения на строго определенные действия. ненужные они только пока не привязаны к чему-то осязаемому. Когда есть комплект, который еще и в работе, CAN протокол сливается очень просто. 

 

6 минут назад, optima сказал:

Вы за 120к готовы сколько раз слетать к заказчику к примеру во Владик?

Можно даже не летать. Делается тестовый снифер с прошивкой по ЛАН или USB, заказчик его подключает и тыкает в ПК с удаленным рабочим столом. ВСЕ, дальше хоть заработайся. А ведь это не единственный вариант. Можно и слетать, если заказчик в этом заинтересован.

Share this post


Link to post
Share on other sites
optima    235
27 минут назад, BARS_ сказал:

Ну не надо сказок. Это будут сообщения на строго определенные действия

Вот именно не надо сказок! это кусок из рабочей кан шины снятый канхакером,  конкретно это управление блоком питания flatpack2,  и какие то ваши действия приведут только к изменению каких то байтов в массе этих данных! Но определенные действия в виде изменения сетевого адреса блока в шине, не изменят в данных ровно ничего!  

41 минуту назад, BARS_ сказал:

CAN протокол сливается очень просто.

Да сливается просто не спорю, но попробуйте определить в данных сколько устройств в сети и в каком направлении идут данные.

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

CAN ON.trc

Share this post


Link to post
Share on other sites
BARS_    996
46 минут назад, optima сказал:

это кусок из рабочей кан шины снятый канхакером,  конкретно это управление блоком питания flatpack2

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

 

53 минуты назад, optima сказал:

но попробуйте определить в данных сколько устройств в сети и в каком направлении идут данные.

А сколько платите за работу?

 

Share this post


Link to post
Share on other sites
optima    235
7 минут назад, BARS_ сказал:

А сколько платите за работу?

Ни сколько! эта работа проделана лично мной, что там и как мне предельно ясно,  и я точно знаю что только снятым протоколом обмена там ни чего не разобрать!

Edited by optima

Share this post


Link to post
Share on other sites
User_1    4

Поддержу @optima . Лично достаточно много работал с шиной CAN (только в автомобиле). Когда передачи не зашифрованы - отлавливаются легко и быстро, даже нет необходимости физически находиться рядом. Но когда часть потока зашифрована, а зашифрована она надёжно - никакие танцы с бубном не помогут. И (по секрету) 120к - это стоимость двух готовых устройств, так что обратиться в такую фирму и считать прошивку - вполне себе выход)

Правда, мы пошли другим путём, и написали свой софт с нуля. Но нам неоткуда было считывать готовую прошивку)

А привязка к определённому ID камня убирается дизасмом

Share this post


Link to post
Share on other sites
optima    235
В 16.06.2018 в 16:08, LiVit сказал:

    #include "stm32F0xx_flash.h"    
    if (RESET == FLASH_OB_GetRDP())        //checking protection status
    {
        FLASH_Unlock();    //unblock the FLASH (!!)
        FLASH_OB_Unlock();    //unblock the Option Byte
        if (FLASH_COMPLETE == FLASH_OB_RDPConfig(OB_RDP_Level_1))     FLASH_OB_Launch();
        FLASH_OB_Lock();
        FLASH_Lock();
    }

Обратите внимание, - перед тем, как разблокировать Option Byte, необходимо разблокировать саму флэшь.

А какая необходимость в  FLASH_OB_Lock();    FLASH_Lock();  ?

После  FLASH_OB_Launch() будет системный сброс и соответственно эти две функции уже выполнятся не будут.

 * @note   The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface
  *         The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes
  *         The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes
  *         (system reset will occur)

Функцию  FLASH_OB_Launch(), можно не использовать, тогда   FLASH_OB_Lock();    FLASH_Lock();  будут уже нужны,  Но защита будет включаться после самостоятельной перезагрузки системы.

Edited by optima

Share this post


Link to post
Share on other sites
LiVit    12
20 часов назад, optima сказал:

А какая необходимость в  FLASH_OB_Lock();    FLASH_Lock();  ?

После  FLASH_OB_Launch() будет системный сброс и соответственно эти две функции уже выполнятся не будут.

Правильно!

Вот, теперь видно человека, который читает и анализирует код ))

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By LiVit
      Привет коллеги! Данная публикация - для тех, кто еще не все плюшки UARTA попробовал ))
      USART1 (и только он) микроконтроллеров серии STM32F030 предоставляет возможность принимать пакеты данных с неизвестной заранее длиной пакета.
      Для этого можно использовать овертаймер.
      Работает это так:
      Если в течение заданного времени не будет принят старт-бит очередного байта, генерируется прерывание.
      Время ожидания задается не физически (в секундах), а в количестве бит, которые могли бы быть приняты на данной скорости.
      т.е., если мы зададим число 16, то прерывание возникнет, если в течение времени эквивалентному приему 16 бит, на вход USART не поступит старт-бит.

      Как включить.
      1 разрешим прерывание - бит RTOIE регистра CR1
      2 зададим время (количество бит) в регистре RTOR
      3 разрешим работу овертаймера - бит RTOEN регистра CR2
      4 при возникновении прерывания от USART1, смотрим флаг RTOF в регистре ISR, - если есть флаг, значит это оно
      5 сбросим флаг прерывания - бит RTOCF в регистре ICR.
      Как я это использую.
      Включаю прерывание при инициализации порта и задаю количество бит для счетчика.
      Как только приходит первый байт сообщения - в прерывании разрешаю работу овертаймера.
      Все принятые байты сохраняю в буфер.
      Когда возникнет прерывание по овертайму - запрещаю овертаймер, и передаю пакет на парсинг.
    • By LiVit
      Приветствую, коллеги!
      Ситуация такая: есть серия устройств на STM32F030R8, на некоторых время от времени начинает греться микроконтроллер. 
      Вся логика работает, всё вроде в порядке, кроме потребления в 250мА. И перегретого корпуса микроконтроллера.
      В прошивке изначально отсутствовала инициализация неиспользуемых ног, кроме того, проц сначала старается завести внешний кварц, и только потом переходит на внутренний генератор.
      Нога BOOT0 притянута к земле напрямую, без резистора.
      На проце который уже начал перегреваться, я сделал инициализацию всех ног на вход, с подтяжкой ног к земле. Сразу завожу внутренний тактовый генератор.
      К сожалению, ему уже ничего не помогает, - даже будучи стертым, он жрет 200 мА. Как я понимаю, тут мои полномочия всё.
      Хотелось бы услышать от коллег, что именно могло вызвать такую странную неисправность проца? Может кто сталкивался? В Errata ничего подобного не нашел.
    • By User_1
      Всем привет!
      Почему-то этот код работает: 
      void Send_to_UART(char* string) { char data = 0; while(*string) { while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); data = *string; USART1->TDR = data; string++; } while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0D); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0A); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TC))); } char hello[13] = {'H','e','l','l','o',' ','W','o','r','l','d','!'}; int main (void) { Init_Clock(); Init_USART1(); Send_to_UART(hello); while(1); } А если написать вот так:
      int main (void) { Init_Clock(); Init_USART1(); Send_to_UART("Hello World!"); while(1); } то не просто не работает - микроконтролер зависает даже до входа в main().
      В Си ведь, насколько я понимаю, строка - это тот же массив символов
      Объясните, пожалуйста, что я делаю не так?
      Камень stm32f030, среда CooCox CoIDE
    • Guest Максим
      By Guest Максим
      Всем светлым и умным головам привет!

      Никак не могу найти информацию о данном прерывании TIM1_BRK_UP_TRG_COM.
      Вопрос 1: Что это за стек или система прерываний? 
      Вопрос 2: Когда будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler, если также есть обработчик прерывания TIM1_CC_IRQHandler?
      Вопрос 3: период переполнения таймера равен 100 мкс. Сколько раз будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler до обработчика прерывания TIM1_CC_IRQHandler? По логике вещей, предполагаю, что 100 раз?
      Заранее благодарен!

      Всем радости))