В данной статья я постараюсь помочь новичкам разобраться в инструментарии, необходимом для изучения пакетного уровня RF Online, а также привести соответствующие примеры. В качестве полигона выберем русский официальный сервер RF Online: http://http://rf.mmotop.ru/page-2/
Итак, начнем:
Необходимый инструментарий
WPF (_http://saur.x33.ru/wpf.rar)
WinHEX (_http://depositfiles.com/files/1042308)
Proxifier (_http://depositfiles.com/files/1042314) – можно использовать Miniproxer, который идет в комплекте с WPF (свежая версия: _http://saur.x33.ru/MiniProxer.rar), но лично у меня он схватывает трафик раза с 3его и крашит при этом ланчер, поэтому буду объяснять на примере Proxifier.
TCPView (_http://download.sysinternals.com/Files/TcpView.zip)
---
4in1 (_http://www.rapidshare.ru/406162 или _http://ifolder.ru/3393762) - полный боекомплект специально для тех, у кого не качается по вышеуказанным ссылкам
Подготовка и настройка
Распаковываем/устанавливаем вышеописанный инструментарий и не забываем его лечить предложенными таблетками. Для начала необходимо узнать IP адрес и порт игрового сервера. Для этого мы воспользуемся утилитой TCPView. Запускаем клиент RF Online, логинимся и выбираем сервер. Сворачиваем окно RF Online и запускаем TCPView. Сразу после запуска необходимо снять галку Options -> Resolve Addresses.
_http://img489.imageshack.us/img489/452/57544161yy0.jpg
RF_Online.bin => Remote Address: 81.176.70.167:27780. Таким образом мы выяснили IP адрес игрового сервера (81.176.70.167) и его порт (27780). Клиент и TCPView можно закрыть.
WPF представляет собой комплекс из 3 независимых модулей: патчер для L2Walker, верификационный сервер для L2Walker, а также PPC (WP Packet Converter). Соответственно, использовать мы будем только PPC. WPF PPC представляет собой SOCKS 5 прокси-сервер. Таким образом необходимо перенаправить трафик от RF_Online.bin на него (RF_Online.bin <-> WPF PPC <-> Game server). Для этого воспользуемся Proxifier'ом. Запускаем Proxifier и открываем Options -> Proxy settings -> Add . В качестве адреса указываем 127.0.0.1, а в качестве порта – 1777, протокол – SOCKS 5.
_http://img78.imageshack.us/img78/8084/16060151al8.jpg
Далее открываем Options -> Proxification Rules. Выбираем Process only the following + manually proxified, снимаем галку с Loopback и жмем Add. Rule name: RFOnline, Application: RF_Online.bin, IP Ranges: 81.176.70.167, Port range: 27780.
_http://img207.imageshack.us/img207/5686/50007909lt6.jpg
Настройка Proxifier'а закончена – его можно свернуть.
Теперь перейдем к WPF. Для начала можно остановить сервер верификации L2Walker’а: Verify Server -> Stop VS. Далее открываем вкладку Proxy P-C и включаем S5 Proxy 1 на 1777 порту, нажав на солнышко. Открываем P-C панель и жмем кнопку Добавить. Name: RFOnline.ru, Host/IP: 81.176.70.167, Port: 27780. Жмем OK.
_http://img441.imageshack.us/img441/4010/34956528hv0.jpg
_http://img472.imageshack.us/img472/8084/40572529rp1.jpg
Настройка завершена! Теперь трафик от RF_Online.bin, предназначенный для 81.176.70.167:27780, перенаправляется на WPF посредством Proxifier'а.
Непосредственное изучение пакетного уровня
Самое время запустить клиент RF Online (желательно в режиме окна). Логинимся, выбираем сервер и входим в игровой мир за своего персонажа. Сразу хочу отметить, что пакетный уровень RF Online отличается от пакетного уровня Lineage 2 прежде всего тем, что только часть пакетов передается в зашифрованном виде (причем достаточно хитро по сравнению с тем же шифрованием в Lineage 2). Таким образом, на данном этапе для большинства людей возможно изучение только незашифрованных пакетов. А те, кто владеют навыками дизассемблирования возможно преуспеют в изучении алгоритма шифрования пакетов в RF Online. Особый интерес представляют, несомненно, пакеты, которые передаются от клиента серверу. Изучать пакетный уровень мы будем на примере пакета, который передается серверу от клиента в незашифрованном виде, содержащий сообщение чата. Для начала немного опишу назначение вкладок WPF PPC: Server/Scripts – позволяет привязать к определенному серверу выполнение того или иного скрипта (до 3х штук). Links Online – отображает текущие активные соединения и информацию о них, а также позволяет отправлять произвольные пакеты (Send Raw Packet). Auto Logger – позволяет производить учет пакетов, которые передаются от клиента серверу и наоборот. ScriptTester – предназначен для отладки скриптов.
Перейдем от слов к делу! Открываем вкладку Auto Logger, выбираем соединенение RFOnline.ru и нажимаем Start log. Далее переключаемся на окно RF Online и пробуем написать что-нибудь в общий чат. Потом опять переключаемся на PPC и нажимаем Stop log.
_http://img402.imageshack.us/img402/9734/34746219dl0.jpg
Теперь вы видим, что Auto Logger отловил пакеты, переданные и полученные за время его работы, и отобразил их в левой части окна. S>C означает, что пакет был передан сервером клиенту, а C>S – наоборот. Соответственно, нас интересуют пакеты C>S. Ищем пакет, которому соответствует переданное нами сообщение в чат. Он будет иметь примерно следующий вид:
Код:
[6585] C>s 0ms. 12:01:21
-------------------------------------------------------------------------------
TType: undef Server: undef ParseType: 2 (auto) EnCode: undef (auto)
------- 0 1 2 3 4 5 6 7 - 8 9 A B C D E F -------------------
TType не определен(описание)
000000 23 00 02 02 1D 5B D2 F0 | E8 E0 F0 E8 E9 5D 4D 61 #....[Триарий]Ma
000010 73 74 65 72 6D 69 6E 64 | 20 3A 20 EF F0 E8 E2 E5 stermind.:.приве
000020 F2 21 00 т!.
Щелкаем по нему правой кнопкой, чтобы его скопировать в буфер обмена. Пакет представляется в виде ряда чисел в 16тиричной системе (слева). Справа представлен его символьный эквивалент в ANSI-ASCII (_http://pyldin.narod.ru/asc_tab.gif). Давайте разберем его структуру:
23 00 02 02 1D 5B D2 F0 E8 E0 F0 E8 E9 5D 4D 61 73 74 65 72 6D 69 6E 64 20 3A 20 EF F0 E8 E2 E5 F2 21 00
Первые 2 байта (23 00) соответствуют длине пакета в 16тиричной системе – 23. С помощью обычного калькулятора Windows в инженерном режиме можно перевести это число в 10тичную систему, более понятную нам. Переводим калькулятор в режим HEX (16тиричная), вводим 23 и переводим калькулятор в режим DEC (10тичная). Получаем 35. Т.е. число 23 в 16тиричной системе счисления равно 35 в 10тичной. Теперь давайте посчитаем число байтов в пакете: их ровно 35.
Следующие 2 байта (02 02) соответствуют типу пакета. Это пакет типа сообщение чата переданное от клиента серверу в общий чат.
Следующий байт (1D) – это длина сообщения в 16тиричной системе. За сообщение принимается: “[Триарий]Mastermind : привет!” (ANSI-ASCII) или “5B D2 F0 E8 E0 F0 E8 E9 5D 4D 61 73 74 65 72 6D 69 6E 64 20 3A 20 EF F0 E8 E2 E5 F2 21” (в 16тиричной системе, ASCII Hex).
Следующие 1D байт или 29 в 10тичной системе счисления соответствуют сообщению.
Ну и последний байт (00) указывает на конец пакета. Теперь попробуем изменить этот пакет, чтобы потом его отправить и изучить поведение сервера на него, а именно убрать титул (“[Триарий]”), изменить ник на “GM”, а также изменить само сообщение. Нагляднее всего это можно сделать с помощью WinHEX'а. Создаем новый файл произвольной длины (File -> New). Окно будет разбито условно на 2 части: слева будут числа в 16тиричной системе (ASCII Hex), а справа их символьные эквиваленты (ANSI-ASCII). В буфере обмена у нас все еще должен находиться наш пакет. Ставим указатель на первый байт (00) и жмем CTRL+V. В появившемся окне выбираем ASCII Hex, при этом должен вставиться наш пакет.
_http://img74.imageshack.us/img74/3130/11wn3.jpg
Далее мы должны отредактировать сообщение по намеченной схеме. Проще всего это сделать в правой части. После того как мы отредактировали сообщение, изменилась его длина (5ый байт – 1D) и, соответственно, длина пакета (1ый байт – 23). Напоминаю, что длина нужна в 16тиричной системе. Выделяем пакет целиком (не забываем про конец пакета – 00), при этом в правом нижнем углу появиться значение длины выделенной области в 16тиричной системе (в нашем случае длины пакета – 1D). Проделываем аналогичные операции для определения длины сообщения – 17. Прописываем полученные значения в нужные места.
_http://img444.imageshack.us/img444/1672/12ig5.jpg
Снова выделяем пакет целиком и жмем CTRL+SHIFT+C (копируем в буфер обмена пакет в 16тиричной системе). Теперь самое время его отправить серверу и посмотреть его реакцию. Возвращаемся к WPF PPC, вкладка Link Online -> Send Raw Packet. Выбираем соединение – RFOnline.ru, вставляем наш пакет и жмем кнопку Серверу. Результат, как говориться, на лицо.
[Для просмотра данной ссылки нужно зарегистрироваться]
В принципе этот баг особой ценности не несет, скорее Just for fun, однако при различных разводах может быть очень кстати. Ради примера еще один пакет на отправку сообщения уже в чат гильдии:
33 00 02 63 FF FF FF FF 29 5B D2 F0 E8 E0 F0 E8 E9 5D 4D 61 73 74 65 72 6D 69 6E 64 20 3A 20 EF EE F7 E5 EC F3 20 ED E5 20 EE E1 F9 E0 E5 EC F1 FF 3F 00
По сути все то же самое, только изменился тип пакета (02 63) - пакет типа сообщение чата переданное от клиента серверу в чат гильдии и появился непонятный довесок в виде 4 байт – FF FF FF FF, который, как я понял, никакого функционала не несет, но без него переданное сообщение в чате не появляется. Очень хочется надеяться, что если вы осилили данную статью, то теперь вы вполне способны самостоятельно разобрать оставшиеся пакеты сообщений чата (группа, личные сообщения, карта и т.п.) и не только, ведь главное – это стремление. Стремитесь и у вас все обязательно получиться!
Как писать свои скрипты и использовать чужие в PPC?
PPC имеет 2 встроенных скрипт-движка: WPS и FS (FastScript). Обучаться будем на примере WPS.
Для начала я расскажу как вообще подгружать скрипты:
1) Открываем P-C панель
2) Переходим на вкладку ScriptTester
3) Переключаемся на скрипт-движок WPS
4) Пишем свой скрипт или вставляем чужой
5) Нажимаем *Script Run*
6) Если скрипт-движок не обнаружил ошибок в коде, то будет выдано примерно следующее:
Код:
.running {WPS text script} 16.09.2007 15:37:51
.end (time: 0ms.)
7) Теперь жмем Save, чтобы сохранить скрипт
8) Переходим на вкладку Servers/Scripts
9) Выбираем заданное условие выбора скриптов (в нашем случае это должно быть правило с названием RFOnline.ru)
9) Выбираем свободный слот для привязки скрипта к правилу (для каждого правила может быть привязано до 3х скриптов)
10) Нажимаем [...] - Файл скрипта
11) Выбираем скрипт, который мы сохранили
Если вы хотите изменить скрипт в процессе его работы, то:
1) Переходим на вкладку Links Online
2) Выбираем текущее соединение
3) Нажимаем Редактировать скрипты онлайн
4) Изменяем скрипт
5) Нажимаем кнопку Write, чтобы обновить скрипт в памяти. Если мы накосячили в процессе редактирования и хотим вернуть исходный скрипт из памяти, то для этого существует кнопка Read.
Узнать больше можно тут:
_http://allcheats.ru/showthread.php?t=2983
Чтобы потренироваться, выкладываю скрипт, который управляется из общего чата и отправляет сообщение в общий чат от любого ника:
Код:
// RF Online ::: Отправка сообщений в общий чат от любого ника by Mastermind
//
// Использование:
// Написать в общий чат следующее сообщение: msg [ник, от имени которого отправляем сообщение] [сообщение]
if (not _gFromServ) and copy(_gBuff,3,2) = HStr('02 02') then begin
i := 6;
while BufToHex(_gBuff[i]) <> '20' do i := i + 1;
i := i + 3;
if copy(_gBuff,i,4) = HStr('6D 73 67 20') then begin
i := i + 4;
nick := '';
while BufToHex(_gBuff[i]) <> '20' do begin
nick := nick + BufToHex(_gBuff[i]);
i := i + 1;
end;
i := i + 1;
msg := '';
while BufToHex(_gBuff[i]) <> '00' do begin
msg := msg + BufToHex(_gBuff[i]);
i := i + 1;
end;
st := nick + '203A20' + msg;
len := inttohex(length(st)/2);
st := '0202' + len + st + '00';
_gOutBuff := HPck(st);
end;
end;
Построчные комментарии к скрипту:
Код:
// Входящий пакет
// 29 00 | 02 02 | 23 | 5B D2 F0 E8 E0 F0 E8 E9 5D 4D 61 73 74 65 72 6D 69 6E 64 20 3A 20 6D 73 67 20 47 4D 20 48 65 6C 6C 6F 21 | 00
// Начало скрипта
// Если пакет не от сервера (т.е. от клиента) и, начиная с 3его байта, 2 байта имеют значение 02 02 (т.е. пакет типа 02 02 - сообщение в общий чат), тогда...
if (not _gFromServ) and copy(_gBuff,3,2) = HStr('02 02') then begin
// Присваиваем переменной i значение 6. Переменная i будет выступать в качестве некого указателя на конкретный байт пакета, т.е. сейчас наш указатель установлен на байт 5B
i := 6;
// Пока 16тиричное значение i-ого байта входящего пакета не равно 20 = [пробел] смешаем указатель вправо на единицу, т.е. после выполнения цикла указатель будет иметь значение 25 и расположен на байте 20
while BufToHex(_gBuff[i]) <> '20' do i := i + 1;
// Смещаем указатель на 3 позиции вправо, т.е. i = 28, и устанавливаем его на байт 6D
i := i + 3;
// Если с 28 байта четыре последующих байта имеют значение 6D 73 67 20 = msg[пробел], тогда...
if copy(_gBuff,i,4) = HStr('6D 73 67 20') then begin
// i = 32, текущий байт = 47
i := i + 4;
// Присваиваем переменной nick пустую строку
nick := '';
// Пока 16тиричное значение i-ого байта входящего пакета не равно 20 = [пробел] ...
while BufToHex(_gBuff[i]) <> '20' do begin
// Пристыковываем справа к строке nick 16тиричное значение i-ого байта
nick := nick + BufToHex(_gBuff[i]);
// Увеличиваем i на единицу
i := i + 1;
// Конец цикла, nick = 47 4D
end;
// Указатель находиться на 33 позиции входящего пакета, а именно на байте 20. Смещаем указатель на следующий байт (48).
i := i + 1;
// Присваиваем переменной msg пустую строку
msg := '';
// Пока 16тиричное значение i-ого байта входящего пакета не равно 00 = нуль-байт ...
while BufToHex(_gBuff[i]) <> '00' do begin
// Пристыковываем справа к строке nick 16тиричное значение i-ого байта
msg := msg + BufToHex(_gBuff[i]);
// Увеличиваем i на единицу
i := i + 1;
// Конец цикла, msg = 48 65 6C 6C 6F 21
end;
// Присваиваем переменной st строку-сообщение, передаваемое в чат - 47 4D | 20 3A 20 | 48 65 6C 6C 6F 21
st := nick + '203A20' + msg;
// Определяем длину строки-сообщения, переводим ее в 16тиричную систему и присваиваем это значение переменной len
len := inttohex(length(st)/2);
// Добавляем тип пакета слева (02 02) и нуль-байт справа (00). st = 02 02 | 0B | 47 4D | 20 3A 20 | 48 65 6C 6C 6F 21 | 00
st := '0202' + len + st + '00';
// Добавляем 2 байта размера, собираем пакет и помещаем его в выходной буфер
_gOutBuff := HPck(st);
// Конец условия
end;
// Конец скрипта
end;
// Исходящий пакет
// 11 00 | 02 02 | 0B | 47 4D 20 3A 20 48 65 6C 6C 6F 21 | 00
(c) http://www.allcheats.ru/ - Mastermind
Информация добыта с вышенаписанного портала.