获取精灵章节偏移

我试图得到一个精灵文件的每个部分的偏移量和数据。 我已经有这个代码的部分名称:

#include <elf.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> int filesize(int fd) { return (lseek(fd, 0, SEEK_END)); } void print_section(Elf64_Shdr *shdr, char *strTab, int shNum) { int i; for(i = 0; i < shNum; i++) printf("%02d: %s\n", i, &strTab[shdr[i].sh_name]); } int main(int ac, char **av) { void *data; Elf64_Ehdr *elf; Elf64_Shdr *shdr; int fd; char *strtab; fd = open(av[1], O_RDONLY); data = mmap(NULL, filesize(fd), PROT_READ, MAP_SHARED, fd, 0); elf = (Elf64_Ehdr *) data; shdr = (Elf64_Shdr *) (data + elf->e_shoff); strtab = (char *)(data + shdr[elf->e_shstrndx].sh_offset); print_section(shdr, strtab, elf->e_shnum); close(fd); return 0; } 

但我找不到一个方法来获得每个部分的数据,也不是他们的起始偏移量。 谢谢你的帮助

我想你可以使用sh_offsetshdr[i].sh_size

 void print_section(Elf64_Shdr *shdr, char *strTab, int shNum, uint8_t *data) { int i; for(i = 0; i < shNum; i++) { size_t k; printf("%02d: %s Offset %lx\n", i, &strTab[shdr[i].sh_name], shdr[i].sh_offset); for (k = shdr[i].sh_offset; k < shdr[i].sh_offset + shdr[i].sh_size; k++) { printf("%x", data[k]); } printf("\n"); for (k = shdr[i].sh_offset; k < shdr[i].sh_offset + shdr[i].sh_size; k++) { printf("%c", data[k]); } printf("\n"); } } 

并像这样调用它:

 print_section(shdr, strtab, elf->e_shnum, (uint8_t*)data); 

一种获得虚拟地址(偏移量)的方法:

 Elf64_Phdr *ph = (Elf64_Phdr *) ((uint8_t *) data + elf->e_phoff); printf("Virtual address offset: %lx\n", ph->p_vaddr - elf->e_phoff);