Entwickler-Ecke
Dateizugriff - EXE soll sich selbst verändern
Klabautermann - Mi 12.03.03 13:04
Titel: EXE soll sich selbst verändern
Hallo,
ich habe folgendes Problem.
Ich habe Eine EXE Datei, und einen Datenblock fester Größe an diese gehängt. Nun möchte ich, das die EXE, die Werte in diesem Datenblock selbst ändert.
Leider bekomme ich eine Zugriffsverletzung, wenn ich versuche die Datei zu öffnen (leider sagt die Exeption nicht viel aus (Zugriffsverletzung bei Adresse XXX).
Quelltext
1: 2: 3: 4: 5:
| VAR f : tFileStream; begin f.Create(ParamStr(0), fmOpenWrite); [...] |
Ich erkläre es mir das damit, das die EXE ja bereits geöffnet ist (denn sie läuft ja) und ich deshalb nciht schreibend auf sie zugreifen kann.
Gibt es eine Möglichkeit wie ich trotzdem mein Ziel erreichen kann?
Gruß
Klabautermann
DeCodeGuru - Mi 12.03.03 13:12
jo, das Problem hatte ich auch mal. Habe es so nicht lösen können - was nicht heißt, dass es nicht gelöst werden kann, obwohl ich denke, dass es wirklich nicht geht.
Na ja, musste dann einen Workaround verwenden (bitte nicht lachen) und der sah so aus:
- Hauptprogramm extrahiert Programm zum Patchen des Hauptprogramm
- Hauptprogramm startet das Patch-Programm mit entsprechenden Parametern.
- Hauptprogramm beendet sich und wird dann gepatcht.
- Wenn das Patchprogramm das Hauptprogramm "gepatcht" hat, startet es wieder das Hauptprogramm
- Das Hauptprogramm löscht ggf. wieder das andere Programm.
Soweit ich mich erinnern kann, hat das sogar gefuntzt, war aber keine schöne lösung. Seit dem habe ich mir aber nicht mehr mit dem Problem beschäftigt.
Delete - Mi 12.03.03 13:14
Könntest du aus dem Datenblock nicht eine Datei machen, die du dann extrahierst und auf die Paltte schreibst?
DaFox - Mi 12.03.03 14:18
@Luckie: Und wie bekommst den dann wieder zurück in die EXE?
Gruß,
Markus
Klabautermann - Mi 12.03.03 15:36
Hallo,
ersmal danke für die Antworten.
Leider war die Ideale lösung noch nicht dabei.
Da das Ausladen der Daten wesentlich wichtiger ist als das reinschreiben. Diesen währe nur das Sahnehäubchen bei der Geschichte.
@DeCodeGuru: Die Idee ist nicht schlecht, wenn auch für meinen Fall zu aufwändig.
@Luckie: Ich wüde das ganze gerne so anstellen, das der (durchschnitliche) User nichts davon mitkriegt. Das anlegen einer Datei kann aber gesehen werden, da diese ja sofort im Explorer sichtbar wird (ich halte nciht viel davon Datein im Windows Verzeichnis oder ähnlichen auzulegen).
Ich Schätze ich werde dann nur die Ausgangsdaten an die Datei hängen und die daraus resultierenden Variablen dann "öffnetlich" in einer Klassischen Datei speichern. Anders währe es schöner - aber naja.
Ein weiteres Interessantes (und ärgerliches) Problem ist aufgetreten.
Wenn ich versuche, die EXE als Stream "nur lesend" zu öffnen bekomme ich ebenfalls die oben beschriebene Zugriffsverletzeung:
Quelltext
1: 2: 3: 4:
| VAR f : tFileStream; begin f.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); |
Ich kann mir nicht erklären warum, denn ich will ja nur lesen.
Auch wenn ich es auf die Klassische Art versuche bekomme ich Probleme beim lesen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| VAR f2 : FILE; Buf : Array[1..100] OF Byte; begin AssignFile(f2, ParamStr(0)); FileMode := fmOpenRead; Reset(f2); Blockread(f2, Buf, 100); |
Wenn ich diese 2te Variante in der IDE laufen lasse, springt Delphi in's CPU Fenster. Wenn ich es außerhalb der IDE laufen lasse verabschiedet sich das Programm Kommentalos. Auch dann wenn ich das ganze mit TRY EXCEPT Klammere und versuche mir die Exception ausgeben zu lassen.
Mache ich da was grundlegendes Falsch oder wodran liegt das?
Gruß
Klabautermann
PS: Verwendet wird D7 und W2k SP3.
DeCodeGuru - Mi 12.03.03 15:58
| Zitat: |
| @DeCodeGuru: Die Idee ist nicht schlecht, wenn auch für meinen Fall zu aufwändig. |
Jo, ich habe ja gesagt, dass das nicht ne "schöne" Lösung ist.
| Zitat: |
Wenn ich versuche, die EXE als Stream "nur lesend" zu öffnen bekomme ich ebenfalls die oben beschriebene Zugriffsverletzeung:
Quelltext 1: 2: 3: 4:
| VAR f : tFileStream; begin f.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); |
Ich kann mir nicht erklären warum, denn ich will ja nur lesen. |
Ähm, das verstehe ich nicht, denn mit
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure ReadInformation; var fs: TFileStream; EMessage: String; begin fs := TFileStream.Create(ParamStr(0),fmOpenRead or fmShareDenyWrite); try fs.Position := fs.Size - 512; fs.Read(ServerInf,512); finally fs.Free; end; |
dem Codeausschnitt habe ich genau das gemacht und das funktioniert einwandfrei.
Motzi - Mi 12.03.03 16:35
| Zitat: |
Wenn ich versuche, die EXE als Stream "nur lesend" zu öffnen bekomme ich ebenfalls die oben beschriebene Zugriffsverletzeung:
Quelltext 1: 2: 3: 4:
| VAR f : tFileStream; begin f.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); |
Ich kann mir nicht erklären warum, denn ich will ja nur lesen. |
Kleiner Denkfehler.. :wink: vergleich mal die folgenden Zeilen:
Quelltext
1: 2: 3: 4:
| aStream: TFileStream;
aStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); // deine Version aStream :=TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite); // meine Version |
Klabautermann - Mi 12.03.03 16:36
Autsch,
ich sollte mir mal die Glupscher putzen.
Natürlich kann
nicht funktionieren. Es muss
Quelltext
1:
| f := tFileStram.Create |
heißen :oops:.
Dann werde ich mal weiter Probieren.
Auf jeden fall noch mal danke. Warscheinlich hätte ich das Stundenlang anstarren können ohne den Fehler zu entdechen, weil er zu Simpel war.
Gruß
Klabautermann
Motzi - Mi 12.03.03 16:43
Übrigens.. eine exe kann NIE selbst Daten an sich anhängen, da exe und dll-Files von Windows als memory mapped files geöffnet werden und daher alle Versuche die Datei mit Schreibzugriffen zu öffnen scheitern! Über ein zweites Prog, das kurzfristig temporär erstellt wird und die Daten anhängt und sich dann selbst wieder entfernt würde es gehen..
DaFox - Mi 12.03.03 16:53
Yep, darauf zielte auch meine Frage an Luckie ab... :roll:
Gruß,
Markus
Klabautermann - Mi 12.03.03 17:06
Hallo,
also ich habe jetzt die Experimente mit dieser Technick (nur lesen) erfolgreich abgeschlossen und werde mich gleich an die Eigentliche implementierung machen.
Danke noch einmal an alle. Ihr habt mir sehr geholfen, auch wenn es schade ist, das die EXE nicht an sich selbst rumpfuschen kann ;).
Gruß
Klabautermann
Popov - Mi 12.03.03 17:19
| Klabautermann hat folgendes geschrieben: |
| Ich wüde das ganze gerne so anstellen, das der (durchschnitliche) User nichts davon mitkriegt. Das anlegen einer Datei kann aber gesehen werden, da diese ja sofort im Explorer sichtbar wird (ich halte nciht viel davon Datein im Windows Verzeichnis oder ähnlichen auzulegen). |
Ich hab sowas in der Art auch mal gemacht. Damals hab ich die Patchexe einfach im Tempordner abgelegt und den Programmpfad als Parameter übergeben. Nach dem Patch hab ich das Programm einfach neu gestartet. Dieses Programm hat dann im Tempordner geprüft ob da eine Patchexe ist. Wenn ja, dann wurde sie gelöscht. Wer guckt schon nach im Tempordener nach. Und wenn, da werden permanent Dateien angelegt.
Auserdem kenn ich ein Trick wie man eine xyz.tmp als Exe ausführen kann.
Die ganze Aktion war dann eigentlich nur ein Flackern auf dem Bildschirm.
mimi - Mi 12.03.03 19:03
>xyz.tmp als Exe
was denn für ein trick ?
Popov - Mi 12.03.03 23:13
| mimi hat folgendes geschrieben: |
>xyz.tmp als Exe
was denn für ein trick ? |
Guck dir in der Registry unter
HKEY_CLASSES_ROOT den Schlüssel
.exe an. Dann denk logisch nach und du wirst es erkennen.
torstenheinze - Mi 12.03.03 23:16
mit dem parameter exefile?
meinst dudas?
Popov - Mi 12.03.03 23:20
Jo. Bis heute war das mein bester Virenschutz. Was für ein Virus greift ein .prg Programm an.
torstenheinze - Mi 12.03.03 23:24
aha.
aber du musst doch dannimmer deinprog starten, welches dann auf die methode dein 'pseudoprog" startet.
da ist es doch besserwenn du mal kurz die dateiendung "renamest"
mimi - Do 13.03.03 00:30
kann mir nicht vorstellen das ein virus oder was auch immer nur nach .exe dateien geht, die suchen warscheinlich ausfürbaren code und die endung ist egal......
aber zurück zum Thema !
Popov - Do 13.03.03 00:32
@torstenheinze
Das meinte ich nicht. Ich habe ne Zeitlang fast alle Programme in .prg umbenannt. Unter Windows ist Exe nur eine Datei die "geöffnet" wird. Du kannst auch jeden anderen Dateityp registrieren und wie eine Exe ausführen. Das meinte ich.
was die xyz.tmp angeht, so kann man kurzfristig .tmp els Exefile registrieren, die Tmp-Datei als Programm starten und danach die registrierung wieder löschen. Wer glaubt schon, daß die Tmp-Datei ein Programm ist. Das ist übrigens ein guter Trick einen Trojaner zu verstecken. Wer glaubt schon, daß yxz.tro ein Trojanerprogramm ist. Allerdings ist das ein Trick made by Popov. Deshalb ist er nicht so bekannt.
DeCodeGuru - Do 13.03.03 10:40
| Zitat: |
| was die xyz.tmp angeht, so kann man kurzfristig .tmp els Exefile registrieren, die Tmp-Datei als Programm starten und danach die registrierung wieder löschen. Wer glaubt schon, daß die Tmp-Datei ein Programm ist. Das ist übrigens ein guter Trick einen Trojaner zu verstecken. Wer glaubt schon, daß yxz.tro ein Trojanerprogramm ist. Allerdings ist das ein Trick made by Popov. Deshalb ist er nicht so bekannt. |
Sprichst aus Erfahrung? :wink:
Ich würde trotzdem nur die Extension ändern und dann das Prog ganz normal starten.
Delete - Do 13.03.03 10:48
| Motzi hat folgendes geschrieben: |
| Übrigens.. eine exe kann NIE selbst Daten an sich anhängen, da exe und dll-Files von Windows als memory mapped files geöffnet werden und daher alle Versuche die Datei mit Schreibzugriffen zu öffnen scheitern! Über ein zweites Prog, das kurzfristig temporär erstellt wird und die Daten anhängt und sich dann selbst wieder entfernt würde es gehen.. |
Das heißt, das:
http://www.delphi-treff.de/content/edhonline/index.php4?id=133 funktioniert mit der eigenen Exe nicht?
Motzi - Do 13.03.03 11:12
| Luckie hat folgendes geschrieben: |
| Motzi hat folgendes geschrieben: | | Übrigens.. eine exe kann NIE selbst Daten an sich anhängen, da exe und dll-Files von Windows als memory mapped files geöffnet werden und daher alle Versuche die Datei mit Schreibzugriffen zu öffnen scheitern! Über ein zweites Prog, das kurzfristig temporär erstellt wird und die Daten anhängt und sich dann selbst wieder entfernt würde es gehen.. |
Das heißt, das: http://www.delphi-treff.de/content/edhonline/index.php4?id=133 funktioniert mit der eigenen Exe nicht? |
Das Auslesen schon (zumindest wenn man die exe nur mit Lese-Zugriff öffnet).. aber das Anhängen nicht.
PS: ich hab mich mit diesem Thema auch shon auseinandergesetzt :wink: :
http://www.swissdelphicenter.ch/de/showcode.php?id=815
(dieser Tipp entstand unabhängig von dem im EDH!)
Und wie gesagt.. eine Komponente zum verwalten von Daten die zusätzlich an die exe angehängt werden können sollen existiert auch..
Edit: ich seh grad, dass man mit dem Tipp aus dem EDH die Daten aus der eigenen exe auch nicht auslesen kann.
Quelltext
1:
| MainFile := TFileStream.create(Main_FileName, !!>> fmOpenReadWrite <<!! or fmShareDenyWrite); |
Da Schreibzugriffe abgeblockt werden wird der Konstruktor hier fehlschlagen. Man darf die Datei nur mit Lese-Zugriff öffenen, also mit fmOpenRead!
Popov - Do 13.03.03 11:19
Ich hab den Tip mal versucht. Mit der eigenen Exe hat es nicht funktioniert. Ich mußte eine Kopie der Exe erstellen und so arbeiten.
mimi - Do 13.03.03 15:15
warum muss ich windows sagen das datei .lll ein exe datei ist ?
ist gibt doch in delphi WinExec mit der man jede datei starten kann die nicht die endung .exe hat...
Popov - Do 13.03.03 15:37
| mimi hat folgendes geschrieben: |
warum muss ich windows sagen das datei .lll ein exe datei ist ?
ist gibt doch in delphi WinExec mit der man jede datei starten kann die nicht die endung .exe hat... |
Sorry, vergiß meinen Tip. Wenn man den nicht verstanden hat, dann ist er sinnlos. Außerdem ist das Thema schon längst abgehackt. Aber um deine Frage zu beantworten: es geht darum, daß dann der User nicht merkt, daß es eine Exe ist und deshalb das Patchprogramm auch eine Tmp-Datei sein kann. Aber der Tip ist sovieso erledigt.
mimi - Do 13.03.03 15:52
das habe ich ja verstanden.....
Aber das man es erst in der reg eintragen muss, als ausfürbar ist doch sinlos.
Es gibt doch WinExec ;)
Popov - Do 13.03.03 16:04
Sei froh, daß du es mit WinExec mir vorgeschlagen hat. Von Luckie hättest du die passende antwort bekommen. WinExec ist veraltet. Es funktioniert zwar noch, aber nur noch aus Gründen der Kompatibilität. Es kann also sein, daß der Nachfolger von WinXp diese Funktion nicht unterstützt. Deine Programme machen dann etwas, aber sie funktionieren dann nicht mehr richtig.
Aber auch so verstehe ich nicht was du mir damit sagen willst. Wir sprechen von einer versteckten Exe. Eine Progi.tmp kannst du somit nicht mit WinExec ausführen. Aber schluß mit dem Thema.
mimi - Do 13.03.03 16:35
> Eine Progi.tmp kannst du somit nicht mit WinExec ausführen
natürlich..
Aber egal.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!