SET 39 Call For Papers

¿Eres un hacker? Si deseas pasar a formar parte de la historia del hacking hispano, colabora con la próxima edición de SET 39 enviándonos un artículo. No esperes más, esta es tu oportunidad de demostrar lo que sabes. Ayúdanos a construir una revista de hackers para hackers. SET Staff

Curso basico-practico de crack/virii

      5834

Autor: +NetBul
 oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo
 A   06    - CURSO BASICO-PRACTICO DE CRACK/VIRII -                      A
 A                                                                       A
 oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo



                Curso Basico-Practico de CRACKEO de VIRUS
                         todo en uno se€ora!!
                            @97 by +NetBuL


  /-------------------------------------------------------------
  |IMPORTANTE:                                                 |
  |.- Nivel: baaaasico (practicamente "explicado para tontos") |
  |.- Indicado para: novatos y lamercillos ocasionales ...     |
  -------------------------------------------------------------/



 ***  INTRODUCCION  ***
 ======================

Mucha gente quiere aprender cosas sobre los virus y los cracks y no saben
por donde empezar. Generalmente los textos basicos que hablan de estos temas
exigen unos conocimientos previos que no son tan basicos.

Por eso, para escribir mi primer texto, he decidido hacer un mini-curso
que trate estos 2 temas (muy por encima) y a la vez se pueda seguir (casi)
sin conocimientos previos, pero a costa de explicar algunas cosas *demasiado*
claras.

A veces, para que te entre el gusanillo por estos temas y empieces a avanzar
es necesario ver resultados. Creo que este texto conseguira, como minimo,
que + de uno empiece con ganas a repasar el ensamblador.

Recuerda la teoria del Gran Pecador de la Pradera : MODIFICAR virus *solo*
es el paso previo para APRENDER a programarlos, a su vez PROGRAMAR virus
*solo* es el paso previo para APRENDER ensamblador ...  (:-? guewos ...).

Por ultimo quiero aclarar que este articulo esta destinado a usos
didacticos (y va en serio).

EL BUEN/MAL USO QUE LE DEIS ES RESPONSABILIDAD VUESTRA, QUEDA CLARO ...



 ***  INGREDIENTES  ***
 ======================

 - Lo imprescindible : el editor, el virus, un diskete vacio, este texto,
                       un PC enchufado a la corriente y como minimo un
                       dedo en cada mano (mancos abstenerse). :-)
 
 - Editor Hexadecimal (MS-DOS) : XED v1.1b
                                 David L. Dight
                                 a€o 1994
                                 Es un poco viejo pero suficiente para
                                 las "practicas" y cumple los requisitos:

                                       - es para MS-DOS
                                       - ocupa poco (unos 170Kb)
                                       - desensambla instrucciones
 
 - Virus BARROTES.1310.A. Pregunta a algun vecino, seguro que tu primo
                          tiene 400mil discos infectados con el barrotes
                          y el PING PONG, y si no lo encuentras buscalo
                          por internet que son 5 minutos.

 - DEBUG del MS-DOS. Facil, no ?

 - Libro "Lenguaje ensamblador de los 80x86"
         Jon Beltran de Heredia.
         Editorial ANAYA Multimedia, 300 pags, unas 1500 ptas.
         Lo mejor para iniciarse con el ASM, claro, clarito...

 - Libro "Virus informaticos"
         Alfonso Mur y otros.
         Iba de regalo en la revista PC Magazine hace tiempo, y es
         100% publicidad y rollete pero tambien viene algo de codigo
         del VIERNES 13 ...

 - Articulo: "Todo sobre los virus"
             Javier Guerrero.
             Lo encontraras en la revista PCMANIA, a€o IV, n§ 28
             ("Regalaban" 2 CD's, uno de ellos de  GREENPEACE)
             Aqui hay parte del codigo del BARROTES comentado.



 ***  SABER LO + BASICO  ***
 ===========================

Para nuestra primera mision solo necesitamos unos minimos conocimientos de
ensamblador (no es imprescindible), instrucciones basicas como MOV, JMP, etc,
uso basico del debug o de algun compilador de ASM, saber que cada
instruccion en ensamblador se codifica al compilarla en uno o varios bytes,
que luego son ejecutados directamente por el PC, por ejemplo:

        La instruccion:                         MOV AX,0 (MOV AX,0000)

        se codifica en hexadecimal como:        B8 00 00 ( 3 bytes )

La forma en que vamos a modificar un virus sera cambiando directamente
determinados bytes del codigo del virus para que cuando sea ejecutado el
archivo infectado ejecute nuestras nuevas instrucciones.
Ejemplo practico:

        Vamos a crear una mierdaprograma de ejemplo con el debug (tambien
        se puede con el editor hexadecimal) que cambie el modo de video, y
        despues lo vamos a modificar a pelo, usando el editor ...
        Resumiendo, que sobre un ejecutable vamos a hacer cambios y listo
        y asi no necesitamos tener el listado fuente, modificarlo y
        compilarlo (en definitiva, vamos a usar tecnicas de cracking).

        c:\>DEBUG                 ;ejecutamos el DEBUG de MS-DOS
        -A                        ;escribimos el comando A: a€adir
        xxxx:0100 MOV AL,6A       ;cargamos 6A en AL
        xxxx:0102 INT 10          ;int 10 (video) con funcion 6A (800x600)
        xxxx:0104 MOV AX,4C00     ;cargamos 4C00 en AX
        xxxx:0107 INT 21          ;int 21 (DOS) con func. 4C00 (salida al dos)
        xxxx:0109                 ;cuando acabamos le damos a INTRO
        -RCX                      ;comando RCX: mostrar registro CX
        CX 0000                   ;en el CX hay 0000
        :09                       ;ponemos en CX el ultimo num. (0109 == 09)
        -N mv8x6.com              ;comando N: poner nombre al programa
        -W                        ;comando W: compila y escribe el COM
        Escribiendo 00009 bytes   ;pues eso ...
        -Q                        ;comando Q: sale del DEBUG
        c:\>

        Ahora tenemos nuestro mv8x6.com de tan solo 9 bytes. Que bonito!!
        Bueno, lo pruebas y seguimos.

La parida de antes nos sirve para aprender como se crackea un programa
cualquiera (p. ej. un virus ... :-) ).

        Ahora vamos a editarlo con el editor hexadecimal y veremos de que
        se alimenta el PC. Esto es lo que se ve (en hex):

        B0 6A CD 10 B8 00 4C CD 21

        Que significa:

        B0 6A     ==  MOV AL,6A
        CD 10     ==  INT 10
        B8 00 4C  ==  MOV AX, 4C00
        CD 21     ==  INT 21
        
        Ahora es cuando ves la luz y dices : J*DER, pues claro !!!!.
        Efectivamente, si queremos "crackear" este fichero para que
        haga otra cosa tan solo tenemos que sobreescribirlo con el 
        nuevo codigo y punto.
        
        Vamos a crear un nuevo .COM que deshaga el entuerto de antes. El
        cambio de instruccion sera sustituir MOV AL,6A por MOV AL,07 para 
        volver al modo 80x25 caracteres. En este caso solo tenemos que
        sustituir el 6A por 07:
        
        MOV AL,6A == B0 6A
        MOV AL,07 == B0 07      
        
        luegorl ....
        
        B0 6A CD 10 B8 00 4C CD 21      ; viejo codigo
        B0 07 CD 10 B8 00 4C CD 21      ; nuevo codigo 
           ^^
           cuando no mire nadie ... cambiazo !!

        Lo grabamos como mv80x25.com y arreglado. Si lo ejecutas despues
        del mv8x6.com todo volvera a ser normal ...

        Ahora no hemos tenido que escribir todo el fuente y compilarlo
        como antes, simplemente lo hemos sobreescrito. 
        
        "Tu primera colonia .... tu primer crack, CHISPAS !!"   :-)))

En este ejemplo tambien vemos una de las normas a respetar al crackear un
programa: no a€adir ni quitar nada, el fichero modificado debe de tener el
tama€o original y no debemos de tocar cosas a lo loco, hay que saber que
estamos haciendo en cada momento. Generalmente solo tocaremos algunos MOV
y poco mas.

Tambien hemos aprendido como saber en cualquier instante la codificacion de
una instrucion. Creamos un .COM con el DEBUG con una unica instruccion y
luego lo editamos para ver como se ha codificado. Con el tiempo espero que
depureis esta tecnica!!         :-D



 ***  PREPARATIVOS PREVIOS  ***
 ==============================

Ahora tienes que conseguir un virus vivo (el ejecutable) y lo mas dificil
es conseguir una parte del listado fuente. En internet puedes encontrar 
virus a patadas.

En este ejemplo he utilizado los listados parciales que aparecieron en un
numero de PCMANIA sobre el virus BARROTES. El virus que he utilizado es,
logicamente, el barrotes (BARROTES.1310.A segun el SCAN).

Pasos a seguir ....

1§ Creamos con el editor hex. un fichero llamado DUMMY.COM de 256 bytes
y lo llenamos de muchos 90 (instruccion NOP, No operation) y lo 
acabamos con B8 00 4C CD 21 (como ya hemos visto, corresponde al codigo
para salir al dos [ MOV AX,4C00 // INT 21 ]). El DUMMY.COM lo usaremos 
para infectarlo con el virus y poder trabajar mejor (conseguiremos 
separar el codigo del virus del codigo del programa infectado, ya que
ahora conoceremos como es el programa infectado). El hecho de que ocupe
256 bytes es porque algunos virus no infectan los .COM si tienen menos
de 256 o 512 bytes.

 Ejemplo:

        DUMMY.COM
        -------------------------------------------------
        |90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90|
        |90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90|
        |90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90|
        |....                                           |
        |... etc ... hasta 16 (15 de estas + la ultima) |
        |....                                           |
        |90 90 90 90 90 90 90 90 90 90 90 B8 00 4C CD 21|
        ------------------------------------------------|

        Este fichero no hace nada al ejecutarse, hace un monton de NOP (90)
        y despues sale al dos (B8 00 4C CD 21).

2§ Formateamos un diskette como disco de sistema y copiamos en el:

        - el fichero infectado con el virus
        - el editor hexadecimal
        - el debug
        - el fichero DUMMY.COM

3§ Reiniciamos el PC y entramos en el SETUP, eliminando el o los discos duros
y dejamos solo la disketera. Salimos del SETUP. Desde este momento *SOLO*
usaremos la DISKETERA !!. Asi evitaremos infectar todo el disco duro.

4§ Reiniciamos el PC con el disco metido y nos aseguramos de que no exista
ningun disco duro.

5§ Ahora es un buen momento para ejecutar el fichero infectado para cargar el
virus en memoria y despues ejecutar el DUMMY.COM para infectarlo. En nuestro
caso el barrotes tambien intentara infectar el C:\COMMAND.COM  pero ahora
no podra ... 

Si eres valiente usa el comando DATE para poner la fecha del PC a 5 de enero
y vuelve a ejecutar algun programa ... Veras los famosos BARROTES y tu HD
no se enterara (puedes hacerlo, el HD ahora no existe). Despues resetea y
seguimos.



 ***  EMPEZAMOS CON EL VIRUS  ***
 ================================

Si hemos seguido bien los pasos veremos que nuestro DUMMY.COM ha engordado
un poquito, algo asi como 1310 bytes ...
Lo editamos y como sabemos como era el DUMMY.COM original, el codigo del virus
se queda en pelotas, lo tenemos delante de nuestras narices. Todo lo que no
sean los 90's y el codigo de salida al dos, sera parte del virus.

Veras que los 3 primeros bytes (90 90 90) han sido sustituidos por (XX XX XX)
que equivale a JMP XXXX que es la direccion en la que empieza el codigo del
virus.

En definitiva, los virus (los de sobreescritura NO, claro) generalmente 
hacen todos lo mismo, cogen el fichero a infectar y le a€aden al principio
una instruccion de JMP que apunta al final del fichero, donde se a€ade el 
codigo del virus. Los bytes que se sobreescriban al principio del fichero
para meter el JMP se copian en el area de datos del virus.

Al ejecutar el fichero lo primero que se ejecuta es el JMP que salta al 
final, donde esta el codigo del virus, se ejecuta el virus que comprueba si
esta residente en memoria y demas y cuando acaba vuelve al area de datos, 
ejecuta los 3 bytes sustituidos del inicio y luego salta al 4§ byte del 
programa donde se sigue ejecutando el fichero con normalidad.

        
        Fichero DUMMY.COM infectado
        ---------------------------------------------------
        | XX XX XX 90 90 90 90 90 90 90 90 90 90 90 90 90 |
        | .                                               |
        | .    (esto es nuestro dummy original)           |        
        | .                                               |
        | 90 90 90 90 90 90 90 90 90 90 90 B8 00 4C CD 21 |
        |                                                 |
        | (datos del barrotes ... aqui encontraremos los 3|
        | 90's que nos faltan y otras cosas)              |
        |                                                 |
        | (codigo del barrotes ...)                       |
        |                                                 |
        | (al final de todo, marca de identificacion)     |
        | (del virus (SO)) -----------------------> 53 4F |
        ---------------------------------------------------



 ***  PRIMEROS RETOQUES  ***
 ===========================

Vamos a empezar por algo sencillito, no hace falta saber nada especial 
para hacer esto. Cambiaremos la marca de identificacion del virus.

El barrotes (y casi todos los virus) marcan el final de los ficheros que
infectan con un par de bytes (el barrotes: SO == 534F hex) para evitar
infectarlos mas de una vez, ya que si no lo hicieran el fichero iria
creciendo y creciendo hasta explotar :-)
Ademas, dentro del codigo del virus encontraremos mas veces la susodicha
cadena ya que, por ejemplo, cuando el virus esta residente en memoria y
ejecutamos cualquier programa, el virus compara los 2 ultimos bytes del
fichero con la cadena 'SO' para ver si esta infectado y si no es el caso
infectarlo. Por lo tanto un fichero infectado contiene la cadena varias
veces: 1 al final, que es la marca en si y otras dentro del codigo del virus.

Vamos alla:
- editamos el DUMMY.COM y buscamos los 2 ultimos bytes. Si no es un BARROTES
modificado, la cadena sera 'OS'. La cambiamos por otra, p. ej. 'ZX'.

- buscamos en el resto del DUMMY la cadena 'SO' y la sustituimos por 'ZX'
(la encontraremos 2 veces). (pista: 'XZ' es '5A 58' en hex)

Pues yasta!. Hemos superado la primera prueba con exito. Los antivirus mas
pobres ya no detectaran nuestra nueva version del Barrotes. Si, si como lo
lees, algunos antivirus basan su busqueda en las marcas de identificacion
de los virus!!.



 ***  SEGUNDOS RETOQUES  ***
 ===========================

Una de las cosillas que hace el barrotes al ejecutarse es comprobar cual es
la fecha del PC y, si por esas cosas de la vida es 5 de enero, ZASSS!, tabla
de particion del disco duro a toma pol culo.

Todo esto lo hace con el siguiente codigo:

        MOV AH,2A       ;carga 2A en el registro AH
        INT 21          ;la int 21 (DOS) con funcion 2A devuelve la fecha
        CMP DX,105      ;comparamos reg. DX con 0105 (5 del 1)
        JNE noes5del1   ;si no es 5 del 1 se va a otra parte
        ...             ;si es 5 del 1 sigue por aqui y ZASSS! ...

Si metemos las tres primeras lineas en el debug y lo compilamos, no saldra
un fichero con lo siguiente:

        B4 2A CD 21 81 FA 05 01

        donde, como ya habras adivinado:

        B42A      == MOV AH,2A
        CD21      == INT 21
        81FA0501  == CMP DX,105

Vamos a fijarnos en la parte del CMP. La funcion 2A del DOS devuelve la
fecha en :
        el registro AL, el dia de la semana (0==dom, 1==lunes, ...)
        el registro CX, el a€o
        el registro DX, el mes y el dia,
                        es decir : el mes en DH
                                   el dia en DL

El barrotes compara DH con 01 y DL con 05, o lo que es lo mismo, CX con 0105.

Pues, de nuevo, yasta!! :

        - Si lo que queremos es que nuestro nuevo barrotes solo joda el dia
        del cumplea€os de la suegra, que fue un mal dia para la humanidad,
        cambiaremos:

                CMP DX,105      por ...
                CMP DX,mmdd     donde 'mm' es el mes en que nacio la maldita
                                y 'dd' es el dia clave ...

        - Si eres de los que odia la navidad, pondras :

                CMP DX,1225     pero no tendra mucho exito ya que el dia
                                de navidad es fiesta y poca gente enciende
                                el PC ... :-)

Como encontrar esta parte del codigo ?. Facil.

        - 1Š forma : simplemente coge la cadena que hemos sacado con el debug
        y buscala por todo el DUMMY.

        - 2Š forma : como ya habras visto todas las instrucciones INT se
        codifican como 'CD XX' donde XX es el numero de la interrupcion.
        Pues busca en el DUMMY todas las cadenas 'CD21' y, si estas
        utilizando el editor XED, pones el cursor encima de la 'C' y con
        SHIFT+F10 se desensambla a partir de esa instruccion. Si la
        siguiente es la CMP DX,105 (o CMP DX,0105), eureka, ya lo tenemos.
        (pista: en el codigo hay muchos CD21, el que nos interesa es el
        ultimo de todos).

        Ahora sobreescribimos ...

          donde pone : .. B4 2A CD 21 81 FA 05 01 ..
          ponemos    : .. B4 2A CD 21 81 FA 25 12 ..  si odias la navidad :-)
                                            ^^ ^^
                                            ozu, que cambiazo . :-)

Ahora bien, si quisieramos que infecte el dia 13 de *cada* mes la cosa se
complica y me explico:

        ahora queremos cambiar :
                                        CMP DX,105    por
                                        CMP DL,13
        ... y el problema ??

                CMP DX,105    se codifica como   '81 FA 05 01' pero
                CMP DL,13     se codifica como   '80 FA 13'

        ... caguenla, me falta un byte!!. No problemo. Para eso tenemos
        la instruccion NOP, que no hace na de na y ademas, ocupa 1 byte!

        Resumiendo, lo que vamos a hacer es sustituir:

                CMP DX,105      ;es 5 de enero ?

        por :
                NOP             ;no hago na de na y relleno 1 byte
                CMP DL,13       ;es dia 13 ?

        Hala, a sobreescribir ... cambiemos pues

                '81 FA 05 01' por
                '90 80 FA 13'
                 ^^
                 NOP

Nuestro cada vez mas querido barrotes hace + cosas distintas. Ya le habiamos
cambiado la personalidad (el cree que se llama ZX y no SO) y ademas ahora
toca las pelotas el dia 13 de todos los meses.



 ***  LA COSA VA EN SERIO !  ***
 ===============================

El barrotes es conocido precisamente por eso, porque el dia que te casca el
disco duro salen unos barrotes en pantalla y te vacilan con una frase que
dice:

Virus BARROTES por OSoft

Esta cadena se encuentra encriptada en la zona de datos del virus de forma
que con un simple type o con un edit no se vea. (La zona de datos empieza
donde acaba nuestro DUMMY; justo antes de la cadena encriptada puedes
encontrar la cadena 'c:\command.com'). El metodo de encriptacion es muy
sencillo y consiste en sumar 50 (decimal) a cada caracter.
Cuando es el momento de sacarla en pantalla, el virus la desencripta
(resta 50) y la muestra.

        (Ojo: 56hex + 50dec == 88hex)
        (Ojo bis: los espacios de la cadena (32dec o 20hex) no estan
        encriptados y por lo tanto NO los desencripta...)

La cadena en hexadecimal (sin encriptar):

     V  i  r  u  s     B  A  R  R  O  T  E  S     p  o  r     O  S  o  f  t
     56 69 72 75 73 20 42 41 52 52 4F 54 45 53 20 70 6F 72 20 4F 53 6F 66 74

La cadena en hexadecimal (encriptada) [recuerda que sumamos 50d == C2h]:

    (V  i  r  u  s     B  A  R  R  O  T  E  S     p  o  r     O  S  o  f  t)
     88 9B A4 A7 A5 20 74 73 84 84 81 86 77 85 20 A2 A1 A4 20 81 85 A1 98 A6
                    ^^                         ^^          ^^
(Atencion a los espacios, siguen *igual* con 20h)

Supongamos que queremos cambiar el texto por eso de vacilar un poco mas a
los amiguetes ... ya que nuestro nuevo virus se activa el dia 13 de CADA
mes y odiamos a nuestra suegra MARUJA podemos utilizar la siguiente cadena:

                        "Virus LA REGLA de MARUJA"

Pues a trabajar ...

Nuevo texto sin encriptar:

     V  i  r  u  s     L  A     R  E  G  L  A     d  e     M  A  R  U  J  A
     56 69 72 75 73 20 4C 41 20 52 45 47 4C 41 20 64 65 20 4D 41 52 55 4A 41

Y ahora lo encriptamos siguiendo los pasos de antes:

    (V  i  r  u  s     L  A     R  E  G  L  A     d  e     M  A  R  U  J  A)
     88 9B A4 A7 A5 20 7E 73 20 84 77 79 7E 73 20 96 97 20 7F 73 84 87 7C 73

Ya lo tenemos!. Resumiendo, sustituimos en el virus la cadena:

        889BA4A7A520747384848186778520A2A1A4208185A198A6

        por la nueva cadena encriptada:

        889BA4A7A5207E73208477797E73209697207F7384877C73

Si quieres poner una cadena distinta debes de tener en cuenta 2 cosas:

        - 1§ La nueva cadena debe de tener como maximo 24 caracteres ya que
        el bucle de desencriptado tiene solo 24 pasos (si metes mas no saldra)

        Virus BARROTES por OSoft
        XXXXXXXXXXXXXXXXXXXXXXXX     nueva cadena (MAX)

        - 2§ Los espacios no los encriptes, dejalos con el 20h ya que el
        bucle de desencriptado los deja tal cual. Si tienes dudas mira el
        ejemplo de la suegra Maruja.

Como siempre, al final de la leccion vienen los deberes para hacer en casa.
:-). Como tenemos varias pistas, a saber, que el bucle consta de 24 pasos,
que resta 50 decimal (C2 hex) a cada caracter y que "pasa" de los 20h,
podemos buscar la parte del codigo del bucle y cambiar el n§ de encriptado
para que en vez de restar 50 reste 10 o sume 15, cambiando logicamente el
encriptado del texto para que la cosa salga bonita, claro.



 ***  Y AHORA QUE ?  ***
 =======================

Ahora se pueden hacer 1000 cosas con nuestro Maruja-barrotes:

        - Guardarlo en un diskete y ense€arlo a los amigos en los guateques.

        - Pasarle todo tipo de antivirus, te llevaras buenas sorpresas.

        - Enviarlo a los se€ores de McAfee y demas para que se coman
        el coco, lo desensamblen y trabajen un poco.

Entre las 1000 cosas tambien esta, por supuesto, la opcion de que salga
de paseo, pero ojo, que conste que yo no incito a nadie. (Como un dia me
infecte un tal 'maruja virus' me lio a leches con tolmundo, eh!). :-D

Ufff, por fin. Peazo rollo.
Bueno, no seais tarugos y aprended que por ahi se empieza. X-)



                                                @1997 by +NetBuL
                                                ++++++++++++++++
                                                456E20
                                                6D656D6F72696120
                                                646520
                                                416E64726577
                                                ++++++++++++++++