[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 4, Dec 1997 file 00B
Вакцина-индикатор заражения Sphinks
by RedArc
Вакцина Shpinks2 представляет собой два файла SETUP.COM и SPHINKS.BIN
Программа SETUP.COM предназначена для установки вакцины в
пользовательские файлы форматов COM и EXE. Для установки вакции следует
запустить эту программу и в командной строке указать один единственный
параметр - имя защищаемой программы, например:
setup.com my_file.exe
Если вакцина была установлена на защищаемую программу ранее, то будет
выдано соответствующее предупреждение и установка прервется, иначе, после
установки вакцины будет выдано сообщение о завершении установки.
ПРЕДУПРЕЖДЕНИЕ: так как это freeware версия, то размер вакцинируемых
файлов не может превышать 64860 байт. Если будет произведена попытка
вакцинировать файл большего размера, будет выдано соответствующее сообщение и
установка прервется.
ПРЕДУПРЕЖДЕНИЕ: программа SETUP.COM не проверяет минимальный размер
защищаемого файла, по этому это кладется на плечи самих пользователей.
Минимальный размер защищаемого файла 700 байт. При попытке установки вакцины
на файл меньшего размера файл будет испорчен.
ОГРАНИЧЕНИЯ: вакцина является индикатором заражения программы практически
любым файловым вирусом, т.е. не имеет функций лечения и ограничена лишь
выдачей предупреждающего сообщения и завершением работы инфицированной
программы. Вакцина не проверяет порчу тела программы, а контроллирует лишь
размер и некоторое количество байт начала. Проверка на уровне FCB не ведется.
ДОСТОИНСТВА: вакцина довольно надежно контроллирует здоровье защищаемых
файлов от поражения вирусами. Она оказывается работоспособной даже при
активных резидентных стелс-вирусах!
Это исходник самой вакцины:
=== Cut ===
Model Tiny
.code
.286
org 100h
ALL_SIZE equ 666
START:
pusha
mov es,word ptr ds:[2ch]
xchg cx,di
xchg di,bx
inc al
repne scasw
push es
mov MY_NAME,di
mov ah,1ah
mov dx,DTA_OFS
inc dh
int 21h
pop ds
call MOVE_CX
mov dx, di
call FIND_FIRST
jb ERROR_1
xor cx,cx
call SET_ATTR
xor ax,ax
call OPEN_FILE
push cs
xchg ax,bx
pop ds
xor cx,cx
push cx
xor dx,dx
mov al,02
call MOVE_HAND
mov LEN1, ax
xchg ax,dx
xor ax,ax
pop cx
call MOVE_HAND
mov cx, 20h
call READ_FROM_FILE
jc ERROR_1
cmp ax,0
jnz ERROR_1
jmp NEXT
MOVE_CX:
mov cx,0ffffh
ret
ERROR_1:
popa
push cs
pop ds
mov ah,09h
lea dx, MSG1
int 21h
mov al,02h
RETURN:
mov ah,4ch
int 21h
CLOSE_FILE:
mov ah, 3eh
int 21h
ret
SET_ATTR:
mov ax,4301h
int 21h
ret
NEXT:
xor cx,cx
push cx
call MOVE_HAND1
N1:
xor cx,cx
inc cl
call READ_FROM_FILE
cmp ah,al
jz N2
pop cx
inc cx
cmp cx,0ffffh
jne N_1
jmp short ERROR_1
OPEN_FILE:
mov ah,3dh
int 21h
ret
N_1:
push cx
jmp short N1
FIND_FIRST:
mov ah,4eh
int 21h
ret
N2:
pop cx
mov LEN3,cx
call MOVE_HAND1
mov cx, 20h
call READ_FROM_FILE
jc ERROR_1
call CLOSE_FILE
push es
mov si, DTA_OFS
mov dx,di
pop ds
add si,100h
push dx
mov cx,word ptr cs:[si+15h]
call SET_ATTR
push cs
mov ax, word ptr cs:[si+1ah]
pop ds
mov LEN2,ax
push es
call MOVE_CX
pop ds
pop dx
call FIND_FIRST
push cs
pop ds
jnb L1
jmp ERROR_1
L1:
mov ax,LEN1
mov bx,LEN2
cmp ax,bx
jz CMP_NEXT
jmp ERROR_1
CMP_NEXT:
mov ax, word ptr cs:[si+1ah]
cmp ax,bx
jz CMP_NEXT1
jmp ERROR_1
CMP_NEXT1:
mov ax,LEN3
cmp ax,bx
jz CMP_NEXT2
jmp ERROR_1
CMP_NEXT2:
mov ax,LEN0
cmp ax,bx
jz CMP_MY_BEG
jmp ERROR_1
READ_FROM_FILE:
mov ah, 3fh
mov dx, offset BUF_READ
int 21h
ret
CMP_MY_BEG:
push es
push cs
mov si,100h
mov di,offset BUF_READ
mov cx,20h
pop es
repe cmpsb
pop es
je TESTED_OK
jmp ERROR_1
MOVE_HAND:
mov ah,42h
int 21h
ret
MOVE_HAND1:
xor ax,ax
xor cx,cx
xor dx,dx
jmp short MOVE_HAND
TESTED_OK:
mov dx,MY_NAME
push es
pop ds
mov al,02
call OPEN_FILE
xchg ax,bx
push cs
pop ds
mov ax,LEN0
sub ax,MY_LEN
push ax
xchg ax,dx
xor ax,ax
call MOVE_HAND
mov cx,MY_LEN
call READ_FROM_FILE
call MOVE_HAND1
mov dx,offset BUF_READ
mov cx,MY_LEN
call WRITE_FILE
pop dx
xor cx,cx
xor ax,ax
call MOVE_HAND
xor cx,cx
xor dx,dx
call WRITE_FILE
call CLOSE_FILE
push es
push cs
mov bx, (3 * ALL_SIZE + 100h)/16
pop es
mov ah,4ah
int 21h
pop es
mov di,offset BUF_READ
xor ax,ax
mov [di], ax
mov ax, 80h
mov [di + 2], ax
mov [di + 4], cs
mov ax,5ch
mov [di + 6],ax
mov [di + 8],cs
mov ax,6ch
mov [di + 10],ax
mov [di + 12],cs
mov byte ptr [di + 14],0eh
popa
mov ax,4b00h
mov bx,offset BUF_READ
push cs
pop ds
mov dx,MY_NAME
push es
mov LEN1,SS
mov LEN2,SP
mov LEN3,ES
pop ds
push cs
pop es
int 21h
mov ss,word ptr cs:[LEN1]
mov sp,word ptr cs:[LEN2]
mov es,word ptr cs:[LEN3]
push cs
pop ds
INSTALL_MY:
mov dx,MY_NAME
push es
pop ds
mov al,02
call OPEN_FILE
push cs
xchg ax,bx
pop ds
mov dx,offset BUF_READ
mov cx,MY_LEN
push dx
push cx
call READ_FROM_FILE
mov al,2
xor cx,cx
xor dx,dx
call MOVE_HAND
pop cx
pop dx
call WRITE_FILE
call MOVE_HAND1
push cs
mov LEN1,es
pop es
mov dx,100h
mov cx,MY_LEN
call WRITE_FILE
call CLOSE_FILE
xor ax,ax
jmp RETURN
;-------------------
WRITE_FILE:
mov ah,40h
int 21h
ret
MSG1 db '░▒▓█ VACCINE Sphinks-2 (c) by RedArc █▓▒░',0ah,0dh
db ' This file is corrupt. ',0ah,0dh
db ' Possible virus! ',0ah,0dh,'$'
LEN0_OFS equ $-START
LEN0 dw 0FFFFh
MY_LEN equ $-START
MY_NAME dw ?
LEN1 dw ?
LEN2 dw ?
LEN3 dw ?
DTA_OFS equ $-START
_DTA db 80h dup (?)
BUF_READ db 20h dup (?)
END START
=== Cut ===
А это исходник программы SETUP:
=== Cut ===
Model Tiny
.code
org 100h
START:
mov al,byte ptr cs:[80h]
cmp al,0
jz INFORMATION
jmp INSTALL
INFORMATION:
lea dx,MSG0
mov ah,09h
int 21h
mov ax,4c00h
int 21h
MSG0 db 'Usage: setup.com filename.com',0ah,0dh,'$'
MSG1 db 'File too big!',0ah,0dh,'$'
MSG2 db 'Installation is completed!',0ah,0dh,'$'
MSG3 db 'Sphinks is already install!',0ah,0dh,'$'
BIN_NAME db 'sphinks.bin',0h
SF_LEN equ 666
IDENT db 0ah,0dh,'Vaccine Sphinks-2'
db 0ah,0dh,'(c) by RedArc // TAVC',0ah,0dh,00h
INSTALL:
mov dx,offset BIN_NAME
mov ax,3d00h
int 21h
xchg ax,bx
mov ah,3fh
mov dx,offset BUF_READ
mov cx,SF_LEN
int 21h
mov ah,3eh
int 21h
mov dx,82h
xor ax,ax
mov si,dx
dec si
mov al,byte ptr cs:[80h]
add si,ax
mov byte ptr cs:[si],00h
mov ax,3d02h
int 21h
xchg ax,bx
mov ah,3fh
mov dx,offset NEW_READ
mov cx,SF_LEN
int 21h
mov si,offset NEW_READ
mov di,offset BUF_READ
mov cx,SF_LEN
repe cmpsb
jne NEXT
mov ah,3eh
int 21h
lea dx,MSG3
mov ah,09h
int 21h
mov ax,4c03h
int 21h
NEXT:
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
push ax
and ax,0f000h
cmp ax,0f000h
jnz Len_Tested
pop ax
mov ah,3eh
int 21h
lea dx,MSG1
mov ah,09h
int 21h
mov ax,4c01h
int 21h
Len_Tested:
mov ah,40h
mov cx,SF_LEN
mov dx,offset NEW_READ
int 21h
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
mov di, offset BUF_READ
pop ax
add ax,SF_LEN
mov word ptr cs:[di + SF_LEN - 2],ax
mov ah,40h
mov cx,SF_LEN
xchg dx, di
int 21h
mov ah,3eh
int 21h
lea dx,MSG2
mov ah,09h
int 21h
mov ax,4c02h
int 21h
BUF_READ db SF_LEN dup (?)
NEW_READ db SF_LEN dup (?)
END START
=== Cut ===