Перейти к содержанию
    

Переадресация в уже собранной прошивке для STM32

Название темы, канеш, непонятное. Не знаю как точно назвать.

ДАНО: есть готовый бинарник прошивки под STM32F207VCT6, исходников нет. По таблице векторов прерываний видно, что базовый адрес флэхи = 0x08000000.

ЗАДАЧА: хочу разместить в начале флэхи (0x08000000) свой загрузчик, а следом за ним разместить 2 прошивки - оригинал и свою версию. В зависимости от настроек, загрузчик должен передавать управление одной из них. Свой проект можно собрать, указав линкеру смещенный адрес флэхи. А как быть с уже собранным оригиналом? Есть ли какой-то способ найти в бинарнике все адреса с флэхи и махнуть их на другие? 

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


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

2 минуты назад, MX_Master сказал:

Есть ли какой-то способ найти в бинарнике все адреса с флэхи и махнуть их на другие? 

Есть: дизассемблер.

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


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

Только что, Forger сказал:

Тупиковая задача, поскольку есть такая штука, как косвенная адресация.

Так в Cortex-M вроде как другой и нет.  :wink:

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


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

Только что, jcxz сказал:

дизассемблер

Никогда ещё не дизассемблировал бинарники от STM32, с чего можно начать? 

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


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

Just now, jcxz said:

Так в Cortex-M вроде как другой и нет.  :wink:

Вот именно! 

Just now, MX_Master said:

Никогда ещё не дизассемблировал бинарники от STM32, с чего можно начать? 

С поиска подходящего вам дизассемблера.

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


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

В контексте задачи можно оригинал разместить и с 0x08000000, а загрузчик в другом месте. Главное, чтобы первым стартовал именно загрузчик (:

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


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

9 минут назад, MX_Master сказал:

 ЗАДАЧА: хочу разместить в начале флэхи (0x08000000) свой загрузчик, а следом за ним разместить 2 прошивки

А если изменить задачу? Свой загрузчик разместить в конце и просто поправить ресет-вектор в первой прошивке, пусть она себе на месте лежит. А в загрузчик жёстко прописать старый вектор.

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


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

3 минуты назад, MX_Master сказал:

Никогда ещё не дизассемблировал бинарники от STM32, с чего можно начать? 

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

PS: Да - дизассемблировать нужно не "для STM32", а "для Cortex-M". Вроде IDA умел Cortex-M. Хотя... может есть какой-то дизасм, специально заточенный под периферию STM32?

2 минуты назад, VladislavS сказал:

А если изменить задачу? Свой загрузчик разместить в конце и просто поправить ресет-вектор в первой прошивке, пусть она себе на месте лежит. А в загрузчик жёстко прописать старый вектор.

Многие прошивки (мои - все) проверяют своё содержимое на валидность через некоторое время после старта. Так что с ними этого не хватит.

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


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

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

 

Где ты там CRC хранишь? В свободных векторах или после прошивки? :biggrin:

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


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

По идее, можно в начало готового бинарника подставить переадресацию на начало вашего загрузчика (&sp и &Reset_Handler), чтобы он стартовал.

Далее, в коде загрузчика явным образом должны храниться адреса &sp и &Reset_Handler, взятые из оригинального бинарника. В конце работы загрузчика эти сохранённые адреса используете, чтобы задать __set_MSP() и прыгнуть в Reset_Handler оригинального бинарника.

Принципиальных проблем не вижу, но сам не пробовал. Напишите, если на практике всё получится. Тема интересная.

14 minutes ago, jcxz said:

Многие прошивки (мои - все) проверяют своё содержимое на валидность через некоторое время после старта. Так что с ними этого не хватит. 

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

 

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


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

Если есть возможность перевести МК в режим заводского загрузчика и подцепить к нему снаружи хитрую штуку, то эта хитрая штука сможет проделывать вот это всё, даже не трогая старую прошивку.

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


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

14 минут назад, VladislavS сказал:

Где ты там CRC хранишь? В свободных векторах или после прошивки? :biggrin:

Я сейчас - в свободном векторе. Но можно и в конце, или в середине - какая разница?

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


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

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

какая разница?

Разница в том заработает ли у ТС сразу, надо будет пару байт найти или проще переписать прошивку с нуля. Против твоих способов хранения CRC ничего не имею :)

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


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

Вариант с подменой адреса reset вектора гениален:dance3:

Спасибо, друзья. Бум пробовать... 

ЗЫ помониторить правку флэша из оригинала тоже не помешает

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

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

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

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

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

×
×
  • Создать...