Читаем Создаем вирус и антивирус полностью

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;

}

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT