Использование таблицы строк и печать имен секций

Мы получили домашнее задание, в котором нам нужно взять файл ELF и вывести названия его разделов.

Мы должны делать все это, используя только данные, которые мы получаем непосредственно из заголовка ELF, то есть мы не можем использовать какие-либо процедуры «высокого уровня» — нам нужно напрямую обращаться к нужным нам данным.

Итак, я пытаюсь напечатать имя первого раздела. Я знаю, что имена должны быть в таблице строк. Это то, что у меня есть до сих пор:

Я получаю начало файла ELF, используя mmap...

elfhead =(Elf32_Ehdr *) mmap...

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

sectionoffset = elfhead->e_shoff

тогда

section = (Elf32_Shdr*)(elfhead + sectionoffset)
nameoffset = section->sh_name    
stringoffset = elfhead->e_shstrndx;

Чтобы было ясно -

  • в elfhead у меня есть заголовок эльфа
  • в разделе у меня есть заголовок раздела
  • в stringoffset у меня есть индекс внутри таблицы разделов, где должна быть таблица строк
  • в nameoffset у меня есть индекс в таблице строк, где должно быть имя первого раздела.

Как перейти к первому имени и распечатать его, учитывая приведенный выше код?


person iddqd    schedule 02.06.2012    source источник
comment
возможный дубликат получения члена sh_name в разделе заголовочный файл elf   -  person Employed Russian    schedule 03.06.2012


Ответы (1)


Ну, во-первых, вам нужно иметь доступ к таблице строк раздела, и, поскольку заголовок - это первое, что находится в файле ELF:

char* stringTable = elfhead + (section + header->stringoffset)->sh_offset;

Как только вы это сделаете, все, что вам действительно нужно сделать, это распечатать первый, используя уже полученное nameoffset, вот так.

char* name = stringTable + nameoffset;
printf("%s\n",name);

К вашему сведению, печать остальных имен будет простым циклом:

for(i=0;i<header->e_shnum;i++){
        char* name = stringTable + nameoffset;
        printf("%s\n",name);
        section++;
    }
person RELnemtzov    schedule 02.06.2012