python - 如何通过pyelftools保存修改过的ELF

标签 python elf

最近对ELF文件结构很感兴趣。在网上搜索时,我发现了一个很棒的脚本,名为 pyelftools。但实际上我并不知道修改后的ELF的保存方法; ELFFile 类没有任何方法可以做。

首先,我喜欢下面的内容:

            header = self.elf.header
            self._emitline("%s" % header['e_shnum'])
            header['e_shnum'] = 30
            self._emitline("%s" % header['e_shnum'])

是的,这是糟糕的方式。但遗憾的是,我不知道在 ELF 文件中获取 e_shnum 的偏移量。有没有人可以教我?

问候,

雷克斯。

最佳答案

根据作者@eli-bendersky 的说法,pyelftools 是一个用于解析和分析 ELF/DWARF 文件的模块,它没有直接修改它们的方法。我查看了模块源文件,也找不到任何编辑/保存方法。

在介绍性帖子上,在 comments 内作者承认 pyelftools 没有 API 级别的支持来执行此操作,但一些修补可以帮助实现您的需要。

如果 pyelftools 不是硬依赖,这里有一个例子说明如何使用 elffile 做同样的事情。 :

import elffile

eo = elffile.open(name="/bin/ls")
eo.fileHeader.shnum = 30
with open('./ls.bin', 'wb') as f: f.write(eo.pack())

使用 readelf,您可以验证更改是否已正确保存:

readelf -h ls.bin 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x804be34
  Start of program headers:          105068 (bytes into file)
  Start of section headers:          103948 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         9
  Size of section headers:           40 (bytes)
  Number of section headers:         30
  Section header string table index: 27
readelf: Error: Unable to read in 0x708 bytes of section headers

关于 elffile 的文档不多,但您可以查看源代码并找出复制 pyelftools 特定功能的方法。如果这不起作用,您可以尝试使用 pyelftools 来读取/分析任务,并使用 elffile 来编辑部分和写入更改。

关于python - 如何通过pyelftools保存修改过的ELF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18569232/

相关文章:

Python:使用 minidom 搜索具有特定文本的节点

python - 用其他 .csv 中的列覆盖 .csv 中的列

c++ - 找出是否在共享库中调用了函数

c - 如何从 ELF 和 PE 文件中找到所有 "user defined functions"?

python - python post server是否有更好的方法来处理不同的文件类型?

python - 在 VTK 中选择不同的、单独的多数据

python - 使用 Python 连接到多播服务器

linux - 如何删除 ELF 文件中的节头表?

Linux 可执行文件格式。规范在哪里?

c - 存储在.data 或.bss 段中的静态或全局数据是否应该在程序执行前加载?