16.39.11. Пример реализации сигнатурного искателя

 
// Добавление сообщения в протокол
Procedure AddAlarm(AFileName, AMsg : string);
begin
  AddtoLog('>>>>> '+AFileName+' подозрение на '+AMsg);
end;
 
// Сканирование файла
Procedure ScanFile(AFileName : string);
begin
  SetStatusBarText(AFileName);
  // Загрузка файла в буфер анализа
  LoadFileToBuffer(AFileName);
  // Поиск сигнатуры
  if SearchSign('2E 61 64 2D 77 2D 61 2D 72 2D 65 2E 63 6F',-20000, 0) >= 0 then
    AddAlarm(AFileName, 'Adware.Look2me');
  // Освобождение памяти, занятой под буфер
  FreeBuffer;
end;
 
// Сканирование папки (с рекурсивным обходом)
Procedure ScanDir(ADirName : string; AScanSubDir : boolean);
var
  FS : TFileSearch;
begin
  ADirName := NormalDir(ADirName);
  FS := TFileSearch.Create(nil);
  FS.FindFirst(ADirName + '*.*');
  while FS.Found do begin
    if FS.IsDir then begin
      if AScanSubDir and (FS.FileName <> '.') and (FS.FileName <> '..') then
        ScanDir(ADirName + FS.FileName, AScanSubDir)
    end else
      ScanFile(ADirName + FS.FileName);
    FS.FindNext;
  end;
  FS.Free;
end;
 
begin
  ScanDir('c:\', true);
end.
 
В примере использовались: AddtoLog, FreeBuffer, LoadFileToBuffer, NormalDir, SearchSign, SetStatusBarText