2015-10-15 4 views
1

У нас есть программа, в которую добавлен раздел с именем .proghead.Доступ к определенному разделу в ELF

Я могу читать эльфийские данные .proghead раздел с помощью следующей команды,

$ readelf -x .proghead elf-binary-file 

Hex dump of section '.proghead': 
    0x0058b960 00112233 00000000 00010000 00000000 .."3............ 
    0x0058b970 15200704 00000000 00016904 00000000 . ........i..... 

Теперь у меня есть доступ в этот раздел с помощью программы C/C++.

Может кто-нибудь, пожалуйста, помогите мне в написании кода C/C++, чтобы прочитать конкретный раздел в бинарнике elf?

Любая помощь очень ценится.

+0

Возможный дубликат [Как получить указатель на определенный раздел программы изнутри самого себя?(Возможно, с лифтером)] (http://stackoverflow.com/questions/12159595/how-to-get-a-pointer-to-an-specific-section-of-a-program-from-within-itself-ma) –

+0

Вы хотите прочитать его из своей памяти программы или хотите прочитать его из файла ELF? – ysdx

ответ

0

в общем случае, измените файл компоновщика компоновщика, чтобы указать имя для первого адреса раздела .proghead.

Затем в файле C напишите структуру, которая будет содержать содержимое раздела .proghead.

Затем установите переменную-указатель C указанного выше типа структуры, чтобы указать раздел .proghead.

С тех пор, что pointer-> FIELDNAME будет доступ к каждому из полей в структурах, которая является .proghead раздела

1

Что вам нужно прочитать заголовки разделов (Elf64_Shdr), чтобы найти название разделов и его смещение , Соответствующая информация находится в полях и sh_offset. Поэтому вам нужно сравнить с вашим необходимым разделом. При нахождении необходимого раздела вы можете получить его смещение (sh_offset) и его размер sh_size. Теперь вам легко получить данные через цикл, который читается от sh_offset до sh_offset+sh_offset+sh_size. Это теоретически правильно, и надеюсь, что вы получите данные о требуемой разделе Для проверки дальнейшей помощи следующих ссылок Get elf sections offsetsHow to get a pointer to an specific section of a program from within itself? (Maybe with libelf)

0

Вы можете копировать один раздел бинарного в текстовый файл с помощью команды 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 может повлиять на логику программы, если есть переход к относительному направлению, которое больше не существует.

Смежные вопросы