Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Wpf с самого начала 2.1

-

Rising Force Online

- Уязвимости, баги, читы и статьи по RF Online.

Ответ
 
Опции темы
Старый 25.03.2009, 16:58   #1
Заблокирован
 Пехотинец
Аватар для Den1S
 
Den1S скоро будет известенDen1S скоро будет известенDen1S скоро будет известен
Регистрация: 07.12.2008
Сообщений: 75
Популярность: 247
Сказал(а) спасибо: 55
Поблагодарили 99 раз(а) в 32 сообщениях
Отправить сообщение для Den1S с помощью ICQ Отправить сообщение для Den1S с помощью Telegram Отправить сообщение для Den1S с помощью Yahoo
 
По умолчанию

Снова решил поднять тему о скриптописании в впф. Гайд в виде для "блондинок" я писать не буду, но постараюсь достаточно подробно разобрать все основные моменты. Чтение "WPF с самого начала 2.0" не нужно вообще. И так начнем...

Перед всеми начинающими скриптописателями после освоения всех функции WPF встает вопрос - а как это юзать? Готовые примеры в интернете искать занятие не благодарное т.к. либо найдете что то очень сложное либо не найдете вообще.

Для начала следует усвоить что WPF(ныне WPP) использует язык Delphi в качестве основы. Соответственно у тех, кто уже умеет кое-как программировать на Delphi, проблем возникнуть не должно.

По сути говоря сам скрипт, представляет собой одну большууууюю функцию, которая начинается со слова "var". Это слово является знаком объявления переменных.

Пример:

Код:
var //знак объявления переменных
ID : int //объявили целоисчеслительную переменную "ID"

BEGIN //знак начала выполнения нашего скрипта.
ID := 1;
END. //знак конца выполнения нашего скрипта.
Скрипт WPP выполняется при каждом пакете в любую сторону, так что нам нужны условия, при которых будет выполняться сам скрипт.

Пример:

Код:
var //знак объявления переменных
ID : int; //объявили целоисчеслительную переменную "ID"

BEGIN //знак начала выполнения нашего скрипта.
if ID = 0 then //если ID = 0 тогда
ID := 1;
END. //знак конца выполнения нашего скрипта.
В WPP любая объявленная переменная автоматически получает значение "0". Таким образом, нам не нужно делать лишние движения для присваивания переменной числа 0.

Все проверки строятся по одному принципу: |если| |условие| |тогда| - if something then притом независимо от значений условие может возвращать лишь два значения 0 и 1 или ПРАВДА или ЛОЖЬ (TRUE or FALSE) --- ПРАВДА - условие выполнилось, ЛОЖЬ - условие НЕ выполнилось. Таким образом, условие "if ID then" будет выполняться ВСЕГДА, если ID не равен 0 так же как "if 999 then". Для более грамотного вида преобразуем наш скрипт:

Пример:

Код:
var //знак объявления переменных
ID : int; //объявили целоисчеслительную переменную "ID"

BEGIN //знак начала выполнения нашего скрипта.
if not ID then //если ID = 0 тогда
ID := 1;
END. //знак конца выполнения нашего скрипта.
Подробные описания "not", "xor", "or", и "and" вы можете посмотреть в любом справочнике в интернете. Сюда копировать это я не вижу смысла.

Для того чтобы поставить реакцию скрипта на определенный пакет в WPP нам нужны две функции.

1: _gFromServ - пакет от сервера, тогда как - not _gFromServ - пакет от клиента.
2: StrCmp(s1, s2) - сравнивает две строки(s1 и s2) и если они равны друг другу - возвращает 1(ПРАВДА).

Если с _gFromServ все понятно, то с StrCmp(s1, s2) не все так просто. Для того чтобы скрипт сработал только на определенный пакет нам нужно использовать внутри еще две функции внутри StrCmp.

1: copy(_строка_ , _номер баита, с которого копировать_ , _количество байт_) - копирует определенное количество байт.
2: Hstr(строка) - превращает нашу строку в последовательность HEX символов.

Проще всего это будет объяснить на примере:

Пример:

Код:
var //знак объявления переменных
ID : int; //объявили целоисчеслительную переменную "ID"

BEGIN //знак начала выполнения нашего скрипта.
if (not _gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then { если пакет от клиента и если начиная с 3го байта пакета 2 байта равны HEX 03 00 тогда }
ID := 1;
END. //знак конца выполнения нашего скрипта.
Всё!
(с) Stormraider

Перед тем как начать вторую часть нашего гайда, я покажу вам нескольких функции и две переменные, которые почти всегда используются в скрипте.
Сначала о переменных: для работы с пакетами в WPP выделены две переменные-строки, а именно _gBuff и _gOutBuff. Объясню по подробнее:

1._gBuff = переменная, которая отвечает за тот пакет, который получает WPP. Редактировать ее нельзя.
2._gOutBuff = переменная, которая отвечает за тот пакет, который выходит из скрипта.

Если по понятнее, то чаще всего это выглядит вот так:

пакет приходит в WPP -> проверки по _gBuff(if ***** then) -> изменения в конечном пакете через _gOutBuff -> пакет ушел дальше.

Во всей этой цепочке используется один и тот же пакет.

Теперь о функциях:
1.gSys.SendS(s1); - отправляет строку s1 на сервер
2.gSys.SendC(s1); - отправляет строку s1 к клиенту
3.writelogin(s1); - крайне нужная функция, которая записывает в лог строку (НЕ ВЗДУМАЙТЕ ЗАПИСАТЬ В ЛОГ ПАКЕТ, ТАКИМ ОБРАЗОМ, в лучшем случае это не сработает, а в худшем WPP просто пошлет весь скрипт. Как это делается правильно, я покажу в конце этой части.)

Перейдем к примерам:
1 Пример: допустим, вам нужно, чтобы WPP ловил какой-то пакет и заменял его своим.

Пример:
Код:
var //знак объявления переменных
stroka1 : string; //объявили строковую переменную stroka1

Procedure OnCreate; //Одна из вложенных процедур в WPP, но о ней ниже...
begin
stroka1 := Hstr('11 22 33 44 55 66 77 88 99'); //присвоили переменной stroka1 строку  хекс 11 22 33 44 55 66 77 88 99
end;

BEGIN
if (not _gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then { если пакет от клиента и если начиная с 3го байта пакета 2 байта равны HEX 03 00 тогда }
_gOutBuff := stroka1; //переменная _gOutBuff будет равна stroka1, по-другому это будет вот так : _gOutBuff := Hstr('11 22 33 44 55 66 77 88 99');
END.
Объясню несколько нюансов, которые я не затронул в предыдущем уроке:
1. Каждая строчка команд в скрипте ОБЯЗАТЕЛЬНО должна заканчиваться "; " таким образом, WPP понимает, что здесь заканчивается одна команда и начинается другая. К командам сравнения if *** then это не относится. Так же после самого последнего end ставится не "; " а ". " что показывает WPP, что скрипт закончен. Все предыдущие end должны заканчиваться "; " хотя и тут есть одно исключение, но об этом потом.
2. Для присваивания переменной чего-либо используется ":=" тогда как "=" используется в операциях сравнения.
3. Регистр символов в кодовых фразах не обязателен к соблюдению но крайне желателен для того чтобы вам было удобнее читать то что вы накатали.

Так же как вы заметили, появилась процедура OnCreate. Подробнее о процедурах и функциях я объясню в следующих уроках, а пока вам следует знать, что внутри этой процедуры (между begin и end можно присвоить вашим переменным стартовые значения.

2 Пример: допустим, вам нужно, чтобы WPP ловил какой-то пакет от сервера и в ответ слал ему что либо:

Пример:
Код:
var //знак объявления переменных
stroka1 : string; //объявили строковую переменную stroka1

Procedure OnCreate; //Одна из вложенных процедур в WPP, но о ней ниже...
begin
stroka1 := Hstr('11 22 33 44 55 66 77 88 99'); //присвоили переменной stroka1 строку хекс 11 22 33 44 55 66 77 88 99
end;

BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then { если пакет от клиента и если начиная с 3го байта пакета 2 байта равны HEX 03 00 тогда }
gSys.SendS(stroka1); // шлем серверу stroka1
END.
Прошу заметить что пакет, который пришел в WPP и подошел под условие, продолжит идти дальше. Для того что бы этого не произошло нужно использовать функцию gBlockPacket; которая не позволит уйти пакету куда либо дальше. Преобразуем наш скрипт до нужного вида:

Пример:
Код:
var //знак объявления переменных
stroka1 : string; //объявили строковую переменную stroka1

Procedure OnCreate; //Одна из вложенных процедур в WPP, но о ней ниже...
begin
stroka1 := Hstr('11 22 33 44 55 66 77 88 99'); //присвоили переменной stroka1 строку хекс 11 22 33 44 55 66 77 88 99
end;

BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then begin { если пакет от клиента и если, начиная с 3го байта пакета 2 байта равны HEX 03 00, тогда начинаем }
gSys.SendS(stroka1); // шлем серверу stroka1
gBlockPacket; //заблокирует пакет _gBuff к дальнейшему перемещению
end; //заканчиваем
END.
В наверняка увидели, что после проверки условия появилась фраза begin. Эта фраза используется здесь для того чтобы обозначить начало команд, которые должны выполнится если условие равно 1(Правда). Нужно для того чтобы выполнилась цепочка команд после проверки условия. Заканчивается оно должно end; . Если бы мы не поставили эти две фразы то команда gBlockPacket; выполнялась бы всегда независимо от того истинно ли условие или ложно.

Ну и напоследок расскажу, как добавить в лог пакет. Для этого нам нужна функция BufToHex(s1); которая переводит строку пакета в нормальную текстовую строку.

Пример:
Код:
ar //знак объявления переменных

BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then
WriteLog(BufToHex(_gBuff)); 
END.

Либо по-другому (используя функцию WriteLogHexB(s1); которая будет аналогична WriteLog(BufToHex(s1))  ).

Пример:

var //знак объявления переменных

BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then
WriteLogHexB(_gBuff); 
END.
Всё!
(с)Stormraider

Последний раз редактировалось Ivan_32; 25.03.2009 в 17:38.
  Ответить с цитированием
Ответ

Метки
начала, самого


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Packets]Берем самого себя в пати. maxxx Rising Force Online 41 14.03.2009 11:45
как голосовать за самого себя FroSt Архив уязвимостей 1 09.05.2008 12:28

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 17:16.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net