在C语言中查找ELF文件的文本部分

3

如何正确获取Elf文件的文本部分并显示其内容?我已经尝试过,但只显示了250个字节的数据,但是当我使用readelf命令时,它会显示更多。我认为我只是获取段落时偏移量设置错误。请问正确的方法是什么?

更新: 我添加了代码,现在想要打印符号名称时出现分段错误。


1
你可以使用libelf来读取elf文件。 - Tom Karzes
不行,我只能使用elf.h库,不能使用其他的。 - danilo
2
对于Unix来说并不重要,但是你应该为二进制文件使用“rb”模式。 - Ian Abbott
2
"elf.h"是一个头文件,而不是一个库。相应的库是"libelf",如果您使用其中任何对象(变量或函数),则需要将其链接到您的程序中,但显然您并不打算这样做。看起来您只是使用头文件中的类型声明。 - the busybee
请不要从问题中删除源代码!这会使您的问题无用。 - the busybee
1个回答

1
我认为我刚刚获取章节的偏移量是错误的。
您的程序遍历所有章节,所以在第一个循环结束时,sectHdr包含最后一个章节的章节标题,这不太可能是.text章节。
因此,在第二个循环中,您会打印出任何最后一个部分的内容。
要打印.text节,需要在找到它时保存其节标题。
更新:
如果我通过for循环遍历所有节,然后与每个名称进行strcmp,并且当我找到匹配文本时,保存该标头的地址怎么办?
您不保存该标头的地址-您保存内容。
关于我想访问符号表,它不是Section(具有自己的类型:Elf32_Sym),我如何访问该表?
符号表确实有它自己的部分(包含一组Elf32_Sym记录)。请参见answer更新2: 这段代码:
    if(strcmp(name, ".symtab") == 0) {
        //symbolTable = (Elf32_Sym*)sectHdr.sh_addr;
        symtab = (Elf32_Shdr*) &sectHdr;
    }
    if(strcmp(name, ".strtab") == 0) {
        strtab = (Elf32_Shdr *) &sectHdr;
    }

显然有问题:在循环的每次迭代中,您保存指向将被覆盖的内存的指针。 您必须保存.symtab和.strtab部分头文件的副本(就像您为.text所做的那样)。
更好的解决方案是将整个文件映射到内存中。 然后,您可以保存对其各个部分的指针(这就是另一个答案所做的--那里的data指向mmaped区域的开头)。

那么,如果我针对所有节执行for循环,然后与每个名称进行strcmp比较,当我找到与.text匹配的时,我保存该标头的地址。如果我想要访问符号表(不是节,具有自己的类型:Elf32_Sym),我该如何到达该表? - danilo
我明白了,谢谢。我只是好奇代码中链接中的“data”变量(类型,用途)是什么。 - danilo
1
@danilo 在另一个问题中,data 变量是一个指向整个文件被读取到的缓冲区的 char*。因此,ELF 头部 elf(struct Elf64_Ehdr *)data,而节头 shdr(Elf64_Shdr *)(data + elf->e_shoff),等等。 - Employed Russian
1
在处理其余部分之前,还应检查魔数以确保它确实声称是 ELF 文件。 - stark
@EmployedRussian,你也检查了我的打印文本部分的代码是否正确吗?因为当我使用dumpelf命令检查时,输出的字符与我的代码输出不同。 - danilo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接