以C代码获取ELF文件任何部分的完整内容

以C代码获取ELF文件任何部分的完整内容,c,elf,objdump,C,Elf,Objdump,我想获取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 = lse

我想获取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);
intfd;
整数计数器;
int文件大小;
作废*数据;
字符*strtab;
Elf64_Ehdr*elf;
Elf64_Shdr*Shdr;
计数器=0;
fd=开路(仅限av[1];
如果(fd==-1){
佩罗尔(“公开:”);
返回(84);
}
filesize=lseek(fd,0,SEEK_END);
data=mmap(空,文件大小,保护读取,映射共享,fd,0);
如果(数据!=NULL){
elf=(Elf64_Ehdr*)(数据);
shdr=(Elf64_shdr*)(数据+elf->e_shoff);
strtab=(字符*)(数据+shdr[elf->e_shstrndx].sh_偏移量);
同时(计数器e_shnum){
printf(“节%s:\n”的内容,&strtab[shdr[counter].sh_name]);
计数器++;
}
返回(退出成功);
}
佩罗尔(“mmap:”);
返回(退出失败);
我发现
shdr
结构包含许多信息,但我需要由
objdump-s a.out
命令提供的信息,我找不到提供所有信息的结构

你能帮我找到一个线索或一个结构的名称,我可以在那里找到这些信息吗?

这是一个错误:

if (data != NULL) {
因为
mmap
在失败时不返回
NULL
(它返回
MAP\u FAILED


您的
shdr
变量指向
struct Elf64_shdr
,该变量具有
.sh_offset
.sh_size
字段。要获取节的内容,您需要转储
。位于
(char*)data+shdr->sh_offset

void
的sh_size
字节是未定义的行为。你可以用
(Elf64_Shdr*)((char*)data+elf->e_shoff)来解决这个问题。
你想要反汇编,还是仅仅以二进制形式编码?我想要以以下格式获取信息:
节的内容。rodata:0000 67452301 efcdab89 67452301 efcdab89 gE#。。。。。0010 64636261 68676665 64636261 68676665 DCBAHGFEDCBAHGFEDCBAHGFE
查看
objdump的代码
?目前的问题是一条通向广泛的道路。