sich selbst modifizierender Code?
-
Hi,
ich hab neulich mal was gelesen von selbst modifizirenden Programmen, die ihre fähigkeiten erweiternkönnen und dafür ihren eigenen Programmcode verändern (zur Laufzeit), nun, jetzt stell ich mir die Frage: wie geht das vor sich? Wie kann z.B. ne exe sich selber modifizieren zur laufzeit und beim beenden nicht die Daten verlieren, sondern sie in der exe belassen, so das sie bei einem 2. Programmstart vorhanden sind?
Wie können programme sich selber modifizieren, ohne neu compiliert zu werden??
-
eine Möglichkeit sind Scriptsprachen
-
Zur Laufzeit den Binär Code zu verändern kann sehr kompliziert und fast unmöglich sein. Du kannst aber die Binär Datei verändern, so dass beim neustart die Dinge geladen werden.
Eigentlich wurde selbstmodifizierender Code früher dazu benutzt, dass man Speicher spart, da die Computer nur über sehr wenig RAM verfügten.
Ich verschieb das mal in das Assembler Forum
-
Nen Beispiel ist jedenfalls der uralte Norten Editor.
-
Polymorphe Viren können das.
-
Wobei Polyviren meist ne Technik anwenden, die rel. einfach ist: "Codezusammenwürfeln" Anweisungen vertauschen und mit JMPs abarbeiten...
-
smc is doch absolut unnötig... scgc (self code generating code) genügt...
-
Es gibt (oder gab?) eine populäre Variante des Bresenham-Algorithmus' mit Selbstmodifikation.
[ Dieser Beitrag wurde am 30.10.2002 um 07:17 Uhr von Bashar editiert. ]
-
Auf dem C64 war das damals eigentlich nichts ungewöhnliches. Leider war ich damals noch viel zu jung um da richtig was zu verstehen, und ich hab mich bis heute auch nicht mehr damit beschäftigt (C++ macht halt ziemlich fauel).
-
ja, bei linien und anderen algorithmen hat man sowas oft gemacht, anstatt einen wert in einer variabel zu speichern, konnte man den wert in den code einfügen, z.B. +1 oder -1 bei der steigung von linien in y richtung, dann konnte man noch JL und JG umtauschen, je nachdem aus welcher richtung die linie kamm.
und anstatt in einem inneren loop mit nem jumptable irgendwo hin zu springen, hat man die einsprungadresse direckt eingefügt.
unter einem OS mit PM muss man das codesegment explizit drauf setzen, dass man da rein schreiben kann, sonst könnte es sein, das es readonly ist.
rapso->greets();
-
Original erstellt von rapso:
**unter einem OS mit PM muss man das codesegment explizit drauf setzen, dass man da rein schreiben kann, sonst könnte es sein, das es readonly ist.
**Wohl eher das Datensegment, oder? Codesegmente sind schließlich immer mindestens read-only
-
PM hat auch diesen Trick glücklicherweise zerstört. Okay, die Programme sind jetzt alle ein paar KB größer, aber was für ein Unglück bei 1GB RAM
(naja es gibt einen schlimmeren Bloat durch andere Dinge, wie GUI *g*)
Aber wenigstens sind die Programme dadurch portabler und als Programmierer muss man keine Hextabellen an Opcodes mehr können
auch wenn einiges das vermissen http://www.rzuser.uni-heidelberg.de/~mhermann/realpro.html
-
In einer Library, die ich gut kenne, ist heute noch ein 'compiled sprite' drin. Platformunabhängig, also auch unter PM.
-
Original erstellt von TriPhoenix:
Wohl eher das Datensegment, oder? Codesegmente sind schließlich immer mindestens read-onlyne... eher das codesegment, immerhin möchte er da noch rein schreiben können um den code zu ändern, oder? also mit meinem vc++ mußte ich das irgendwo mal angeben damit das läuft. dass es read-only ist, ist ja das blöde, da kann der code sich net modifizieren, selbst wenn man das ohne zugriffsverletung macht, kann es sein, dass das system den code auslagert und dann einlädt, wobei es die änderungen nicht extra abspeichert auf platte, wozu denn auch, in read-only sollte es keine geben, und scho ist der code falsch.
rapso->greets();
-
@Bitsy
meinte Platform unabhängig eher in dem Sinn, dass man das C++ Programm auch auf einer anderen Platform benutzen kann. Wenn man irgend etwas in den Speicher nachlädt und ausführt oder modifiziert, dann muss man das natürlich für jede Platform neu anpassen. Außerdem ist das schwerer das Programm zu warten, wenn man auf einmal mit Hexcodes arbeiten muss (sonst könnten wir ja alle unsere Sources wegschmeissen und einfach nur noch die Binärys bearbeiten ;))
-
Original erstellt von rapso:
**ne... eher das codesegment, immerhin möchte er da noch rein schreiben können um den code zu ändern, oder? also mit meinem vc++ mußte ich das irgendwo mal angeben damit das läuft. dass es read-only ist, ist ja das blöde, da kann der code sich net modifizieren, selbst wenn man das ohne zugriffsverletung macht, kann es sein, dass das system den code auslagert und dann einlädt, wobei es die änderungen nicht extra abspeichert auf platte, wozu denn auch, in read-only sollte es keine geben, und scho ist der code falsch.
**Codesegmente kann man nicht beschreiben per Definition (eine kleine Ausnahme gibts im Ring < 3, aber da sind wir ja nicht). Codesegmente haben da wo Datensegmente ein Write-Enable haben nur ein Read-Enable, d.h. Codesegemnte können nur ausführbar oder Ausführbar und lesbar sien, mehr nicht. Du musst schon ein Datensegment parallel dazu legen (was aber i.a. der Fall ist afaik). Wenn, dann müssten die Seiten entsprechend markiert sien, damit auch reingeschrieben werden kann, aber den Seiten ists ja egal, in welchem Segment sie liegen
-
Leute vielen dank für eure Posts, aber ich glaube ihr habt mich net soo richtig verstanden
Also ich meinte das so:
programm hat beim start NUR funktionen um etwas zu lesen, nach ner weile, oder beim eintreten eines bestimmten ereignisses oder bei Bedarf, soll sich das programm eigenhändig eine Funktionschreiben zum schreiben und löschen! und sich so weiterentwickeln
Immer neuere Funktionen entwickeln und erfinden, wovon es beim Programmstart nie etwas von wusste oder dafür gesorgt wurde vom coder.
Dann sollen sich diese Funktionen in das programm einschreiben (in die EXE) und beim erneuten programmstart sollen diese funktionen noch vorhanden sein und nicht verloren gehen
Das programm soll sogesehen so weiterlaufen, als ob es nie beendet wurde.
So also ich glaube jetzt wisst ihr genau was ich meine
Wie geht sowas? Das sich das programm selber erweitern kann zur laufzeit und beim neustart des programmes nicht die erweiterungen an sich selber verloren gehen
Klingt irgendwie, wie KI, ne? :D:D
-
das geht nur sehr kompliziert, du musst dein Programm bei bringen zu Programmiern. Ich will nicht deine Fähigkeiten anzweifeln, aber das du es schaffst ein Programm zu schreiben, was dies vollbringt halte ich für sehr sehr unrealistisch
Aber hier mal grob wie es funktionieren würde:
Dein Programm bastelt sich eine schöne Funktion zusammen -> durchsucht das Binary, ändert die entsprechenden Code Stellen -> ändert die Header entsprechend
-
habe ja NIE gesagt, das ich sowas machen will, aber ich frage mich, WIE sowas geht? Wie das Programm zur laufzeit seinen eigenen code verändern/erweitern/editieren kann, OHNE neu compiliert zu werden und selbst etwas an sich zu zerstören.
-
Original erstellt von TriPhoenix:
Codesegmente kann man nicht beschreiben per Definition (eine kleine Ausnahme gibts im Ring < 3, aber da sind wir ja nicht). Codesegmente haben da wo Datensegmente ein Write-Enable haben nur ein Read-Enable, d.h. Codesegemnte können nur ausführbar oder Ausführbar und lesbar sien, mehr nicht. Du musst schon ein Datensegment parallel dazu legen (was aber i.a. der Fall ist afaik). Wenn, dann müssten die Seiten entsprechend markiert sien, damit auch reingeschrieben werden kann, aber den Seiten ists ja egal, in welchem Segment sie liegenhmmm....
http://www.geocities.com/SiliconValley/2151/selfmod.htmlno more 2 say
rapso->greets();