if (((buf.name[l-3]=="C")&&
(buf.name[l-2]=="0")&&
(buf.name[l-1]=="M"))ll
((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);
/* Нашли новый файл - надо проверить, инфицирован ли он.
Если заражен, то лечим 7
if (infected(buf.name)==BAD) cure(buf.name);
}
found_f=_dos_findnext( &buf );
}
}
main( int argc, char *argv[] )
{
puts("ANTISVC - демонстрационный антивирус-фаг");
if (argc < 2)
{ р1Л8("Введите имя диска в качестве параметра"); exit(2); }
if(((toupper(argv[1][0]))>"Z")ll((toupper(argv[1][0]))<"A"))
{ puts("HeBepHO задано имя диска"); exit(3); }
drive[0]=argv[1][0]; drive[1 ]=":"; drive[3]="\0';
for (i=0;i<BLANK_LEN;i++) blank[i]=" ";blank[BI_ANK_LEN-1]="\0";
n_dir=0; n_fil=0;
getcwd(old_path, PATHJ-EN);
drive[2]="\0"; system(drive);
drive[2]=^\"; chdir(drive);
/* Запускаем рекурсивный обход дерева каталогов
для выбранного диска 7
walk();
old_path[2]="0"; system(old_path);
old_path[2]='\"; chdir(old_path);
printf("\nKaTanoroB : %с1\пфайлов : %Ь\пОбнаружено больных
и излечено: %d", n_dir, n_fil, n_ill);
if (nJII) exit(1); else exit(O);
Файл "ANTILIB.C", включаемый в предыдущий:
Процедуры обнаружения и лечения
/* Сигнатура */
char sign[7]={ (char) OxB4,
(char) 0х83,
(char) OxCD,
(char) 0х21,
(char) Ox5E,
(char) 0х56,
"\0");
int infected( char *fn )
I
int f;
int r,q;
char buf[7]; /* Буфер под сигнатуру */
/* Открываем файл */
r=_dos_open( fn, 0_RDONLY, &f );
if (r) { printf(" - ошибка открытия!"); return GOOD; }
/* Читаем 6 байт */
lseek( f, -1724, SEEK_END );
r=_dos_read( f, buf, 6, &q ); buf[6]="\0";
if ((r)ll(q!=6)) {printf(" - ошибка чтения!"); _dos_close(f); return GOOD;
/* Закрываем файл */
_dos_close(f);
/* Сравниваем байты с сигнатурой 7
if (strcmp( buf, sign)==0)
( printf(" - был болен и..."); n_ill++; return BAD; } /* Болен !!! */
/* Годен к в/службе. П/пк мед. службы Орлов :-) */
return GOOD;
cure( char *fn )
i
int f;
int mz;
int r,q;
char buf[24]; /* Буфер под байты */
/* Открываем файл */
r=_dos_open( fn, 0_RDWR, &f );
if (r) { printf(" - ошибка открытия!"); return; }
/* Читаем первые два байта для определения типа программы */
r=_dos_read( f, &mz, 2, &q );
if ((r)ll(q!=2)) {printf(" - ошибка чтения!"); _dos_close(f); return; }
/* Читаем сохраненные вирусом 24 байта старого начала */
lseek( f, -80, SEEK_END );
r=_dos_read( f, buf, 24, &q );
if ((r)ll(q!=24)) (printf(" - ошибка чтения!"); _dos_close(f); return; }
/* Определяем тип программы 7
if ((mz==Ox4D5A)ll(mz==Ox5A4D))
{ /* Это ехе 7
/* Пишем правильные PartPag и PageCnt 7
lseek( f, 2, SEEK_SET );
r=_dos_write( f, &buf[2], 4, &q );
if ((r)ll(q!=4)) {printf(" - ошибка записи!"); _dos_close(f); return; }
/* Пишем правильные ReloSS и ExeSP 7
lseek( f, 14, SEEK_SET );
r=_dos_write( f, &buf[14], 4, &q );
if ((r)ll(q!=4)) {printf(" - ошибка записи!"); _dos_close(f); return; }
/* Пишем правильные ReloCS и ExelP */
lseek( f, 20, SEEK_SET );
r=_dos_write( f, &buf[20], 4, &q );
if ((r)ll(q!=4)) {printf(" - ошибка записи!"); _dos_close(f); return; }
)
else
( /* Это corn */
/* Восстанавливаем сохраненные З первые байта программы */
lseek( f, О, SEEK.SET);
r=_dos_write( f, &buf[0], 3, &q );
if ((r)ll(q!=3)) {printf(" - ошибка записи!"); _dos_close(f); return; }
/* Усекаем файл (переходим на начало вируса
и записываем 0 байт) */
lseek( f, -1740, SEEK_END);
r=_dos_write( f, buf, 0, &q);
/* Закрываем файл 7
_dos_close(f);
printf("Tenepb исцелен !\п");
return;
}