使用Python修改二进制文件

jam*_*909 4 python file-io binaryfiles

我正在尝试修补hex文件.我有两个名为"patch 1"和"patch 2"的补丁文件(hex)

要修补的文件是一个名为"file.bin"的16 MB文件.

在过去的6或7个小时里,我尝试了许多不同的方法来弄清楚如何去做.我可以整天写一个字符串到一个文件,但我想尝试执行以下操作:

打开patch1.bin,读取字节打开patch2.bin,读取字节打开file.bin,写入字节

我想寻找位置0xc0010和0x7c0010,并应用patch1.bin然后我想寻求0x040000并应用patch2.bin

总而言之,我将应用3个补丁,然后关闭"file.bin"

如果有人给我一个例子,我会非常感激:)

我先尝试过这个:

patch1 = open("patch1", "r");
patch2 = open("patch2", "r");
main = open("file.bin", "w");

main.seek(0xC0010);
main.write(patch1);
main.seek(0x7C0010);
main.write(patch1);
main.seek(0x40000);
main.write(patch2);
main.close();
Run Code Online (Sandbox Code Playgroud)

但被告知我正在尝试将字符串写入文件,当它确实不是我想要的时候,大声笑然后我试过这个:

infile1 = open("patch1.bin", "rb") 
new_pos1 = int("0x00", 16)
infile1.seek(new_pos1, 0)
infile2 = open('file.bin', 'wb')
new_pos2 = int('0xc0010', 16)
infile2.seek(new_pos2, 0xc0010)
chunk1 = int("6FFFE0", 16)         #this is how long patch1 file is
data1 = infile1.read(chunk1)
with open("file.bin", "a") as outfile:
    outfile.write(data1)
Run Code Online (Sandbox Code Playgroud)

但它也没有用,因为无论我怎样尝试,我都无法用正确的偏移来写数据.

我确实管理了几次将patch1写入file.bin,但它没有在正确的偏移处进行修补,事实上它删除了file.bin并且只是将patch1复制到了它的位置.哪个是错的.

我必须提醒你我是python和编程的新手,但我真的想深入研究它并学习,所以任何好的例子都会被检查,希望对我来说是一个很好的学习课:)

谢谢你们和gals帮助我弄清楚我做错了什么:)

bik*_*der 7

你只需要使用seekwrite.使用seek跳转到位置,并write以overrwite现有数据.

with file('patch1.bin', 'rb') as fh:
    patch1 = fh.read()

with file('patch2.bin', 'rb') as fh:
    patch2 = fh.read()

with file('file.bin', 'r+b') as fh:
    # apply patch1
    fh.seek(0xc0010)
    fh.write(patch1)
    fh.seek(0x7c0010)
    fh.write(patch1)
    # apply patch2
    fh.seek(0x040000)
    fh.write(patch2)
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我弄清楚了它是什么,文件('file.bin','w')需要是'r +'....在我更改代码后,代码工作完美。非常感谢 :) (2认同)
  • 打开补丁文件时,应该以二进制模式打开它们 - "open("<fn>","rb")`,而要修补的文件应该以"r + b"模式打开. (2认同)