Таблица 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
}
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)
/* Годен к в/службе. П/пк мед. службы Орлов :-) */
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 );
/* Читаем сохраненные вирусом 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;
}
... свои копии (не обязательно полностью совпадающие с оригиналом) и внедрять их в различные объекты или ресурсы компьютерных систем, сетей и так далее без ведома пользователя. При этом копии сохраняют способность дальнейшего распространения. На сегодняшний день известно 6 основных типов вирусов: файловые, загрузочные, призраки (полиморфные), невидимки, скрипт-вирусы и макро-вирусы. Следует отличать ...
... годами «сидеть» в дистрибутивной копии какого-либо программного продукта и неожиданно проявиться при установке программ на новом компьютере. Никто не гарантирует полного уничтожения всех копий компьютерного вируса, так как файловый вирус может поразить не только выполняемые файлы, но и оверлейные модули с расширениями имени, отличающимися от COM или EXE. Загрузочный вирус может остаться на какой- ...
... российском рынке. Так до сих пор сложно определить масштабы проблем связанных с кракерами, ощущается явный недостаток фактов по данной проблеме. В сложившейся ситуации от 80 до 90% злоупотреблений угрожающих информационной безопасности являются внутренними. Опрошенный администратор сети крупного коммерческого банка заявляет, что никогда не встречался с внешними нарушениями системы. "Однако у нас ...
... сталкиваться с вирусами какможно меньше или, по крайней мере, только сталкиваться, не допускаяих на жесткий диск своего винчестера. В первую очередь - самые элементарные правила «компьютерной гигиены»: проверка дискет на наличие вируса самыми надежными антивирусными программами, такими, например, как AVP или DrWeb. Очень хорошо, если на жестком диске установлен ревизор Adinf. Многие пользователи ...
0 комментариев