Доброго времени суток, в этой статье я опишу процесс авторизации в Perfect World без клиента игры
Пугаться не стоит, так как это очень просто
[Ссылки могут видеть только зарегистрированные пользователи. ]
Для начала я опишу пакеты, которые мы будем отправлять/получать:
Как только мы подключимся к серверу, он вышлет нам пакет 0x01
В этом пакете будет храниться ключ для генерации хеша, который мы передадим серверу в пакете 0x03
Затем сервер вышлет нам пакет 0x02 или же 0x05 0x02 - Связка верна 0x05 - Связка неверна
Для начала создадим класс PWAuth.cs, в котором будут следующие переменный:
Код:
string IP;
int Port;
public bool Result { get; private set; }// Результат авторизации(связка(логин+пароль) верна/не верна)
public bool Connected { get; private set; }// Результат подключения к серверу(подключиться удалось/не удалось)
Так же мы должны подключить следующие библиотеки:
Код:
using System.Net.Sockets;
using System.Security.Cryptography;
Удобнее будет передавать IP и Порт классу при его создании, для этого создадим пару методов
Код:
public PWAuth(string ip) : this(ip, 29000) { }
public PWAuth(string ip, int port)
{
IP = ip;
Port = port;
}
При формировании пакета 0x03(LogginAnnounce) нам понадобится генерация хеша md5 (логин+пароля) в обертке HMACMD5
Для этого мы будем использовать следующий метод:
Я обернул метод tcp.Connect(IP, Port); в блок try затем, чтобы при неудачном подключении не вылетал Exception
Если же мы подключились к серверу, то можно начинать чтение пакета, который вышлет нам сервер(причему все следующие действия мы будем проводить в цикле while (skt.Connected))
Все полученные данные мы запишем в массив байт
Код:
byte[] buf = new byte[0xFF];
skt.Receive(buf);
buf[0] - Тип пакета
buf[1] - Длина пакета
Все остальное - пакет
Если тип пакета равен 0x01(if (buf[0] == 0x01)), то нам нужно сформировать пакет 0x03 и отправить его серверу
Код:
if (buf[0] == 0x01)
{
List<byte> Send = new List<byte>();
byte[] key = new byte[0x10];
for (int i = 0; i < 0x10; i++) key[i] = buf[i + 3];
byte[] loginbt = Encoding.GetEncoding(1251).GetBytes(login);
byte[] hash = GetHash(key, login, pass);
Send.Add((byte)loginbt.Length);
Send.AddRange(loginbt);
Send.Add((byte)hash.Length);
Send.AddRange(hash);
Send.Add(0x00);
Send.AddRange(new byte[]{4,0,0,0,0});
Send.Insert(0,(byte)Send.Count);
Send.Insert(0, 0x03);
skt.Send(Send.ToArray());
continue;
}
[Ссылки могут видеть только зарегистрированные пользователи. ]
В коде чуть выше мы проделали следующие действия:
Вычитали ключ из данных, которые прислал нам сервер
Перевели логин в байт
Сгенерировали хеш
Записали длину логина и логин в массиве байт
Записали длину хеша и сам хеш
Записали длину пакета в начало массива
Записали тип пакета(0x03) в начало массива
Отправили пакет
Следующий пакет, который отправит нам сервер, будет для нас результатом авторизации и если тип пакета не равен 0x01, то будет выполнен код после условия выше:
Код:
Result = buf[0] == 0x02;
break;
[Ссылки могут видеть только зарегистрированные пользователи. ]
И под конец метода мы закроем сокет и вернем результат:
Код:
skt.Close();
return Result;
В итоге у нас должен получиться следующий класс: PWAuth
using System.Collections.Generic;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;
namespace PWCheckAccount
{
class PWAuth
{
string IP;
int Port;
public bool Result { get; private set; }// Результат авторизации(связка(логин+пароль) верна/не верна)
public bool Connected { get; private set; }// Результат подключения к серверу(подключиться удалось/не удалось)
public PWAuth(string ip) : this(ip, 29000) { }
public PWAuth(string ip, int port)
{
IP = ip;
Port = port;
}
public bool Check(string login, string pass)
{
Result = false;
Connected = false;
PWAuth auth = new PWAuth(tbIP.Text, (int)updPort.Value);
auth.Check(tbLogin.Text, tbPass.Text);
if (!auth.Connected)
{
MessageBox.Show("Ошибка при подключении");
return;
}
MessageBox.Show(auth.Result ? "Успешная авторизация" : "Логин или пароль не верны");
В аттаче лежит готовый проект с GUI интерфейсом
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
Последний раз редактировалось FreePVP))); 17.10.2012 в 19:31.
Делал бы уже нормально: с чтением куинтов на тип и размер, на асинхронной модели сокетов с последующей нарезкой и сборкой пакетов.
Ну и сокет использовать лучше, чем обертку над ним под названием tcpclient...
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
Делал бы уже нормально: с чтением куинтов на тип и размер, на асинхронной модели сокетов с последующей нарезкой и сборкой пакетов.
Ну и сокет использовать лучше, чем обертку над ним под названием tcpclient...
Этот класс сделан специально для проверки аккаунтов на валидность
Не вижу смысла делать большее, разве что чек логина еще добавить
Если уж и делать с нарезкой, куинтами и асинхронными сокетами, то в отдельной статье
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
Этот класс сделан специально для проверки аккаунтов на валидность
Нет смысла делать урезки, когда можно сделать что-то полноценное, что можно применять и как проверку логина и все остальное.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
Нет смысла делать урезки, когда можно сделать что-то полноценное, что можно применять и как проверку логина и все остальное.
Ну знаешь, в своем парсере логинов мне удобнее было использовать этот класс, нежели подключать несколько других классов моей библиотеки
Добавлено через 3 минуты
Да и для того же брутфорса это было бы не очень удобно
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
Последний раз редактировалось FreePVP))); 19.07.2012 в 20:11.
Причина: Добавлено сообщение
Алгоритм описывается просто, без привязки к среде, языку программирования и т.д.
Автор темы предоставил реализацию алгоритма по работе с трафиком игры.
Реализация далека от идеала, поэтому и критикую.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
не могли бы Вы подсказать ссылочку на такой алгоритм?
Речь шла об абстрактном алгоритме, а точнее о том, что правильно называть алгоритмом.
Цитата:
Алгоритм — набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное время.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Быстрое снятие и загрузка скриншотов на хостинг.
Эта тема уже не раз поднималась, и работа с первыми пакетами не один раз описана. Но было бы очень интересно увидеть процесс выбора персонажа и входа в игру)