Código metamórfico


El código metamórfico es un 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 un quine , excepto que el código fuente de un quine es exactamente equivalente a su propia salida. El código metamórfico también genera normalmente código de máquina y no su propio código fuente.

Los virus informáticos utilizan el 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, editando la representación temporal de sí mismos y luego traducen la forma editada nuevamente al código de máquina. [1] Este procedimiento se realiza con el virus en sí 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 el código metamórfico cuando están a punto de infectar archivos nuevos, y el resultado es que la próxima generación nunca se verá como 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 usando 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 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 de computadora diferentes . A menudo, el virus hace esto llevando varios virus dentro de sí mismo. El comienzo del virus luego se codifica para que se traduzca al 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.