ZF

             Актуальные разработки в области макровирусов
                      1999 Stefan Kurtzhals / VHM

*************************** Перевод by Redarc *************************

                      Вирусы VBScript наступают?

    VBScript -   это   облегчённый   вариант   VBA  (Visual  Basic  for
Applications),  который был введён в использование с Windows  Scripting
Host (WSH) в Microsoft Windows 98 и Internet Explorer 5.0. VBS обладает
той же функциональностью,  что и та часть VBA,  которую использовали до
сих   пор   макровирусы.   Однако   код  программы  существует  в  виде
ASCII-текста,  который исполняется  непосредственно  Windows  Scripting
Host.  Так  как  файлы  VBScript можно просто просматривать в редакторе
ASCII-файлов,  Microsoft  предлагает  инструмент,   который   позволяет
кодировать  так  файлы  VBScript,  что  редактируемый сценарий остается
полностью  дееспособным.   Программисты   вирусов   использовали   этот
инструмент  непосредственно  для  того,  чтобы затруднить распознавание
вирусов VBS. К счастью, можно без проблем отключать это шифрование (для
этого  нужно  найти  необходимые  таблицы в файле VBSCRIPT.DLL,  что не
составляет большой  проблемы).  HTML-документы  также  могут  содержать
вставки  на  VBScript.  Код  этих  вставок  активируется  при просмотре
документа в Microsoft  Explorer  -  этим  Microsoft  позволила  сделать
возможным существование HTML-вирусов.

    Используя VBS  можно  без проблем изменять Registry или файлы,  что
является достаточным для создания  вируса.  В  особенности,  с  помощью
команды  CreateObject  можно  на VBScript создавать множество различных
объектов,  как например,  объект файловой системы или документ  Word  и
манипулировать     ими.     Таким     образом     возможно     создание
Cross-Application-вирусов, которые одинаково успешно могут инфицировать
несколько разных офисных приложений.  Пример - это вирусы O97M/Hopper.E
и W97M/Coldape, которые инфицируют VBS-файлы и документы Word. Во время
перехода  из VBScript в документ Word вирус может без проблем отключать
встроенную в Microsoft Office защиту от вирусов посредством манипуляций
с   Registry.   Впрочем,  при  выполнении  VBScrip-программ,  создающих
FileSystemObject,  обычно показывается  предупреждающее  сообщение  при
установке стандартной безопасности. Однако такой однажды активированный
VBScript может постоянно в будущем отключать эту защиту.

    До сих  пор  вирусы  VBS  практически  не  имели   распространения.
Ситуация  изменилась в последнее время,  так как с появлением Microsoft
Office 2000,  Internet Explorer 5.0 и  Windows  2000  (релиз  кандидат)
автоматически  соинсталлируется  Windows  Scripting  Host  и  позволяет
вирусам VBS получить большее распространение,  чем это было до сих пор.
VBS/Freelink является до сих пор первым вирусом VBS, который появился в
огромном количестве у пользователей.  VBS/Freelink  использует  простое
шифрование для всех строк (очевидно автор не был знаком с Microsoft VBS
-Encryptor).  Вирус  создаёт  свою  копию  под  именем  "RUNDLL.VBS"  в
системном каталоге и заносит этот файл в Registry для того, чтобы вирус
выполнялся при каждой загрузке компьютера.  Как  и  W97M/Melissa,  этот
вирус  содержит  функцию  массовой  рассылки почты и рассылает себя как
Attachment (файл с именем "LINK.VBS")  по  всем  записям,  найденным  в
адрессной книге пользователя.  Дополнительно VBS/Freelink ищет активные
сетевые соединения и создаёт в корневых каталогах этих  дисководов свои
копии.   Кроме   того   инфицируются   IRC-чат  клиенты  mIRC  и  pIRCH
соответствующими INI-файлами,  которые распространяют VBS/Freelink  как
только пользователь входит в IRC-канал.

    Следующий известный VBS-вирус - это VBS/BubbleBoy, который несмотря
на заявления некоторых антивирусных фирм до сих пор не является  In The
Wild. Собственно, VBS/BubbleBoy не является никаким особенно интересным
макровирусом - однако, он использует брешь в защите Microsoft Outlook и
Microsoft  Outlook  Express,  которая позволяет активироваться VBScript
без какого-либо предупреждающего сообщения. Этот вирус активируется уже
при просмотре электронной почты,  а не при запуске Attachment,  как это
было характерно до сих  пор  для  подобных  вирусов.  Причём  Microsoft
Outlook  Express  позволяет  активироваться  вирусу  даже при просмотре
электронной  почты  в  окне  предварительного   просмотра.   Если   это
происходит, вирус через компонент ActiveX (который, очевидно, считается
безопасным) создаёт инфицированный HTA-файл в  папке  автозапуска.  При
этом  имя каталога задано твёрдо (инсталляция в "C:\WINDOWS"),  поэтому
VBS/BubbleBoy работоспособен только в английском варианте  Windows  9x.
Вирус   VBS/BubbleBoy,  как  и  вирус  VBS/Freelink,  содержит  функции
массовой рассылки почты  и  рассылает  себя  посредством  EMail  другим
пользователям.   Однако  он  использует  способ  распространения  через
электронную почту только один раз при инфицированнии системы.

    Оба вируса созданы одним и тем же автором.  Эти вирусы можно  найти
на его домашней странице,  что к сожалению,  после газетных сообщений о
VBS/BubbleBoy,  приведёт к тому, что много других вирусописателей также
будут  использовать  упомянутую брешь в защите.  Заплатка от Microsoft,
которая эту брешь в  защите  устраняет,  существует  уже  очень  давно,
однако она установлена не на каждую систему.

      Проблемы при распознавании макровирусов для Office 97/2000.

    С переходом  от  Office95  к  Office97  Microsoft  ввела совместный
макроязык VBA5 и заменила  им  WordBasic  (Word95)  и  VBA3  (Excel95).
Внутренняя  структура  VBA5  более  сложная,  чем  в WordBasic и сильно
отличается, к сожалению, от VBA3. Фирма Microsoft не разглашает никакие
полезные  сведения о внутреннем формате файла,  так что до сегодняшнего
дня ни одна антивирусная  прграмма  не  может  действительно  правильно
распознавать и обрабатывать макрокоманды VBA5.

    Все документы  Office  (исключая  банк данных Access) сохраняются в
так называемом OLE COM-формате (Compound Object Model).  OLE  COM-файлы
имеют  внутреннюю  структуру схожую с FAT жёсткого диска и разделены на
секторы,  FAT,  потоки (Stream) и подкаталоги  (Storage).  Антивирусные
фирмы нуждались в большом количестве времени, чтобы понять этот формат,
но  к   сожалению   старые   версии   системного   файла   "OLE32.DLL",
ответственного  за  OLE-файлы,  содержали  ошибки.  Из-за  этих  ошибок
макрокоманды незначительно повреждались в Word95  при  до  сих  пор  не
выясненных   обстоятельствах.   Это  приводило  к  большому  количеству
"естественных" мутаций  вирусов,  как  на  то  указывают  многие  сотни
вариантов   WM/CAP  и  семейство  WM/NPAD.  С  Windows  2000  Microsoft
расширила  OLE  COM-формат  и  позволило  создавать  переменный  размер
секторов  -  с  чем многие антивирусные прграмм до сих пор еще не могут
правильно работать.

    Основное построение документа Word95 с макрокомандами  показано  на
рисунке 1. Все необходимые сведения находятся в Stream ("WordDocument")
и относительно легко интерпретируются.  WordBasic использует лексемы  и
поэтому документы можно легко анализировать и "декомпилировать".

    +---------------+---------------------------+-----------------+
    |FIB (заголовок)| 1Table                    | Заголовок       |
    |Текст документа| VBA                       | Таблицы объектов|
    |Код макроса    | dir                       | Таблица строк   |
    |TDT            | Thisdocument              | P-Code          |
    |               | Modul                     | Сжатый исходник |
    |               | __Srp_                    |                 |
    |               | _VBA_PROJECT              |                 |
    |               | PROJECT                   |                 |
    |               | PROJECTwm                 |                 |
    |               | WordDocument              |                 |
    |               | DocumentSummaryInformation|                 |
    +---------------+---------------------------+-----------------+

    а) Макросы в Word 95  b) Потоки в Word 97 с) Поток с макросами
                               Рисунок 1

    Заголовок (FIB) содержит кроме прочего сообщения о том, является ли
файл документом или шаблоном и указывает на позицию и размер блока TDT.
Блок  TDT  содержит  все  сообщения  об  отдельных  макрокомандах (имя,
размер,  позиция в  пределах  WordDocument-Stream,  байт  шифрования  и
т.д.).

    VBA5 делает  различие между модулями или классами и макрокомандами.
В пределах одного модуля  могут  находиться  несколько  макрокоманд.  В
файлах  VBA5  сведения  распределены  для  модулей  или соответствующих
макрокоманд в нескольких Stream. "1Table"-Stream содержит кроме прочего
TDT   (который   должен   корректироваться  при  очистке).  Все  другие
макрорелевантные сведения находятся в "VBA"-Storage (который  сам,  как
правило,  содержится  в  другом  Storage,  например "Macros" в Word97).
"dir" - и "__VBA_PROJECT"-Stream содержат  почти  идентичные  сведения,
причем  они  сохранены  в  "dir"-Stream в заархивированном виде.  Здесь
находятся среди прочего имена всех имеющихся модулей и непосредственные
символы  PCode.  "ThisDocument"  (имя  устанавливается в зависимости от
языка  и  от  приложения   Office   и   может   называться,   например,
"DiesesDokument"   или   "ThisWorkbook")  является  модулем  классов  и
содержится в каждом документе Office с макрокомандами.

    Сам код  программы  находится  в  отдельном  модуле  Stream.  Когда
выполняется  макрокоманда и из неё документ сохраняется,  тогда в файле
образуются в большом количестве "__SRP"-Stream.  Они  содержат  готовый
компилированный код программы, который Office сохраняет для ускоренного
выполнения  макрокоманд.  В  Modulstream   находится   PCode,   который
формируется из лексем и нуждается в дополнительной информации из таблиц
с  непосредственными  символами  (__VBA_PROJECT-Stream)  и   косвенными
символами. Здесь появляется уже первая проблема для многих антивирусных
сканеров.  Из-за сложности структуры многие антивирусные фирмы не могут
или  не  хотят  редактировать  PCode  полностью.  Таким  образом  может
происходить  то,  что  антивирусная  прграмма  следующие  строки   кода
различить не может:

ActiveDocument.VBProject.VBComponents.Name = "Test"
NormalTemplate.VBE.VBComponents.Description = "Test"

    Modulstream содержит   дополнительно    полный,    заархивированный
исходный текст макрокоманд в формате ASCII.  Таким образом существуют в
одном файле  две  или  три  копии  одного  вируса  и  невозможно  сразу
определить,  какая копия действительно запускается из Microsoft Office.
Почти все антивирусные прграммы проверяют лишь PCode,  который считался
до сих пор самим кодом программы.  Исходный ASCII-текст не используется
ни для выполнения ни для отображения исходного текста в  редакторе VBA.
Если  в  файле  присутствуют  __SRP-Stream,  Microsoft  Office может их
выполнять,  а PCode полностью игнорировать.  Происходит  это  следующим
образом:  сравниваются  номер версии VBA в __VBA_PROJECT-Stream и номер
версии Office,  установленный у пользователя.  Если оба  номера  версии
совпадают,  запускается наличествующий __SRP-Stream,  а не PCode.  Если
номера версии не совпадают, Office использует заархивированный исходный
текст и создаёт новый PCode.  Этот механизм нужен, очевидно, для обмена
макросами между различными версиями Office.  Так Office97 может  читать
макрокоманды  созданные в Office2000 и наоборот.  Однако это доставляет
антивирусным программам проблемы,  так как теперь не  возможно  сказать
однозначно,  какая  копия  вируса в конце концов будет использована для
выполнения.  Если PCode повреждается, например, ошибкой в OLE32.DLL, то
в Office97 появляется новый вариант вируса, а при той же ситуации новая
модификация вируса в Office 2000 не появляется.  Ни  одна  антивирусная
прграмма не проверяет в настоящее время,  совпадают ли PCode и исходный
код с вирусом. __SRP-Stream являются временными и совсем не проверяются
и  не удаляются,  к сожалению,  некоторыми антивирусными прграммами при
очистке  документа  от  вируса.  Так  были  известны  случаи,  когда  в
результате лечения удалялся модуль Stream,  а __SRP-Stream оставались в
документе.  Например, вирус X97M/Laroux оставался работоспособным после
такого лечения,  но файл уже не определялся антивирусными сканерами как
инфицированный.  Следующий пример - это W97M/Melissa.U.  Инфицированный
этим вирусом файл также чистился неправильно. PCode удалялся полностью,
многократно вставлялись дефектные исходные тексты в ошибочную позицию и
номер  версии  VBA  устанавливался  на  недопустимое  значение.  Однако
исходный код активировался  как  собственный  код  вируса  -  вирус  не
удалялся.  Такие  повреждения  обычно  не  сохраняются  при  дальнейшем
распространении вируса,  однако,  W97M/Melissa имеет  функции  массовой
рассылки почты,  при этом отправляет первоначальный документ - в данном
случае модифицированный файл,  в котором некоторые антивирусные сканеры
не могут больше определять вирус.

    Оптимальным был   бы   контроль   всех   трёх   возможных   позиций
расположения вируса:  PCode,  исходный код  и  Execode  (__SRP-Stream).
Однако,  это значительно замедлило бы работу антивирусных сканеров, так
как при уже существующем количестве макровирусов VBA5/6 (примерно 5000)
актуализация банка сигнатур уже является большой затратой времени.

           Псевдо-паразитические макровирусы - "Sandwiches".

    С появлением Service Release 1 (SR1) для пакета Microsoft Office 97
был устранён использованный до сих пор макровирусами способ копирования
собственных модулей:

Application.OrganizerCopy Source:= NormalTemplate.FullName,
Destination:= ActiveDocument.FullName, Name:= "Virus"

    SR1 препятствует   непосредственному   копированию    модулей    из
глобального  шаблона  NORMAL.DOT в другие документы.  Таким образом все
высоко-конвертированные WM-вирусы и более старые  W97M-вирусы  потеряли
способность к размножению. Тем не менее, вирусописатели быстро выяснили
как   можно   обойти    это    ограничение.    Более    новые    Office
97/2000-макровирусы   копируют   исходный   текст  вместо  того,  чтобы
переносить  целый  вирусный  модуль.  Для   передачи   исходного   кода
существуют четыре возможности:

1. .Import/.Export - заменена всего исходного текста в модуле
2. .AddFromString - прибавление текста в конец исходного текста
3. .AddFromFile - прибавление текста в конец исходного текста
4. .InsertLine - вставка текста в начало исходного текста

    Тем временем современные макровирусы  больше  не  используют  метод
.Import/.Export, так как он определяется любой эвристикой, а три других
метода имеют при определенных обстоятельствах непреднамеренный побочный
эффект.  Если вирусописатель исходит из того, что в инфицируемом модуле
отсутствует любой  код  или  он  забывает  удалить  присутствующий  код
пользователя,   тогда   макровирусы,   псевдо-паразитически  используют
упомянутые выше три метода инфицирования.  До сих пор  известен  только
безуспешный      опыт     написания     паразитического     макровируса
(W97M/Intended/Flesh), но часто, плохо разработанные макровирусы, могут
инфицировать нормальные макровирусы и паразитировать на них. Комбинация
нескольких   макровирусов   в   пределах   одного   модуля   называется
"сэндвичем", однако, во многих случаях эти комбинации неработоспособны.
Основанием для этого является то обстоятельство,  что VBA не  позволяет
использовать  два  одинаковых имени процедуры/функции в пределах одного
модуля.  VBA делает различие лишь между авто-модулями (Modul  с  именем
AutoOpen  и процедурой "Main"),  авто-макрокомандой (процедура AutoOpen
()) и обработчиком события (процедура Document_Close ()).

    Если присутствуют одновременно авто-макрокоманда  и  авто-модуль  с
одинаковым именем, то авто-модуль не запускается. Если текущий документ
содержит авто-макрокоманду и NORMAL.DOT  содержит  авто-макрокоманду  с
тем же именем, то возникает сообщение об ошибке Microsoft Office. Авто-
макрокоманды имеют более  высокий  приоритет  чем  обработчик  события,
поэтому  процедура AutoOpen() запускается раньше,  чем Document_Open().
Если два макровируса инфицируют один модуль (так бывает  часто например
с  модулем  "ThisDocument")  и  при  этом  оба используют один и тот же
обработчик события (например,  Document_Close()),  то в результате  эти
вирусы  теряют  возможность  к  репликации  (и  при  этом они больше не
определяются многими антивирусными сканерами).

    Если два вируса используют  различные  макроимена,  то  очередность
инфицирования  или  приоритет  используемых  макрокоманд,  как правило,
решает,  может  ли  результат  стать   дееспособным   вирусом.   Многие
макровирусы изменяют строки программы при инфицировании,  например, так
часто имя макрокоманды активации Document_Open() изменяется в Document_
Close().  Например,  назовём  некий  вирус  "A"  и  предположим,  что в
"ThisDocument" уже  присутствует  вирус  "B",  и  при  этом  вирус  "A"
использует ".AddFromString".  Таким образом код вируса "A" прибавляется
к коду вируса "B".  При  этом  вирус  "A"  адресует  строки  программы,
которыми  он  хочет  манипулировать непосредственно через номера строк.
Однако строки теперь лежат в области кода вируса "B". Если в этом месте
располагается  важный  код  программы,  то в результате будет поврежден
вирус  "A"  и  он,  как  правило,  больше  не  сможет  функционировать.
Полиморфные макровирусы семейства "W97M/Class" более проблематичны. Они
заменяют   каждую   вторую   строку   программы   случайно   созданными
комментариями.  Если при этом модуль уже был заражен таким вирусом, как
например,  W97M/Brenda.A и  варианта  Class  (например,  Class.D)  этот
модуль инфицирует, то есть Class.D будет располагаться в этом модуле на
втором месте,  то полиморфные изменения коснутся каждой второй  строкой
вируса   Brenda.A.   Опрос   текста  используется  для  самодиагностики
некоторыми макровирусами,  например, содержит ли пятая строка исходного
текста  строку  "Rem  Я  вирус".  Если  один  из  вирусов  в "сэндвиче"
использует этот метод,  то дело  доходит  до  повторного  инфицирования
модуля,  так  как  маркер  одного  вируса  перемещается  при  повторном
инфицировании.  Таким образом,  может получиться,  что "сэндвич"  будет
содержать  две  копии первого и одну копию второго вируса (очередность:
вирус  1,  вирус  2,  вирус  1).  При  этом  имена  макрокоманд   будут
повторяться и такой "сэндвич" станет неработоспособным.

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



(C) NF, 1998-2004