Создаем вирус и антивирус (Гульев) - страница 75

********************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define F_FOUND 0

#define PATH_LEN 128

#define DRIVE_LEN 4

#define BLANK_LEN 80

#define BAD 1

#define GOOD 0

#define DBG

char

/* Строка имени текущего подкаталога */

path[PATH_LEN],

/* Строка имени начального места расположения */

old_path[PATH_LEN],

/* Строка имени требуемого устройства */

drive[DRIVE_LEN],

/* Пустая строка */

blank[BLANK_LEN];

int

/* Количество отсканированных каталогов */

n_dir,

/* Количество исследованных файлов */

n_fil,

/* Количество больных и исцеленных файлов */

n_ill;

int

/* Длина имени файла */

l,

/* Временный индекс */

i;

#include ”antilib.c”

/* Рекурсивная процедура обхода дерева каталогов */

walk()

{

int found_d, found_f;

struct find_t buf;

/* Поиск каталогов */

found_d=_dos_findfirst(”*.*”,_A_SUBDIR ,&buf);

while (found_d == F_FOUND)

{

if ((buf.name[0] != ”.”) && (buf.attrib & _A_SUBDIR ))

{

chdir(buf.name);

walk();

chdir(”..”);

}

found_d=_dos_findnext( &buf );

}

/* К этому моменту не отсканированных нижележащих каталогов

больше не осталось – сканируем файлы */

n_dir++;

getcwd( path, PATH_LEN );

/* Поиск файлов */

found_f=_dos_findfirst(”*.*”,_A_NORMAL ,&buf);

while (found_f == F_FOUND)

{

l=strlen( buf.name );

if (((buf.name[l−3]==”C”)&&

(buf.name[l−2]==”O”)&&

(buf.name[l−1]==”M”))||

((buf.name[l−3]==”E”)&&

(buf.name[l−2]==”X”)&&

(buf.name[l−1]==”E”)))

{

n_fil++;

printf(”%c%s”,13,blank);

printf(”%c%s\\%s ”,13,path,buf.name);

/* Нашли новый файл – надо проверить, инфицирован ли он.

Если заражен, то лечим */

if (infected(buf.name)==BAD) cure(buf.name);

}

found_f=_dos_findnext( &buf );

}

}

main( int argc, char *argv[] )

{

puts(”ANTISVC – демонстрационный антивирус−фаг”);

if (argc < 2)

{ puts(”Введите имя диска в качестве параметра”); exit(2); }

if (((toupper(argv[1][0]))>”Z”)||((toupper(argv[1][0]))<”A”))

{ puts(”Неверно задано имя диска”); exit(3); }

drive[0]=argv[1][0]; drive[1]=”:”; drive[3]=”\0’;

for (i=0;i

n_dir=0; n_fil=0;

getcwd(old_path, PATH_LEN);

drive[2]=”\0”; system(drive);

drive[2]=”\\”; chdir(drive);

/* Запускаем рекурсивный обход дерева каталогов

для выбранного диска */

walk();

old_path[2]=”0”; system(old_path);

old_path[2]=”\\”; chdir(old_path);

printf(”\nКаталогов : %d\nФайлов : %d\nОбнаружено больных

и излечено: %d”, n_dir, n_fil, n_ill);

if (n_ill) exit(1); else exit(0);

}

Файл «ANTILIB.C», включаемый в предыдущий:

/***************************************************************