Código polimórfico
En informática, el código polimórfico es un código que usa un motor polimórfico para mutar mientras mantiene intacto el algoritmo original; es decir, el código cambia cada vez que se ejecuta, pero la función del código (su semántica) no cambiará en absoluto. Por ejemplo, las expresiones matemáticas simples 3+1 y 6-2 logran el mismo resultado, pero se ejecutan con un código de máquina diferente en una CPU. Esta técnica a veces es utilizada por virus informáticos, shellcodes y gusanos informáticos para ocultar su presencia.
El cifrado es el método más común para ocultar código. Con el cifrado, el cuerpo principal del código (también llamado su carga útil) se cifra y parecerá sin sentido. Para que el código funcione como antes, se agrega una función de descifrado al código. Cuando el código se ejecuta, esta función lee la carga útil y la descifra antes de ejecutarla a su vez.
El cifrado por sí solo no es polimorfismo. Para obtener un comportamiento polimórfico, el par de encriptador/desencriptador se muta con cada copia del código. Esto permite diferentes versiones de algún código que funcionan todas de la misma manera.
Código malicioso
La mayoría de los software antivirus y los sistemas de detección de intrusos (IDS) intentan localizar el código malicioso buscando en archivos informáticos y paquetes de datos enviados a través de una red informática. Si el software de seguridad encuentra patrones que corresponden a virus o gusanos informáticos conocidos, toma las medidas adecuadas para neutralizar la amenaza. Los algoritmos polimórficos dificultan que dicho software reconozca el código infractor porque muta constantemente.
Los programadores malintencionados han intentado proteger su código cifrado de esta estrategia de detección de virus reescribiendo el motor de descifrado no cifrado (y la carga útil cifrada resultante) cada vez que se propaga el virus o el gusano. El software antivirus utiliza un análisis de patrones sofisticado para encontrar patrones subyacentes dentro de las diferentes mutaciones del motor de descifrado, con la esperanza de detectar dicho malware de manera confiable.
La emulación se puede usar para derrotar la ofuscación polimórfica al permitir que el malware se deshaga por sí mismo en un entorno virtual antes de utilizar otros métodos, como el escaneo tradicional de firmas. Este entorno virtual a veces se denomina sandbox. El polimorfismo no protege al virus contra dicha emulación si la carga útil descifrada sigue siendo la misma independientemente de la variación en el algoritmo de descifrado. Las técnicas de código metamórfico pueden usarse para complicar aún más la detección, ya que el virus puede ejecutarse sin tener bloques de código identificables en la memoria que permanezcan constantes de una infección a otra.
El primer virus polimórfico conocido fue escrito por Mark Washburn. El virus, llamado 1260, fue escrito en 1990. Un virus polimórfico mejor conocido fue creado en 1992 por el hacker Dark Avenger como un medio para evitar el reconocimiento de patrones del software antivirus. Un virus polimórfico común y muy virulento es el infectador de archivos Virut.
Ejemplo
Este ejemplo no es realmente un código polimórfico, pero servirá como introducción al mundo del cifrado a través del operador XOR. Por ejemplo, en un algoritmo que usa las variables A y B pero no la variable C, podría haber una gran cantidad de código que cambia C, y no tendría ningún efecto en el algoritmo en sí, lo que permitiría cambiarlo sin cesar y sin prestar atención. en cuanto a cuál será el producto final.
Comienzo: GOTO Decryption_Code Cifrado: ...muchos de código encriptado... Decryption_ Código: C = C + 1 A = cifrado Loop: B = *A C = 3214 * A B = B XOR Crypto Clave *A = B C = 1 C = A + B A = A + 1 GOTO Loop IF NOT A = Decryption_Code C = C^2 Encriptado CryptoKey: algunos_random_number
El código cifrado es la carga útil. Para hacer diferentes versiones del código, en cada copia cambiarán las líneas basura que manipulan C. El código dentro de "Cifrado" ("mucho código cifrado") puede buscar el código entre Decryption_Code y CryptoKey y cada algoritmo en busca de código nuevo que haga lo mismo. Normalmente, el codificador utiliza una clave cero (por ejemplo, A x o 0 = A) para la primera generación del virus, lo que facilita las cosas al codificador porque con esta clave no se cifra el código. Luego, el codificador implementa un algoritmo de clave incremental o uno aleatorio.
Contenido relacionado
Chatarra (barco)
Macworld
C++