Смекни!
smekni.com

Методы борьбы с вирусами (стр. 6 из 6)

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]="&bsol;0';

for (i=0;i<BLANK_LEN;i++) blank[i]=" ";blank[BI_ANK_LEN-1]="&bsol;0";

n_dir=0; n_fil=0;

getcwd(old_path, PATHJ-EN);

drive[2]="&bsol;0"; system(drive);

drive[2]=^&bsol;"; chdir(drive);

/* Запускаем рекурсивный обход дерева каталогов
для выбранного диска 7
walk();

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

old_path[2]='&bsol;"; chdir(old_path);

printf("&bsol;nKaTanoroB : %с1&bsol;пфайлов : %Ь&bsol;пОбнаружено больных
и излечено: %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,

"&bsol;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]="&bsol;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 исцелен !&bsol;п");

return;

}