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», включаемый в предыдущий: /*************************************************************** Процедуры обнаружения и лечения ***************************************************************/ /* Сигнатура */ char sign[7]={ (char) 0xB4, (char) 0x83, (char) 0xCD, (char) 0x21, (char) 0x5E, (char) 0x56, ”\0”}; int infected( char *fn ) { int f; int r,q; char buf[7]; /* Буфер под сигнатуру */ /* Открываем файл */ r=_dos_open( fn, O_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)||(q!=6)) {printf(” – ошибка чтения!”); _dos_close(f); return GOOD; } /* Закрываем файл */ _dos_close(f); /* Сравниваем байты с сигнатурой */ if (strcmp( buf, sign)==0) { printf(” – был болен и...”); n_ill++; return BAD; } /* Болен !!! */ /* Годен к в/службе. П/пк мед. службы Орлов :−) */ return GOOD; } cure( char *fn ) { int f; int mz; int r,q; char buf[24]; /* Буфер под байты */ /* Открываем файл */ r=_dos_open( fn, O_RDWR, &f ); if (r) { printf(” – ошибка открытия!”); return; } /* Читаем первые два байта для определения типа программы */ r=_dos_read( f, &mz, 2, &q ); if ((r)||(q!=2)) {printf(” – ошибка чтения!”); _dos_close(f); return; } /* Читаем сохраненные вирусом 24 байта старого начала */ lseek( f, −80, SEEK_END ); r=_dos_read( f, buf, 24, &q ); if ((r)||(q!=24)) {printf(” – ошибка чтения!”); _dos_close(f); return; } /* Определяем тип программы */ if ((mz==0x4D5A)||(mz==0x5A4D)) { /* Это exe */ /* Пишем правильные PartPag и PageCnt */ lseek( f, 2, SEEK_SET ); r=_dos_write( f, &buf[2], 4, &q ); if ((r)||(q!=4)) {printf(” – ошибка записи!”); _dos_close(f); return; } /* Пишем правильные ReloSS и ExeSP */ lseek( f, 14, SEEK_SET ); r=_dos_write( f, &buf[14], 4, &q ); if ((r)||(q!=4)) {printf(” – ошибка записи!”); _dos_close(f); return; } /* Пишем правильные ReloCS и ExeIP */ lseek( f, 20, SEEK_SET ); r=_dos_write( f, &buf[20], 4, &q ); if ((r)||(q!=4)) {printf(” – ошибка записи!”); _dos_close(f); return; } } else { /* Это com */ /* Восстанавливаем сохраненные 3 первые байта программы */ lseek( f, 0, SEEK_SET); r=_dos_write( f, &buf[0], 3, &q ); if ((r)||(q!=3)) {printf(” – ошибка записи!”); _dos_close(f); return; } } /* Усекаем файл (переходим на начало вируса и записываем 0 байт) */ lseek( f, −1740, SEEK_END); r=_dos_write( f, buf, 0, &q); /* Закрываем файл */ _dos_close(f); printf(”теперь исцелен!\n”); return;