1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

[c][linux]Антивирус

Тема в разделе "Вопросы новичков и не только", создана пользователем Rydj, 25 май 2011.

Статус темы:
Закрыта.
  1. Rydj

    Rydj Гость

    Репутация:
    0
    Доброго времени стуток. Взял себе на курсовую написать простенький антивирус :google: . Задача такова: Условный антивирусный файловый сканер.
    Сканировать рекурсивно папку, заданную пользователем.
    Осуществлять поиск сигнатур, известных сканеру.
    Выводить инфицированные объекты на экран в формате:
    путь к файлу: название сигнатуры условного вируса.
    Каждая сигнатура - это запись в файле сигнатур, который
    хранится в папке антивируса (база).
    Сигнатура состоит из нескольких полей:
    1) Название, срока. Пример: Worm.LoveSan
    2) Длина тела, целое число.
    3) Собственно тело, последовательность байт.
    Основу я уже сделал, у меня антивирус проходит рекурсивно папку и ищет название условного вируса, но пока я это название задаю программно. Можете мне помочь сделать сравнение не только по названию но и по пункту 2 и 3 и желательно чтобы эти данные брались из файла base

    Код:
    #include <sys/stat.h>
    #include <ftw.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/dir.h>
    #include <sys/stat.h>
    #include <string.h>
    
    int rek (const char *name, const struct stat *status, int type) //Функция которая вызывается для каждого файла или каталога, найденого в поддереве. (нужна для рекурсивного обхода)
    {
    FILE *f1;
    f1 = fopen("Buf.txt", "a+");
    if (type == FTW_F)
    fprintf(f1 ,"%s %ld\n", name, status->st_size);
    fclose(f1);
    return 0;
    }
    
    int main (int argc, char *argv)
    {
    
    int rek (const char *, const struct stat *, int); 
    FILE *f1, *f2, *f3, *f4;
    char filename[256];
    int i, sch, k;
    char b[1024];
    
    f2 = fopen("Buf.txt", "w");
    fprintf(f3, "");
    
    printf("Введите точку отчета!\n");
    scanf("%s", filename);
    
    if ((f1 = fopen(filename, "r")) == NULL)
    {
    printf("Не верно указана точка отсчета!");
    return 0;
    }
    else
    ftw(filename, rek, 1);
    fclose(f1);
    fclose(f2);
    
    if ((f3 = fopen("Base.txt", "r")) == NULL)
    {
    printf("Антивирусная база не найдена!");
    return 0;
    }
    if ((f4 = fopen("Buf.txt", "r")) == NULL)
    {
    printf("Не найден отчет сканирования!");
    return 0;
    }
    i = 0;
    sch = 1;
    k = 0;
    while(1) {
    int c = getc(f4);
    if (c == EOF)
    break;
    b[i] = c;
    
    if (b[i] == '\n' || b[i] == '/' || b[i] == ' ')
    {
    b[i] = '\0';
    sch = strcmp(b, "Worm.Love");
    if ( sch == 0 )
    {
    printf("Обнаружен вирус! %s\n", b);
    k++;
    }
    i = 0;
    }		
    else
    ++i;
    }
    if (sch != 0 && k == 0)
    {
    printf("Вирусы не обнаружены!\n");
    }
    printf("Обнаруженно вирусов: %d\n", k);
    
    fclose(f3);
    fclose(f4);
    }
    f1-указываем путь к директории
    f2- обнулить старые значения в buf
    f3- открытие антивирусной базы
    f4-открытие результата сканирования

    Сам файл с базой открываю но как теперь сравнивать значения от туда с проверяемым файлом я не знаю. Сенсей сказал что сравнение с базой должно проходить в функции rek.

    Файлы программы:
    Buf.txt - результат сканирования
    base.txt- вирусная база
    Worm.Love -наш злой условный вирус=)
    r.c -прога
     
Статус темы:
Закрыта.

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