Jump to content

    
Sign in to follow this  
MX_Master

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
Just now, jcxz said:

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

Вот именно! 

Just now, MX_Master said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
9 минут назад, MX_Master сказал:

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

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

Share this post


Link to post
Share on other sites
3 минуты назад, MX_Master сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

14 minutes ago, jcxz said:

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
14 минут назад, VladislavS сказал:

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

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

Share this post


Link to post
Share on other sites
6 минут назад, jcxz сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

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

Edited by MX_Master

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji 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.

Sign in to follow this