Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Point Blank (Piercing Blow) (https://forum.zone-game.info/forumdisplay.php?f=204)
-   -   Структура, крипт и декрипт Tcp и Udp пакетов (https://forum.zone-game.info/showthread.php?t=39792)

PROGRAMMATOR 29.12.2015 13:56

Структура, крипт и декрипт 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, чтобы применить полученные знания на деле.

Есть вопросы или дополнения - велком.

Enfern 11.08.2016 21:48

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
PROGRAMMATOR, Первые 13 байт пропускать надо верно? Потом остаток что осталось % 6 + 1; Верно??

PROGRAMMATOR 11.08.2016 22:47

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#

Enfern 12.08.2016 22:08

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
PROGRAMMATOR,
Можешь помочь с наброском удп сервера?

и еще проблема, когда срезаю верхушку 13 байт, как получить длину пакета, если до среза они в разброс идут
может второй ид пакета придти, а длина другого(

PROGRAMMATOR 13.08.2016 09:17

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
Цитата:

Сообщение от Enfern (Сообщение 416891)
если до среза они в разброс идут
может второй ид пакета придти, а длина другого(

В Udp, пакеты, могут прийти в разном порядке, например приходит более старая версия PosRotation. Но чтобы приходил пакет с "чужой" длиной... nichoci

Длина пакета в заголовке, там же структуру я описал. Именно её берёте для получения битового сдвига packet.Length % 6 + 1.

Enfern 14.08.2016 02:55

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
PROGRAMMATOR,

Код:

 
// Temp получает с Receive ...........
int Length = BitConverter.ToUInt16(Temp, 7) & 0x7FFF;
Unshift(Temp, 13, Length % 6 + 1);
HandlePacket(Temp);
Code: C#

Я тебя верно понял?

PROGRAMMATOR 14.08.2016 11:33

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
Да, только & 0x7FFF там не нужно, это относится к Tcp.

Enfern 18.08.2016 01:28

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
PROGRAMMATOR, как мне получить теперь опкод?
Если я расшифровал, дальше даже длина пакета не отображается в чем проблема?
Если не сложно, объясни сколько он всего примерно оп кодов шлет, потому что первые 13 байт они изменились полностью.

PROGRAMMATOR 18.08.2016 17:52

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
А не должны они меняться. 13 байт - это заголовок пакета, он не шифрован.

Awiion 19.08.2016 15:16

Re: Структура, крипт и декрипт Tcp и Udp пакетов
 
Enfern,
1. Пишешь структуру.
2. Пропускаешь по структуре (13) байт.
3. Расшифровываешь Длина пакета % 6 + 1
4. В итоге у тебя получится, 13 байт не кодированных, дата расшифрованная.


Текущее время: 05:25. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot