AVZ 5. Руководство пользователя
×

Поиск подозрительных объектов по именам

Поиск файлов по именам малоэффективен для борьбы с современными вредоносными программами, но он может пригодиться в качестве одной из форм своеобразной эвристики. Достоинство метода - высокая скорость поиска и простота реализации. Рассмотрим несколько вариантов реализации этого поиска при помощи скриптов AVZ
 
Пример 1. Простейший поиск по именам
 
// Поиск файла с указанным именем
function CheckByName(Fname : string) : boolean;
begin
  Result := FileExists(Fname) ;
  if Result then
    AddToLog('Файл '+Fname+' имеет подозрительное имя');
end;
 
begin
  // Проверка файлов
  CheckByName('%WinDir%\cservv32.exe');
  CheckByName('%WinDir%\services.exe');
  CheckByName('%WinDir%\lsass.exe');
end.
 
В примере использовались: AddToLog, FileExists
 
 
В данном примере объявляется функция CheckByName, задачей которой является проверка наличия файла с указанным именем на диске. В случае обнаружения подобного файла функция возвращает true и делает отметку в протоколе при помощи функции AddToLog. Недостатком функции является то, что список файлов как таковой отсутствует - вместо него идут повторяющиеся вызовы  CheckByName. В более сложном примере можно усовершенствовать поиск, разместив список имен в отдельном файле, который будет выступать в роли базы данных.
 
Пример 2. Поиск по именам с использованием загружаемого списка файлов
 
// Поиск файла с указанным именем
function CheckByName(Fname : string) : boolean;
begin
  Result := FileExists(Fname) ;
  if Result then
    AddToLog('Файл '+Fname+' имеет подозрительное имя');
end;
 
var
  SuspNames : TStringList; // Список имен подозрительных файлов
  i : integer;
begin
  // Проверка файлов по обновляемой базе данных
  if FileExists(GetAVZDirectory + 'files.db') then begin
    SuspNames := TStringList.Create;
    SuspNames.LoadFromFile('files.db');
    AddToLog('База имен загружена - количество записей = '+
           inttostr(SuspNames.Count));
 
    // Цикл поиска
    for i := 0 to SuspNames.Count - 1 do
      CheckByName(SuspNames[i]);
  end else
   AddToLog('Ошибка загрузки списка имен файлов');
end.
 
В примере использовались: AddToLog, FileExists, GetAVZDirectory
 
В данном примере используется уже знакомая по примеру 1 функция CheckByName, которая вызывается в цикле. Для работы со списком файлов применяется класс TStringList. Предполагается, что список файлов хранится в текстовом файле files.db, который размещается в каталоге AVZ (путь к этому каталогу определяется при помощи GetAVZDirectory
 
Пример 3. Поиск по именам с использованием загружаемого списка файлов и AV баз AVZ
 
// Поиск файла с указанным именем
function CheckByName(Fname : string) : boolean;
var
  S : string;
begin
  Result := FileExists(Fname) ;
  if Result then begin
    S := '';
    case CheckFile(Fname) of
     -1 : S := ', доступ к файлу блокируется';
      1 : S := ', опознан как Malware ('+GetLastCheckTxt+')';
      2 : S := ', подозревается файловым сканером ('+GetLastCheckTxt+')';
      3 : exit; // Безопасные файлы игнорируем
    end;
    AddToLog('Файл '+NormalFileName(Fname)+' имеет подозрительное имя'+S);
  end;
end;
 
var
  SuspNames : TStringList; // Список имен подозрительных файлов
  i : integer;
begin
  // Проверка файлов по обновляемой базе данных
  if FileExists(GetAVZDirectory + 'files.db') then begin
   SuspNames := TStringList.Create;
   SuspNames.LoadFromFile('files.db');
   AddToLog('База имен загружена - количество записей = '+inttostr(SuspNames.Count));
   // Цикл поиска
   for i := 0 to SuspNames.Count - 1 do
     CheckByName(SuspNames[i]);
  end else
    AddToLog('Ошибка загрузки списка имен файлов');
end.
 
В примере использовались: AddToLog, CheckFile, FileExists, GetAVZDirectory, GetLastCheckTxt, NormalFileName
 
 
В данном примере появляется еще одно усовершенствование - функция CheckByName проверяет обнаруженный по имени файла по базам AVZ. Для этих целей применяется функция CheckFile (она поддерживается начиная с AVZ 4.23). Анализ результатов сканирования файла позволяет исключить из протокола безопасные файлы и файлы, прошедшие контроль по каталогу Microsoft. Функция CheckFile применяется совместно с GetLastCheckTxt для получения имени зловреда в случае его детектирования или подозрения. Еще одной особенностью является применение функции NormalFileName для нормализации имени файла (которая, в частности, предполагает замену применяемых в AVZ макросов). Дополнительную информацию о поиске файлов можно посмотреть в разделе "Поиск файлов и папок"