Analisis de virus

por Fernando Bonsembiante

 

Michelángelo, uno de los virus más famosos de los últimos tiempos.

En 1992 los virus tuvieron una gran publicidad
gracias a que se activaba el Michelangelo el día 6 de
marzo. Probablemente la causa de tanto interes repentino
de la prensa fue que era muy destructivo y estaba
diseminado en gran cantidad de máquinas. El día fatídico
se reportaron muchos casos de información perdida, pero
mucha más gente ni siquiera prendió su máquina por miedo
a lo que pudiera pasar. Las pérdidas que originó este
virus, por lo tanto, no solo deben contarse por la
información destruida, sino por el lucro cesante causado
por tantas máquinas apagadas. Quien sabe que hubiera sido
peor, si nadie hubiese estado advertido del virus quizá
hubiesen habido muchas más pérdidas de información, pero
de esta forma se perdió un día de trabajo para mucha
gente. Seguramente si la gente supiera más sobre virus no
habría estos problemas. Se dijeron muchas cosas absurdas
de este virus, por ejemplo que se contagiaba por modem,
cosa ridícula, ya que la única forma de contagiar un
virus es en el momento de ejecución de un programa (o en
el booteo de un disco, que tambien es la ejecución de un
programa). Para transmitir un virus por modem hay que
transmitir un programa infectado y el que lo recibe debe
ejecutarlo. En el caso de un virus de boot esto es mucho
más complicado ya que se debería enviar una imagen de
disco y reconstruirla del otro lado, y bootear con ese
disco.
Michelángelo es un virus de boot sector, que lleva
ese nombre porque se activa en la fecha de cumpleaños del
genial artista italiano. Se cree que se originó en Suecia
o en Holanda, o por lo menos fue aislado allí. Está
basado en el virus Stoned, pero a diferencia de este
último, que es inofensivo, Michelángelo es altamente
destructivo cuando se activa. El virus queda residente en
memoria cuando se intenta bootear con un diskette
infectado, y aunque el disco no contenga el sistema
operativo puede copiarse a un disco rígido. Se instala
residente dentro de los 640k de memoria del DOS, y ocupa
2k. El DOS va a reportar 2k menos de memoria disponible
si el virus está activo. El virus se instala en el boot
de los diskettes, y copia el boot original en uno de los
sectores finales del directorio. En los discos rígidos se
instala en la tabla de particiones y copia la tabla
original en una parte del disco que normalmente no se
usa. Cuando el virus está activo en memoria infecta cada
disco al que se acceda para lectura o escritura. El día 6
de marzo (de cualquier año) se activa su rutina de
destrucción. Esta rutina toma un área de memoria y copia
su contenido secuencialmente en el disco rígido, con lo
cual se pierde toda la información, e incluso el DOS no
reconoce más el disco ya que sobreescribe la tabla de
particiones. La mejor forma de detectarlo es usando el
Scan, con la precaución de que sea la versión más nueva
que se pueda encontrar. Al momento de escribir esto, la
última versión es la 100. Para limpiarlo podemos usar el
Clean o el Mdisk.

Ping Pong, un virus tradicional

El virus Ping Pong es el primero en hacer explosión
en Argentina. Fue descubierto en marzo de 1988, y en poco
tiempo estuvo en nuestro país, donde se convirtió
rápidamente en epidemia. La falta de conocimiento sobre
los virus lo ayudó a que se diseminara por todos lados, y
fuera incontrolable en un principio. En centros
universitarios como la Facultad de Ciencias Exactas de la
UBA o la Facultad de Informática de la Universidad de
Morón era difícil encontrar un disco sin infectar. El
desconocimiento del tema llevó a que pasara bastante
tiempo hasta que se empezaran a tomar medidas. Solo
despues de algunos meses medios como Compu Magazine
empezaron a publicar formas de desinfectar los discos, y
se aplicaron políticas de seguridad en las universidades.
Lo que siempre se ve como positivo de esto fue que la
gente empezó a conocer el DOS más profundamente, por
ejemplo, a conocer el boot sector, para que servía y que
era, ya que se usaban las máquinas pero nadie sabía como
funcionaban realmente. Demostró que la ignorancia es el
peor enemigo. Por eso mismo, pensamos que la mejor forma
de combatirlos y evitar que se repita una epidemia de
esas proporciones es conocerlos lo más posible. Otro
efecto que causó en la gente es la confusión entre el
síntoma y el virus en si. Como tenía un síntoma muy
evidente, la famosa pelotita que rebota, pensaron que
todos los virus debían ser tan visibles. Los siguientes
fueron más ocultos, y se limitaban a reproducirse o
destruir sin avisar al usuario.
El Ping Pong original no podía infectar discos
rígidos, pero la versión que se popularizó aquí fue la B,
que podía hacerlo. Se creó una variante en Argentina,
probablemente fue la primera variante de virus originada
en el país, el Ping Pong C, que no mostraba la pelotita
que rebota en la pantalla. Este virus está extinto en
este momento ya que sólo podía funcionar en máquinas con
procesador 8088 o 8086, porque ejecutaba una instrucción
que es indocumentada en estos e ilegal en los siguientes.

Virus Piazzolla

Características

Piazzolla es un virus que infecta todos los archivos
.COM, ejecutados despues de que esté activo en memoria,
excepto el command.com. Su síntoma más notable es que el
archivo infectado crece en 874 bytes, y que se instala
como un residente de 1,136 bytes. Tambien toma la
interrupción 21h. Una vez que está residente, infecta
todos los archivos .com que se ejecuten. No cambia la
fecha y hora del archivo. En el programa infectado se
pueden ver los siguientes textos:

"Piazzolla"
"COMMANDCOM"
"Piazzoll.$$$"

No hace nada, excepto reproducirse.

Funcionamiento

En el programa infectado por Piazzolla, primero está
el código del virus, y a continuación el programa
original. Cuando el DOS carga el programa en la memoria,
deja el virus primero y el programa original a
continuación. Lo que empieza a ejecutarse es el código
del virus, ya que la ejecución de un .com empieza en el
principio del archivo, cargado por el DOS en la posición
de memoria CS:0100h
Es interesante que veamos como funciona en detalle,
ya que es un virus sencillo de archivos .COM, y no hace
uso de ningun truco extraño del sistema operativo,
funciona como si fuese un residente común y corriente.
Instala una rutina en la interrupción 21h (en la
función DDh) que restaura el programa cargado a
continuación del virus y le da control a este. Cuando se
carga un programa infectado, lo primero que hace es
llamar a esa función, (poniendo en ah 0DDh y llamando a
la interrupción 21h). Si el virus ya está activo en
memoria, esta rutina copia el programa original desde la
zona de memoria en que lo cargó el DOS, (a continuación
del virus) a donde debería estar normalmente, en
CS:0100h. Obviamente, el CS es el CS del programa cargado
y no el de la rutina residente del virus, que es
distinto. Despues de restaurar el programa, salta a la
dirección de origen del mismo (CS:0100h) con lo que lo
ejecuta. De esta forma no se nota nada raro al ejecutar
un programa infectado.
En el caso de que el virus no esté ya presente en la
memoria, instala una rutina propia para la interrupción
21h, y reserva memoria para dejar su código completo
residente. Es importante este detalle, ya que para
infectar un programa copia el código del virus que está
en memoria antes del programa original. Si no hiciera
esto debería sacar el código del virus del disco, es
fácil ver que esta estrategia es mejor. Por esta causa
los virus suelen ocupar más lugar en memoria que en
disco, o por lo menos el mismo lugar, ya que deben
guardar todo su código en memoria y no solo la parte que
van a usar. Cuando instaló esa rutina, llama a la
interrupción 21h servicio 4B00h para ejecutar el programa
original desde disco. La forma en que lo hace es
interesante, ya que busca el nombre con el que fue
llamado el programa en el environment del mismo. En esa
área de memoria, apuntada por el byte que está en el
offset 2Ch del Program Segment Prefix (PSP), están todas
las variables del environment del programa (path,
comspec, etc.) A continuación de esas variables está el
nombre completo con el que fue llamado el programa. Está
después del primer par de bytes con valor 0 (o sea, un
byte 0 del final de la cadena ASCIIZ (ASCII terminado en
cero) de la última variable de environment, y un byte 0
que señala el final del environment) El código que hace
eso es así:

mov cx,0FFFFh
xor ax,ax
xor di,di
mov es,ds:env_seg ; previamente se hizo env_seg equ
2Ch

busca:
repne scasb ; Repetir mientras zf=0 y cx>0
; Scan es:[di] hasta que sea = ax
(0)
cmp byte ptr es:[di],0
je encontro ; si lo encontró
scasb ; Scan es:[di] hasta que sea = ax
(0)
jnz busca ; repetir hasta que lo encuentre

encontro:
mov dx,di
add dx,3 ; dx = di + 3 (el primer word es el
nro
; de strings despues del
environment)
push es
pop ds ; ds = es
mov bx,13Ah
mov ax,4B00h
push cs ; llama a la int 21h
pop es ; 4B00h load and execute
pushf ; ejecuta el programa huesped desde
disco
; En int21h está la
dirección de
call dword ptr cs:int21h ; la interrupción 21h
original

mov ah,4Dh ; obtiene el codigo de retorno del
programa
int 21h ; para devolverlo despues de terminar

mov dx,cs:tamres ; en tamres tiene el tamaño del
código
mov ah,31h
int 21h ; termina y queda residente

Nótese que no hace una llamada a la interrupción
21h, sino que usa la instrucción call, como si fuese una
subrutina más, pasando por encima de la interrupción
instalada por el programa. Esto es una técnica muy usada
por los virus cuando quieren ejecutar una interrupción
modificada por ellos mismos pero como si no estuviese
modificada.
La interrupción 21h instalada por el virus
básicamente tiene dos funciones. Cuando es llamada
verifica si ah es 0DDh o ax es 4B00h. Si es la primera,
realiza la rutina descrita anteriormente para restaurar
el programa original. Si es la segunda, (servicio de
cargar y ejecutar un programa) infecta al archivo. Veamos
como lo hace: Crea un stack temporario, porque va a usar
servicios de la interrupción 21h, y como es un programa
residente esto causa problemas en el stack. Luego
convierte el nombre del programa que se quiso ejecutar a
mayúsculas (el nombre está en DS:DX) y verifica si la
extensión es .COM. Como el programa puede ser un .EXE
renombrado a .COM, el virus verifica si tiene el
identificador interno de los .EXE, en los cuales los dos
primeros bytes del archivo son los caracteres ASCII 'MZ'.
Si el archivo es el command.com, tampoco lo infecta. Para
saber si está previamente infectado verifica que el
cuarto y quinto byte sean 'ia'. A partir del tercer byte
de todos los programas infectados está el string
'Piazzolla', aunque el virus utiliza solamente los bytes
'ia' como identificador, no el nombre completo. Si no es
un .COM real, es el command.com o ya está infectado,
sigue con la interrupción normal, con un jmp dword ptr
cs:int21h, ya que no debe infectar esos archivos.

Infección

La rutina de infección crea un archivo temporario
llamado PIAZZOLL.$$$ donde el copia código del virus
residente en la memoria, y a continuación el programa a
infectar, leyéndolo del disco. De esta forma genera lo
que luego será el programa infectado. Para hacerlo
eficientemente crea un buffer de 20k reservando memoria
con el servicio 48h de la interrupción 21h. Cuando ya
generó el programa infectado, utiliza una estrategia algo
extraña, en vez de borrar el programa original y
renombrar el temporario, borra el original, copia
nuevamente el temporario con el nombre del original, y
borra el temporario. Esto parece una pérdida de tiempo,
pero quizá es un truco para engañar a algún antivirus.
Cuando termina la infección, cambia la hora y fecha del
archivo recien infectado para que sea igual al original.
Mientras está haciendo la copia redirecciona
temporariamente la interrupción 24h (manejo de errores
críticos del DOS) para que siempre devuelva 0, o sea,
para que el DOS no note posibles errores mientras se está
infectando, como ser que no hay lugar en el disco, etc.
Si el virus detecta algún error en algun momento de la
infección, o sea, si la interrupción 21h vuelve con el
flag de carry encendido, aborta toda la operación.


Logo de Ubik World Domination