使用pyelftools抓取程序头信息

Grabbing program header information with 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?

这样的十六进制格式

你的 post 发生了一些奇怪的事情。

你说:

I am simply trying to grab the program header information with pyelftools (the offset, virtual address, and physical address).

Note: Elf_Shdr is the program header file.

但是 Elf_Shdr 不是程序 header,而是部分 header。看看elftools/elf/structs.py

Elf_Shdr:
                Section header

然后在你的代码中你出于某种原因解析了文件两次。第一个字符串足以解析它,您可以从 elffile object:

访问所有 header 数据
for segment in elffile.iter_segments():
    header = segment.header
    for key, value in header.items():
        if isinstance(value, int):
            print(key, hex(value))

这里我遍历ELF文件的所有段(它们由程序headers描述),然后遍历header中的所有属性,如果是整数则将它们打印为十六进制。这里没有魔法,header 只是标准字典的容器。

您也可能对使用 pyelftools 实现的 readelf 感兴趣 - here.