2013-02-01 111 views
2

我想修補一個十六進制文件。 我有兩個名爲「patch 1」和「patch 2」的補丁文件(十六進制)用Python修改二進制文件

要修補的文件是名爲「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(); 

,但被告知我是試圖將一個字符串寫入文件,而實際上它不是我想要的,笑 然後我試着這樣的:

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) 

,但它也不能工作,因爲不管是什麼我想,我不能讓它在他正確的偏移量來寫入數據。

我確實管理過幾次,把patch1寫到file.bin中,但是它沒有在正確的偏移量上打補丁,事實上它刪除了file.bin,只是在它的位置複製了patch1。哪個課程是錯誤的。

我必須提醒你我是新來的python和編程,但我真的想挖掘我的腳,並學習,所以任何好的例子將被檢查,並希望對我來說是一個很好的學習課程:)

感謝球員,併爲幫助我弄清楚加侖我在做什麼錯了:)

+0

你試過了什麼?引用你的代碼。 –

+1

這不是一個「十六進制文件」;它是一個*二進制*文件。十六進制文件將是一個包含十六進制數字的文本文件。這些通常用於*代表*二進制數據,當你想處理文本。 – unwind

回答

4

你只需要使用seekwrite。使用seek跳轉到該位置,並使用write來覆蓋現有數據。

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) 
+0

非常感謝你tho,現在我有點更多的教育;) – james28909

+0

好吧,我想出了它是什麼,與文件('file.bin','W')需要'R +'....後我改變了代碼完美無瑕。非常感謝:) – james28909

+2

當打開補丁文件時,應該以二進制模式打開它們:'open(「」,「rb」)',而要修補的文件應該以「r + b」模式打開。 –

1

您需要使用r+b模式編輯目標文件。 wb是寫入時不更新的模式,將截斷現有文件。查看http://docs.python.org/2/library/functions.html#open或您的OS的手冊頁打開以獲取有關不同文件模式的詳細信息。

+0

'w + b'截斷文件。在這種情況下使用'r + b'。 –

+0

哎呀,我甚至寫在裏面!修正了,謝謝。 –

1

的1.txt:

asdf 

a.py:

with open('1.txt','r+b') as f: 
    f.seek(2) 
    f.write('D') 

1。txt:

asDf 

這應該給你一個線索。

+0

是的,我現在知道我在做什麼工作;)感謝學校的noob大聲笑 – james28909