Резидентные вирусы -> Загрузочные вирусы

Подявляющее большинство резидентных загрузочных вирусов для выделения системной памяти для своей резидентной копии использует один и тот же прием: они уменьшают объем DOS-памяти (слово по адресу 0040:0013) и копируют свой код в "отрезанный" блок памяти. Объем DOS-памяти обычно уменьшается на единицу (один килобайт) в случае коротких загрузочных вирусов, код которых занимает один сектор дискового пространства (512 байт). Вторая половина килобайта используется такими вирусами как буфер чтения/записи при заражении дисков. Если же размер вируса больше одного килобайта или он использует нестандартные методы заражения, требующие большего объема буфера чтения/записи, объем памяти уменьшается на несколько килобайт (среди известных вирусов максимальное значение у вируса RDA.Fighter - 30K).

В дальнейшем некоторые вирусы "ждут" загрузки DOS и восстанавливают первоначальное значение объема системной памяти - в результате они оказываются расположенными не за пределами DOS, а как отдельный блок DOS-памяти. Некоторые загрузочные вирусы вообще не используют и не изменяют значение объема системной памяти. Они копируют себя в какую-либо область памяти, неиспользуемую вплоть до загрузки DOS, ждут загрузки DOS и затем инсталлируют свой код в системе всеми возможными в DOS способами.

Такими вирусами используются несколько способов перехвата момента загрузки DOS. Наиболее "популятный" способ - проверка значения INT 21h (прерывание DOS-функций). Если это значение изменилось, вирусы считают, что инсталляция DOS завершена. Проверка значения INT 21h проводится при вызовах INT 8, 1Ch (прерывания таймера, для этого вирусы помимо прерываний обращения к дискам перехватывают также прерывания таймера) или при вызовах INT 13h. Менее популярный способ - проверка данных, считываемых с диска (для этого требуется только перехват INT 13h). Если буффер чтения содержит заголовок EXE-файла, вирусы считают, что загрузка DOS завершена, поскольку в память для выполнения загружается EXE-файл.

Для того, чтобы перехватить обращения к дискам, большинство загрузочных вирусов перехватывают INT 13h - основное прерывание для работы с дисками. Реже используется перехват INT 40h - прерывание для работы с флоппи-дисками. Еще реже используются различные экзотические способы перехвата прерываний BIOS и DOS, возникающих при работе с дискетами.

В случае перехвата INT 13h/40h вирусы обрабатывают команды чтения/записи секторов (AH=2,3), проверяют диск на зараженность и записывают в его загрузочный сектор или MBR винчестера свой код. Реже перехватываются другие команды - от команды Reset Disk (AH=0) вплоть до команд "длинного" чтения/записи (AH=0Ah,0Bh).

Большая часть загрузочных вирусов не проверяет системную память на наличие своей уже установленной TSR-копии - они либо используют стелс-приемы и повторный запуск кода вируса невозможен, либо ориентируются на то, что кода вируса загружается однократно в момент загрузки DOS - после этого коды загрузочных секторов дисков больше не выполняются ни при каких условиях. Часть вирусов проверяют наличие своей копии - для этого используются либо специальные вызовы INT 13h с каким-либо нестандартным значением, либо помечается какой-либо заведомо неиспользуемый байт (или слово) в таблице векторов прерываний или в области данных BIOS (0040:00??). Существуют, конечно же, и другие способы детектирования своей TSR-копии.