Come modificare un file binario del valore esadecimale utilizzando C#

Quindi, ecco il mio problema. Ho un file binario che voglio modificare. Posso usare un hex editor per modificarlo, naturalmente, ma ho bisogno di fare un programma per modificare questo particolare file. Dire che conosco un certo hex voglio modificare, so che è di indirizzo etc. Diciamo che è un binario a 16 bit, e l’indirizzo è 00000000, è sulla riga 04 e ha un valore di 02. Come posso creare un programma in grado di modificare il valore dell’esagono, e solo che la sfortuna con il clic di un pulsante?

Ho trovato risorse che parlare di cose simili, ma non posso per la vita di me a trovare aiuto con l’esatto problema.

Qualsiasi aiuto sarebbe apprezzato, e per favore, non ditemi solo la risposta, se c’è uno, ma provare a spiegare un po’.

  • Faccio correclty che si desidera sovrascrivere un paio di byte in un determinato luogo in un file sul disco?
InformationsquelleAutor JC Leyba | 2010-07-10



2 Replies
  1. 22

    Penso che questo è meglio spiegato con un esempio specifico. Ecco i primi 32 byte di un file eseguibile, come mostrato in Visual Studio hex editor:

    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 si vedono in un hex editor sono lì solo per rendere le cose più facile da leggere. Quando si desidera modificare il byte in un file utilizzando il codice, è necessario identificare i byte da loro basato su 0 posizioni. Nell’esempio di cui sopra, le posizioni dei non-zero byte sono come segue:

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

    Nell’hex editor di rappresentanza sopra indicato, i numeri sulla sinistra rappresentano le posizioni del primo byte della riga corrispondente. L’editor è mostrando 16 byte per riga, in modo che l’incremento di 16 (0x10) ad ogni riga.

    Se volete semplicemente prendere uno dei byte del file e modificare il suo valore, l’approccio più efficiente che vedo sarebbe di aprire il file utilizzando un FileStream, cercano di posizione appropriata e sovrascrivere il byte. Per esempio, il seguente cambierà il 0x40 alla posizione 24 per 0x04:

    using (var stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) {
        stream.Position = 24;
        stream.WriteByte(0x04);
    }
    • Grazie mille, sono riuscito a completare il mio programma con queste informazioni.
  2. 0

    Beh, la prima cosa sarebbe probabilmente capire le conversioni. Esadecimale a decimale probabilmente non è così importante (a meno che, naturalmente, è necessario modificare il valore decimale di prima, ma è una semplice formula di conversione), ma esadecimale a binario sarà importante vedere come ogni esagono carattere (0-9,A-F) corrisponde a uno specifico output binario.

    Dopo la comprensione di quella roba, il passo successivo è quello di capire esattamente che cosa si sta cercando di fare la conversione in modo corretto, e sostituire la stringa esatta. Vorrei raccomandare (se il buffer non sarebbe troppo grande) per prendere l’intero hex dump e sostituire quello che stai cercando in là per evitare la sovrascrittura di un duplicato sequenza binaria.

    Speranza che aiuta!

    Riguarda,

    Dennis M.

Lascia un commento