![]() |
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:
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 :(
...
procedure Button1Click(Sender: TObject); begin Showmessage (Edit1.Text); end; ... Hoffe ihr könnt mir weiter helfen ;) Danke |
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; |
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 ? |
Re: EXE editieren
Das kannst du soviel ich weiß mit einem Hex Editor ermitteln. Nimm lieber INI Dateien, denn es ist einfacher.
|
Re: EXE editieren
|
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:
Und diesen Code fügst du in das Programm ein, welches die andere Datei patcht.
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;
Delphi-Quellcode:
EDIT: Code geändert, man kann jetzt mehrere Strings mittels Record in an die EXE anhängen und auslesen.
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; |
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 |
Re: EXE editieren
|
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 |
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 06:56 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