Logo Dialogue Science Logo

Новости о вирусах и антивирусах


ДиалогHаука предупреждает о новой вирусной опасности

Итак, угроза, возможность которой уже не один год обсуждалась в вирусно-антивирусных кругах, уже стала реальностью. Игорю Данилову, ведущему вирусологу АО "ДиалогHаука", автору программы Doctor Web, один из пользователей (г.Владимир) прислал новый вирус. И хотя этот вирус и не опасен сам по себе, но к сожалению, показывает принципиальную возможность маскироваться от антивирусов на гораздо более серьезном уровне, чем было возможно до сих пор. Одно пока утешает, что воспользоваться таким приемом по силам только очень профессионально подготовленному программисту-вирусописателю. Кстати, очень высоким требованиям должен соответствовать и вирусолог, создающий антивирус против такого вируса.

Борьба "вирус-антивирус" в очередной раз выходит на новый виток своего развития. В этих условиях еще более актуальной становится грамотность пользователей в вопросах компьютерной безопасности и в частности, регулярное использование профессиональных антивирусных средств, причем, что важно, свежих версий.

Итак, слово Игорю Данилову, который первым проанализировал этот вирус и включил его обнаружение и лечение в очередное дополнение вирусной базы своего популярного антивируса Doctor Web. Это дополнение выпущено и разослано 21 апреля 1997 г.

(Заметим сразу, что такая публикация нисколько не помогает писать подобные вирусы из-за исключительно высоких требований к квалификации программиста для реализации многочисленных описанных и неописанных в публикации технических деталей. А кто имеет такую квалификацию, тот и так знает, как это делается...)


Компьютерный вирус - супервизор защищенного режима?

Игорь Данилов

Персональные компьтеры год от года становятся все сложнее и сложнее, используя все более высокие аппаратные и программные технологии. Компьютерные вирусы также становятся все сложнее и пытаются приспособиться к новым условиям обитания. Так, вирусы научились заражать загрузочные сектора дисков, файлы для операционных систем DOS, Windows, Windows'95, OS/2, Linux и даже документы для Word, Excel и MS-Office'97. Для сокрытия своего присутствия в системе они стали невидимками, или стелс-вирусами. Они научились быть полиморфными в загрузочных секторах, файлах и памяти для того, чтобы их детектирование стало более трудной задачей для разработчиков антивирусных средств. С появлением процессоров i386 вирусы стали использовать в своем коде 32-разрядные инструкции. В настоящее время полиморфные вирусы используют 32-разрядные расшифровывающие команды в своем декрипторе. Вирусами предпринимаются практически все попытки для создания сложноразрешимых задач по их поиску и лечению.

Одним словом, вирусы хотят выжить и победить в данных условиях. Для этого они используют все предоставляющиеся им возможности, как программные, так и аппаратные. Но с появлением i286, а затем и 32-разрядного процессора i386 стал возможен защищенный (или виртуальный) режим работы процессора, который до настоящего момента вирусам никак не удавалось "приручить" и привлечь его к себе на помощь. Вернее, вирусы пытались его освоить, но все эти попытки были как "проба пера" и реальной выгоды они вирусам не принесли.

Загрузочный вирус PMBS, первым пытавшийся освоить защищенный режим (1994 г.), не мог ужиться ни с одной программой или драйвером (EMM386, Windows, OS/2,...), которые также пытались использовать в своей работе защищенный режим. Вирусы Evolution.2761 и Evolution.2770 (тоже 1994 г.) использовали только часть мощного защищенного режима и то только тогда, когда процессор находился в реальном режиме работы. Данные вирусы подменяли реальную таблицу векторов прерываний на собственную IDT, которую загружали с помощью Interrupt Descriptor Table Register (IDTR). Но как вирусы Evolution могут использовать данный прием в повседневной жизни? Покажите мне хоть одного пользователя PC, который сегодня работает в реальном режиме на процессорах i386-Pentium.

Так много времени уже прошло с момента появления процессора i386, (не будем даже вспоминать, что до него был i286), а вирусы до настоящего момента не могли покорить его самый мощный защищенный режим. Я думаю, вирусописатели только и мечтали об этом. Но, видимо, основной массе вирусописак такая задача явно не по плечу из-за отсутствия знаний и квалификации.

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

PM.Wanderer является резидентным полиморфным вирусом, использующим защищенный (виртуальный) режим процессоров i386-Pentium. Для установки своей резидентной копии в память и переключения в защищенный режим процессора (Protected Mode) используется документированный интерфейс VCPI (Virtual Control Programm Interface) драйвера расширенной памяти EMS (EMM386).

Инсталляция

При старте инфицированной программы вирусный полиморфный декриптор расшифровывает основное тело вируса и передает ему управление. Далее основной вирусный код выделяет участок памяти в верхних адресах памяти DOS, копирует в него собственный код и передает ему управление. Затем он восстанавливает код инфицированного файла в программном сегменте (для EXE-файлов также производит настройку адресов перемещаемых элементов) и приступает к непосредственному внедрению в память своей резидентной копии.

Первым делом вирус пытается выяснить, установлен ли в системе драйвер EMS. Для этого он получает адрес прерывания Int 67h (Extended Memory) с помощью функции AX=3567h Int 21h (Get Interrupt Vector) и проверяет наличие строки "EM" в заголовке драйвера EMS. Далее вирус проверяет, не находится ли уже в памяти его резидентная копия - вызывает недокументированную функцию DOS AX=0BABAh Int 21h и проверяет ответ: AX=0FA00h.

Если драйвер EMS не установлен в системе или вирусная резидентная копия уже находится в памяти, а также в дальнейшем - при отсутствии интерфеса VCPI или при возникновении какой-либо ошибки на этапе установки своей резидентной копии, вирус освобождает ранее выделенную память и отдает управление программе-вирусоносителю, заканчивая тем самым свою "жизнедеятельность" в системе.

Если же "условия среды обитания" благоприятствуют, то вирус "перехватывает" Int 1 и трассирует Int 21h с целью нахождения определенной последовательности байт (9090h, или на языке команд ассемблера: NOP; NOP), присутствующих в оригинальном обработчике Int 21h MS-DOS версий 5.00-7.00. Если данная последовательность обнаружена, то вирус извлекает из специфичного адреса обработчика и запоминает в своем теле адрес ядра обработчика Int 21h, обычно расположенного в области HMA. В дальнейшем вирус будет использовать этот адрес для вызова ядра Int 21h при заражении файлов.

Следующие действия вируса - проверка наличия в системе интерфейса VCPI и получение 4-х физических адресов страниц памяти. Затем вирус получает адрес интерфейса VCPI, таблицу страниц и адрес глобальной дескрипторной таблицы GDT (Global Descriptor Table), состоящей из трех элементов (первый - дескриптор сегмента кода, два другие - используются драйвером VCPI). Вирус записывает в таблицу страниц ссылку на страницы, выделенные им драйвером VCPI, и получает физический адрес страницы памяти сегмента, в котором вирус в данный момент находится. Потом получает регистры глобальной дескрипторной таблицы GDT и дескрипторной таблицы прерываний IDT (Interrupt Descriptor Table). Далее вирус создает три собственных дескриптора (кода и данных) и дескриптор сегментов состояния задачи TSS (Task State Segment) в глобальной дескрипторной таблице GDT, подготавливает значения для регистров CR3, GDTR, IDTR, LDTR (Local Descriptor Table Register), TR (Task Register) и адрес CS:EIP точки входа в защищенный режим, и средствами интерфейса VCPI производит переключение процессора в защищенный режим работы с наивысшим уровнем привилегий - супервизора.

В защищенном режиме вирус корректирует таблицу GDT, создавая в ней два собственных дескриптора сегментов и производит поиск дескриптора TSS. После чего вирус устанавливает две аппаратные контрольные точки по командам (Breakpoints): на первый байт кода текущего обработчика Int 21h (адрес 0000:0084h) и на первый байт кода в BIOS по адресу 0FE00:005Bh (линейный адрес 0FE05Bh). Обычно в BIOS по адресу 0FE00:005Bh находится команда перехода (Near Jump) на процедуру перезапуска компьютера. Затем вирус корректирует дескрипторную таблицу прерываний IDT таким образом, чтобы установить на прерывания: Int 1 (особый случай отладки, Debug Exceptions) и Int 9 (клавиатура) - собственные дескрипторы обработчиков: ловушки (Trap Gate) и прерывания (Interrupt Gate). После этих приготовлений вирус копирует свой код в страницу памяти, полученную им еще до входа в защищенный режим, и производит переключение процессора обратно в виртуальный режим работы на процедуру освобождения ранее выделенной памяти DOS в верхних адресах и возвращения управления инфицированной программы. После чего инфицированная программа начинает свою "полезную" работу, а в защищенном режиме оказываются установленными вирусные обработчики: ловушки на Int 1 и прерывания от клавиатуры на Int 9.

Обработчик клавиатуры

При получении управления вирусный обработчик Int 9 производит контроль за наличием и восстановлением своих двух контрольных аппаратных точек, в случае, если хотя бы одна из них была обнулена. Вирус проверяет по регистру DR7, установлены ли две аппаратные контрольные точки (0 и 1), не проверяя их линейные адреса. И если хотя бы одна контрольная точка отсутствует, то вирус вызывает свою процедуру, которая незамедлительно их восстанавливает в исходное состояние. Кроме того, вирусный обработчик Int 9 отслеживает нажатие на Ctrl-Alt-Del и в этом случае "сбрасывает" все аппаратные контрольные точки. Таким образом, при нажатии на любую клавишу управление получает вирусный код, который проверяет наличие контрольных точек и при их отсутствии устанавливает их снова.

Обработчик особого случая отладки

При получении управления вирусный обработчик особого случая отладки проверяет, произошло ли нарушение одной из двух "вирусных" контрольных точек по адресу команды. Если управление в данный обработчик попало из точки, находящейся "на процедуре перезагрузки" в BIOS, то вирус сбрасывает все аппаратные контрольные точки, так же как и вирусный обработчик клавиатуры Int 9 при нажатии на Ctrl-Alt-Del. Если же нарушение вызвано контрольной точкой оригинального обработчика DOS Int 21h, то вирус анализирует значение регистра AX (или AH) с целью определения функции прерывания Int 21h и в зависимости от этого предпринимает различные свои действия. Перед данным анализом вирус взводит флаг RF=1 (Resume Flag) в регистре EFLAGS, находящегося в стеке и предназначенный для возврата управления контрольной точке. Данный флаг устанавливается для того, чтобы при возврате управления не произошел бы снова особый случай отладки.

Если AX=0BABAh, то вирус считает, что данный вызов исходит от его "собрата", который проверяет, находится ли уже его копия в памяти. В этом случае вирус записывает в AX значение 0FACCh и возвращает управление оригинальному обработчику DOS Int 21h. При выходе из обработчика DOS регистр AL будет сброшен в 0. По AX=0FA00h вирусный код, пытавшийся выяснить наличие своей копии в памяти, будет информирован о том, что память уже инфицирована.

Если AX=4B00h (запуск программы) или AH=3Dh и AL AND 0Fh равен 0 (открытие файла только на чтение), то вирус считает, что наступило "время большой охоты". Вирус копирует свой код по адресу 9000:0000h (линейный адрес 90000h), подготавливает стек и командой IRETD переключает процессор в виртуальный режим работы процессора 8086 в третье кольцо защиты (наименее привилегированное). То есть вирус копирует свой код в адреса 9000:0000h виртуального процесса DOS-машины (V-режим) и отдает управление своему коду (процедуре заражения), находящемуся в пределах первого мегабайта в сегменте 9000h.

Заражение файлов

Вирусный код в V-режиме проверяет последние две буквы расширения имени файла (OM или XE) и производит создание своей полиморфной копии и заражение файлов размером более 4095 байт. Вирус не заражает файлы, содержащие в поле значения времени создания - 34 секунды, считая, что такие файлы уже инфицированы. Коррекцию атрибутов файлов вирус не производит, поэтому все файлы, помеченные как ReadOnly, заражены не будут. Также вирус не заражает программу, имя которой состоит из 7 букв. Мне не удалось выяснить имя данной программы, так как вирус неявно определяет ее имя, а подсчитывает CRC данного имени. Вирус не устанавливает на себя Int 24h (Critical Error Handler). Поэтому при возникновении критических ошибок (запись на защищенный от записи диск) в процессе заражения появится стандартный вопрос DOS (...Retry, Ignore, Fail, Abort).

При заражении файлов вирус использует прямой вызов ядра обработчика DOS Int 21h. Адрес этого ядра вирус выяснил при трассировке Int 21h во время своей инсталляции в память, которая была описана выше. Вирус внедряет свой код в начало COM- или в середину EXE-файлов (сразу же за заголовком, обнулив предварительно значение поля Relocations в заголовке), запоминая оригинальный программный код в конце файлов. "Реальный рабочий код" вируса составляет 3684 байт, но на практике инфицированные файлы имеют приращение длины более 3940 байт.

Выход из V-режима DOS-машины

Представляет интерес выход вируса из V-режима и передача управления контрольной точке обработчика DOS Int 21h, которая вызвала особый случай отладки, для нормальной дальнейшей жизнедеятельности операционной системы DOS. Если бы вирус производил заражение, находясь в P-режиме, то все было бы достаточно просто. Достаточно было бы выполнить команду IRETD. Но вирус переключился в V-режим с уровнем привилегий - 3 и вернуться обратно в P-режим, в обработчик особого случая отладки, уже оказалось невозможным. Но вирус поступает в данной сложившейся ситуации чрезвычайно просто.

При возникновении любой ошибки в процессе заражения или при выходе из виртуального режима процессора вирус вызывает Int 21h с AX=4B00h для вызова особого случая исключения и возвращения управления оригинальному обработчику DOS Int 21h в контрольную точку, вызвавшую особый случай отладки. Рассмотрим, что происходит. При вызове Int 21h с AX=4B00h управление попадает на первую команду обработчика DOS Int 21h. Но на этой команде стоит "вирусная" аппаратная контрольная точка. Необходимо передать управление в P-режим обработчику особого случая отладки. Но монитор V-режима видит, что еще не завершена обработка предыдущего особого случая отладки, а уже необходимо обработать следующий. Ведь вирусный обработчик особого случая отладки не возвратил управление контрольной точке, он все еще занят - находится в обработке. И тогда монитор V-режима останавливает текущий вызов Int 21h, снимает обработку предыдущего случая и возвращает управление контрольной точке со значениями сохраненных регистров предыдущего вызова Int 21h. Вызова, который обрабатывал (а правильнее сказать, не обрабатывал, а заражал файл) вирусный обработчик.

Проявления

Если обработчик особого случая отладки зафиксирует значение регистра AX=3506h (получить адрес прерывания Int 6; обычно такой вызов существует во всех программах, написанных на языках высокого уровня: C, Pascal,...), то вирус пытается найти в пространстве линейных адресов 0-90000h некоторую последовательность байт, очевидно, принадлежащих программе ADinf. Если данная последовательность будет вирусом найдена, то он определенным образом модифицирует найденный код, так чтобы управление не попадало на вызов межсегментной процедуры, которая демонстрирует пользователю изменения, найденные на диске или в файлах.

Вирус в своем теле содержит текст "WANDERER,(c) P. Demenuk".

Поиск вируса в памяти

Из всего вышесказанного следует, что обнаружить резидентную копию данного вируса, находящегося в нулевом кольце (в режиме супервизора) защищенного режима процессора, обычными способами невозможно. Для обнаружения вируса в памяти необходимо переключиться в защищенный режим с наивысшими привилегиями и по таблицам GDT или IDT производить его поиск. Но попытаться обнаружить признаки вируса в системе можно и обычными способами. Для этого необходимо прочитать линейные адреса двух первых аппаратных контрольных точек (0 и 1) и сравнить их со значениями, которые описаны выше. На основании наличия определенных адресов и делается вывод о возможности нахождения вируса PM.Wanderer в памяти компьютера. Но производить данные действия необходимо только в DOS. Например, это можно сделать на языке ассемблера так:

        .8086

        MOV AX,0BABAH          ;Притворимся  вирусом, проверяющим свое
        INT 21H                ;наличие в памяти
        CMP AX,0FA00H          ;Получили ответ от резидентной копии?
        JNE ExitCheckMemory
        .386P
        MOV EAX,DR7            ;Прочитаем регистр DR7
        AND EAX,20AH
        CMP EAX,20AH           ;Установлены ли 2 контрольные точки?
        JNE ExitCheckMemory
        MOV EAX,DR1            ;Прочитаем линейный адрес контр.точки 1
        CMP EAX,0FE05BH        ;Установлена ли она в BIOS на 0FE00:005BH?
        JNE ExitCheckMemory
        .8086
        MOV AH,9
        MOV DX,OFFSET VirusIsFound
        INT 21H                ;Сообщение о возможном вирусе в памяти
        CLI
        JMP $+0                ;"Повесим" систему
    ExitCheckMemory:
        INT 20H                ;Завершение работы
        

Тестирование

При заражении нескольких тысяч файлов-жертв вирус проявил себя как "жилец" - все зараженные файлы оказались работоспособными. Здесь надо только сделать поправку - файлы могут оказаться неработоспособными в том случае, если их стек после заражения окажется в области вирусного кода. PM.Wanderer при заражении EXE-файлов не корректирует значения стартовых SS:SP в EXE-заголовке. Как уже отмечалось выше, вирус сохраняет способность к воспроизводству только в том случае, если в системе установлен драйвер EMS (EMM386). При устанновленном драйвере EMM386 с ключом NOEMS, при переключении вирусом в защищенный режим, процессор перезагружает систему. Компьютер также может перезагрузиться, если в системе используется драйвер QEMM386.

Самое интересное в том, что если в системе находился резидентный вирус, а потом произошла загрузка Windows 3.1x или Windows'95, то вирус не сможет размножаться в данных операционных средах, так как Windows устанавливает свои обработчики в IDT и обнуляет все аппаратные контрольные точки. Но по окончании своей работы и возвращении в DOS, Windows восстанавливает предыдущее состояние IDT. И уже в операционной среде DOS, при нажатии на любую клавишу, вирус опять получает управление, устанавливает свои аппаратные контрольные точки и снова может "трудиться, не покладая рук". Если же вирус будет запущен в Windows, в DOS-сессии, то из-за отсутствия спецификации VCPI вирус не сможет воспользоваться его интерфейсом и переключиться в защищенный режим. Под OS/2 вирус нежизнеспособен, также из-за отсутствия VCPI.

Заключение

Стоит отметить, что это первый известный в мире вирус, использующий защищенный (виртуальный) режим работы процессора и не конфликтующий с операционными системами "от Microsoft", работающими также в защищенном режиме.

Возможно, что в недалеком будущем компьютерный вирус сможет полностью заменить своим кодом программу-супервизора, и сам будет поддерживать интерфейсы DPMI, EMS/VCPI, XMS, Int 15h. Кто знает?


Back Получить информацию о других интересных вирусах

Copyright © 1997 ЗАО ДиалогНаука All rights reserved.