sich selbst modifizierender Code?
-
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();
-
Original erstellt von rapso:
**hmmm....
http://www.geocities.com/SiliconValley/2151/selfmod.htmlno 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. ]
-
Irgendwer hatte hier gesagt, dass polymorphe Viren ihren Code ändern (weiß gerade nicht wer das gesagt hat, hab den Thread hier nur kurz überflogen). Also polymorphe Viren ändern keinen Code, sondern erzeugen eine zufällige Entschlüsslungsroutine und verschlüsseln den Virus passend dazu. Dabei werden neben den eigentlichen Entschlüsslungsinstruktionen auch "junk"- oder "garbage"-Instruktionen eingefügt, die im Prinzip nichts wesentliches machen.
Dementsprechend ändert ein polymorpher Virus nicht seinen Code, sondern einen kleinen zufälligen Teilcode.
Ein metamorpher Virus dagegen ändert seinen Code. Der Code wird nicht erweitert, sondern Instruktionen werden durch äquivalente Instruktionen ausgetauscht. Dadurch erhält der Virus ein neues "Aussehen". Beispiel: Der metaPHOR Virus von Mental Driller. Die erste Generation ist ca. 32 Kb groß. Folgende Generationen sind immer irgendwo um die 64 Kb groß. Der Source Code ist allein 500 kb reines Assembler! Und wohlgemerkt ist ca. 90% vom Virus nur die Meta Engine. Sowas ist auf jeden Fall eine recht komplexe Sache, die vor allem tierisch schwer zu debuggen sein muss (man erkennt seinen eigenen Code ja kaum wieder ;)).
Code erweitern machen doch viele Programme schon mit PlugIns. Sogar einige Viren haben die Fähigkeiten PlugIns runterzuladen und zu nutzen. Bestes Beispiel ist dafür sicherlich der Hybris Virus von Vecna, für den es sicherlich mindestens 10 PlugIns gibt.
Ich persönlich hab erst heute meine erste Polymorphe Engine fertiggestellt. Ziemlich schlicht geworden, aber wenigstens selbstgemacht.
-
Nur mal ne Frage zwischen durch:
Es gibt unter Windows die Funktion CreateThread und man übergibt einen Pointer auf eine Funktion,die daraufhin ausgeführt wird.Wenn ich jetzt die Adresse eines (von mir beschreibaren) Strings übergebe ,könnte man damit vielleicht auch Variablen-Code realisieren,unter Windows95/98/SE...?