Как удалить заголовок программы из двоичного файла ELF - PullRequest
4 голосов
/ 04 мая 2011

Я хочу написать утилиту для удаления заголовка программы из двоичного файла ELF. Например, когда я запускаю readelf -l / my / elf, я получаю список всех заголовков программы: PHDR INTERP ... GNU_STACK GNU_RELRO. Когда я запускаю свою утилиту, я хотел бы вернуть все те же заголовки программы в том же порядке, за исключением того, который я удалил. Есть ли более простой способ сделать это, чем воссоздать весь ELF с нуля, пропустив нежелательный заголовок?

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Есть ли более простой способ сделать это, чем воссоздать весь ELF с нуля

Конечно: заголовки программы формируют таблицу с фиксированными записями со смещением, заданным ehdr.e_phoff, содержащим .e_phnum записей .e_phentsize байтов.

Чтобы удалить одну запись, просто скопируйте остальные записи поверх нее и уменьшите .e_phnum. Это все, что нужно сделать.

Осторожно: удаление некоторых записей может привести к сбою динамического загрузчика. GNU_STACK - это единственный заголовок, который можно удалить без особого вреда (о чем я могу подумать).

Обновление:

Да, установка .p_type в PT_NULL - еще один (и более простой) подход. Но такие записи, как правило, не должны присутствовать, и вы можете найти некоторые системы, в которых PT_NULL вызовет утверждение в загрузчике (или в какой-либо другой программе).

Наконец, добавить новый Phdr может быть сложно. Обычно нет места для расширения таблицы (так как сразу за ней следуют некоторые другие данные, например, .text). Вы можете переместить таблицу в конец файла и установить .e_phoff и .e_phnum в соответствии с новой таблицей, но многие программы ожидают, что вся таблица Phdr будет загружена и доступна во время выполнения, а это не так. легко организовать, так как новое местоположение в конце файла не будет "покрыто" ни одним сегментом PT_LOAD.

0 голосов
/ 04 мая 2011

Библиотека дескрипторов двоичных файлов GNU (libbfd) может быть полезна.

...