Структура, крипт и декрипт 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); } } Tcp пакеты Структура клиентского Tcp пакета: class TcpPacket { ushort Length { get; set; } ushort Opcode { get; set; } byte[] Data { get; set; } } При этом размер пакета не криптуется, а комбинируется с флагом 0x8000. ushort length =| 0x8000 Таким образом, при получении пакета от клиента, нам нужно получить размер данных, это делается так: int length = BitConverter.ToUInt16(_buffer, 0) & 0x7FFF; В размере пакета не учтён размер опкода, поэтому с буффера нужно получить на 2 байта больше полученной длины. byte[] buffer = new byte[length + 2]; Buffer.BlockCopy(_buffer, 2, buffer, 0, buffer.Length); Unshift(buffer, _bits); Сам сдвиг рассчитывается следующим образом: // Id - идентификатор текущего соединения. _bits = Id % 7 + 1; В ответ сервер отправляет не криптованные данные, структура которых ничем не отличается от клиентских. 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; } } Первые 13 байт* в которые входят Id, Slot, Time, Session, Length - не криптованы, это касается как клиентских, так и серверных пакетов. Data же криптована всё тем же сдвигом бит, только для получения сдвига используется длина пакета: int bits = length % 6 + 1; *длина заголовка Udp пакета может меняться от версии к версии. Так же, изучите тему с чего начать написание BattleServer в режиме Relay, чтобы применить полученные знания на деле. Есть вопросы или дополнения - велком. |
Re: Структура, крипт и декрипт Tcp и Udp пакетов
PROGRAMMATOR, Первые 13 байт пропускать надо верно? Потом остаток что осталось % 6 + 1; Верно??
|
Re: Структура, крипт и декрипт Tcp и Udp пакетов
Да, можно изменить метод Unshift:
public static void Unshift(byte[] buffer, int start, int bits) { int length = buffer.Length - start; // ... } И использовать: Unshift(buffer, 13, length % 6 + 1); |
Re: Структура, крипт и декрипт Tcp и Udp пакетов
PROGRAMMATOR,
Можешь помочь с наброском удп сервера? и еще проблема, когда срезаю верхушку 13 байт, как получить длину пакета, если до среза они в разброс идут может второй ид пакета придти, а длина другого( |
Re: Структура, крипт и декрипт Tcp и Udp пакетов
Цитата:
Длина пакета в заголовке, там же структуру я описал. Именно её берёте для получения битового сдвига packet.Length % 6 + 1. |
Re: Структура, крипт и декрипт Tcp и Udp пакетов
PROGRAMMATOR,
Код:
|
Re: Структура, крипт и декрипт Tcp и Udp пакетов
Да, только & 0x7FFF там не нужно, это относится к Tcp.
|
Re: Структура, крипт и декрипт Tcp и Udp пакетов
PROGRAMMATOR, как мне получить теперь опкод?
Если я расшифровал, дальше даже длина пакета не отображается в чем проблема? Если не сложно, объясни сколько он всего примерно оп кодов шлет, потому что первые 13 байт они изменились полностью. |
Re: Структура, крипт и декрипт Tcp и Udp пакетов
А не должны они меняться. 13 байт - это заголовок пакета, он не шифрован.
|
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