AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EXE-Datei überschreiben mit blockwrite?

Ein Thema von Lyan · begonnen am 21. Aug 2012 · letzter Beitrag vom 21. Aug 2012
Antwort Antwort
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#1

EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 15:33
Delphi-Version: 7
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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 15:46
Was ist fstr?
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#3

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 16:09
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...
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 16:25
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 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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 16:36
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;
Andreas
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 16:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 16:56
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: EXE-Datei überschreiben mit blockwrite?

  Alt 21. Aug 2012, 22:27
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 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