Python 覆盖二进制文件中的单个字节会使objdump无法识别它吗?
我想覆盖二进制文件中特定Python 覆盖二进制文件中的单个字节会使objdump无法识别它吗?,python,linux,python-3.x,Python,Linux,Python 3.x,我想覆盖二进制文件中特定偏移量处的单个字节。值cval是一个整数 为此,我编写了以下代码: f = open(program, "wb") f.seek(offset, 0) # absolute #print(f.read(1)) f.write(bytes([cval])) f.close() 读取偏移量处的字节时,代码工作正常,但写入此位置会导致objdump无法识别ELF二进制文件 mfo@mfo-Ubuntu:~/llvm-ir-obfuscation/checker$ objdum
偏移量处的单个字节。值cval
是一个整数
为此,我编写了以下代码:
f = open(program, "wb")
f.seek(offset, 0) # absolute
#print(f.read(1))
f.write(bytes([cval]))
f.close()
读取偏移量处的字节时,代码工作正常,但写入此位置会导致objdump
无法识别ELF二进制文件
mfo@mfo-Ubuntu:~/llvm-ir-obfuscation/checker$ objdump -dF fac_c
objdump: fac_c: File format not recognized
我看不出我做错了什么?您使用w
模式打开文件,该模式在打开文件时会截断文件。所以您的最终文件将只包含您编写的一个字节
只需在更新模式下打开它:
f = open(program, "r+b")
这应该很好。请参阅关于Python文件I/O的本教程:
rb+:以二进制格式打开文件进行读写。这个
放置在文件开头的文件指针
让你困惑的可能是你认为rb+是阅读,wb+是写作。但是,这两种模式都会打开文件进行读写,而后者也会覆盖文件
由于后一种模式会覆盖文件,ELF二进制文件会被有效地销毁(标题消失)。您确定没有在某些标题中写入内容吗?当我执行f.read(1)
时,我在.text
部分正确读取了位。然而,写操作在某种程度上把事情搞砸了。你真的应该因为在发布这个问题之前没有检查“未识别”的文件大小而被否决。