Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EXE editieren (https://www.delphipraxis.net/86087-exe-editieren.html)

albert1985 8. Feb 2007 21:36


EXE editieren
 
Hi,
Wie wäre es möglich, eine exe-Datei zu "verändern" ? Hab mich schon darüber informiert, wobei
ich jetzt die Möglichkeit mit Ressourcen ganz interessant finde...
Leider fällt mir es recht schwer da komplett durchzublicken und ich würde
mich freuen wenn mir jemand ein beipspiel zeigen könnte, denn ich denke so werd ich es am
effektivsten lernen ! ;)

Also nehmen wir an ich hätte zB ein Programm geschrieben, dass beim Klick auf einen Button
eine Nachricht anzeigt mit einem bestimmten Text, der in meinem Programm über ein Edit-Feld
eingegeben wurde:

Delphi-Quellcode:
...
procedure Button1Click(Sender: TObject);
begin
  Showmessage (Edit1.Text);
end;
...
Ich will es nun quasi irgendwie ermöglichen, dass ich in meinem Programm immer wieder neue exen "erzeugen" kann, eben mit unterschiedlichem edit1.text. Geht dass nun so, dass ich das Nachrichten-Programm kompiliere und dann irgendwie in meinem hauptprogramm den Editfeld-Text in die Exe hineinschreibe ? Ich hab zwar schon von Offsets gehört, die per Hex-Editor gesucht werden müssen etc., aber wie gesagt blick ich da nicht so richtig durch und weiß nicht wo ich nun genau anfangen soll :(

Hoffe ihr könnt mir weiter helfen ;) Danke

SMALLID 9. Feb 2007 01:05

Re: EXE editieren
 
Willst du das denn unbedingt in einer Datei haben? Ansonsten hättest du einfach eine Exe machen können und verschiedene "ini" oder "txt" dateien ausliefern können, in denen unterschiedliche werte für Edit1.Text stehen.

Ich weiß nicht ob es eine elegante Lösung ist, aber über einen FileStream kannst du die Exe direkt aufmachen und editieren. Besser wäre, aber wenn man auch da noch direkt auf die Eigenschaft Text zugreifen könnte. Es gibt Komponenten, die eine "Ressource" in deine Exe bringen, die veränderbar ist. Die Ressource müsste dann nur noch vom Edit ausgelesen werden.

Ansonsten läuft die Alternative mit den Filestreams so:

Delphi-Quellcode:
var
  FileStream : TFileStream;
begin
  FileStream := TFileStream.Create('meineExe.exe', fmOpenReadWrite);
  try
    FileStream.Position := .... //hier die Position eintragen, ab der du ändern möchtest
    FileStream.Write(...) //oder so ähnlich
  finally
    FileStream.Free;
  end;
end;

albert1985 9. Feb 2007 16:04

Re: EXE editieren
 
Hm, die Methode mit dem Filestream hört sich ganz gut an ... aber wie zB finde ich heraus
zu welcher Position ich muss ?

gauggi 9. Feb 2007 16:19

Re: EXE editieren
 
Das kannst du soviel ich weiß mit einem Hex Editor ermitteln. Nimm lieber INI Dateien, denn es ist einfacher.

MrKnogge 9. Feb 2007 16:34

Re: EXE editieren
 
Eine weitere Möglichkeit wäre auch Hier im Forum suchenupdateresource. Funktioniert aber erst ab Windows2000.

Gruß

bitsetter 9. Feb 2007 19:15

Re: EXE editieren
 
Du kannst auch einen String an die EXE anhängen und diesen dann auslesen. Das funktioniert dann auch unter Windows 98, ist sicher nicht so professionell wie updateresource.

Folgenden Code fügst du in das zu patchende Programm ein. Er liest den String am Dateiende der eigenen Datei aus.
Delphi-Quellcode:
Type TText= record
  Text1, Text2, Text3: array[0..99] of Char;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  FileStream: TFileStream;
  Text: TText;
begin
  FileStream:= TFileStream.Create(application.ExeName, fmOpenRead);
  try
    FileStream.Position:= FileStream.Size- SizeOf(Text);
    if FileStream.Read(Text, SizeOf(Text))= SizeOf(Text) then
      Edit1.Text:= String(Text.Text2);
  finally
    FileStream.Free;
  end;
end;
Und diesen Code fügst du in das Programm ein, welches die andere Datei patcht.
Delphi-Quellcode:
Type TText= record
  Text1, Text2, Text3: array[0..99] of Char;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileStream: TFileStream;
  Text: TText;
  Pfad: AnsiString;
begin
  Pfad:= 'C:\Project1.exe';
  ZeroMemory(@Text, SizeOf(Text));
  StrCopy(Text.Text2, PChar(Edit1.Text));
  if FileExists(Pfad) then
  begin
    FileStream:= TFileStream.Create(Pfad, fmOpenReadWrite);
    try
      FileStream.Position:= FileStream.Size;
      if FileStream.Write(Text, SizeOf(Text))= SizeOf(Text) then
      Showmessage('fertig');
    finally
    FileStream.Free;
    end
  end;
end;
EDIT: Code geändert, man kann jetzt mehrere Strings mittels Record in an die EXE anhängen und auslesen.

albert1985 9. Feb 2007 19:24

Re: EXE editieren
 
Hab mich jetzt nach einem groben Überblick für die Resourcen entschieden ... Aber da das ganze für mich doch
recht kompliziert ist, hoff ich natürlich weiterhin auf eure Hilfe ;)

Also, mein Problem ist immer noch, dass ich nicht konkret weiß, wie ich jetzt genau vorzugehen hab...
Hab zwar einiges gefunden zu Icons etc. die über "Updateresource" geändert werden, aber das bringt mich nicht gerade weiter ...

Muss man zunächst den über das EditFeld eingegebenen Text in einer RES-,RC (...) datei abspeichern ?
und dann den updatebefehl ausführen?? Ich verstehe immer noch nicht wie ich dann das in die exe bekomme, also mit den
Parametern etc... wenn in der exe sowas wie "showmessage(B)" steht ... wie müsste die zugehörige RES-Datei aussehen ???

MfG

bitsetter 9. Feb 2007 19:38

Re: EXE editieren
 
Hier ist ein Link mit String.
string aus resource auslesen

albert1985 10. Feb 2007 15:29

Re: EXE editieren
 
Nochmal ne Frage zu bitsetters Vorschlag über die Stream-Methode:

Geht das auch wenn ich mehr als einen String an die EXE anhängen will ??
Wenn ja wie? Hab zwar schonmal bisschen probiert das irgendwie hinzukriegen, aber irgendwie klappts noch nicht :(
Mann müsste ja sozusagen immer an einer anderen Stelle anfangen zu lesen, oder ?

MfG Albert

bitsetter 10. Feb 2007 16:44

Re: EXE editieren
 
Hallo albert1985,

den Code weiter oben habe ich nun so abgeändert, dass man nun mehrere Strings mit Hilfe eines Records speichern kann. Die Records kannst du noch weiter ausbauen, müssen in beiden Programmen jedoch identisch sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
Seite 1 von 2  1 2      

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