用pyelftools抓取程序头信息

问题描述

我只是想用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感兴趣。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...