Подразумевается, что флаг прохода цепочки 21-го прерывания проверяется в обработчике INT 2Ah.
Конструирование неотслеживаемого обращения к DOS
Для чего нужно такое конструирование? Неужели антивирусные мониторы настолько бдительны, что пресекают любые попытки открыть для модификации EXE– или СОМ-файл? Да, это действительно так. Авторы антивирусных мониторов обладают достаточно эффективными средствами, чтобы предотвратить прямые обращения к DOS со стороны вирусов.
Обратимся к мнению Ю. Косивцова: «Для обнаружения действия нерезидентных вирусов необходимо контролировать вызов функций DOS с номерами: 3Dh (открытие файла через описатель), 0Fh (открытие файла через FCB и 5Dh) и подфункцию 00h (косвенный вызов DOS). Если при открытии файла обнаружено, что расширение его СОМ, ЕХЕ или SYS, то можно выдавать предупреждающее сообщение».
Список выглядит слишком коротким. Действительно, а что произойдет, если сначала переименовать программный файл? И почему не учтена функция 6Ch (расширенное открытие файла)? А что будет, если открыть файл для чтения, а затем изменить режим доступа прямым обращением к SFT?
Конечно же, авторы антивирусных мониторов не столь наивны. Просто они никогда не раскрывают свои профессиональные секреты. Например, авторы программы AVPTSR реально учли и использовали все эти методики и тонкости.
Итак, предположим, что гипотетический антивирусный супермонитор:
– отслеживает и блокирует попытки трассировки 21-го прерывания;
– для контроля «опасных» функций DOS встраивается в начало обработчика прерывания INT 21h;
– для предотвращения прямого обращения к DOS использует флаг, сбрасываемый либо во вставленном фрагменте, либо в обработчике прерывания 2Ah (более грамотный подход).
Эти действия монитора порождают соответствующие проблемы при конструировании неотслеживаемого обращения к DOS.
Первая проблема достаточно просто решается с использованием «метода предопределенных адресов».
Для решения второй проблемы стоит проанализировать возможное расположение в обработчике DOS точки перехода на антивирусный монитор. Очевидно, это может быть точка 0 либо точка 1. В самом худшем случае можно допустить, что врезка происходит непосредственно после команды проверки на максимальное значение номера функции. Далее обработчик DOS «растекается» на многочисленные ручейки, поэтому отследить их все крайне затруднительно. По крайней мере, обработчики функций 0Fh, 3Dh и 5Fh попадают в разные ручейки. Однако, при использовании ограниченного набора функций они могут разместиться и в одном ручейке, что намного упростит решение данной задачи. Функции 3Ch-43h, отвечающие за создание, открытие, закрытие, чтение, запись, атрибуты и перемещение, действительно располагаются в одном общем ручейке. Это позволяет использовать адрес точки 2 для прямого обращения к DOS. Мониторы, скорее всего, не будут отслеживать эту точку.