如何通过pyelftools保存修改后的ELF

Rex*_*Rex 3 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'])
Run Code Online (Sandbox Code Playgroud)

是的,那是不好的方式.但遗憾的是我不知道在ELF文件中获得e_shnum的偏移量.有人能教我吗?

问候,

雷克斯.

7h3*_*rAm 6

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

在介绍性帖子中,作者在评论中承认,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())
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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