sich selbst modifizierender Code?



  • 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-only 🙂

    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.

    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 liegen 🙂

    hmmm....
    http://www.geocities.com/SiliconValley/2151/selfmod.html

    no more 2 say

    rapso->greets();



  • Original erstellt von rapso:
    **hmmm....
    http://www.geocities.com/SiliconValley/2151/selfmod.html

    no more 2 say
    **

    Tja, da werden aber die Seitenrechte geändert, nicht die Segmente 🙂 Und die asm-Stückchen schreiben auch ganz normal über das Datensegment, also nichts da, Codesegmente bleiben unbeschreibbar 🙂

    [ Dieser Beitrag wurde am 30.10.2002 um 20:23 Uhr von TriPhoenix editiert. ]



  • seh ich das falsch oder wird dort ein dword im codesegment entlockt damit man den code ändern kann und dann wieder gelockt, damit es ein herkömliches codesegment bleibt (ohne zugriff durch das programm) ?

    _asm mov dword ptr address,offset [myloop+3]
    hollt man sich doch die addi vom Code der sicherlich im codesegment liegt, wie sollte er den sonst aufgeführt werden? (CS und DS haben die selbe addresse soweit ich weiß, deswegen kann man über DS auf gleichzeitig auf das codesegment zugreiffen).

    rapso->greets();



  • Original erstellt von rapso:
    **seh ich das falsch oder wird dort ein dword im codesegment entlockt damit man den code ändern kann und dann wieder gelockt, damit es ein herkömliches codesegment bleibt (ohne zugriff durch das programm) ?
    **

    Es wird nicht im Codesegemnt de-locked sondern in den Pagetabellen, die ja nochmal zusätzliche Read/Write/Execute-Rechte haben.

    Original erstellt von rapso:
    **
    _asm mov dword ptr address,offset [myloop+3]
    hollt man sich doch die addi vom Code der sicherlich im codesegment liegt, wie sollte er den sonst aufgeführt werden? (CS und DS haben die selbe addresse soweit ich weiß, deswegen kann man über DS auf gleichzeitig auf das codesegment zugreiffen).**

    Ja das holt die adresse vom Code, aber du sagst ja shcon richtig, die segmente decken denselben Bereich ab, von daher greift man über das Codesegment zu. Damit das schreiben erlaubt ist werden vorher die Seiten schreibbar gemacht (s.o.)



  • Original erstellt von TriPhoenix:
    Es wird nicht im Codesegemnt de-locked sondern in den Pagetabellen, die ja nochmal zusätzliche Read/Write/Execute- Rechte haben.

    es wird eine page de-locked, eine aus dem codesegment.... wenn man sagt, dass das codesegment de-locked werden muss, dann meint man den speicherbereich worauf CS zeigt, was sollte sonst gemeint werden? *verwundertsei* und dafür muss man doch die page(s) de-locken... oder wiederspricht irgendetwas was ich gesagt habe den tatsachen?

    Original erstellt von TriPhoenix:
    Ja das holt die adresse vom Code, aber du sagst ja shcon richtig, die segmente decken denselben Bereich ab, von daher greift man über das Codesegment zu. Damit das schreiben erlaubt ist werden vorher die Seiten schreibbar gemacht (s.o.)

    genau das hab ich schon von anfang an gesagt..

    Original erstellt von TriPhoenix:
    **
    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**

    das segment ist nicht mindestens read only, es ist jeglicher zugrif auf die pages des codesegments nicht erlaubt:
    MSDN "PAGE_EXECUTE
    Enables execute access to the committed region of pages. An attempt to read or write to the committed region results in an access violation
    "

    rapso->greets();



  • Im PMTUT.TXT steht, wie man selbst Modifizierenden Code trotz PM machen kann.

    http://www.geocities.com/sunriseos/docs/PMTUT.txt

    das geht irgend wie mit einem Alias Segment



  • es wird eine page de-locked, eine aus dem codesegment.... wenn man sagt, dass das codesegment de-locked werden muss, dann meint man den speicherbereich worauf CS zeigt, was sollte sonst gemeint werden? *verwundertsei* und dafür muss man doch die page(s) de-locken... oder wiederspricht irgendetwas was ich gesagt habe den tatsachen?

    Pages haben keine Segfmentzuordnungen. EIn Sgement umfasst pages, und da Datensegment und Codesegment auf dieselbe Page zeigen, wird die Page so gesehen in beiden Segmenten delocked. Der Page ist trotzdem egal, in welchem Sgement (falls überhaupt) sie liegt 🙂

    Original erstellt von TriPhoenix:
    Ja das holt die adresse vom Code, aber du sagst ja shcon richtig, die segmente decken denselben Bereich ab, von daher greift man über das Codesegment zu. Damit das schreiben erlaubt ist werden vorher die Seiten schreibbar gemacht (s.o.)
    *
    genau das hab ich schon von anfang an gesagt..

    da hab ich mich nur verschirieben 🙂 meinte "von daher greift man über das Datensegment zu.

    das segment ist nicht mindestens read only, es ist jeglicher zugrif auf die pages des codesegments nicht erlaubt:
    MSDN "PAGE_EXECUTE
    Enables execute access to the committed region of pages. An attempt to read or write to the committed region results in an access violation"

    sorry, meinte Pages sind maimal read-only 🙂 Was die Pages dahinetr sind ist wieder eine andere Sache, die MSDN sagt ja auch hier nichts zu den Segmenten 🙂

    [ Dieser Beitrag wurde am 31.10.2002 um 16:43 Uhr von TriPhoenix editiert. ]


Anmelden zum Antworten