El código metamórfico es código que cuando se ejecuta genera una versión lógicamente equivalente de su propio código bajo alguna interpretación . Esto es similar a quine , excepto que el código fuente de quine es exactamente equivalente a su propia salida. El código metamórfico también suele generar código de máquina y no su propio código fuente.
Los virus informáticos utilizan código metamórfico para evitar el reconocimiento de patrones del software antivirus . Los virus metamórficos a menudo traducen su propio código binario en una representación temporal, editan la representación temporal de sí mismos y luego traducen la forma editada nuevamente a código de máquina. [1] Este procedimiento se realiza con el virus mismo y, por lo tanto, también el motor metamórfico sufre cambios, lo que significa que ninguna parte del virus permanece igual. Esto difiere del código polimórfico , donde el motor polimórfico no puede reescribir su propio código.
Algunos virus utilizan código metamórfico cuando están a punto de infectar nuevos archivos, y el resultado es que la próxima generación nunca se parecerá a la generación actual. El código mutado hará exactamente lo mismo (según la interpretación utilizada), pero la representación binaria del niño normalmente será completamente diferente de la del padre. La mutación se puede lograr utilizando técnicas como insertar instrucciones NOP ( fuerza bruta ), cambiar qué registros usar, cambiar el control de flujo con saltos, cambiar las instrucciones de la máquina por otras equivalentes o reordenar instrucciones independientes.
El metamorfismo no protege a un virus contra el análisis heurístico . [ cita necesaria ]
El código metamórfico también puede significar que un virus es capaz de infectar ejecutables de dos o más sistemas operativos diferentes (como Windows y Linux ) o incluso arquitecturas informáticas diferentes . A menudo, el virus hace esto llevando varios virus dentro de sí. Luego, el comienzo del virus se codifica para que se traduzca en código de máquina correcto para todas las plataformas en las que se supone que debe ejecutarse. [2] Esto se usa principalmente en código de inyección remota de exploits donde se desconoce la plataforma de destino.