![]() |
Datei an bestimmten Offsets editieren
Guten Tag,
foglendes.. Ich habe eine .exe datei welche ich editieren will. Manuell habe ich sie im HexEditor geöffnet und darin rumgeschrieben. Genau das soll nun mein Delpiprogramm machen. Wie frage ich in einer Datei bestimmte positionen (offsets) ab und wie editiere ich sie. Wäre sehr dankbar wenn ich wenigstens Ansätze bekomme. Güsse Quick_silver |
Re: Datei an bestimmten Offsets editieren
schau dir mal TFileStream an, dort kannst du mit per seek oder position an die jeweilige position springen und per write (und noch einige andere) schreiben.
per strtoint('$'+hexwert); kannst du hexwerte in dezimalwerte umrechnen. HTH Frank |
Re: Datei an bestimmten Offsets editieren
Von:
![]() Zitat:
|
Re: Datei an bestimmten Offsets editieren
Nach vielem rumbasteln habe ich es gesschafft. Es gibt nur ein kleines problem. Der Code sieht so aus:
Delphi-Quellcode:
Hat Spaß gemact das alles so hin zu basteln. nichtmal ein #0 in der Datei stört die Routine.
procedure TForm1.PatchFile(const path, searchFor, replaceWith:string);
var r,i,j:integer; f: file of byte; offset:array of integer; buf:array [0..8] of byte; //Zu Testzwecken so kurz gehalten workBuf:array of byte; begin ProgressBar.Max := GetFileSizeEx(path); ProgressBar.Position := 0; //searchFor -> workbuf SetLength(workBuf, Length(searchFor)); for i:=0 to Length(workBuf)-1 do workBuf[i]:=Ord(searchFor[i+1]); //Durchsuchen assignfile(f,path); reset(f); repeat blockread(f,buf,Length(buf),r); //Block einlesen ProgressBar.StepBy(Length(buf)); //buf nach workBuf durchsuchen for i:=0 to Length(buf)-1 do //buf durchgehen begin for j := 0 to Length(workBuf)-1 do //Suchstring bei i durchgehen begin if buf[i+j] = workBuf[j] then //Anfang gefunden! begin if j = Length(workBuf)-1 then //Komplett gefunden! {///// PROBLEM: Dies tritt nicht ein wenn der Block in "buf" mitten im Suchstring endet... /////} begin SetLength(offset,Length(offset)+1); offset[Length(offset)-1] := filepos(f) - Length(buf) + i; //offset[n] gibt die Position des workBuf[0] wieder end; end else //Nicht kmoplett gefgunden! begin break; end; //else end;// for end;//for until r < Length(workBuf); //Alles was gefunden wurde steht in offset... //Gefundenes ersetztn: //replaceWith -> als Byte -> workBuf SetLength(workBuf,Length(replaceWith)+1); for i:=0 to Length(workBuf)-1 do workBuf[i] := Ord(replaceWith[i+1]); //An jedem Offset ersetzen: for i:=0 to Length(offset)-1 do begin Seek(f, offset[i]); BlockWrite(f, workBuf[0], Length(workBuf),r); end; closefile(f); end; Nur denke ich das die Suchfunktion endweder viel einfacher geht. Und wenn nicht einfacher, dann brauche ich eine Lösung für das oben beschriebene Problem. Wenn der Suchstring also zwischen 2 "BlockRead(..)" liegt. Ein anderes problem, eher eine Frage ist: Wieso kann man das Array Buf nicht als Dynamisches array nutzen? Er Meckert dann komischer Weise immer. Denn mit einem Dynamischen Array könnte man auch Dateien die < Length(buf) sind mit dieser Routine bearbeiten. |
Re: Datei an bestimmten Offsets editieren
Ich hab nun sleber eine Lösung, ich denke es gibt auch shcnellere Lösungen, für Hinweise in die Richtung wäre ich dankbar. Auch wenn das Aktuelle für mich vollkommen ausreicht.
Dies hat mein Problem ersteinmal gelößt.
Delphi-Quellcode:
Ausserdem habe ich noch andere "Bugs" behoben:
if filepos(f) > Length(workBuf) then
seek(f, filepos(f)-Length(workBuf)); - Dateien können kleiner < buf bytes sein - Nur tatsächlich neu ausgelesenes wird behandelt
Delphi-Quellcode:
Da es nun fertig ist würde ich mich über Verbesserungsvorschläge und Kritik freuen.
procedure TForm1.PatchFile(const path, searchFor, replaceWith:string);
var r,i,j:integer; f: file of byte; offset:array of integer; buf:array [0..1023] of byte; workBuf:array of byte; begin ProgressBar.Max := GetFileSizeEx(path); ProgressBar.Position := 0; //searchFor -> workbuf SetLength(workBuf, Length(searchFor)); for i:=0 to Length(workBuf)-1 do workBuf[i]:=Ord(searchFor[i+1]); //Durchsuchen assignfile(f,path); reset(f); repeat if filepos(f) > Length(workBuf) then seek(f, filepos(f)-Length(workBuf)); blockread(f,buf,Length(buf),r); ProgressBar.StepBy(Length(buf)); //buf nach workBuf durchsuchen for i:=0 to Length(buf)-1 do //buf durchgehen begin if i >= r then break; //Ausserhalb des Buffers abbrechen for j := 0 to Length(workBuf)-1 do //Suchstring bei i durchgehen begin if buf[i+j] = workBuf[j] then //Anfang gefunden! begin if j = Length(workBuf)-1 then //Komplett gefunden! begin SetLength(offset,Length(offset)+1); offset[Length(offset)-1] := filepos(f) - r + i; //offset[n] gibt die Position des workBuf[0] wieder end; end else //Nicht kmoplett gefgunden! begin break; end; end;// for end; until r < Length(Buf); //Alles was gefunden wurde steht in offset... //Gefundenes ersetztn: //replaceWith -> als Byte -> workBuf SetLength(workBuf,Length(replaceWith)+1); for i:=0 to Length(workBuf)-1 do workBuf[i] := Ord(replaceWith[i+1]); //An jedem Offset ersetzen: for i:=0 to Length(offset)-1 do begin Seek(f, offset[i]); BlockWrite(f, workBuf[0], Length(workBuf),r); end; closefile(f); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz