Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用Python修改ELF文件_Python 3.x_Elf_Pyelftools - Fatal编程技术网

Python 3.x 如何使用Python修改ELF文件

Python 3.x 如何使用Python修改ELF文件,python-3.x,elf,pyelftools,Python 3.x,Elf,Pyelftools,我正在尝试使用python修改ELF文件的.text段。 我成功地获得了.text字段,这样我就可以简单地更改所需的位。问题是,pyelftools不提供任何从ELF对象生成ELF文件的方法 因此,我尝试了以下几点: 我已经在c中创建了一个简单的helloworld程序,对其进行了编译并获得了a.out文件。然后我使用pyelftools来分解它 解决方案 要更改/编辑ELF文件的任何部分,我只需使用pyelftools的ELF文件类方法来获取字段的(I)偏移量和(ii)大小。这样我就知道了在二

我正在尝试使用python修改ELF文件的
.text
段。 我成功地获得了.text字段,这样我就可以简单地更改所需的位。问题是,
pyelftools
不提供任何从ELF对象生成ELF文件的方法

因此,我尝试了以下几点:

我已经在
c
中创建了一个简单的helloworld程序,对其进行了编译并获得了
a.out
文件。然后我使用
pyelftools
来分解它

解决方案 要更改/编辑ELF文件的任何部分,我只需使用
pyelftools
ELF文件
类方法来获取字段的(I)
偏移量
和(ii)
大小
。这样我就知道了在二进制文件中的确切位置

因此,在得到字段(A,B)的边距值后,我只是将该文件当作普通二进制文件处理。我所做的唯一一件事就是执行
file.seek(a)
将文件指针移动到我要修改的特定部分

无论如何,谢谢你的评论

def edit_elf_section(elf_object,original_file,section):
    
    elf_section = elf_object.get_section_by_name(section) 
                                             # !! IMPORTANT !!
    section_start = elf_section['sh_offset'] # NOT sh_addr. sh_addr is the logical address of the section
    section_end   = section_start + elf_section['sh_size']
    
    original_file.seek(section_start)

    # Write whatever you want to the file #

    assert(original_file.tell() <= section_end) # You've written outside the section
def edit_elf_部分(elf_对象、原始文件、部分):
elf\U section=elf\U对象。按\u名称获取\u section(section)
# !! 重要的!!
区段开始=elf区段['sh_偏移量]#非sh_地址。sh_addr是节的逻辑地址
截面图结束=截面图开始+elf截面图['sh\U尺寸']
原始文件.seek(节开始)
#把你想写的写在文件里#

断言(原始_文件.tell()你的具体问题是什么?可能是@sophros的副本我希望根据我从C编译HelloWorld程序得到的旧文件生成一个新的ELF文件。因此理想情况下,我希望它生成与gcc中的a.out文件相同的输出。我不确定我是否理解。如果你想要生成相同的输出,请复制我希望创建一个脚本来修改ELF文件的.text字段。因此,它将原始ELF作为输入,修改其.text字段,然后生成一个新的修改ELF。使用pyelftools,我能够得到文本字段,找到合适的基和偏移量,得到整个.text字段,我几乎准备好操纵它了。但在我开始翻转位之前,比如在.text字段,我想知道应用程序生成的文件确实是一个可执行的ELF。所以我只是尝试打开ELF(创建一个pyelftools对象),并通过这个循环尝试生成一个新的对象。但没用