[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 ===