1740 байт.

Таблица 6.1. Таблица перемещений для ЕХЕ-файла

Источник, отсчет от
конца файла
Приемник, отсчет от
начала файла
78 2
76 4
66 14
64 16
60 20
58 22


Демонстрационный антивирус-фаг

для вируса SVC-1740.

"**"***************"**"**"*"*******"*"*"**^

#include <stdio.h>
^include <dos.h>

^include <dir.h>

^include <str.h>

^include <process.h>

^include <errno.h>

^include <bios.h>

^include <io.h>

#include <fcntl.h>

^define F_FOUND 0

#define PATH_LEN 128
^define DRIVE_LEN 4
ftdefine BLANK_LEN 80

#define BAD 1
^define GOOD 0

#define DBG
char

/* Строка имени текущего подкаталога */
path[PATH_LEN],

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

/* Строка имени требуемого устройства 7
drive[DRIVE_LEN],

/* Пустая строка */
blank[BLANK_LEN];

int

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

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

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

int

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

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

' 1

^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 );

/* Поиск файлов */
^иг^^оз.Лг^ЛгзЦ^.^^А.МОРМА!- ,&buf);

while (foundJ == F_FOUND)

{
1=strlen( buf.name );

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

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

n_dir=0; n_fil=0;

getcwd(old_path, PATHJ-EN);

drive[2]=""; 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,

"");

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]="";

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;

}


Информация о работе «Методы борьбы с вирусами»
Раздел: Информатика, программирование
Количество знаков с пробелами: 51922
Количество таблиц: 1
Количество изображений: 1

Похожие работы

Скачать
18646
0
0

... свои копии (не обязательно полностью совпадающие с оригиналом) и внедрять их в различные объекты или ресурсы компьютерных систем, сетей и так далее без ведома пользователя. При этом копии сохраняют способность дальнейшего распространения. На сегодняшний день известно 6 основных типов вирусов: файловые, загрузочные, призраки (полиморфные), невидимки, скрипт-вирусы и макро-вирусы. Следует отличать ...

Скачать
61244
0
0

... годами «сидеть» в дистрибутивной копии какого-либо программного продукта и неожиданно проявиться при установке программ на новом компьютере. Никто не гарантирует полного уничтожения всех копий компьютерного вируса, так как файловый вирус может поразить не только выполняемые файлы, но и оверлейные модули с расширениями имени, отличающимися от COM или EXE. Загрузочный вирус может остаться на какой- ...

Скачать
95974
7
0

... российском рынке. Так до сих пор сложно определить масштабы проблем связанных с кракерами, ощущается явный недостаток фактов по данной проблеме. В сложившейся ситуации от 80 до 90% злоупотреблений угрожающих информационной безопасности являются внутренними. Опрошенный администратор сети крупного коммерческого банка заявляет, что никогда не встречался с внешними нарушениями системы. "Однако у нас ...

Скачать
74017
1
5

... сталкиваться с вирусами какможно меньше или, по крайней мере, только сталкиваться, не допускаяих на жесткий диск своего винчестера. В первую очередь - самые элементарные правила «компьютерной гигиены»: проверка дискет на наличие вируса самыми надежными антивирусными программами, такими, например, как AVP или DrWeb. Очень хорошо, если на жестком диске установлен ревизор Adinf. Многие пользователи ...

0 комментариев


Наверх