Kann man Werte in der Datasection auch schreibend verändern?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Du kannst schon die Datasection verändern so mit PokeB usw., aber dann bewiehen sich diese Änderungen nur auf die Daten die in den Arbeitsspeicher geladen wurden. Beim Neustart ist soweit ih weiß alles wieder beim alten.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

@PMV
Danke, das Beispiel von Mischa kenne ich schon.
Der hat wirklich was drauf.
Wäre schön, wenn ich PureBasic auch mal so beherrschen würde.

@unix
So etwas geht also in PureBasic auch?

Ich habe vor etwa 15 Jahren mal mit PowerBasic 3.2 für DOS ein Programm geschrieben, bei dem ich ein Passwort verschlüsselt in der EXE-Datei speichern und verändern konnte. Die EXE-Datei hatte ich im BINARY-Modus geöffnet, mit GET$ und PUT$ konnte man lesen und schreiben und mit SEEK den Dateizeiger setzen. Auch LOC und LOF gab es damals schon, also ähnlich wie heute in PureBasic. Ich weiß nur nicht mehr, wie ich damals die Position des Passwortes ermittelt habe.
Scheiß Alzheimer! Ich werde alt.

Na ja, vielleicht funktioniert ja die Funktion ReplaceFileData() von FroggerProgger. Er hat mir vorhin ein einem anderen Forumsthema ein Beispiel gepostet. Dann wäre mein Problem gelöst.
Vielen Dank für deinen Tipp!
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Froggerprogger hat geschrieben:Ja Blackskyliner, das möchte ich sehen. Insbesondere mit dem String... und mit dem Überschreiben einer geöffnete Exe... :twisted:
Ok, bin davon ausgegangen, dassers mit ner anderen ändern will, sorry! :D Aber das andere, das ändern, muss gehn, hatte das schonmal hinbekommen :D
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

Klar, eine geöffnete EXE kann man nicht überschreiben.

Mit einem anderen Denkansatz kann man aber trotzdem die Einstellungen in der DataSection der gleichen EXE ändern.

1.) Nach dem Start erstellt man sich eine Arbeitskopie seiner laufenden EXE-Datei (z.B. mit OpenFile("Testprogramm.exe", "Testprogramm.$$$")

2.) In der Kopie Testprogramm.$$$ können die Strings ausgetauscht werden (z.B. mit ReplaceFileData() von Froggerprogger).
Ein kleines Beispiel zum Aufruf siehe hier:
http://forums.purebasic.com/german/view ... c&start=10
Für InputFile$ und OutPutFile$ wird Testprogramm.$$$ eingegeben.
Suchen$ und Ersetzen$ müssen die gleiche Länge haben, sonst ist die Zieldatei kaputt und natürlich muss Suchen$ in Testprogramm.$$$ zu finden sein.

3.) Kurz vor Programmende erzeugt und startet man eine kleine Batchdatei, die die laufende EXE löscht und anschließend die temporäre Arbeitsdatei Testprogramm.$$$ wieder in Testprogramm.exe umbenennt.
Die Batchdatei kann natürlich die laufende EXE nicht löschen.
Daher muss in der Batchdatei der Löschbefehl in einer Scheife ausgeführt werden, bis die Testprogramm.exe geschlossen ist.
Ein Beispiel, wie man eine laufende EXE-Datei löscht findet sich auch im Codearchiv.

Auf diese Weise könnte man also auch die eigene EXE aktualisieren und bräuchte keine Ini-Datei oder Registry-Einträge.

Für meinen Bedarf genügt es jedoch, die EXE mit einer anderen EXE-Datei zu ändern und das kann ich prima mit ReplaceFileData() erledigen. Vielen Dank Froggerprogger! Das war genau die Funktion, die ich gebraucht habe :allright:
Ich hoffe, sowas wird mal in einem PureBasic-Update als Befehl eingebaut.
Eine ReplaceMemData() zum Suchen und Ersetzen im Speicher würde ich mir in einem PureBasic-Update auch noch wünschen :mrgreen:
Ein fehlerfreies Programm ist der Traum jedes Programmierers
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

unix hat geschrieben:Du kanst mit BinaryInclude eine datei Includieren und dann mit Read und WriteString belibig ändern.

Code: Alles auswählen

openfile(0,?MyFile) ;könnte wenn nicht
openfile(0,"MyFile")

readstring(...
writesting(...

datasection

MyFile:
 binaryinclude "MyFile"

enddatasection

oder so ähnlich.
Musste mal schaun
Geht definitiv nicht :freak: Wär ja auch unlogisch, weil die Executable kann nur beschrieben werden wenn sie nicht läuft. Außerdem wird bei OpenFile(ID, Filename.s) ein String erwartet, und woher soll das Program bei "MyFile" wissen, dass du eine Adresse(die es ohnehin nicht mit dem Synonym "MyFile" verbindet, denn so einen Schwachsinn gibt es nur in ScriptSprachen) im Program meinst?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Tracker
Beiträge: 53
Registriert: 22.11.2005 21:46
Computerausstattung: Intel Core 2 Quad Q6600, 2,4 GHZ, 2 GB RAM, NVidia GeForce 8600 GT 512 MB, Windows XP Prof. SP3, PureBasic v4.51

Beitrag von Tracker »

Ich habe den Lösungsansatz von unix nicht weiter verfolgt, weil ich schon zwei alternative Lösungsmöglichkeiten von ts-soft und Froggerprogger hatte.

Schade, dass man in PureBasic das laufende EXE-Programm nicht verändern kann.

In PowerBasic für DOS konnte man die eigene EXE direkt ändern.
Ich habe mein Paßwortprogramm das ich 1992 geschrieben habe wieder gefunden.

Hier ein paar Auszüge aus dem Code:

Code: Alles auswählen

'----- Suchtext 'Ø=' und Code '[p' für Paßwort 'GEHEIM' definieren -----
originalcode$ = "Ø=[p"     '[p wird bei Eingabe eines neuen Paßwortes verändert

Code: Alles auswählen

'----- Dateizeiger auf Paßwortcodes positionieren und Paßwort vergleichen -----
open passwortprogramm$ for binary as #1
get$ #1, 32000, block$
dateizeiger& = seek(1)
get$ #1, lof(1) - 32000, block$
suchtext$ = "Ø" + "="
dateizeiger& = dateizeiger& + instr( block$, suchtext$ ) + 1
seek #1, dateizeiger&
get$ #1, 2, dateicode$
if testcode$ <> dateicode$ then                 'falsches Paßwort eingegeben
   ergebnis% = %FALSE
   incr zaehler%
end if

Code: Alles auswählen

seek #1, dateizeiger&
put$ #1, testcode$                       'Paßwortcode in PW.EXE ändern
Als Suchtext habe ich "Ø=" (Durchmesserzeichen, ASCII 157, nicht mit 0 verwechseln) verwendet, um die Position des Paßwortes in der PW.EXE zu finden. Diese Zeichenfolge kam sonst in der fertigen EXE nicht mehr vor.
Das vorgegebene Paßwort "GEHEIM" habe ich in zwei Zeichen verschlüsselt (hier zufällig "[p") und als Startpaßwort vorgegeben.
Zur Verschlüsselung habe ich einfach die Quersumme der ASCII-Zeichen des Paßwortes gebildet und mit zwei Rechenansätzen zerlegt.

In PowerBasic wurden die Strings am Ende der EXE gespeichert und weil die Stringlänge auf ca. 32000 Zeichen begrenzt war, habe ich einfach die letzten 32000 Zeichen der PW.EXE in einen String eingelesen, diesen mit instr nach Ø= durchsucht und die nachfolgenden zwei Zeichen mit der Umrechnung des eingegebenen Paßwortes verglichen.

Nach Änderung des Paßwortes durch den Benutzer konnte man den neuen Paßwortcode wieder direkt in die PW.EXE schreiben. Die Position ist ja noch vom Suchen bekannt.

Wichtig war nur, dass man die Zeichen in den durch den Platzhalter reserierten Platz schrieb. Ein Schreiben darüber hinaus hätte die PW.EXE beschädigt und evtl. zum Absturz gebracht.

Ich PowerBasic für DOS konnte man also wirklich die gestartete PW.EXE selbst ändern.
In PureBasic geht es nur mit Tricks.

Es ist schon interessant, wenn man sich nach so vielen Jahren die eigenen Quelltexte betrachtet und sieht, welche geistigen Klimmzüge man damals unternommen hat.
Heute würde man das garantiert anders und sicherer lösen, aber damals, ohne Vorlagen hat man eben nur programmiert, was einem gerade einfiel.
Ein fehlerfreies Programm ist der Traum jedes Programmierers
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Dass man eine geöffnete EXE-Datei nicht während der Laufzeit ändern kann ist allerdings keine Schwäche von PureBasic, sondern dem Datei- und Betriebssystem zuzuschreiben. Unter DOS war das alles noch simpler. Dafür gabs da kein Multitasking, so dass man gar nicht Gefahr laufen konnte, dass z.B. ein anderes Programm die parallel laufende EXE verändert.
!UD2
Antworten