Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 11.04.2006, 16:24 Titel: Ist REFLEXIVES PROGRAMMIEREN MIT QB4.5 D möglich? |
|
|
Ich meine Damit, ob ich ein Programm in QB erstellen kann, das in sich selbst weiteren Programmcode einbaut.
Nicht damit gemeint ist z.B. das Speichern von Variablen oder so in anderen Dateien auf die dann irgendwie zugegriffen wird!
Nils  _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 11.04.2006, 16:25 Titel: |
|
|
Du kannst eine andere .BAS erstellen und dann mit CHAIN aufrufen, aber nur im Interpretermodus
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 11.04.2006, 17:04 Titel: |
|
|
Meinst du, dass sich das Programm selbst zur Laufzeit ändert? In Assembler ist es (zwar nicht gerade einfach, aber es geht - gab's auch mal 'nen Tutorial dazu) möglich.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 11.04.2006, 18:19 Titel: |
|
|
Selbst Modifiziernte Code .
Einige C C++ Asemebler Programmierer setzen das ein um Rechenzeit zu sparen, solche Verfahren Grenzen aber an Lebensmüde.
In QBasic ist es, wenn auch mit etwas Vorsicht, möglich mit diesen Befehlen das zu basteln:
Open "*****" Das Programm öffnet den eignen Code
Input
Print Das Programm modifiziert den Code und kopiert ihn.
Die übergabe klappt dann über Run oder Chain.
Aber eben nur beim Interpretieren, mit Exe Dateien geht es nicht.
In QBasic kann nicht viel schief gehen, ausser Natürlich der erzeugte Code ist fehlerhaft.
Sag mal die Anwendung, dann geht konkretter. |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 11.04.2006, 20:42 Titel: |
|
|
Zitat: | Du kannst eine andere .BAS erstellen und dann mit CHAIN aufrufen, aber nur im Interpretermodus
|
Das ist nicht richtig. Ich habe es ausprobiert: Auch compilierte EXE-Dateien kann man problemlos chainen. Sie können sogar Daten miteinander austauschen, wenn diese in allen CHAIN-Moduldateien in gleicher Reihenfolge mit COMMON deklariert werden. Beim CHAIN-Befehl muss man als Namen des gechainten Programms natürlich die Dateierweiterung "EXE" statt "BAS" anhängen.
In die neuen Version der QB-MonsterFAQ, die noch diesen Monat erscheinen wird, habe ich ein Beispiel eingefügt, welches das Chainen von EXEs demonstriert. _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 12.04.2006, 07:59 Titel: |
|
|
@Thomas Antoni
Das "nur im Interpretermodus" war auf die selbst Modifikation bezogen.
Eine Exe Datei kann mit einer Exe Datei verbunden werden, aber eine Exe Datei nicht mit einer Bas.
Man könnte nun die Bas Datei compilieren vor dem chainen, aber dadurch wird des Verfahren wesentlich komplexer. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 12.04.2006, 10:07 Titel: |
|
|
@Thomas: Das war - wie Michael schon sagte - auf das Generieren von Quellcode zur Laufzeit bezogen.
Wenn eine EXE iregendeinen Quellcode erstellt, und ihn dann während der Laufzeit mit
Code: | CHAIN "wasweisich.bas" |
aufruft, dann wird der Quellcode ja nicht mehr mitkompiliert, was das Problem an der ganzen Geschichte ist...
jb _________________ Elektronik und Programmieren |
|
Nach oben |
|
 |
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 12.04.2006, 14:00 Titel: |
|
|
Interessante Antworten von Euch allen!
Beispiel:
Ich gebe ein QB.exe-Programm ab. Dieses ruft der Nutzer auf und passt es seinen Bedürfnissen durch Auswahlfragen an. Beim nächsten Aufruf der *.exe soll nicht mehr angepaßt werden ,sondern die *.exe nur noch mit dieser angepaßten Änderung laufen. Eigentümernameseingabe oder so was. Und zwar ohne, daß eine Parameterdatei oder so aufgerufen werden muß.
Anders gefragt kann eine QB.exe Quellcode erstellen, kompillieren, in sich aufnehmen, und als dieselbe *.exe erscheinen(abgesehen von Größenänderung)?
Nils  _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.04.2006, 14:22 Titel: |
|
|
Habe dazu einmal früher einmal einen Artikel im Usenet veröffentlicht:
http://groups.google.com/group/comp.lang.basic.misc/msg/caf5586a7e28da5c
Ansonsten jedoch sollte man self-modifizierenden Code eher als etwas Verpöntes betrachten! Jeder soll sich hier bewusst sein, dass jeder z.B. in einer bösartigen Webseite eingebaute Exploit, der aktiv eine Browser-Sicherheitslücke vom Typ Pufferüberlauf nutzt, letztendlich gar nichts anderes als selbstmodifizierender Code ist, dasselbe natürlich auch, wenn ich an einen verletzbaren HTTP-Daemon (Webserver), SMTP-Server usw. eine überlange Eingabe ("z.B. "RCPT TO: xxx@yyy....(meineitwegen mehrere Millionen Zeichen, so dass der Befehlspuffer beim schlecht programmierten Server überläuft)...yyy.de") sende.
Microsoft hat die Problematik inzwischen erkannt und baut daher den Betriebssystemkernel speziell ab Vista so aus, dass das sog. Textsegment (=geladener Maschinencode aus der .EXE) nur read-only bereitsteht, während im Datensegment (=Variablenspeicher) Änderungen möglich sind, aber nichts ausgeführt werden kann). Sog. Stack execute protection wurde daher bereits mit XP Service Pack 2 eingeführt.
Aus genau diesem Grund sollte man Software-Design-Ansätze, die Selbstmodifikation erfordern, in Zukunft tunlichst vermeiden und unterlassen. _________________ Teste die PC-Sicherheit mit www.sec-check.net
Zuletzt bearbeitet von dreael am 12.04.2006, 14:24, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 12.04.2006, 14:23 Titel: |
|
|
Hi!
Entweder du benutzt eine externe Datei um die Daten zu speichern (zum Beispiel ein nutzerspezifischer Programmname o.ä.) oder du hängst die Daten an die EXE hinten 'ran.
Wegen dem komletten Programm verändern: du könntest in die EXE "nur" einen Scriptspracheninterpreter einbauen, was auch wieder zwei Möglichkeiten brächte:
entweder a) Daten an die EXE hängen, oder b) eine externe Datei.
(Ich ging in meinem ersten Posting davon aus, dass du das Programm zur Laufzeit temporär im Speicher ändern willst)
Grüße,
Mao _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 12.04.2006, 14:44 Titel: |
|
|
Zitat: | Ich gebe ein QB.exe-Programm ab. Dieses ruft der Nutzer auf und passt es seinen Bedürfnissen durch Auswahlfragen an. Beim nächsten Aufruf der *.exe soll nicht mehr angepaßt werden ,sondern die *.exe nur noch mit dieser angepaßten Änderung laufen. Eigentümernameseingabe oder so was. Und zwar ohne, daß eine Parameterdatei oder so aufgerufen werden muß. |
Dann muss sich der Code aber nicht selbst verändern!?
Das Programm zum ändern könnte eigenständig sein und am Code des Eigentlichen Programmes einfacher rum Doktern.
Zitat: | Anders gefragt kann eine QB.exe Quellcode erstellen, kompillieren, in sich aufnehmen, und als dieselbe *.exe erscheinen(abgesehen von Größenänderung)? |
Eine Exe Datei kann sich nicht selbst überschreiben, du müsstest über Temporäre Dateien gehen.
Aber:
Solche Spielereien sind nicht gerade Benutzer freundlich, stell dir vor irgendwas geht nicht und du must Fehlersuche machen bei einem solchen komplexen Zusammenspiel.
Techniss wäre es durchaus machbar, aber der Aufwand steht in keinem Verhälltniss zum Nutzen. |
|
Nach oben |
|
 |
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 13.04.2006, 15:42 Titel: |
|
|
Hallo dreael, mao und michael!
Antworten, die ich erst mal verdauen muß.
Frohes Ostereiersuchen ... äh dazu geht man übrigens ins Freie!
Nils offline  _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
 |
StrikerXP
Anmeldungsdatum: 23.04.2006 Beiträge: 4
|
Verfasst am: 23.04.2006, 01:11 Titel: |
|
|
folgende Frage dazu:
Habe ein Programm mit einer GUI programmiert (Quelltext ca. 600 KB) das ein quasisimultanes Multitasking hat.
Es prüft ständig die Serielle Schnittstelle auf Signal (mit eigenem Protokoll zur komm. mit anderen Rechnern/Microkontrollern an einem Sternkoppler), Mausroutine, Eingabefeldern, Hintergrundoperationen (Speichern im HG)...
Nun sind in meinem Programm mehrere Unterprogramme eingebettet.
ein Vorteil wäre nun, wenn ich ein zusätzliches, eigens geschriebenes Programm "installieren" könnte indem ich es nachträglich für den entsprechenden Benutzerkreis hinzufügen könnte. CHAIN und RUN entfallen dabei, da die Kernelschleife dann in der Durchlaufgeschwindigkeit (norm. 2000 bis 5000 mal pro Sek. bei 75 MHz) drastisch sinkt und die Festplatte durch das öffnen/schließen dauerrotiert.
Ein einbinden von einem neuem Modul (bisher 7 von Haus aus) in das Programm wäre also total gut!! |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.04.2006, 09:16 Titel: |
|
|
Etwa so sollte es gehen:
Ich würde die neuen Programme als Sub aufbauen, dann wird das Installieren und Deinstallieren einfacher.
Makiere mit Kommentaren die Stelle wo sich die neuen Programm einklinken dürfen.
Der Installer sucht dann diese Stelle (im Quellcode) und schreibt dort den Namen des Programmes (beziehungsweise Sub) ein.
Dann geht der Installer an das Ende des Quellcodes und fügt dort die eigentliche Subroutine ein.
Die Installation würde ich mit einem ausgelargten Konsolen Programm machen (das dann über RUN/CHAIN aufgerufen wird), so muss sich der Code nicht selbst verändern.
Da der auf Ruf recht selten ist, macht der Zeit bedarf von RUN/CHAIN nicht so viel aus.
Und während der Installation darf das GUI sowieso nicht laufen, sonst könnte es sich aufhängen.
Alternativ kann der Benutzer die Installation von Hand ausführen, in dem er genau das macht, was der Installer machen würde.
(Stelle suchen, Namen eintragen, ans Ende gehen, Code einfügen) |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 23.04.2006, 15:39 Titel: |
|
|
Ganz früher unter reinem MS-DOS war der sog. Overlay-Mechanismus noch in vielen professionellen Anwendungen verbreitet (z.B. AutoCAD), d.h. bei Bedarf wurden Maschinencode-Teile von .OVL-Dateien nachgeladen, denn nur so waren komplexe Programme mit 640 KB konventionellem RAM überhaupt lauffähig. Overlay war meines Wissens auch innerhalb von grossen .EXE-Dateien möglich, d.h. dass beim Ausführen nur ein Teil geladen wird und innerhalb der Anwendung sporadisch Teile nachgeladen wurden (hatte ich damals auf Diskettensystemen noch viel beobachtet).
Über Grundkonzepte, zugehörige Betriebssystemroutinen, geeignete Compiler und vor allem Linker usw. konnte ich jedoch auf die Schnelle nichts dazu finden. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
StrikerXP
Anmeldungsdatum: 23.04.2006 Beiträge: 4
|
Verfasst am: 23.04.2006, 16:02 Titel: Overlay |
|
|
Ja, genau solche Overlays verwende ich in meinem Programm.
Und mit RUN/CHAIN geht es leider nicht schnell genug, da es jedesmal die Datei von neuem öffnet, abarbeitet und schließt. Und wenn es sich dann in dem gechainten Programmabschnitt um eine Multitasking-Operatgion geht, die ja eigentlich nur im Hintergrund laufen soll, belegt das allein die ganze Rechenzeit (dann wäre es ja nicht mehr "Speichern im Hintergrund", wenn es den Vordergrund belegt). |
|
Nach oben |
|
 |
|