![]() |
Delphi-Version: 7
EXE-Datei überschreiben mit blockwrite?
Hallo,
habe soeben versucht einen String einer EXE zu ersetzen, dazu habe ich die von Luckie bereitgestellte procedure verwendet:
Delphi-Quellcode:
Dummerweise ist die EXE nach ausführen des obigen codes immer leer(0kb).
var
f: File; cntWritten: Integer; cntRead: Integer; buffer: Array of Byte; begin AssignFile(f, extractfilepath(paramstr(0)) + 'output.exe'); {$I-} Reset(f); if IOResult = 0 then begin SetLength(buffer, Length(fstr)); BlockRead(f, buffer[0], Length(fstr), cntRead); ShowMessage('Gelesener Text: ' + string(buffer) + '. Gelesene Bytes: ' + IntToStr(cntRead)); CloseFile(f); end else ShowMessage(SysErrorMessage(GetLastError)); {$I+} AssignFile(f, extractfilepath(paramstr(0)) + 'output.exe'); {$I-} Rewrite(f); if IOResult = 0 then begin BlockWrite(f, fstr[1], Length(fstr), cntWritten); ShowMessage('Geschrieben Bytes: '+IntToStr(cntWritten)); CloseFile(f); end else ShowMessage(SysErrorMessage(GetLastError)); {$I+} end; Vorhaben: 1. EXE-Datei mit FileToStr in einen String lesen. 2. Mit meiner Funktion einen beliebigen String in der EXE suchen und ersetzen 3. Die alte EXE mit dem neuen String(den bearbeiteten EXE-String) mit Blockwrite überschreiben. Hat jemand bessere Ideen? Ich habe es selbstverständlich auch schon so gemacht, dass ich eine Textdatei, in die ich normale ASCII Zeichen hineingeschrieben hab einfach in .exe umbenannt habe.. Hier ersetze ich den String:
Delphi-Quellcode:
ssearch : Der Suchbegriff(String)
function TFormL.searchex(ssearch,sfile,strrep : string) : string;
var ipos: Integer; search : Treplaceflags; begin search := [rfReplaceAll, rfIgnoreCase]; result := StringReplace(sfile,ssearch,strrep,search); end; sFile : Der schon eingelesene String der EXE-Datei strrep : Der String der ssearch ersetzen soll Und hier die procedure zum Überschreiben:
Delphi-Quellcode:
Hoffe hier weiß jemand wo der Fehler liegt.
procedure TFormL.WriteEx;
var f: File; cntWritten: Integer; cntRead: Integer; buffer: Array of Byte; begin AssignFile(f, extractfilepath(paramstr(0))+'test.exe'); {$I-} Rewrite(f); if IOResult = 0 then begin BlockWrite(f, fstr[1], Length(fstr), cntWritten); CloseFile(f); end else ShowMessage(SysErrorMessage(GetLastError)); {$I+} end; |
AW: EXE-Datei überschreiben mit blockwrite?
Was ist fstr?
|
AW: EXE-Datei überschreiben mit blockwrite?
Zitat:
da steht das drin, was man halt auch im editor sieht, wenn man die exe dort öffnen würde... |
AW: EXE-Datei überschreiben mit blockwrite?
Zitat:
Vermutung: fstr ist global, also zu Beginn = '', also length(fstr)=0. Und das ändert sich auch nicht. Frage: Was zeigt denn
Delphi-Quellcode:
Nur wenn da was anderes als 0 käme, wäre es verwunderlich, wenn die neue Datei eine Länge von 0 hätte.
ShowMessage('Geschrieben Bytes: '+IntToStr(cntWritten))?
|
AW: EXE-Datei überschreiben mit blockwrite?
Es ist mal wieder Zeit für die unentbehrlichen Funktionen StringToFile() und FileToString():
Delphi-Quellcode:
procedure StringToFile(const FileName: string; const Contents: AnsiString; append:Boolean=False);
const SO_END=2; var fs: TFileStream; Len: Integer; begin if append and FileExists(filename) then begin fs := TFileStream.Create(FileName, fmOpenReadWrite or fmShareDenyWrite); end else begin fs := TFileStream.Create(FileName, fmCreate); append := False; end; try if append then fs.Seek(0, SO_END); // faster than .Position := .Size Len := Length(Contents); if Len > 0 then {$IFDEF CLR} fs.WriteBuffer(BytesOf(Contents), Len); {$ELSE} fs.WriteBuffer(Contents[1], Len); {$ENDIF CLR} finally fs.Free; end; end; function FileToString(const FileName: string): AnsiString; var fs: TFileStream; Len: Integer; {$IFDEF CLR} Buf: array of Byte; {$ENDIF CLR} begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then {$IFDEF CLR} begin SetLength(Buf, Len); fs.ReadBuffer(Buf, Len); Result := Buf; end; {$ELSE} fs.ReadBuffer(Result[1], Len); {$ENDIF CLR} finally fs.Free; end; end; |
AW: EXE-Datei überschreiben mit blockwrite?
Es könnten nach dem richtigen Einlesen aber immer noch VCL-Routinen auf pchar-Basis benutzt werden, die beim ersten 0-Byte die Grätsche machen (es gibt sicherlich einige Nullen in den ersten paar Hundert Bytes des EXE-Headers). Danach nützt auch kein korrektes Rausschreiben mehr. Deshalb wäre es wichtig, die genaue Anzahl der geschriebenen Bytes zu wissen und nicht nur die KB.
|
AW: EXE-Datei überschreiben mit blockwrite?
Zitat:
Tja, wer die Fehlerbehandlng deaktiviert und dann vergißt die Fehler selber zu behandeln, der soll sich nicht wundern, wenn etwas nicht geht und er nicht rausbekommt, warum es nicht geht. z.B. könnte man von BlockWrite auch mal das IOResult prüfen. PS: Wieso GetLastError, wo der Fehler doch in IOResult steht? |
AW: EXE-Datei überschreiben mit blockwrite?
Wie wäre es den zu ersetzenden Text (array of ansichar) zu suchen und den Ersatz dann an genau diese Position zu schreiben?
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 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