2010-07-10 5 views
9

Quindi, ecco il mio problema. Ho un file binario che voglio modificare. Posso usare un editor esadecimale per modificarlo, ovviamente, ma ho bisogno di creare un programma per modificare questo particolare file. Dì che conosco un certo hex che voglio modificare, so che è l'indirizzo ecc. Diciamo che è un binario a 16 bit, e l'indirizzo è 00000000, è sulla riga 04 e ha un valore di 02. Come potrei creare un programma che cambierebbe il valore di quell'esagono e solo quell'esagono con il clic di un pulsante?Come modificare il valore esadecimale di un file binario utilizzando C#

Ho trovato risorse che parlano di cose simili, ma non posso per la vita di me trovare aiuto con il problema esatto.

Qualsiasi aiuto sarebbe apprezzato, e per favore, non dirmi semplicemente la risposta se ce n'è uno, ma cerca di spiegarlo un po '.

+0

faccio a farlo correclty che si desidera sovrascrivere pochi byte in un determinato luogo in un file già presente sul disco? –

risposta

21

credo che questo si spiega meglio con un esempio specifico. Ecco le prime 32 byte di un file eseguibile come mostrato in hex editor di Visual Studio:

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 

Ora un file è in realtà solo una sequenza lineare di byte. Le righe che vedi in un editor esadecimale sono lì per rendere le cose più facili da leggere. Quando si desidera manipolare i byte in un file utilizzando il codice, è necessario identificare i byte in base alle posizioni basate su 0. Nell'esempio di cui sopra, le posizioni dei byte non-zero sono i seguenti:

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

nella rappresentazione editor esadecimale mostrato sopra, i numeri a sinistra rappresentano le posizioni del primo byte della riga corrispondente. L'editor mostra 16 byte per riga, quindi incrementano di 16 (0x10) per ogni riga.

Se si desidera semplicemente prendere uno dei byte nel file e modificarne il valore, l'approccio più efficiente che vedo sarebbe quello di aprire il file utilizzando un FileStream, cercare la posizione appropriata e sovrascrivere il byte. Ad esempio, il seguente cambierà la 0x40 alla posizione 24 a 0x04:

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

Grazie mille, sono stato in grado di completare il mio programma con queste informazioni. –

0

Beh, la prima cosa sarebbe probabilmente capire le conversioni. Probabilmente esadecimali non è così importante (a meno che, naturalmente, non sia necessario modificare prima il valore da un decimale, ma questa è una semplice formula di conversione), ma esadecimale sarà importante visto ogni carattere esadecimale (0-9, AF) corrisponde a una specifica uscita binaria.

Dopo aver compreso questa roba, il passo successivo è capire esattamente cosa si sta cercando, effettuare la conversione corretta e sostituire quella stringa esatta. Vorrei raccomandare (se il buffer non fosse troppo grande) per prendere l'intero dump esadecimale e sostituire quello che stai cercando lì per evitare di sovrascrivere una sequenza binaria duplicata.

Spero che questo aiuti!

saluti,
Dennis M.

Problemi correlati