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

Добрый день!

Возникла необходимость кусок кода, а точнее функцию, выделить в отдельную, не занятую область. С этим разобрался. Функция в отдельном файле test_file.c

 

__attribute__((section(".ARM.__at_0x08012B00"))) float test(float t1, float t2, float t3)  
{
    return (t1 * t2 + t3);    
}

всё хорошо, область не занятая

вот выписки из map файла

сама функция (кстати, не пойму почему адрес 0x08012b01, а не 0x08012b00?)

test(float, float, float)            0x08012b01   Thumb Code    30  metrologicalcalculation.o(.ARM.__at_0x08012B00)

секция

.ARM.__at_0x08012B00                     0x08012b00   Section        0  test_file.o(.ARM.__at_0x08012B00)

генерируется hex, всё замечательно

:102AE00000000000000000000000000000000000E6
:102AF00000000000000000000000000000000000D6
:102B00002DE9F04105460E46144631462846FDF7AC
:102B10007DF907462146FDF7A3F8BDE8F0810000E6
:102B200000000000000000000000000000000000A5
:102B30000000000000000000000000000000000095

но при изменении кода, никак не касающегося этой функции! имею, что в этом куске hex происходят изменения во второй строке

:102AE00000000000000000000000000000000000E6
:102AF00000000000000000000000000000000000D6
:102B00002DE9F04105460E46144631462846FDF7AC
:102B100039F907462146FDF75FF8BDE8F08100006E
:102B200000000000000000000000000000000000A5
:102B30000000000000000000000000000000000095

не могу понять почему?

Задача, выделить эту функцию, посчитать ее CRC, и чтобы это CRC не менялось при изменении остальной части программы.

 

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


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

Надо посмотреть дизасемблером разницу и станет понятно. Палльцем в небо: там вызываются функции для плавающей арифметике и при этомих адреса меняются при изменении кода.

>> сама функция (кстати, не пойму почему адрес 0x08012b01, а не 0x08012b00?)

Особенности вызова Thumb Code.

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


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

Задача, выделить эту функцию, посчитать ее CRC, и чтобы это CRC не менялось при изменении остальной части программы.

Метрология что ли какая-то? Кстати, CRC от врагов не защищает. От врагов нужна криптостойкая хеш-функция.

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


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

Вам нужно сформировать ABI - binary interface -- и скопмпилировать его отдельно и по фиксированному адресу разместить не функцию, а таблицу указателей на функции. Таки образом вам нужно отдельно скомпилировать эти функции в отдельном проэкте, а в другом проэкте пользоваться этими функциями через структуры и таблицу указателей -- посмотрите как это сделано у NXP когда они встраивают код в спец память контроллера. (LPC11u68 например) уверен так сделано и у некоторых других производилей МК.

 

А вот как объяснить это компилятору (что функции main() не существует) -- в случае с Keil не представляю.

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


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

Kabdim

В дизасемблере все одинаково

 

scifi

да, метрология

 

SyncLair

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

 

На ум приходит только лепить из разных hex-ов разных проектов один hex, но это чудовище Франкинштейна не очень мне нравится.

 

Есть мнение, что, если организовать не функцию, а класс, то всё может получится. Попробую, отпишусь.

 

 

Попробовал.

Создал класс с одним единственным методом, объявил объект класса, разместил этот объект по нужному адресу.

Прикол в том, что объект занимает 1 байт и смысл считать его CRC нет.

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

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


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

Если большой объем программы, то возможно смотрите не тот сегмент.

Преобразуйте Hex бинарник и бинарники (образы прошивок) уже сравнивайте.

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


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

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

Всё правильно SyncLair написал. То, что вы игнорируете его совет, - это ваши проблемы.

 

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

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


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

Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь.
И каких же? Вроде ничего особенного...

 

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


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

И каких же? Вроде ничего особенного...

Ну, я немного преувеличил, но немного. Скажем, для защиты от врагов CRC не годится, как я уже писал выше. Также для защиты от врагов нужно залочивать МК. В общем, как-то так.

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


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

В дизасемблере все одинаково

Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить.

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


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

Всё правильно SyncLair написал. То, что вы игнорируете его совет, - это ваши проблемы.

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

 

А эта задача в принципе честно решается?

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

 

Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить.

 

Так это от уровня дизассемблера зависит. Если он развернёт команду "branch по адресу 0xabcd" в "branch в функцию def()", в дизассемблере, действительно "ничего не поменяется" :-)

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


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

По-моему, во втором сообщении уже дан ответ.

У процессора есть плавающая арифметика? Если нет, то вызываются функции. Которые размещаются, где понравится компилятору.

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


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

А эта задача в принципе честно решается?

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

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

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


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

CRC32 вполне подходит для защиты.

Код по дисассемблеру посмотрите - там всё понятно будет.

Тем более в Keil это не проблема.

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


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

Добрый день!

 

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

Нужно считать только CRC, никаких больше защит не нужно.

Еще раз говорю, в дизассемблере функция выглядит одинаково. Или не функцию нужно смотреть?

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


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

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

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

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

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

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

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

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

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

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