Получить полное содержимое любого раздела файла ELF в коде C - PullRequest
0 голосов
/ 02 марта 2020

Я хочу получить полное содержимое любых разделов в файле ELF,

Я могу получить название содержимого с помощью этого кода:

int fd;
int counter;
int filesize;
void *data;
char *strtab;
Elf64_Ehdr  *elf;
Elf64_Shdr  *shdr;

counter = 0;
fd = open(av[1], O_RDONLY);
if (fd == -1) {
    perror("open : ");
    return (84);
}
filesize = lseek(fd, 0, SEEK_END);
data = mmap(NULL, filesize, PROT_READ, MAP_SHARED, fd, 0);
if (data != NULL) {
    elf = (Elf64_Ehdr *)(data);
    shdr = (Elf64_Shdr *)(data + elf->e_shoff);
    strtab = (char *)(data + shdr[elf->e_shstrndx].sh_offset);
    while(counter < elf->e_shnum) {
        printf("Contents of section %s:\n", &strtab[shdr[counter].sh_name]);
        counter ++;
    }
    return (EXIT_SUCCESS);
}
perror("mmap : ");
return (EXIT_FAILURE);

Я обнаружил, что * Структура 1006 * содержит много информации, но мне нужна информация, предоставленная командой objdump -s a.out, и я не могу найти структуру, которая предоставляет всю информацию.

Можете ли вы помочь мне найти отряд или название структуры, где я могу найти эту информацию, пожалуйста?

1 Ответ

0 голосов
/ 03 марта 2020

Это ошибка:

if (data != NULL) {

, потому что mmap не возвращает NULL при сбое (возвращает MAP_FAILED).

Ваши shdr переменные точки до struct Elf64_Shdr, который имеет поля .sh_offset и .sh_size. Чтобы получить содержимое раздела, вы хотите получить дамп .sh_size байтов, расположенный в (char *)data + shdr->sh_offset.

...