Я постараюсь помочь новичкам разобраться в инструментарии, необходимом для изучения пакетного уровня RF Online, а также привести соответствующие примеры. В качестве полигона выберем русский официальный сервер RF Online: http://rfonline.ru. Итак, начнем:
Необходимый инструментарий
WPF
WinHEX
Proxifier, можно использовать Miniproxer, который идет в комплекте с WPF, но лично у меня он схватывает трафик раза с 3его и крашит при этом ланчер, поэтому буду объяснять на примере Proxifier.
TCPView
---
Все программы в комплекте - _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.[/hide]
_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, который, как я понял, никакого функционала не несет, но без него переданное сообщение в чате не появляется. Очень хочется надеяться, что если вы осилили данную статью, то теперь вы вполне способны самостоятельно разобрать оставшиеся пакеты сообщений чата (группа, личные сообщения, карта и т.п.) и не только, ведь главное – это стремление. Стремитесь и у вас все обязательно получиться![hide=3]