2010-07-10 49 views
9

因此,這是我的問題。我有一個我想編輯的二進制文件。我當然可以用十六進制編輯器編輯它,但我需要編寫一個程序來編輯這個特定的文件。假設我知道一個我想編輯的十六進制數,我知道它是地址等。假設它是一個16位二進制數,地址是00000000,它在第04行,它的值爲02.我怎麼能創建一個程序會改變那個十六進制的值,只有那個點擊一個按鈕的十六進制?如何使用C編輯二進制文件的十六進制值#

我發現有關類似事情的資源,但我無法爲我的生活尋找幫助確切的問題。

任何幫助,將不勝感激,請,不要只告訴我,如果有一個答案,但嘗試解釋一下。

+0

我能得到它correclty要覆蓋在給定位置的幾個字節的文件已經在磁盤上? – 2010-07-10 05:04:07

回答

21

我認爲這是最好的一個具體的例子說明。下面是在Visual Studio中的十六進制編輯器顯示的前32個字節的可執行文件:

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 

現在文件確實是字節只是一個線性序列。您在十六進制編輯器中看到的行只是爲了使事情更易於閱讀。如果要使用代碼操作文件中的字節,則需要通過基於0的位置來標識字節。在上述例子中,是非零的字節位置如下:

Position Value 
-------- ------ 
    0  0x4D 
    1  0x5A 
    2  0x90 
    4  0x03 
    8  0x04 
12  0xFF 
13  0xFF 
16  0xB8 
24  0x40 

在上面所示的十六進制編輯器的表示,在左邊的數字表示在相應的行中的第一個字節的位置。編輯器每行顯示16個字節,所以它們每行增加16(0x10)。

如果您只想取出文件中的一個字節並更改其值,那麼我所看到的最有效的方法就是使用FileStream打開文件,找到適當的位置並覆蓋該字節。例如,下面將在24位改變0x40的爲0×04:

using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { 
    stream.Position = 24; 
    stream.WriteByte(0x04); 
} 
+0

非常感謝,我能用這些信息完成我的程序。 – 2010-07-10 15:10:36

0

那麼第一件事可能是理解轉換。十六進制到十進制可能不是那麼重要(除非當然需要先從小數點開始更改值,但這是一個簡單的轉換公式),但十六進制到二進制將很重要,因爲每個十六進制字符(0-9,AF )對應於特定的二進制輸出。

理解完這些東西之後,下一步就是找出你正在搜索的內容,進行正確的轉換,並替換確切的字符串。我會建議(如果緩衝區不會太大)採取整個十六進制轉儲並替換您在那裏搜索的任何內容,以避免覆蓋重複的二進制序列。

希望有幫助!

問候,
丹尼斯M.

相關問題