Вы можете копировать один раздел бинарного в текстовый файл с помощью команды objcopy
из пакета Binutils:
$ objcopy -O binary --only-section=<section> <binary> <output>
Так что в вашем случае:
$ objcopy -O binary --only-section=.proghead elf-binary-file output.proghead
После этого, вы можете просто написать код программы на C++, который считывает двоичный файл. Этот подход будет работать до тех пор, пока все, что вам нужно сделать, - это прочитать этот раздел, а не изменять двоичный файл.
Если вам нужно изменить двоичный код, вы должны были бы начать чтение раздела в том, что секции смещения игровой для размера байт. Можно использовать readelf
знать, что смещение раздел начинается и его размер:
$ readelf --wide -S /bin/ls
There are 28 section headers, starting at offset 0x1c760:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 0000000000400238 000238 00001c 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 000254 000020 00 A 0 0 4
[ 3] .note.gnu.build-id NOTE 0000000000400274 000274 000024 00 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000400298 000298 000068 00 A 5 0 8
[ 5] .dynsym DYNSYM 0000000000400300 000300 000c18 18 A 6 1 8
[ 6] .dynstr STRTAB 0000000000400f18 000f18 000593 00 A 0 0 1
Однако, имейте в виду, что непосредственно изменение двоичного файла хорошо до тех пор, пока нет никаких новых данных добавлены или данные удалены. Добавление новых данных приведет к увеличению раздела, что приведет к переопределению данных других разделов и дезорганизации индекса раздела. Сокращение раздела и заполнение заполнением может быть ОК, но, например, в разделе .text может повлиять на логику программы, если есть переход к относительному направлению, которое больше не существует.
Возможный дубликат [Как получить указатель на определенный раздел программы изнутри самого себя?(Возможно, с лифтером)] (http://stackoverflow.com/questions/12159595/how-to-get-a-pointer-to-an-specific-section-of-a-program-from-within-itself-ma) –
Вы хотите прочитать его из своей памяти программы или хотите прочитать его из файла ELF? – ysdx