最近对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 来编辑部分和写入更改。
我是一名优秀的程序员,十分优秀!