Q: Selbstmodifizierendes Programm möglich?

  • Hallo Zusammen,

    meiner einer hat da mal eine grundsätzliche Frage. Ist es evtl. in AU3 möglich während der Laufzeit code zu erzeugen und diesen dann auszuführen?

    Der Befehl EXECUTE geht schon in diese Richtung ist aber scheinbar auf eine Zeile beschränkt. Die andere Lösung, während der Laufzeit ein neues Skript zu erzeugen und es dann zu starten, erscheint mir zu "unelegant".

    Mit freundlichen Grüßen
    Lutz

  • Hä willst du ein Skript haben das dir deine z.b Mausbewegung , Tastentruck etc. aufzeichnet und das dan als code zurück gibt oder wie jetz ^^

  • Hä willst du ein Skript haben das dir deine z.b Mausbewegung , Tastentruck etc. aufzeichnet und das dan als code zurück gibt oder wie jetz ^^

    Hilalie

    nein, dass ist damit nicht gemeint. Allgemeine Info unter:
    http://de.wikipedia.org/wiki/Selbstmodifizierender_Code

    bzw. ein Beispiel in VB:
    http://www.freevbcode.com/ShowCode.asp?ID=4892

    Eine Anwendung könnte z.B. sein, dass der user während der Laufzeit(!) eine Funktion eingibt, und das Progi dann einen Funktionswert zurückgibt (mathe parser) oder nummerisch das Intergral berechnet usw.

    Gruss
    Lutz

  • Hi,
    selbstmodifizierende Code ist schon seit einigen Jahren (Jahrzehnten) "out".
    Funzt natürlich nur mit Maschinensprache (Assembler ftw) und insbesondere muss man höllisch auf Sachen aufpassen, von denen 99% aller "Hochsprachenfreaks" keine Ahnung haben (müssen), weil der Compiler das alles erledigt, Speichermanagement, Segmente, Offsets, Real- Protectedmode, uswusf. Als 8088/8086-Programmierer hat man da nur neidisch auf die Motorolajungs (68000er) mit ihrem linearen Adressraum geschielt...

    Aber auch mit AutoIt ist es möglich, während der Laufzeit den Speicher zu verändern, guck mal nach der memory-udf. Problematisch wird das ganze, wenn bei neuen Prozessoren der Programmcode vom Speicher direkt in den Cache gelesenund von dort abgearbeitet wird...viel Spass beim abfragen der Cachelines....

    Das VB-Beispiel-Script verändert übrigens in keinster Weise den Code zur Laufzeit, sondern den Sourccode.
    Wenn du so etwas machen willst, kein Problem!

    ciao
    Andy

  • Hallo Andy,

    vielen Dank für die Antwort, ich denke wir kommen der Sache schon näher :-).

    Was ich nicht kann und will ist konkret maschinennah mit den Bits&Bytes herumbasteln. Als etwas älter Mensch hab ich das mal früher mit einem Appel ][ mit dem 6502 bzw. Z80 gemacht, wer sich damals eine 68000 Plattform leisten konnte war wirklich "the king".

    Nein mit einer Interpretersprache müsste man das einfacher hinbekommen, der EXECUTE Befehl geht ja in diese Richtung z.B. hab vor einiger Zeit hier mal dieses Schnippsel reingestellt:
    Gleichungslöser für AutoIt3

    Was mir fehlt ist sowas wie ein EXECUTE Befehl der mehrer variable Textzeilen als AU3 Code interpretiert. In der Programmiersprache REXX (eigentlich sowas wie ein Vorgänger von AU3) gibts einen INTERPRET Befehl, Erklärung:
    http://www.kilowattsoftware.com/tutorial/rexx/Interpret.htm
    wobei das einfache Beispiel aber auch in AU3 gecodet werden könnte, aber der EXECUTE "frist" leider keine Eingaben über mehrer Zeilen geschweige den Kontrollstrukturen.
    Fazit: Es wäre schön wenn es sowas wie ein INTERPRET in AU3 gäbe.

    Einen schönen Abend wünscht
    Lutz

    Hi,
    selbstmodifizierende Code ist schon seit einigen Jahren (Jahrzehnten) "out".
    Funzt natürlich nur mit Maschinensprache (Assembler ftw) und insbesondere muss man höllisch auf Sachen aufpassen, von denen 99% aller "Hochsprachenfreaks" keine Ahnung haben (müssen), weil der Compiler das alles erledigt, Speichermanagement, Segmente, Offsets, Real- Protectedmode, uswusf. Als 8088/8086-Programmierer hat man da nur neidisch auf die Motorolajungs (68000er) mit ihrem linearen Adressraum geschielt...

    Aber auch mit AutoIt ist es möglich, während der Laufzeit den Speicher zu verändern, guck mal nach der memory-udf. Problematisch wird das ganze, wenn bei neuen Prozessoren der Programmcode vom Speicher direkt in den Cache gelesenund von dort abgearbeitet wird...viel Spass beim abfragen der Cachelines....

    Das VB-Beispiel-Script verändert übrigens in keinster Weise den Code zur Laufzeit, sondern den Sourccode.
    Wenn du so etwas machen willst, kein Problem!

    ciao
    Andy

  • Mir fällt dazu auf anhieb nur eine Frickellösung ein, aber vllt reicht es ja für deinen Zweck.

    Lass doch die Codezeilen die du brauchst in eine *.au3 schreiben, über autoit ausführen und dir das gewünschte Ergebnis wieder in eine Datei schreiben.

  • Hallo Lutz,

    Zitat

    Als etwas älter Mensch...

    ...willkommen im Club ;)

    Zitat

    Der Befehl EXECUTE geht schon in diese Richtung ist aber scheinbar auf eine Zeile beschränkt. Die andere Lösung, während der Laufzeit ein neues Skript zu erzeugen und es dann zu starten, erscheint mir zu "unelegant".

    Eigentlich ist ja eine Interpretersprache prädestiniert für dein Vorhaben, solange "Klartext" im Speicher steht.
    "Früher" haben wir an den Stellen im Code, die später modifiziert bzw. erweitert werden sollten, einfach NOP´s hingesetzt, dort konnte dann das Programm hinschreiben was es wollte, ausführbare *.COM-Dateien waren da eine Offenbarung.
    Eigentlich müsste man sich mal anschauen, in welchem "Format" AutoIt in den Speicher schreibt. Beim Compilieren wird der Code jedenfalls verschlüsselt, aber im Speicher? Habe jetzt auf Anhieb keine Ahnung wie der Quellcode im Speicher "aussieht", man müsste mal schauen^^, oder jemanden Fragen, der davon Ahnung hat....
    ciao
    Andy

    Btw, was ist eigentlich dein konkretes Problem?

  • Hallo Andy, hallo Bitboy,

    vielen Dank eure Antworten, ein konkretes Problem habe ich nicht, meiner einer möchte nur mal die Grenzen von AU3 ausloten.
    Wenn Autoit zur Laufzeit sich selbst z.B. durch userinputs programmieren könnte, wäre z.B. ein einfügen von neuen Funktionen (bzw. ändern von alten) und sofortiges Ausführen dieser Funktionen möglich. In LISP, LOGO bzw. FORTH ist dies m.W. eingebaut und erlaubt ein extrem flexibeles Programmieren.

    Die Lösung mit -> Progi schreibt sich selbst + Erweiterung auf HD und führt sich danach wieder selber aus, ist evtl. ein Anzsatz, Schwierig erscheint aber die Übernahme der aktuellen Werte der Variablen (Programmzustand vor dem speichern)

    Einen schönen Abend wünscht
    Lutz

    P.S.: Ich meine gaaaaaanzzzz früher hat man z.B. beim C64 BASIC mit peek eine BASIC tocken (= befehl in byteform) im RAM verändern (während der Laufzeit) und schwupss war das Progi modifiziert.

    Hallo Lutz,

    ...willkommen im Club ;)

    Eigentlich ist ja eine Interpretersprache prädestiniert für dein Vorhaben, solange "Klartext" im Speicher steht.
    "Früher" haben wir an den Stellen im Code, die später modifiziert bzw. erweitert werden sollten, einfach NOP´s hingesetzt, dort konnte dann das Programm hinschreiben was es wollte, ausführbare *.COM-Dateien waren da eine Offenbarung.
    Eigentlich müsste man sich mal anschauen, in welchem "Format" AutoIt in den Speicher schreibt. Beim Compilieren wird der Code jedenfalls verschlüsselt, aber im Speicher? Habe jetzt auf Anhieb keine Ahnung wie der Quellcode im Speicher "aussieht", man müsste mal schauen^^, oder jemanden Fragen, der davon Ahnung hat....
    ciao
    Andy

    Btw, was ist eigentlich dein konkretes Problem?

    • Offizieller Beitrag

    Beim C64 war das auch kein Problem (in Assembler). Da gab's nur eine CPU und es gab kein MultiTasking. Da konnte Dein Programm nach Herzenslust im Speicher rumschreiben (solange Du die Systembereiche ausgeklammert gelassen hast).
    In AutoIt und unter Windows direkt den Speicher zu verändern, wäre mir zu riskant (falls das überhaupt geht). Man müsste ja nicht nur rauskriegen, wo das Programm im Speicher abgelegt ist, sondern auch noch wie der Interpreter die Befehle ablegt. Und dann müsste man auch noch die Arbeitsweise des Interpreters kennen.