|
|
Новости о вирусах и антивирусах |
Борьба "вирус-антивирус" в очередной раз выходит на новый виток своего развития. В этих условиях еще более актуальной становится грамотность пользователей в вопросах компьютерной безопасности и в частности, регулярное использование профессиональных антивирусных средств, причем, что важно, свежих версий.
Итак, слово Игорю Данилову, который первым проанализировал этот вирус и включил его обнаружение и лечение в очередное дополнение вирусной базы своего популярного антивируса 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).
Первым делом вирус пытается выяснить, установлен ли в системе драйвер 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.
Если 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.
При заражении файлов вирус использует прямой вызов ядра обработчика DOS Int 21h. Адрес этого ядра вирус выяснил при трассировке Int 21h во время своей инсталляции в память, которая была описана выше. Вирус внедряет свой код в начало COM- или в середину EXE-файлов (сразу же за заголовком, обнулив предварительно значение поля Relocations в заголовке), запоминая оригинальный программный код в конце файлов. "Реальный рабочий код" вируса составляет 3684 байт, но на практике инфицированные файлы имеют приращение длины более 3940 байт.
При возникновении любой ошибки в процессе заражения или при выходе из виртуального режима процессора вирус вызывает Int 21h с AX=4B00h для вызова особого случая исключения и возвращения управления оригинальному обработчику DOS Int 21h в контрольную точку, вызвавшую особый случай отладки. Рассмотрим, что происходит. При вызове Int 21h с AX=4B00h управление попадает на первую команду обработчика DOS Int 21h. Но на этой команде стоит "вирусная" аппаратная контрольная точка. Необходимо передать управление в P-режим обработчику особого случая отладки. Но монитор V-режима видит, что еще не завершена обработка предыдущего особого случая отладки, а уже необходимо обработать следующий. Ведь вирусный обработчик особого случая отладки не возвратил управление контрольной точке, он все еще занят - находится в обработке. И тогда монитор V-режима останавливает текущий вызов Int 21h, снимает обработку предыдущего случая и возвращает управление контрольной точке со значениями сохраненных регистров предыдущего вызова Int 21h. Вызова, который обрабатывал (а правильнее сказать, не обрабатывал, а заражал файл) вирусный обработчик.
Вирус в своем теле содержит текст "WANDERER,(c) P. Demenuk".
.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 ;Завершение работы
Самое интересное в том, что если в системе находился резидентный вирус, а потом произошла загрузка Windows 3.1x или Windows'95, то вирус не сможет размножаться в данных операционных средах, так как Windows устанавливает свои обработчики в IDT и обнуляет все аппаратные контрольные точки. Но по окончании своей работы и возвращении в DOS, Windows восстанавливает предыдущее состояние IDT. И уже в операционной среде DOS, при нажатии на любую клавишу, вирус опять получает управление, устанавливает свои аппаратные контрольные точки и снова может "трудиться, не покладая рук". Если же вирус будет запущен в Windows, в DOS-сессии, то из-за отсутствия спецификации VCPI вирус не сможет воспользоваться его интерфейсом и переключиться в защищенный режим. Под OS/2 вирус нежизнеспособен, также из-за отсутствия VCPI.
Возможно, что в недалеком будущем компьютерный вирус сможет полностью заменить своим кодом программу-супервизора, и сам будет поддерживать интерфейсы DPMI, EMS/VCPI, XMS, Int 15h. Кто знает?
|
Получить информацию о других интересных вирусах |