问题描述
我只是想用pyelftools
(偏移量,虚拟地址和物理地址)获取程序头信息。
这可以通过运行以下命令在终端上完成:
readelf -l <elf_file>
但是我很难从pyelftools获得相同的信息。从示例中,我将其拼凑而成:
elffile = ELFFile(stream)
section_header = elffile.structs.Elf_Shdr.parse_stream(stream)
print (section_header)
注意:Elf_Shdr
是程序头文件。
这将打印偏移量,虚拟地址,物理地址等。但是不是我想要的十六进制格式,或者像readelf
那样打印。有没有办法让它打印出readelf
这样的十六进制格式?
解决方法
您的帖子中发生了一些奇怪的事情。
您说:
我只是想通过以下方式获取程序头信息 pyelftools(偏移量,虚拟地址和物理地址)。
注意:Elf_Shdr是程序头文件。
但是Elf_Shdr不是Program头,它是Section头。看elftools/elf/structs.py
Elf_Shdr:
Section header
然后由于某种原因在代码中将文件解析两次。第一个字符串足以解析它,您可以从elffile
对象访问所有标头数据:
for segment in elffile.iter_segments():
header = segment.header
for key,value in header.items():
if isinstance(value,int):
print(key,hex(value))
在这里,我遍历ELF文件的所有段(它们由Program标头描述),然后遍历标头中的所有属性,如果是整数,则将它们打印为十六进制。这里没有魔术,标题只是标准字典的容器。
另外,您可能对使用pyelftools-here实现的readelf
感兴趣。