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

  • Автор темы Rydj
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Rydj

#1
Доброго времени стуток. Взял себе на курсовую написать простенький антивирус :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 -прога
 
Статус
Закрыто для дальнейших ответов.