Datei bearbeiten. Bei bestimmtem Offset Werte ändern?

moson

Mitglied
Hallo,

ich möchte gerne in einer Datei an einem bestimmten Offset (wie man es vom Hex Editor kennt...) einen Wert verändern. Wie kann ich das am besten realisieren?

Aufgabe:
Zum Offset 0003A42E gehen und 0F84 2706 0000 ersetzen durch 9090 9090 9090

Ich komm da irgendwie nicht mit dem Hex Zeugs klar.
 
Hallo.

Ist eigentlich ziemlich einfach. Ich habe dir ein Beispielprogramm geschrieben, ich denke so ists am verständlichsten. (Wenn du schon bissl C#/.net kannst vorrausgesetzt.)

Test-Datei Generator (generate_file.cs)
Code:
using System;
using System.IO;

public class Test
{
  public static void Main()
  {

    Stream strm = File.Create("testfile.bin");

    BinaryWriter writer = new BinaryWriter(strm);
    Random rnd = new Random((int)DateTime.Now.Ticks);
    for (int i = 0; i < 0xFFFF; i++)
      writer.Write((byte)rnd.Next());

    writer.Close();
    strm.Close();
    
  }
}

DateiWertÄnderer *g* (modify_file.cs)
Code:
using System;
using System.IO;

public class Modify
{
  public static void Main(string[] args)
  {
    byte[] vals = new byte[args.Length-2];
    for (int i = 0; i < vals.Length; i++)
      vals[i] = byte.Parse(args[i+2],System.Globalization.NumberStyles.HexNumber);
    
    new Modify(args[0], int.Parse(args[1],System.Globalization.NumberStyles.HexNumber), vals);
  }

  public Modify(string file, int offset, params byte[] vals)
  {
    Stream strm = File.Open(file, FileMode.Open);
    Stream strm_new = File.Create("modified_" + file);

    BinaryReader reader = new BinaryReader(strm);
    BinaryWriter writer = new BinaryWriter(strm_new);

    writer.Write(reader.ReadBytes(offset));

    foreach (byte b in vals)
    {
      writer.Write(b);
    }

    reader.ReadBytes(vals.Length);
    
    byte[] rest = reader.ReadBytes((int)(strm.Length - vals.Length));
    writer.Write(rest);

    writer.Close();
    reader.Close();
    strm.Close();
    strm_new.Close();
  }
}

Das ganze ist so zu benutzen.
Ich habs in die Dateien generate_file.exe und modify_file.exe kompiliert.

Zuerst 'generate_file' aufrufen, damit wir die Datei 'testfile.bin' haben.
Danach öffnete ich diese Datei mit einem Hex-Editor, suchte mir eine nette Stelle raus (also den Offset). In meinem Fall war das 23C
Dort stand folgende Byte-Folge:
.. 77 79 C3 97 DF 49 ..

Wir wollen also 6 Bytes überschreiben. Ich dachte mir damits gleich ersichtlich ist, schreibe ich einfach FF FF FF FF FF FF drüber.

Also hab ich modify_file so aufgerufen:
modify_file.exe testfile.bin 23C FF FF FF FF FF FF

Wichtig in dem Fall ist, das die hinten wirklich die Bytes einzeln stehen, weil ich die ja in ein Byte-Array schreibe.

So.. Das Programm braucht nicht lange (kommt natürlich auf die Dateigröße an), also gleich mal die neu erstellte Datei geöffnet und nachgesehen. -> Funktioniert. ;)

Ich hoffe du wirst schlau draus, wenn nicht - Frag nach.

MfG,
Weihnachtswiesel
 
Zurück