Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EXE-Datei überschreiben mit blockwrite? (https://www.delphipraxis.net/169924-exe-datei-ueberschreiben-mit-blockwrite.html)

Lyan 21. Aug 2012 14:33

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:
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;
Dummerweise ist die EXE nach ausführen des obigen codes immer leer(0kb).

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:
function TFormL.searchex(ssearch,sfile,strrep : string) : string;
var
  ipos: Integer;
  search : Treplaceflags;

begin
  search := [rfReplaceAll, rfIgnoreCase];
  result := StringReplace(sfile,ssearch,strrep,search);
end;
ssearch : Der Suchbegriff(String)
sFile : Der schon eingelesene String der EXE-Datei
strrep : Der String der ssearch ersetzen soll


Und hier die procedure zum Überschreiben:

Delphi-Quellcode:
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;
Hoffe hier weiß jemand wo der Fehler liegt.

gammatester 21. Aug 2012 14:46

AW: EXE-Datei überschreiben mit blockwrite?
 
Was ist fstr?

Lyan 21. Aug 2012 15:09

AW: EXE-Datei überschreiben mit blockwrite?
 
Zitat:

Zitat von gammatester (Beitrag 1179056)
Was ist fstr?

fstr ist der string mit dem inhalt der EXE...
da steht das drin, was man halt auch im editor sieht, wenn man die exe dort öffnen würde...

gammatester 21. Aug 2012 15:25

AW: EXE-Datei überschreiben mit blockwrite?
 
Zitat:

Zitat von Lyan (Beitrag 1179062)
fstr ist der string mit dem inhalt der EXE...

Soweit wahrscheinlich die Theorie. Eingelesen wird der Inhalt der Exe nach buffer. Wie er magischer Weise nach fstr kommen soll, kann man Deinem Code nicht entnehmen.

Vermutung: fstr ist global, also zu Beginn = '', also length(fstr)=0. Und das ändert sich auch nicht.

Frage: Was zeigt denn
Delphi-Quellcode:
ShowMessage('Geschrieben Bytes: '+IntToStr(cntWritten))?
Nur wenn da was anderes als 0 käme, wäre es verwunderlich, wenn die neue Datei eine Länge von 0 hätte.

shmia 21. Aug 2012 15:36

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;

gammatester 21. Aug 2012 15:42

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.

himitsu 21. Aug 2012 15:56

AW: EXE-Datei überschreiben mit blockwrite?
 
Zitat:

Zitat von Lyan (Beitrag 1179062)
fstr ist der string mit dem inhalt der EXE...
da steht das drin, was man halt auch im editor sieht, wenn man die exe dort öffnen würde...

ihhhhhhh

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?

p80286 21. Aug 2012 21:27

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 05:29 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