LiVit

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

23 сообщения в этой теме

LiVit    7

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

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

Почитав мануал на проц, погуглив, почитав комментарии в 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, необходимо разблокировать саму флэшь.

Изменено пользователем LiVit

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mmc1    0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LiVit    7
В 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() - надо уточнить в мануале.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216
В 16.06.2018 в 16:08, LiVit сказал:

 FLASH_Lock();

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

LiVit    7
4 часа назад, optima сказал:

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

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

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

Изменено пользователем LiVit

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    19

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

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    19

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

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

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

 

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216
4 часа назад, Oxford сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    19

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

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

 

 

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216
1 час назад, Oxford сказал:

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

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

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

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

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

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

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

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

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

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

 

Изменено пользователем optima

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    19

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

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

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LiVit    7

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BARS_    747
17 часов назад, optima сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216
2 часа назад, BARS_ сказал:

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

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

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

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

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

Как минимум

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BARS_    747
57 минут назад, optima сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216

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

В рабочем случае, снимите вы или заказчик трассу с 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 софт проще написать новый. Я например могу за меньшие деньги софт написать с нуля.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BARS_    747
5 минут назад, optima сказал:

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216
27 минут назад, BARS_ сказал:

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

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

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

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

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

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

CAN ON.trc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BARS_    747
46 минут назад, optima сказал:

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

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

 

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    216
7 минут назад, BARS_ сказал:

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

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

Изменено пользователем optima

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
User_1    3

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: User_1
      Доброго времени суток!
      Вкратце: нужно после того, как я записал байт данных в SPI1->DR, отменить передачу этого байта и вместо него отправить 0х00
      Подробно: Смысл вот в чём: некий контроллер, с которым я пытаюсь наладить общение по SPI, запрашивает произвольный участок массива байт и считывает их сплошным потоком. Ну примерно как считывается микросхема EEPROM: задаёшь начальный адрес, а потом просто шлёшь сплошные 0xFF, а она сама инкрементирует адрес и прямо непрерывным потоком байт выдаёт содержимое памяти. Только тут в роли этой микросхемы мой stm32f030 и мне нужно следующий байт отправлять в SPI1->DR сразу после отправки предыдущего. Но когда поток заканчивается (а он каждый раз разной длины и длина эта заранее неизвестна), один байт остаётся не переданным и отправится первым при следующем запросе. А мне нужно, чтобы первым байтом всегда отправлялся 0х00
      Пином (ну то есть битом) NSS управляю программно, его выставление в единичку и снова в ноль, очевидно, не помогает вообще никак. Пока решил проблему так: деинициализирую модуль SPI и выключаю его тактирование, затем включаю тактирование и снова инициализирую. Работает, скорости хватает. Но должно же быть менее костыльное решение?)
      Может кто сталкивался с такой проблемой?
      Курение даташита, reference manual и результатов поиска в гугле, не особо помогло.
    • Автор: User_1
      Всем доброго времени суток!
      Кто-нибудь может поделиться рабочим примером инициализации I2C в STM32F030? Ну или может увидите в моём коде ошибку
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // Включаем тактирование RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; // Speed 50 MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Альтернативная функция GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Без подтяжки GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // Открытый сток GPIO_Init(GPIOA, &GPIO_InitStructure); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // Режим работы (I2C) I2C_InitStructure.I2C_OwnAddress1 = 0x11; // Адрес (не важен, если устройство - мастер) I2C_InitStructure.I2C_Timing = 0x00300619; // Значение для записи в регистр I2C_TIMINGR I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Cmd(I2C1, ENABLE); I2C_Init(I2C1, &I2C_InitStructure); Полдня уже вожусь, никак не заводится. Компилится без ошибок, светодиод мигает (ну в основном цикле написана простая светодиодная мигалка и раз в секунду - отправка сообщения в I2C), но смотрю логическим анализатором - на ножках тишина (ну в смысле единичка всегда, они же подтянуты резисторами к плюсу)
      I2C_Timing рассчитывается калькулятором от ST (I2C Timing Configuration) на основе частоты тактирования модуля I2C,  желаемой скорости шины и ещё пары параметров, калькулятор прикрепил к сообщению
      I2C_Timing_Configuration_V1.0.1.xls
    • Автор: Pag
      Продам остатки от производства, а именно микроконтроллеры семейтсва STM32F030 и STM32F051
      1. STM32F030K6T6 LQFP32 79 штук - 2000 рублей
      2. STM32F030C6T6 LQFP48 - 100 штук - 2800 рублей
      3. STM32F051R8T6 LQFP64 - 50 штук (один паяный) - 2500 рублей
      Все микроконтроллеры новые (кроме 1 шт.). Покупались в Элитане.
      Доставка по России - 200 рублей






    • Гость arthedza
      Автор: Гость arthedza
      Доброго времени суток всем! Товарищи, нужна ваша помощь.
      Буду краток. В универе проходил курс АВРок, настало время диплома. Диплом делаю на предприятии (и кураторы тоже от предприятия), в виду этого приходится на ходу осваивать STM32F0. Да и в универском курсе ни разу не сталкивался с датчиками. Пока имеется один вопрос, с остальным вроде разобрался. Он заключается в следующем: как мне подключать сей
      датчик скорости на эффекте Холла к СТМке? В программе MicroXplorer есть такой пунктик интересный — XORED Inputs Hall Sensor Interface (3 ноги под это дело заводится, 3 канала таймера). Что, все три ноги датчика на таймер МК подавать? Или лучше просто задействовать один канал таймера в режиме input capture? Если нужна дополнительная инфа — пишите, я укажу все, что знаю. Вот что написано в инсайдерском руководстве:
      Цитата:
      5.1.4.2.2. Интерфейс датчика Холла
      Каждый из таймеров, в т.ч. и расширенный, разработан с учетом простоты
      подключения к датчику Холла, предназначенного для измерения угловой частоты
      вращения электродвигателя. Первые три вывода захвата каждого таймера можно связать
      с каналом 1 через логический элемент "исключающее ИЛИ". В этом случае, по мере
      вращения двигателя и прохождения возле каждого датчика, в канале будет
      генерироваться событие захвата. Это приведет к копированию текущего состояния
      таймера в регистр захвата канала, а также к сбросу таймера. Таким образом, значение
      счетчика, которое окажется в регистре захвата, можно пересчитать в частоту вращения
      электродвигателя.