Процедуры обнаружения и лечения
***************************************************************/
/* Сигнатура */
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;
}