Booger 0 19 февраля, 2016 Опубликовано 19 февраля, 2016 · Жалоба Добрый день! Возникла необходимость кусок кода, а точнее функцию, выделить в отдельную, не занятую область. С этим разобрался. Функция в отдельном файле 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 не менялось при изменении остальной части программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 19 февраля, 2016 Опубликовано 19 февраля, 2016 · Жалоба Надо посмотреть дизасемблером разницу и станет понятно. Палльцем в небо: там вызываются функции для плавающей арифметике и при этомих адреса меняются при изменении кода. >> сама функция (кстати, не пойму почему адрес 0x08012b01, а не 0x08012b00?) Особенности вызова Thumb Code. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 февраля, 2016 Опубликовано 19 февраля, 2016 · Жалоба Задача, выделить эту функцию, посчитать ее CRC, и чтобы это CRC не менялось при изменении остальной части программы. Метрология что ли какая-то? Кстати, CRC от врагов не защищает. От врагов нужна криптостойкая хеш-функция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SyncLair 0 19 февраля, 2016 Опубликовано 19 февраля, 2016 · Жалоба Вам нужно сформировать ABI - binary interface -- и скопмпилировать его отдельно и по фиксированному адресу разместить не функцию, а таблицу указателей на функции. Таки образом вам нужно отдельно скомпилировать эти функции в отдельном проэкте, а в другом проэкте пользоваться этими функциями через структуры и таблицу указателей -- посмотрите как это сделано у NXP когда они встраивают код в спец память контроллера. (LPC11u68 например) уверен так сделано и у некоторых других производилей МК. А вот как объяснить это компилятору (что функции main() не существует) -- в случае с Keil не представляю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Booger 0 20 февраля, 2016 Опубликовано 20 февраля, 2016 (изменено) · Жалоба Kabdim В дизасемблере все одинаково scifi да, метрология SyncLair Попробовал создал отдельный проект-либу. Подключил либу к своему проекту и та же фигня. На ум приходит только лепить из разных hex-ов разных проектов один hex, но это чудовище Франкинштейна не очень мне нравится. Есть мнение, что, если организовать не функцию, а класс, то всё может получится. Попробую, отпишусь. Попробовал. Создал класс с одним единственным методом, объявил объект класса, разместил этот объект по нужному адресу. Прикол в том, что объект занимает 1 байт и смысл считать его CRC нет. Изменено 20 февраля, 2016 пользователем Booger Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба Если большой объем программы, то возможно смотрите не тот сегмент. Преобразуйте Hex бинарник и бинарники (образы прошивок) уже сравнивайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба Попробовал создал отдельный проект-либу. Подключил либу к своему проекту и та же фигня. Всё правильно SyncLair написал. То, что вы игнорируете его совет, - это ваши проблемы. Кстати, а вот эта штука с проверкой целостности функции - это нужно по-честному сделать или абы так, чтобы отстали? Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь.И каких же? Вроде ничего особенного... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба И каких же? Вроде ничего особенного... Ну, я немного преувеличил, но немного. Скажем, для защиты от врагов CRC не годится, как я уже писал выше. Также для защиты от врагов нужно залочивать МК. В общем, как-то так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба В дизасемблере все одинаково Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба Всё правильно SyncLair написал. То, что вы игнорируете его совет, - это ваши проблемы. Кстати, а вот эта штука с проверкой целостности функции - это нужно по-честному сделать или абы так, чтобы отстали? Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь. А эта задача в принципе честно решается? Ну получим мы функцию, которая точно не изменяется после прохождения сертификации. Но никто ж не обещает, что данные ей на вход будут поступать без обработки. Или что вообще будет использоваться эта функция, а не соседняя, "слегка доработанная". Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить. Так это от уровня дизассемблера зависит. Если он развернёт команду "branch по адресу 0xabcd" в "branch в функцию def()", в дизассемблере, действительно "ничего не поменяется" :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба По-моему, во втором сообщении уже дан ответ. У процессора есть плавающая арифметика? Если нет, то вызываются функции. Которые размещаются, где понравится компилятору. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба А эта задача в принципе честно решается? Смотря как задача ставится. Если нужна реально защищённая система с указанием возможностей врага, то всё можно спроектировать. А если задача - это "ну изобразите тут что-то такое, похожее на некую меру некой защиты", то и будет так, как вы написали: Ну получим мы функцию, которая точно не изменяется после прохождения сертификации. Но никто ж не обещает, что данные ей на вход будут поступать без обработки. Или что вообще будет использоваться эта функция, а не соседняя, "слегка доработанная". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 20 февраля, 2016 Опубликовано 20 февраля, 2016 · Жалоба CRC32 вполне подходит для защиты. Код по дисассемблеру посмотрите - там всё понятно будет. Тем более в Keil это не проблема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Booger 0 25 февраля, 2016 Опубликовано 25 февраля, 2016 · Жалоба Добрый день! Пока оставил эту проблему до лучших времен. Попробую реализовать совет SyncLair позже. Нужно считать только CRC, никаких больше защит не нужно. Еще раз говорю, в дизассемблере функция выглядит одинаково. Или не функцию нужно смотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться