El polimorfismo consiste en cifrar nuestro programa de manera que su contenido varíe dinámicamente, y que por tanto lo haga más complicado de detectar.

Lo que hace nuestro código VBS es básicamente leer el contenido del fichero original, y codificarlo de una manera que siga siendo ejecutable, de manera que se explota también las características de código automodificable.

La idea es transformar el contenido en una cadena de caracteres, que contienen el carácter original, pero encriptado con XOR. Utilizamos como clave de encriptación un carácter generado más o menos aleatoriamente sobre los segundos de la fecha del sistema. De esta forma, tenemos la combinación de diferentes codificaciones que cambiarán cada vez que ejecutemos el proceso.

Ahora nos queda la parte más complicada, que es conseguir que ese propio script siga funcionando en su forma codificada, por lo que no nos queda más remedio que agregar una rutina decodificadora sobre el string encriptado, que realice el proceso inverso. Una vez tengamos la cadena en plano, podemos aprovechar la función Execute de VBS, para ejecutar ese código.

Sin embargo, el sistema sería bastante débil de esta manera, pues sería relativamente sencillo identificar la rutina decodificadora. Para evitarlo, hacemos que cuente también con un cierto grado de polimorfismo.

Vemos todo el proceso con ejemplos.

Contenido original:
MsgBox "Polimorfismo"

Partimos de un archivo original, que simplemente saca un mensaje por pantalla. Al codificarlo con nuestro algoritmo, obtenemos diferentes variantes codificadas de ese mismo código.

Contenido mutado 1:
j=""&Chr(39)&Chr(25)&Chr(13)&Chr(40)&Chr(5)&Chr(18)&Chr(74)&Chr(72)&Chr(58)&Chr(5)&Chr(6)&Chr(3)&Chr(7)&Chr(5)&Chr(24)&Chr(12)&Chr(3)&Chr(25)&Chr(7)&Chr(5)&Chr(72)
jjj=""
For jj=1 To Len(j):jjj=jjj&Chr(Asc(Mid(j, jj, 1)) Xor 106)
Next
Execute jjj

Contenido mutado 2:
a=""&Chr(44)&Chr(18)&Chr(6)&Chr(35)&Chr(14)&Chr(25)&Chr(65)&Chr(67)&Chr(49)&Chr(14)&Chr(13)&Chr(8)&Chr(12)&Chr(14)&Chr(19)&Chr(7)&Chr(8)&Chr(18)&Chr(12)&Chr(14)&Chr(67)
aaa=""
For aa=1 To Len(a):aaa=aaa&Chr(Asc(Mid(a, aa, 1)) Xor 97)
Next
Execute aaa

Obviamente los carácteres codificados en la secuencia de Chr, es distinta, pues cada uno de ellos ha utilizado una clave Xor diferente y pseudo-aleatoria. También es diferente el código de descifrado, que es probablemente la parte más interesante de todo.

Os invito a descargar el código fuente del mutador VBS (1 Kb. en formato ZIP), y al mismo tiempo os planteo un reto para destacar el concepto: Desarrollar una expresión regular que sea capaz de detectar el contenido polimórfico, con un grado mínimo de falsos positivos.

Y no os perdáis la siguiente entrega de Técnicas víricas: Ocultación. Entre tanto podéis consultar la anterior en Técnicas víricas: Introducción.