Структура, крипт и декрипт Tcp и Udp пакетов - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Point Blank (Piercing Blow)

Point Blank (Piercing Blow)
Общие вопросы по написанию эмулятора. General questions on developing emulator. При поддержке: Lucera 2 - разработка Java Interlude

Ответ
Опции темы
Непрочитано 29.12.2015, 13:56   #1
Аватар для PROGRAMMATOR
Администратор

Автор темы (Топик Стартер) Структура, крипт и декрипт Tcp и Udp пакетов

Крипт и декрипт

Клиент Piercing Blow криптует пакеты (и не только) методом сдвига бит. Методы крипта и декрипта можно без усилий получить из i3BaseDx_Cli.dll.

public static void Shift(byte[] buffer, int bits)
{
    int length = buffer.Length;
    byte first = buffer[0];
    byte current;
 
    for (int i = 0; i < length; i++)
    {
        if (i >= (length - 1))
        {
            current = first;
        }
        else
        {
            current = buffer[i + 1];
        }
 
        buffer[i] = (byte)(current >> (8 - bits) | (buffer[i] << bits));
    }
}
 
public static void Unshift(byte[] buffer, int bits)
{
    int length = buffer.Length;
    byte last = buffer[length - 1];
    byte current;
 
    for (int i = length - 1; (i & 0x80000000) == 0; i--)
    {
        if (i <= 0)
        {
            current = last;
        }
        else
        {
            current = buffer[i - 1];
        }
 
        buffer[i] = (byte)(current << (8 - bits) | buffer[i] >> bits);
    }
}
 
Code: C#

Tcp пакеты

Структура клиентского Tcp пакета:

class TcpPacket
{
    ushort Length { get; set; }
    ushort Opcode { get; set; }
    byte[] Data { get; set; }
}
 
Code: C#

При этом размер пакета не криптуется, а комбинируется с флагом 0x8000.

ushort length =| 0x8000
 
Code: C#

Таким образом, при получении пакета от клиента, нам нужно получить размер данных, это делается так:

int length = BitConverter.ToUInt16(_buffer, 0) & 0x7FFF;
 
Code: C#

В размере пакета не учтён размер опкода, поэтому с буффера нужно получить на 2 байта больше полученной длины.

byte[] buffer = new byte[length + 2];
Buffer.BlockCopy(_buffer, 2, buffer, 0, buffer.Length);
 
Unshift(buffer, _bits);
 
Code: C#

Сам сдвиг рассчитывается следующим образом:

// Id - идентификатор текущего соединения.
_bits = Id % 7 + 1;
 
Code: C#

В ответ сервер отправляет не криптованные данные, структура которых ничем не отличается от клиентских.

Udp пакеты

Piercing Blow, Point Blank и Project Blackout для обмена данными между игроками использует одноранговую сеть P2P.

Структура Udp пакета

public class UdpPacket
{
    public byte Id { get; set; }
    public byte Slot { get; set; }
    public float Time { get; set; }
    public byte Session { get; set; }
    public ushort Length { get; set; }
    public byte[] Data { get; set; }
}
 
Code: C#

Первые 13 байт* в которые входят Id, Slot, Time, Session, Length - не криптованы, это касается как клиентских, так и серверных пакетов. Data же криптована всё тем же сдвигом бит, только для получения сдвига используется длина пакета:

int bits = length % 6 + 1;
 
Code: C#

*длина заголовка Udp пакета может меняться от версии к версии.


Так же, изучите тему с чего начать написание BattleServer в режиме Relay, чтобы применить полученные знания на деле.

Есть вопросы или дополнения - велком.
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR на форуме Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 11.08.2016, 21:48   #2
Пользователь

По умолчанию Re: Структура, крипт и декрипт Tcp и Udp пакетов

PROGRAMMATOR, Первые 13 байт пропускать надо верно? Потом остаток что осталось % 6 + 1; Верно??
Enfern вне форума Ответить с цитированием
Непрочитано 11.08.2016, 22:47   #3
Аватар для PROGRAMMATOR
Администратор

Автор темы (Топик Стартер) Re: Структура, крипт и декрипт Tcp и Udp пакетов

Да, можно изменить метод Unshift:

public static void Unshift(byte[] buffer, int start, int bits)
{
    int length = buffer.Length - start;
 
	// ...
}
 
Code: C#

И использовать:

Unshift(buffer, 13, length % 6 + 1);
 
Code: C#
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR на форуме Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Непрочитано 12.08.2016, 22:08   #4
Пользователь

По умолчанию Re: Структура, крипт и декрипт Tcp и Udp пакетов

PROGRAMMATOR,
Можешь помочь с наброском удп сервера?

и еще проблема, когда срезаю верхушку 13 байт, как получить длину пакета, если до среза они в разброс идут
может второй ид пакета придти, а длина другого(
Enfern вне форума Ответить с цитированием
Непрочитано 13.08.2016, 09:17   #5
Аватар для PROGRAMMATOR
Администратор

Автор темы (Топик Стартер) Re: Структура, крипт и декрипт Tcp и Udp пакетов

Цитата:
Сообщение от Enfern Посмотреть сообщение
если до среза они в разброс идут
может второй ид пакета придти, а длина другого(
В Udp, пакеты, могут прийти в разном порядке, например приходит более старая версия PosRotation. Но чтобы приходил пакет с "чужой" длиной...

Длина пакета в заголовке, там же структуру я описал. Именно её берёте для получения битового сдвига packet.Length % 6 + 1.
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR на форуме Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Непрочитано 14.08.2016, 02:55   #6
Пользователь

По умолчанию Re: Структура, крипт и декрипт Tcp и Udp пакетов

PROGRAMMATOR,

Код:
 
// Temp получает с Receive ...........
int Length = BitConverter.ToUInt16(Temp, 7) & 0x7FFF;
Unshift(Temp, 13, Length % 6 + 1);
HandlePacket(Temp);
Code: C#
Я тебя верно понял?
Enfern вне форума Ответить с цитированием
Непрочитано 14.08.2016, 11:33   #7
Аватар для PROGRAMMATOR
Администратор

Автор темы (Топик Стартер) Re: Структура, крипт и декрипт Tcp и Udp пакетов

Да, только & 0x7FFF там не нужно, это относится к Tcp.
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR на форуме Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Непрочитано 18.08.2016, 01:28   #8
Пользователь

По умолчанию Re: Структура, крипт и декрипт Tcp и Udp пакетов

PROGRAMMATOR, как мне получить теперь опкод?
Если я расшифровал, дальше даже длина пакета не отображается в чем проблема?
Если не сложно, объясни сколько он всего примерно оп кодов шлет, потому что первые 13 байт они изменились полностью.
Enfern вне форума Ответить с цитированием
Непрочитано 18.08.2016, 17:52   #9
Аватар для PROGRAMMATOR
Администратор

Автор темы (Топик Стартер) Re: Структура, крипт и декрипт Tcp и Udp пакетов

А не должны они меняться. 13 байт - это заголовок пакета, он не шифрован.
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR на форуме Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Непрочитано 19.08.2016, 15:16   #10
Аватар для Awiion

По умолчанию Re: Структура, крипт и декрипт Tcp и Udp пакетов

Enfern,
1. Пишешь структуру.
2. Пропускаешь по структуре (13) байт.
3. Расшифровываешь Длина пакета % 6 + 1
4. В итоге у тебя получится, 13 байт не кодированных, дата расшифрованная.
Awiion вне форума Отправить сообщение для Awiion с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват и подмена пакетов Smiler ArcheAge 25 04.01.2019 21:08
Прием пакетов LameGuard (IT) Deazer Игровой клиент 1 26.05.2015 13:45
Структура/шифрация пакетов Логин сервера Donatte Игровой клиент 11 14.07.2014 18:48
Структура пакетов LineOFWar TERA 17 17.01.2013 21:13
packets.properties JFS Lineage II 0 05.04.2011 00:08


© 2007–2019 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 14:04. Часовой пояс GMT +3.

Вверх