Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei auf binärer Ebene bearbeiten? (https://www.delphipraxis.net/73568-datei-auf-binaerer-ebene-bearbeiten.html)

cruso 19. Jul 2006 23:24


Datei auf binärer Ebene bearbeiten?
 
Hi!

Wisst ihr, wie man eine Datei (*.exe; *.zip ......) auf Binärer Ebene bearbeiten kann? Also es wäre wichtig, dass ich den Binärcode einer Datei als String geliefert bekomme, diesen bearbeiten kann und dann wieder eine funktioniernde Datei draus machen kann (wenn die Datenstruktur noch stimmt ^^).

???

mkinzler 20. Jul 2006 05:24

Re: Datei auf binärer Ebene bearbeiten?
 
Wie meinst du das, willst du die Funktionalität der Exe ändern? Vielleicht wäre da ein Disassembler das Angebrachte.

Mordilion 20. Jul 2006 06:21

Re: Datei auf binärer Ebene bearbeiten?
 
Hört sich so an, also ob du eine EXE-Datei Patchen möchtest oder ähnliches. Ich kenne das noch von früher, da hat man das meistens über einen Hex-Editor gemacht.

Gruß
Mordi

marabu 20. Jul 2006 06:43

Re: Datei auf binärer Ebene bearbeiten?
 
Guten Morgen.

Ein String ist vielleicht nicht die beste Wahl um eine Datei im Hauptspeicher zu bearbeiten - ich würde eher ein ByteArray verwenden:

Delphi-Quellcode:
uses
  Types;

function LoadFile(fn: TFileName; var bda: TByteDynArray): Boolean;
begin
  with TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite) do
  try
    SetLength(bda, Size);
    Result := Read(bda[0], Size) = Size;
  finally
    Free;
  end;
end;
Wenn die zu ändernden Stellen (Offset, Länge) bekannt sind, dann muss die Datei garnicht in den Hauptspeicher geladen werden. Ein patch file ist dann viel eleganter:

Code:
# offset=percent encoded string
2525=Hello%00
252B=Mary Lou%00
Die Datei kann mit TStringList.LoadFromFile() geladen und zeilenweise in einer Schleife verarbeitet werden:

Delphi-Quellcode:
uses
  IdURI;

function PercentToStr(const s: String): String;
begin
  Result := TIdURI.URLDecode(s);
end;

procedure PatchFile(fn: TFileName; patches: TStrings);
var
  i, iOffset: Integer;
  s: String;
begin
  with TFileStream.Create(fn, fmOpenReadWrite or fmShareDenyWrite) do
  begin
    for i := 0 to Pred(patches.Count) do
      if (Pos('#', patches[i]) <> 1)
      and TryStrToInt(patches.Names[i], iOffset) then
      begin
        Position := iOffset;
        s := PercentToStr(patches.ValueFromIndex[i]);
        Write(s[1], Length(s));
      end;
  end;
end;
Getippt, korrigiert und immer noch nicht getestet.

Grüße vom marabu

cruso 20. Jul 2006 15:48

Re: Datei auf binärer Ebene bearbeiten?
 
Ich hatte mir das als Grundlage einer Verschlüsselung vorgestellt. Deshalb wäre mir das ganze als Binärcode-String lieber.

Muetze1 20. Jul 2006 16:09

Re: Datei auf binärer Ebene bearbeiten?
 
Zitat:

Zitat von cruso
Ich hatte mir das als Grundlage einer Verschlüsselung vorgestellt. Deshalb wäre mir das ganze als Binärcode-String lieber.

Nutze die binären Daten, ein String ist nicht dafür ausgelegt binäre Daten zu transportieren oder zu halten.

cruso 20. Jul 2006 16:24

Re: Datei auf binärer Ebene bearbeiten?
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von cruso
Ich hatte mir das als Grundlage einer Verschlüsselung vorgestellt. Deshalb wäre mir das ganze als Binärcode-String lieber.

Nutze die binären Daten, ein String ist nicht dafür ausgelegt binäre Daten zu transportieren oder zu halten.

Und wie komm' ich da ran und wie kann ich die bearbeiten?

glkgereon 20. Jul 2006 16:37

Re: Datei auf binärer Ebene bearbeiten?
 
Stichwort: TFileStream
Wie auch schon in den Codeschnipseln oben benutzt ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz