[!] >>> PPC by Sauron, документация на PPC <<< [!]
1.
WP PPC - Wicked Patcher
или как пустить поезд по нашим рельсам.
Внимание! после версии wp655f, WP меняет свое название, и меняет набор модулей.
Wicked Patcher (после wp655f версии) содержит три модуля:
1. PPC -- Proxy Packed Converter - прокси сервер и скриптовый пакет-конвертер
2. MI -- Multi Injector - Мульти-инжектор (v.4.0)
3. SE -- Server Emulator - эмулятор серверов, (еще не закончен)
Здесь речь идет о PPC.
PPC = Proxy Packet Converter, что примерно означает - Прокси, Пакетный конвертер.
PPC предназначен для перехвата трафика TPC вообще , и трафика между клиентом (ботом) и сервером LA2/RFO (и других) в частности.
Так же , продвинутым контролем над этим трафиком , включая полное оперативное вмешательство в протокол соединения и изменение трафика по своему усмотрению с помощью гибкой системы скриптов.
С помощью PPC можно ловить пакеты TCP, изменять их, блокировать, посылать свои пакеты и вообще все что угодно с помощью скриптов.
PPC является первой в своем виде программой, где с помощью скриптов можно 'кодировать' алгоритм изменения трафика, в данный момент уже появилось много подражателей моей идеи (теже хлапексы, l2пакетхаки и прочие ), что радует, так как это подтверждает состоятельность моей идеи как факта.
Но, WP PPC является на сегодняшний момент единственной реально МНОГОПОТОЧНОЙ программой подобного рода.
Т.е. работает с большим количеством независимых друг от друга соединений.
Взять PPC можно в составе последней версии WP с моего сайта http://saur.x33.ru
Permeo Security Driver - http://www.satspace.ru/uploaded/perm...er.v.4.2.6.rar
В состав PPC входит:
1. Два прокси сервера с гибким настраиваемым протоколом , по умолчанию Socks 5.
Каждый из серверов многопоточный, то есть , каждый из серверов может держать несколько соединений одновременно. В принципе не обязательно он и Socks, так как прокси протокол написан на скрипте, а его можно изменять под свои нужды.
2. Продвинутый Автологгер (далее по тексту - AL),
предназначенный для протоколирования и автоматической записи пакетов трафика. Управляется как в ручную, так и через скрипты (включая способы шифрации и прочее)
Умеет автоматически определять является ли этот трафик последствием LA2 соединения, и, исходя из этого автоматически дешифрует (и шифрует обратно) пакеты LA2.
Так же, автоматически определяет разные способы работы с не LA2-трафиком, например RFO.
Возможно пользовательское дополнение своего типа трафика в определитель AL.
3. Скрипт-машина. (далее по тексту - СМ),
Позволяет гибко изменять пакеты трафика, путем написания скрипт-программ.
Это позволяет делать с пакетами все , что захотим.
Функции СМ все время дополняются и улучшаются, о них далее по тексту.
Каждый принятый пакет проходит последовательно до трех скриптов.
[принятый пакет] >> [дешифрация] >> [скрипт1] >> [скрипт2] >> [скрипт3] >> [шифрация ] >> [пакет на отправление]
I) Соединение клиента с сервером.
http://x33.ru/saur/upload/PPC/k1a.gif
Обычно Трафик между клиентом (ботом) и сервером происходит напрямую, т.е. клиент сразу лезет на заданный IP и порт сервера.
(для LA2 трафика: в боте прописывается в set.ini , а в клиенте в l2.ini)
Соединение через прокси ,у бота LA2 (walker), происходит на адрес указанный в самом боте, а он уже по прокси-протоколу передает ему адрес куда прокси сервер должен соединятся дальше на сервер.
Другими словами, перенаправить трафик бота LA2 (Walker) просто, так как у него в опциях есть настройки работы через socks5 прокси, а PPC это и есть sock5 прокси (по умолчанию)
Достаточно сделать следующее , чтобы бот соединялся через PPC :
http://x33.ru/saur/upload/PPC/k2.gif
127.0.0.1 ставить обязательно, а вот порт надо указывать такой, какой указываем в один из серверов PPC:
http://x33.ru/saur/upload/PPC/k3.gif
А чтобы по 10 раз не забивать адрес, то сохраните в опциях волкера настройки.
НО! Внимание! волкер глючит при лоаде настроек - поэтому вызывайте настройки в волкере два раза подрят - это исключит глюки при загрузки сохраненых опций волкера.
С клиентом сложнее, так как у него нету встроенной функции соединения через прокси, и для этого приходится пользоваться сторонними программами проксификаторами.
Permeo Security Driver и Proxifier являются стандартными проксификаторами, инструкций по использованию полно в интернете.
Внимание!
В последних версих WP PPC добавлен модуль Multi Injector.
Он позволяет перенаправлять программы без использования сторонних проксификаторов.
В WP PPC по умолчанию уже находятся записи MI для перехвата LA2 и RFO:
http://x33.ru/saur/upload/PPC/WPMIdef.gif
в случае LA2 клиента надо включить галочку на l2.exe (l2.dll в случае левых загрузчиков)
внимание! GG официального сервера Lineage2.com обнаруживает данный перехват
(если получится обойтись без драйвера, то скоро эта проблема будет решена)
в случае RFO включаем галочки на rf.exe и rf_online.bin (в rf.exe внедряем DLL помогающую перехватывать rf_online.bin)
Разумеется, чтобы MI работал с процессами, необходимо так же включить кнопку:
http://x33.ru/saur/upload/PPC/k15.gif
Для других программ создаются аналогичные записи пользователем.
Более полная документация по MI (Multi Injector) в процессе написания ..
2.
Настроив соединение, настраиваем PPC:
II) Настройки PPC
В начале , надо определить порт , на который зацепится наш прокси сервер.
Так как их два, то можем поставить два номера порта подряд, по умолчанию в PPC это 1777 и 1778. Но можно выбрать любые не занятые номера.
Обычно нужен только один сервер, поэтому выбираем любой из двух и нажимаем кнопку включения (с желтым солнышком).
http://saur.x33.ru/upload/PPC/k3.gif
Если появилось предупреждение о том, что порт занят, ставим другой номер порта.
! Очень важно правильно настроить фаерволл, разрешив WP PPC запускать сервера на локальном компьютере, а так же, разрешить выход в интернет. !
Нажав на кнопку [ * P-C панель] открываем главную панель PPC:
Тут изображена первая закладка главной панели PPC:
http://saur.x33.ru/upload/PPC/k4.gif
На ней, вверху, находится список задания условий для соединений, а в углу права внизу опции.
На этой закладке устанавливается привязка скриптов по условиям.
Условие может быть :
Имя сервера - у соединения должно совпасть имя сервера
Host / IP - у соединения должно совпасть Host или IP
Port - у соединения должен совпасть Port
Галочками ставятся либо какое ни будь одно условие либо комбинацию из них.
В списке ниже, устанавливается от 1 до 3 скриптов для данной привязки.
! Нужно помнить, что если мы поставим порт 2106, то указанные скрипты в этой записи запустятся ТОЛЬКО на этот порт, то есть только на время работы Логин сервера, следовательно самым разумным ставить только Host /IP ! Для этого должна стоять только одна галочка Host/IP на данном условии, и в поле 'Выбор по:' так же должно стоять IP нашего сервера.
Устанавливая порт мы можем отдельно для логин сервера запускать одни скрипты, а для геймсервера другие.
Имена серверов берутся из обнаруженных в памяти ботов - эти имена мы прописываем в set.ini бота. Имена в условие запуска скриптов лучше не ставить, для начала достаточно только IP.
Например, мы хотим установить скрипт позволяющий боту нормально двигаться на ява-серверах, l2j. Пусть IP сервера у нас будет 195.152.91.110 , название скрипта - demo2.sc (скрипт уже есть в дистрибутиве).
Тогда все должно выглядеть так :
http://saur.x33.ru/upload/PPC/k5a.gif
(1) мы добавляем кнопкой [Добавить] сервер в список , можно с любым именем, например [Все имена].
(2) убедившись, что появившаяся запись отмечена (выбрана) , мы вводим IP в первом поле над кнопкой [OK]. (4) Далее нажимаем [OK].
(3) отмечаем галочку [x] Host/IP
(4) Далее нажимаем [OK].
(5) После этого, указываем какие скрипты будут запускаться при этих условиях.
Теперь нажав на пустое место под записью, чтобы снять выделение, мы должны увидеть раскраску полей . Если первое поле с номером зеленое , и нет ни одного поля с красным, значит, эта запись будет использоваться, иначе, она игнорируется (когда есть хоть одно красное поле - значит данные не до конца введены)
http://saur.x33.ru/upload/PPC/k5b.gif
Теперь, если будет произведен коннект по такому IP, то на этот коннект будут запущены скрипты ниже (список из трех строчек).
Мы поставили 1 скрипт, но можно ставить до трех. Они будут выполняться по очереди , отдавая друг другу пакет по цепочке, после последнего он зашифруется и отправится.
3.
http://saur.x33.ru/img/t.gif
Ниже на этой же закладке мы видим опции (они стоят в данный момент по умолчанию):
http://saur.x33.ru/upload/PPC/k6.gif
'[ ] без скриптов не пропускать '- если тут будет галочка, то соединение не попавшее в список выбора скриптов, (либо если запись выбора не полная, есть красные поля), то это соединение не будет установлено.
'[x] Автостарт Auto Logger'a (AL)' - AL работает сразу, с первым пакетом. Иначе он будет ждать нажатия кнопки [On/Off] см. закладку Auto Logger. (либо когда из скрипта будет команда)
'Пакетов сохранять [ 500 ]' - Так как сохранить весь трафик не возможно (будет слишком накладно), то здесь ставится максимально количество пакетов на одно соединение, когда количество в работающем AL превысит установленное, ранние (верхние) пакеты будут удаляться, а последние добавляться . Например , если стоит 500, но при работающем AL прошло 850 пакетов, то сохранятся пакеты с 350 по 850. Значения этой опции могут быть от 100 до 3000 (пока так)
'Макс. Размер файла AL [ 3 ] Мег.' - Все собранные пакеты (если AL был включен хоть на время), при разрыве соединения сохраняются в файл 'autolog.dat', туда добавляются все пакеты пока файл не превысит указанный размер тут. Далее файл переименовывается в 'autolog.dat~.dat' заменяя старый если был, и начинается новый фал. 3 мегабайта это достаточно, но кому мало, можно поставить до 10 (пока так). (см. закладку Auto Logger.)
'Тип АвтоПарсинга пакетов [1]' - значение 1 - означает автоматическое определение разделения 'склеенных' пакетов. Значение 0 - не парсить пакеты , значение 2 - делить по факту размера в первых двух байтов. По умолчанию значение 1 .
Значение можно изменять 'на лету' в скриптах. Допустим, зная, что первые пакеты - это пакеты защиты, мы ставим значение в 0 (в скриптах) и работаем, эмулируя защиту, когда приходит время протоколу la2 мы ставим 2.(в скриптах)
'Тип PDecode пакетов [1]' - значение 1 - автоматическое определение дешифрации пакетов гейм сервера, 0 - выключено ! В этом случае пакеты будут идти, как есть - не дешифрованные.
2 - включен тип декодировки пакетов для la2 'GSDecode' (дешифроваться будет, только, если определятся ключи). Оставим 1.
'Таймаут по не активности [0]' - в секундах. Любое соединение, через которое в течении установленного тут времени не было ни одного пакета - рвется.
0 - таймаут выключен. (по умолчанию)
Все опции PPC запоминаются при выходе из WP PPC.
Левее опций мы видим установки скрипта для Прокси протокола, по умолчанию запускается скрипт почти аналогичный тому что можно посмотреть в файле 'wpsc\socks5.sc'.
III) Скрипты.
Запустив бота можно переключиться на следующую закладку (Links Online):
Мы видим онлайн соединение нашего бота.
!!! (Далее мы будет разбирать реальное соединение, и там другое IP, отличающееся от того, что мы указывали выше, скрины переделывать мне уже влом. Будем считать, что IP было то, что будем видеть дальше)
http://saur.x33.ru/upload/PPC/k7.gif
Ниже списка мы видим закладки 'SysLog' , 'INFO' и 'Send Raw Packet'
'Syslog' это системный лог, туда пишутся глобальные сообщения об ошибках ( а так же сообщения от прокси скрипта).
'INFO' - это информация об активном соединении.
Там , кстати , можно всегда узнать реальный протокол =) (в данном случае 659)
'Send Raw Packet' - возможность послать пакет вручную, без скрипта.
в верхнем поле вводится пакет в виде двухсимвольных шестнадцатеричных байт разделенных пробелом, выбирается активное соединение и нажимается кнопка отсылки на сервер или на клиент.
В низу справа под списком Онлайн соединений мы видим кнопку [ Terminate link ]
Этой кнопкой мы всегда сможет разорвать соединение.
Кнопка с солнышком и надписью 'редактировать скрипты онлайн' активна только при выборе активного соединения из списка.
! Нажав не него мы получаем дополнительную закладку !!! с именем сервера и его Host/IP
http://saur.x33.ru/upload/PPC/k8.gif
На ней мы видим редакторы для трех скриптов и скрипт лог для данного соединения,
Скрипты можно оперативно, не разрывая связи править, записывать в память/ на диск/загружать...
Script Log - туда записываются сообщения скриптов для каждого пакета.
Вспомним, что скрипты, все три, вызываются по очереди для каждого пакета, и после них пакет шифруется и отправляется дальше, куда он и шел в начале.
Далее , следующий пакет трафика опять идет на скрипты и так далее: (и пакеты от сервера и от клиента все идут через скрипты, а уже в скриптах можно по переменной _gFromServ определить откуда пакет)
Кнопки Read/Write - читают/пишут скрипт в памяти, после исправления скрипта, чтобы он исправился в памяти надо нажать Write - с этого момента следующий пакет сразу попадет на исправленный скрипт. Read - читает пакет из памяти.
Кнопки Load/Save - загружают/записывают, соответственно, скрипт из/в файл.
Если воспользовались кнопкой Load, то после загрузки, надо нажать Write, чтобы скрипт из редактора записался в память на пакеты. Т.е. как и при редактировании.
В закладке ScriptLog мы видим сообщения от скриптов (функции типа Writelog() ) и ошибки скриптов. Если ошибка будет фатальна для соединения, то произойдет разъединение и вся закладка скриптов закроется. НО! Если был включен (по умолчанию включен, вспомним опции) Auto Logger, то все это запишется в лог , и сообщения скриптов тоже, так что мы всегда узнаем что там случилось.
4.
http://saur.x33.ru/img/t.gif
IV) Auto Logger. (AL)
Не прерывая соединение бота, можно переключиться на закладку 'Auto Logger'
Мы видим Список соединений сверху, слева список пакетов.
Нажимая кнопки 'Online'/'Log File'справа от списка соединений , мы можем видеть как запущенные в данный момент соединения, так и записанные в файл.
Когда нажат режим 'Online' , в списке вверху, раз в секунду, обновляются запущенные в данный момент соединения, и выбрав одно , можно увидеть пакеты данного соединения в левом списке.
Кнопкой Start log/Stop log мы может останавливать и заново запускать автолог для каждого соединения.
Нажав на любой пакет из списка пакетов, можно видеть содержимое пакета.
'S>c ' означает , что пакет идет в направлении от сервера к клиенту.
Сохраняется только определенное количество пакетов, максимум 3000 пакетов (см. опции)
При разрыве соединения, лог этого соединения записывается в файл.
http://saur.x33.ru/upload/PPC/k9.gif
В случае, если пакет был исправен скриптом, или было некое сообщение из скриптов, то появляются дополнительные закладки:
http://saur.x33.ru/upload/PPC/k10.gif
Тут пакет идет с клиента через скрипт , закладка C>(scr) , далее пакет из скрипта иде на сервер (scr)>S.
Закладка Scripts log появляется, когда скрипт выдает какое либо сообщение (к примеру ф-цией Writelog())
Есть еще закладка (scr)<>(с)/(s) это закладка отражает все дополнительные пакеты, которые были переданы из скриптов при обработке данного пакета.
отображение пакетов в списке пакетов :
1. первая скобка '>':
S>c , C>s - передача текущего пакета без изменения.
2. первая скобка '}':
S}c , C}s - передача пакета с изменениями (закладки S>(scr) C>(scr) (scr)>S (scr)>C )
3. вторая скобка '>':
S>>c, C>>s - передача текущего пакета без изменений,
но были посланы дополнительно пакеты. (закладка (scr)<>(c/s))
S}>c, C}> - передача текущего пакета с изменениями,
и плюс были посланы дополнительные пакеты (закладки соответствуют)
4. значек в конце '~':
S>c~, S}>c~, S>>c~ .. - присуствуют сообщения из скриптов (закладка Script Log)
5. символ 'x':
S>x , C>x, S>>x, S}x - текущий пакет блокирован.
6. первый значек '='
=>c, =>s - пакет отправлен вручную, минуя скрипт. ('Links Online' / 'Send Raw Packet')
7. первый значек 'T' : (см. '_gS3OnTimer' и gSys('S3timer'))
сообщения или дополнительные пакеты из скрипта3 запущенного по таймеру:
T>~ - присуствуют сообщения из скрипта3 по таймеру.
T>> T>>~ - были посланы дополнительные пакеты из скрипта3 по таймеру.
В последних версиях дополнено описание пакетов.
Описание пакетов зависит от типа трафика, и устанавливается либо автоматически, либо в ручную на закладке 'Описание'
пример 'раскраски' пакета в зависимости от типов аргументов (и типа трафика, в данном случае это трафик 'LA2'):
http://saur.x33.ru/upload/PPC/k12.gif
цвета заменяемые.
для одного типа аргумента один цвет, но до 5 тонов, чтобы одного типа аргументы не 'склеивались'
Номера пакетов можно переключить на название из описания или обратно:
http://saur.x33.ru/upload/PPC/k13.gif
V) Script Tester
Это отдельный скрипт-движок, для отработки синтаксиса выражений,
от остальной части PPC не зависим и не связан.
Системные переменные почти все отсутствуют, (для отладки инициализировать в ручную)
Можно писать несложные некоторые программки.
При выходе из WP, все , что написано в Script Tester'е будет автоматически сохранено в файле 'ScriptTester.txt'. И при запуске WP опять туда загрузится.
возможность выбирать скрипт-движок:
зависит от расширения файлов скриптов:
'.sc' - WPS, - текстовый файт WPScript
'.fsc' - FS, - текстовый файл FastScript
'.xml' - PFS, - прекомпилированный файл FastScript. (можно создать в Script Tester'e)
В .xml случае (прекомпилированный) файл можно только использовать, но не редактировать.
Так же его очень трудно понять, можно использовать в качестве некоего подобия шифрования скрипта
Прекомпилированный файл будет примерно в 6-9 раз больше текстового, но зато при первичной загрузке (и соответственно компиляции) будет выполняться быстрее.
компиляция происходит только один раз при загрузке, но, например, при количестве строк более 1000 компиляция '.fsc' будет примерно 2 секунды, а компиляция '.xml' будет 100 ms.
Далее, после компиляции, при работе скрипта, разницы в скорости не будет.
Внимание!
Крайне рекомендуется выбирать FS скрипт, так как FS движок более быстр и продвинут, чем WPS.
5.
http://saur.x33.ru/img/t.gif
VI) Функции скрипт-языка WPS.
Внимание!
В WP PPC встроено два разных скрипт-движка, чей синтаксис и ф-ции частично различны.
WPS, как устаревший движок, больше не поддерживается и описан в качестве документации. Используйте только FS движок.
Здесь описан скрипт движок WPS, информация о другом , FS, будет дальше по теме.
Синтаксис скрипт-движка WPS
Синтаксис скрип - языка WPS во многом схож с паскалем, об исключениях ниже.
Поддерживаются следующие операторы:
begin .. end;
if .. then .. else
case ... else end;
For .. to/downto .. do
While .. do
Repeat .. until
continue
break
goto
exit
Переменные автотипизированы, то есть, тип переменной определяется при присваивании , по результату или по первому операнду в выражении (если не ясен результат).
Переменные могут быть переопределены.
Объявленые переменные сохраняются от пакета к пакету в пределах одной сессии (по сути они глобальны для одной сессии)
Самое главное отличие от стандартных языков программирования, это частичное нивелирование определения типов char/byte в выражениях, с одной стороны это очень разгружает скрипт машину, и ускоряет ее в десятки раз, с другой стороны, накладывает ограничения.
Пример определения типа переменной;
c := 'a' ; // тип char;
k := c + 1; // тип сhar, равнозначно k = char( (byte(с)+1) and $ff );
k := 1 + c; // тип int, равнозначно k = byte(с) +1;
k := 0 + c; // тип int, равнозначно простому переводу типа k := byte(c);
пример нарушения правила 'о перестановке слагаемых' =)
zz := 2 + gBuff[1]; // - zz стала int , = (byte(buff[1]) + 2) and $FF;
zz := gBuff[1] + 'a'; // - zz стала строкой, (= 'aa')
Чтобы не было подобных ошибок, советую использовать явное преобразование:
k := byte(c);
k := char(c);
А вот присваивание элементу строки (одномерного массива) будет работает как угодно:
s := '123456'; // буфер - это таже строка.
s[4] := 'G'; // здесь s = '123G56'
s[5] := 60 ; // здесь s = '123G<6'
шестнадцатеричные значения как в паскале:
v := $10; // v = 16;
v := $FFFF; // v = 65535
символ цифрами тоже как в паскале:
c := #97; // c : char = 'a' (97 = $61)
c := #$61; // c :char = 'a' ($61) шестнадцатиречный символ =)
строку можно набрать по разному:
s := 'aaaa1';
s := '#$61+#$61+#97+#97+'1' ; // = 'aaaa1'
доступ к символам/байтам как в массиве с позиции 1 то есть, s[5] = '1'
(немного из старых объяснений:
Brotherhood Of Cheaters - Allcheats.ru - Братство Читеров - Показать сообщение отдельно - WP401F/451R(WP307F) в производстве (не только для ботов) )
функции и процедуры скрипта:
В скрипте можно писать функции и процедуры, синтаксис схож с паскалем.
procedure Name(v1, ... vn); // описание процедуры
begin // тело процедуры
end;
function Name(v1, ... vn); // описание функции
begin // тело функции
result := ... // возвращаемое функцией значение.
end;
процедуры и функции без аргументов описываются так:
procedure Name();
...
function Name();
...
Внимание !! (только для WPS)
Все внешние переменные описанные в главном теле скрипта копируются в тело функции/процедуры, но не изменяются при выходе. За исключением переменных описанных в аргументах.
Системные переменные в том числе. (_gOutBuff присваивать только в главном теле скрипта)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> например, так неправильно: <<<
procedure aaa();
begin
_gOutBuff := _gBuff; // здесь _gOutBuff локальный для этой ф-ции !!
// он копируется из основного, но не изменяет основной.
_gOutBuff[5] := #0;
end;
begin // главное тело скрипта
aaa; // <- вызов функции не изменит _gOutBuff;
end;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> Правильно так: <<
function aaa();
begin
result := _gBuff;
result[5] := #0;
end;
begin // главное тело скрипта
_gOutBuff := aaa; // теперь _gOutBuff установился нормально.
end;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> так тоже правильно: <<
procedure aaa(bf);
begin
bf := _gBuff;
bf[5] := #0;
end;
begin // главное тело скрипта
bf := 0; // определим переменную.
aaa(bf);
_gOutBuff := bf; // теперь _gOutBuff установился нормально.
end;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Массивы.
Одномерные массивы являются набором отдельных переменных.
Объявляется каждый элемент массива отдельно.
например:
a[100] := 10;
- создастся сотый элемент массива a[], но, другие элементы еще не определены.
length(a) - работать не будет, так как каждый элемент массива это отдельная переменная.
Если необходимо сразу весь массив, то , на данный момент, только так :
if _gAbsNumPkt = 1 then begin // если первый пакет, то объявляем переменные.
for i := 1 to 100 do a[i] := 0;
alen := 100; // создадим переменную, где будем держать размер массива.
end;
Строка/буффер тоже определяется как одномерный массив, но имеет свойства string.
Двух мерные массивы создавать нельзя, но можно создавать массивы строк/буферов.
например:
a[1] := _gBuff;
if length(a[1]) >2) then ID := a[1][3]; // если размер пакета больше 2, то берм ID пакета
length(a) - даст ошибку.
length(a[1]) - даст размер пакета.
Для целей PPC этого достаточно, так как в скриптмашине сделан упор на быстродействие, а более мощные массивы существенно снижают быстродействие.
Более продвинутые синтаксис и возможности имеет второй скрипт-движок FS, информация о нем будет дальше.
Системные переменные скрипт-движка WPS
Все переменные определенные когда либо в скриптах, действительны для всей сессии.
Кроме этого существуют системные переменные, для входящей и исходящей инф-ции в скриптах. (Только для WPS)
_gBuff :str - входящий буфер (строка) , в нем приходит пакет в скрипты.
_gOutBuff :str - исходящий буфер, это пакет который уйдет дальше по назначению.
Если ничего не присваивать этой переменной, то пакет на выходе будет без изменений.
_gFromServ :bool - возвращает true , если скрипт получил пакет с сервера на клиент.
false - если с клиента на сервер.
_gS3onTimer - возвращает true ('1') если скрипт запущен по таймеру (см. gSys('S3timer'[,time]))
_gS3TimerCount - возвращает счетчик срабатываний таймера с последнего сброса таймера.
при сбрасывани таймера в ноль (выключении - gSys('S3timer',0)) счетчик _gS3TimerCount обнуляется. (_gS3TimerCount только начиная с WP410F)
(см. gSys('S3timer'[,time]))
_gAbsNumPkt :int - абсолютный номер приходящего пакета, нумеруется с 1.
_gStopOnError (bool) по умолчанию false, если установить значение true, то будет разрыв соединения в случае любой ошибки скрипта.
Разрыв будет не сразу, может пройти еще пара пакетов (для лога полезно).
_gServName - строка, с именем сервера, как он определился PPC.
_gServHost - строка, с хостом сервера, если он определился.
_gServIP - int, IP сервера.
_gServPort - int, Port сервера.
_gCWinSock - доступно только в скрипте socks5, тип WinSocketStream.