Изменить значения переменных в файле ELF?

Мне нужно изменить пару переменных в скомпилированном файле ELF. Попытка объяснить это ясно, я буду использовать простую структуру C в качестве примера.

Один исходный файл компилируется и связывается (@ 0x1000) в MyFile.elf из MyFile.c:

typedef struct {
uint32_t SerialNumber;      /* Increments for every time it's programmed */
uint32_t PartNumber;        /* Always the same */
char     ProdDateTime[32];  /* "YYYY-MM-DD HH:MM:SS" date/time when programmed */
uint32_t CalcCrc32;         /* Checksum of the above data */
} MyData_T;

const MyData_T MyData = {
/* SerialNumber      */ 0x11111111,
/* PartNumber        */ 0x12345678,
/* ProdDateTime[32]  */ "2013-11-10 12:49:30",
/* CalcCrc32         */ 0xC0CAC01A
};

Теперь мне нужен «консольный инструмент», который (без компиляции):

  1. Записывает новый серийный номер на 0x1000
  2. Записывает новую строку в 0x1008
  3. Обновляет контрольную сумму на 0x1028.

Я не смог найти инструмент (objcopy и т. Д.), Который даже выполняет первую (1) задачу. Кажется, это должен быть довольно распространенный сценарий? Я написал свой собственный инструмент, но предпочел бы инструмент с открытым исходным кодом или аналогичный.

Любые предложения / идеи / комментарии / критика высоко ценятся: D Спасибо вам !!

3

Решение

«gdb —write / your / application / binary» должен иметь возможность изменить значение инициализированных данных и записать его обратно в исполняемый файл.

Добавьте «-batch» и «-x command_file», и вы сможете заставить его делать то, что вы хотите.

2

Другие решения

QNX имеет встроенный инструмент под названием «Spatch» это позволяет вам делать именно это. Другие предложения использовать gdb или шестнадцатеричный редактор одинаково действительны.

Хотя патч двоичного кода полностью возможен, это звучит как ты делаешь это неправильно :-). Возможно, эти значения лучше подходят для хранения в каком-либо файле данных, распространяемом с двоичным файлом, и считывания во время какого-либо конструктора? Если у вас нет веской причины требовать, чтобы это было в двоичном, Я бы серьезно посмотрел на дизайн и посмотрел, нужно ли тебе это делать.

Если вы ответите «да, мне действительно нужно это сделать», тогда отлично. У вас есть пара очень надежных методов, предложенных для достижения этой цели. Удачи.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector