R
Доброго времени стуток. Взял себе на курсовую написать простенький антивирус :google: . Задача такова: Условный антивирусный файловый сканер.
Сканировать рекурсивно папку, заданную пользователем.
Осуществлять поиск сигнатур, известных сканеру.
Выводить инфицированные объекты на экран в формате:
путь к файлу: название сигнатуры условного вируса.
Каждая сигнатура - это запись в файле сигнатур, который
хранится в папке антивируса (база).
Сигнатура состоит из нескольких полей:
1) Название, срока. Пример: Worm.LoveSan
2) Длина тела, целое число.
3) Собственно тело, последовательность байт.
Основу я уже сделал, у меня антивирус проходит рекурсивно папку и ищет название условного вируса, но пока я это название задаю программно. Можете мне помочь сделать сравнение не только по названию но и по пункту 2 и 3 и желательно чтобы эти данные брались из файла base
f1-указываем путь к директории
f2- обнулить старые значения в buf
f3- открытие антивирусной базы
f4-открытие результата сканирования
Сам файл с базой открываю но как теперь сравнивать значения от туда с проверяемым файлом я не знаю. Сенсей сказал что сравнение с базой должно проходить в функции rek.
Файлы программы:
Buf.txt - результат сканирования
base.txt- вирусная база
Worm.Love -наш злой условный вирус=)
r.c -прога
Сканировать рекурсивно папку, заданную пользователем.
Осуществлять поиск сигнатур, известных сканеру.
Выводить инфицированные объекты на экран в формате:
путь к файлу: название сигнатуры условного вируса.
Каждая сигнатура - это запись в файле сигнатур, который
хранится в папке антивируса (база).
Сигнатура состоит из нескольких полей:
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);
}
f2- обнулить старые значения в buf
f3- открытие антивирусной базы
f4-открытие результата сканирования
Сам файл с базой открываю но как теперь сравнивать значения от туда с проверяемым файлом я не знаю. Сенсей сказал что сравнение с базой должно проходить в функции rek.
Файлы программы:
Buf.txt - результат сканирования
base.txt- вирусная база
Worm.Love -наш злой условный вирус=)
r.c -прога