In der Reihenfolge zunehmender Komplexität: oligomorph, polymorph, metamorph.
Die ersten beiden Begriffe werden im Allgemeinen auf Entschlüsseler angewendet. Wir (Antiviren-Industrie) definieren sie folgendermaßen: oligomorph - Entschlüsseler mit wenigen variablen Elementen, der die Größe oder Form des Codes nicht beeinflusst. Dies bedeutet, dass die variablen Elemente normalerweise Anweisungen mit fester Größe sind, sie können jedoch auch für die Registerinitialisierung gelten.
Oligomorphes Beispiel
std; fake, wird möglicherweise durch ersetzt cld / nop / xchg axe, cx / ... mov cx, sizemov axe, axe; fake, könnte durch mov bx, bx / oder cx, cx / ... mov si, decrypt_srccld; fakemov di, decrypt_dstor axe, ersetzt werden. axe; fakemov bl, keyand bp, bp; fakedecrypt: xor [di], blxchg dx, axe; fakeinc dicld; fakeloop decrypt
In diesem Fall der di code Das Register> könnte beispielsweise mit si
ausgetauscht werden. Sehr einfache Ersetzung.
Polymorpher
Entschlüsseler mit möglicherweise sehr variablen Elementen, was sich auf die Größe und / oder Form des Codes auswirkt. Dies bedeutet, dass alle Arten von Änderungen angewendet werden können, einschließlich der Erstellung von Unterprogrammen, großer Blöcke von Müllanweisungen, Code "Inseln" oder sogar der Initialisierung von algorithmischen Registern (Beispiel hier).
Metamorphe
hochvariable Elemente werden direkt auf den Körper angewendet. In diesem Fall gibt es im Allgemeinen keinen Entschlüsseler. Die gleichen Techniken für den Polymorphismus werden auf den Code selbst angewendet. Das bekannteste Beispiel hierfür ist das Simile-Virus aus dem Jahr 2002 (Details hier). Es gibt ein ausführliches Papier zu diesem Thema mit aktuellen Beispielen hier)