Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 12.03.03 13:04 
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).
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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.

_________________
Viele Grüße
Jakob
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mi 12.03.03 14:18 
@Luckie: Und wie bekommst den dann wieder zurück in die EXE?

Gruß,
Markus
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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:
ausblenden 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
ausblenden 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.

_________________
Viele Grüße
Jakob
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 12.03.03 16:36 
Autsch,

ich sollte mir mal die Glupscher putzen.

Natürlich kann
ausblenden Quelltext
1:
f.Create					

nicht funktionieren. Es muss
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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..

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mi 12.03.03 16:53 
Yep, darauf zielte auch meine Frage an Luckie ab... :roll:

Gruß,
Markus
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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.

_________________
Popov
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 12.03.03 19:03 
>xyz.tmp als Exe
was denn für ein trick ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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.

_________________
Popov
torstenheinze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 461



BeitragVerfasst: Mi 12.03.03 23:16 
mit dem parameter exefile?
meinst dudas?
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mi 12.03.03 23:20 
Jo. Bis heute war das mein bester Virenschutz. Was für ein Virus greift ein .prg Programm an.

_________________
Popov
torstenheinze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 461



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 !

_________________
MFG
Michael Springwald, "kann kein englisch...."
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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.

_________________
Popov
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: 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.

_________________
Viele Grüße
Jakob