Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Хотелось бы узнать, от знающих, "на пальцах" структуру и алгоритм шифрации пакетов для логин сервера приходящих от клиента.
Тыкать в сорцы не стоит. Я не настолько знаток, чтобы хорошо разбираться в Java коде касаемо работы с байт кодом и шифрациями.
Если есть мануалы или кто-то может словами объяснить, буду очень признателен. Реализация пакетов планируется осуществлять на PHP. Знаний PHP достаточно (полностью реализована пакетная работа с гейм сервером), но на данный момент не могу понять смысла шифрации в Java коде.
Заранее спасибо.
Родился, живу и когда-нибудь умру.
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Первые данные, которые приходят/уходят криптуются статичным блоуфиш ключем.
Код: 6b 60 cb 5b 82 ce 90 b1 cc 2b 6c 55 6c 6c 6c 6c
Затем генерируется рандомный ключ. Обмен ключами производится в пакете Init (cddbddddbc).
RSA ключем криптуется логин и пароль пользователя. RSA ключи генерируются опять же - рандомно.
Для большей конкретики - напишите более конкретные вопросы, на которые, я постараюсь ответить
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Pointer*Rage, спасибо за инфу. Конкретней изложу проблему ниже.
Итак, всё что я смог узнать, так это строение пакета, и то, общее.
Любой пакет к логин серверу имеет примерно следующую структуру:
XX XX - длина пакета (little-endian) которая никогда не шифруется
XX - опкод пакета
---------
XX XX XX XX XX
XX XX XX XX XX - тело пакета (данные)
XX XX XX XX XX
---------
XX XX XX XX - чексумма (little-endian)
00 00 00 00 - суффикс непостоянен
1. Непонятно откуда берётся чексумма (как генерируется, т.е. какой участок пакета берётся и каким методом вычисляется чексумма);
2. Насколько важен суффикс в пакете (т.е. возможно его постоянное использование как статического блока);
3. Шифрация. Люди пишут что шифруется весь пакет начиная с третьего байта. Собсбвенно, есть ли смысл выполнять шифрацию, если планируется общаться с сервером одним пакетом (отправил пакет с сайта и получил ответ с логина), не доходя до Init пакета?
Пока эти моменты мне очень непонятны, опять же, из-за моего хиленького скила в Java.
Родился, живу и когда-нибудь умру.
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
07-12-2014, 08:21 PM
(Сообщение последний раз редактировалось: 07-12-2014, 08:33 PM n3k0nation.)
Все данные при передаче по сети идут в LittleEndian.
Длина пакета вычисляется таким образом:
Заголовок статичен, он имеет размер 2 байта.
В дату входит опкод и сама дата.
Проверка чексуммы
Начинаем собирать посредством побайтовой сборки - dword и дальнейшим захориванием нуль-числа.
Код: long chksum = 0;
for (int i = 0; i < count; i += 4) {
check = raw[i] & 0xff;
check |= raw[i + 1] << 8 & 0xff00;
check |= raw[i + 2] << 0x10 & 0xff0000;
check |= raw[i + 3] << 0x18 & 0xff000000;
chksum ^= check;
}
Последние 4 байта делаем тоже самое, но без хора и далее сравниваем:
Запись чексуммы точно такая же, но конечно, в обратном порядке:
Код: long chksum = 0;
int count = size - 4;
long ecx;
int i;
for (i = offset; i < count; i += 4)
{
ecx = raw[i] & 0xff;
ecx |= raw[i + 1] << 8 & 0xff00;
ecx |= raw[i + 2] << 0x10 & 0xff0000;
ecx |= raw[i + 3] << 0x18 & 0xff000000;
chksum ^= ecx;
}
ecx = raw[i] & 0xff;
ecx |= raw[i + 1] << 8 & 0xff00;
ecx |= raw[i + 2] << 0x10 & 0xff0000;
ecx |= raw[i + 3] << 0x18 & 0xff000000;
raw[i] = (byte) (chksum & 0xff);
raw[i + 1] = (byte) (chksum >> 0x08 & 0xff);
raw[i + 2] = (byte) (chksum >> 0x10 & 0xff);
raw[i + 3] = (byte) (chksum >> 0x18 & 0xff);
Я забыл упомянуть, что при статичном крипте (когда используется статичный ключ блоуфиша) - мы хорим все данные перед криптом блоуфиша. Перед данными, мы кладем хор-ключ длиной в 4 байта, а уже после, мы покрываем блоуфишем все это.
Добавлено через 3 минуты
Суффикс
Его нету ;D Если это пакет Init, то он означает окончание блоуфиш ключа.
Добавлено через 5 минут
Чексумма генерится для даты (опкод + дата)
Добавлено через 12 минут
Donatte Написал:3. Шифрация. Люди пишут что шифруется весь пакет начиная с третьего байта. Собсбвенно, есть ли смысл выполнять шифрацию, если планируется общаться с сервером одним пакетом (отправил пакет с сайта и получил ответ с логина), не доходя до Init пакета?
Можно, почему нет? Правда для этого придется править сервер Плюс вопрос в том, насколько передаваемые данные секретны.
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Мануал хорош. Спасибо.
Осталось всё это обмозговать и нарисовать в PHP версии.
По поводу данных. Я думаю пакетная структура общения с сервером имеет массу преимуществ по сравнению с прямыми SQL запросами. Например:
1. Невозможность отправить свой запрос, т.к. все пакеты имеют статичный вид (взломщик не нарисует ничего лишнего);
2. Скорость обработки запроса во много раз выше, т.к. задержки в SQL запросах иногда бывают по 5-10 секунд;
3. Простота (сервер сам формирует нужные данные).
Если позаботиться о безопасности веб части, то это лучшее что можно придумать для обвязки.
Серверная часть не проблема, т.к. блок идентификации входящего пакета обзаведётся новыми условиями для новых опкодов. Ну и обработчик ответа придётся запилить соответственно.
Для меня основная проблема дойти до L2LoginPacketHandler с правильным пакетом в буфере.
Родился, живу и когда-нибудь умру.
Сообщений: 168
Тем: 4
Зарегистрирован: Mar 2014
Репутация:
194
Donatte Написал:Мануал хорош. Спасибо.
Осталось всё это обмозговать и нарисовать в PHP версии.
Если не секрет - зачем может понадобиться php ?
Кажется вопрос снимается.
Donatte Написал:это лучшее что можно придумать для обвязки.
Сообщений: 2,102
Тем: 40
Зарегистрирован: Apr 2008
Репутация:
12,296
Воу воу, палехче!11111
Вам все объяснят тут, с 100500 летним стажем данной статьи О_о
П.С - обязательно обращать внимание на "до и после"!!!
П.С2 - обязую, от лица оверАхеревшихПасанофф(Это шутка как бы!!111111111111111111111111111111111111111), скопипастить статью в облако и сохранить линки на нее с зиги!!!111
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
После долгих пыток отправил пакет логину:
Код: 10 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00
где,
10 00 - длина
00 - опкод
00 00 00 00 00 00 00 00 00 - данные
10 00 00 00 - чексумма
Сервер выдаёт
Код: Wrong checksum from client: [192.168.1.1]
Неужели всё таки нужно ещё и криптовать пакет? Или я неправильно чексумму посчитал?
Родился, живу и когда-нибудь умру.
Сообщений: 236
Тем: 7
Зарегистрирован: Jun 2014
Репутация:
697
KilRoy Написал:Воу воу, палехче!11111
Вам все объяснят тут, с 100500 летним стажем данной статьи О_о
П.С - обязательно обращать внимание на "до и после"!!!
П.С2 - обязую, от лица оверАхеревшихПасанофф(Это шутка как бы!!111111111111111111111111111111111111111), скопипастить статью в облако и сохранить линки на нее с зиги!!!111
Спасибо за статью,скпопипастил в .txt документ!
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Если вы пытаетесь наладить общение между сервером и обвязкой, то юзайте XML-RPC. Проверено временем и показало себя только с лучшей стороны.
|