Código polimórfico - Polymorphic code

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 a sí mismo cada vez que se ejecuta, pero la función del código (su semántica ) no cambiará en absoluto. Por ejemplo, 1 + 3 y 6-2 logran el mismo resultado utilizando valores y operaciones diferentes. Esta técnica a veces es utilizada por virus informáticos , códigos shell 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) está cifrado y parecerá sin sentido. Para que el código funcione como antes, se agrega una función de descifrado al código. Cuando se ejecuta el código, 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 cifrador / descifrador se muta con cada copia del código. Esto permite diferentes versiones de algún código que funcionan de la misma manera.

Código malicioso

La mayoría de los programas antivirus y los sistemas de detección de intrusos (IDS) intentan localizar el código malintencionado buscando a través de archivos de computadora y paquetes de datos enviados a través de una red de computadoras . 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 tratado de proteger su código cifrado de esta estrategia de escaneo de virus reescribiendo el motor de descifrado sin cifrar (y la carga útil cifrada resultante) cada vez que se propaga el virus o 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 de manera confiable dicho malware .

La emulación se puede utilizar para vencer la ofuscación polimórfica al permitir que el malware se demande en un entorno virtual antes de utilizar otros métodos, como el escaneo de firmas tradicional. Este entorno virtual a veces se denomina caja de arena . 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. Se pueden utilizar técnicas de código metamórfico para complicar aún más la detección, ya que el virus puede ejecutarse sin tener nunca 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 más 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 archivo infecter Virut .

Ejemplo

Este ejemplo no es realmente un código polimórfico, pero servirá como una introducción al mundo del cifrado a través del operador XOR . Por ejemplo, en un algoritmo que utiliza las variables A y B pero no la variable C, podría haber una gran cantidad de código que cambie C, y no tendría ningún efecto en el algoritmo en sí, lo que permitiría que se cambiara infinitamente y sin prestar atención. en cuanto a cuál será el producto final.

Start:
	GOTO Decryption_Code

Encrypted:
	...lots of encrypted code...

Decryption_Code:
	C = C + 1
	A = Encrypted
Loop:
	B = *A
	C = 3214 * A
	B = B XOR CryptoKey
	*A = B
	C = 1
	C = A + B
	A = A + 1
	GOTO Loop IF NOT A = Decryption_Code
	C = C^2
	GOTO Encrypted
CryptoKey:
	some_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 de basura que manipulan C. El código dentro de "Encrypted" ("mucho código encriptado") puede buscar el código entre Decryption_Code y CryptoKey y cada algoritmo para un nuevo código que haga lo mismo. Por lo general, el codificador utiliza una clave cero (por ejemplo, A xo 0 = A) para la primera generación del virus, lo que lo hace más fácil para el codificador porque con esta clave el código no está encriptado. Luego, el codificador implementa un algoritmo de clave incremental o uno aleatorio.

Cifrado polimórfico

El código polimórfico también se puede utilizar para generar un algoritmo de cifrado. Este código fue generado por el servicio en línea StringEncrypt. Toma la cadena o el contenido de un archivo y lo cifra con comandos de cifrado aleatorios y genera un código de descifrado polimórfico en uno de los muchos lenguajes de programación compatibles:

// encrypted with https://www.stringencrypt.com (v1.1.0) [C/C++]
// szLabel = "Wikipedia"
wchar_t szLabel[10] = { 0xB1A8, 0xB12E, 0xB0B4, 0xB03C, 0x33B9, 0xB30C, 0x3295, 0xB260, 0xB5E5, 0x35A2 };
 
for (unsigned tUTuj = 0, KRspk = 0; tUTuj < 10; tUTuj++) {
    KRspk = szLabel[tUTuj];
    KRspk ^= 0x2622;
    KRspk = ~KRspk;
    KRspk --;
    KRspk += tUTuj;
    KRspk = (((KRspk & 0xFFFF) >> 3) | (KRspk << 13)) & 0xFFFF;
    KRspk += tUTuj;
    KRspk --;
    KRspk = ((KRspk << 8) | ( (KRspk & 0xFFFF) >> 8)) & 0xFFFF;
    KRspk ^= 0xE702;
    KRspk = ((KRspk << 4) | ( (KRspk & 0xFFFF) >> 12)) & 0xFFFF;
    KRspk ^= tUTuj;
    KRspk ++;
    KRspk = (((KRspk & 0xFFFF) >> 8) | (KRspk << 8)) & 0xFFFF;
    KRspk = ~KRspk;
    szLabel[tUTuj] = KRspk;
}
 
wprintf(szLabel);

Como puede ver en este ejemplo de C ++, la cadena se cifró y cada carácter se almacenó en forma cifrada utilizando el formato UNICODE widechar. Se utilizaron diferentes comandos de cifrado como XOR bit a bit , NOT , suma, resta, rotaciones de bit. Todo es aleatorio, las claves de cifrado, los contadores de rotación de bits y el orden de los comandos de cifrado también. El código de salida se puede generar en C / C ++ , C # , Java , JavaScript , Python , Ruby , Haskell , MASM , FASM y AutoIt . Gracias a la aleatorización, el algoritmo generado es diferente cada vez. No es posible escribir herramientas de descifrado genéricas y el código compilado con código de cifrado polimórfico debe analizarse cada vez que se vuelve a cifrar.

Ver también

Referencias

  1. ^ Raghunathan, Srinivasan (2007). Protección de software antivirus frente a ataques virales (M.Sc.). Universidad del estado de Arizona. CiteSeerX  10.1.1.93.796 .
  2. ^ Wong, ala; Sello, M. (2006). "Caza de motores metamórficos". Revista de Virología Informática . 2 : 211-229. CiteSeerX  10.1.1.108.3878 . doi : 10.1007 / s11416-006-0028-7 .
  3. ^ Wójcik, Bartosz (2015). Cifrado de cadenas y archivos