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

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

Описание темы:Проблема декрипта входящих пакетов

Ответ
Опции темы
Непрочитано 26.05.2017, 14:28   #1
Пользователь

Автор темы (Топик Стартер) Полученный опкод и размер не верен

логи сервера auth
Код:
26.05.2017 16:20:08 - Send 65 bytes
26.05.2017 16:20:09 - Received = 81
26.05.2017 16:20:09 - PacketId = 34048 Lenght = 2048
26.05.2017 16:20:09 - |--------------------------------------------------------------------------|
|       00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F                    |
|--------------------------------------------------------------------------|
| 0000: 00 85 03 91 00 87 80 0B 80 04 83 83 98 99 19 9A    ................
| 0010: 1A 9B 00 18 99 19 9A 1A 9B 00 20 46 AE 22 AC 3B    .......... F.".;
| 0020: 80 00 00 3F 80 00 00 80 00 00 00 00 00 00 00 1B    ...?............
| 0030: 9C 99 98 1C 18 1C 18 9B 99 9C B1 9A B0 B3 32 30    ..............20
| 0040: 9B 98 B3 1B 33 1A B0 98 31 B1 B2 18 98 1C 9C       ....3...1......
|--------------------------------------------------------------------------|
ClientConnection
Код:
 private int clan_id;
        private string login;
        //public ClientConnection network = new ClientConnection();
        public delegate void MethodContainer(ClientConnection session);

        public event MethodContainer OnDisconnected;

        public TcpClient Client { get; set; }

        private readonly Logger Log  =  new Logger();

        public Account Account { get; set; }

        byte[] buffer = new byte[2048];

        public NetworkStream Stream { get; set; }

        public int Id { get; set; }

        public byte[] RemoteIPAddress { get; set; }

        public int RemoteUdpPort { get; set; }


        public int getClan()
        {
            return clan_id;
        }
        public string getLogin()
        {
            return login;
        }
        public Account getPlayer()
        {
            return Account;
        }
        public void setClan(int clan_id)
        {
            this.clan_id = clan_id;
        }

        public void setLogin(string lo)
        {
            login = lo;
        }
        public int getCryptKey()
        {
            return 0x74c2;
        }
        public void setPlayer(Account p)
        {
            Account = p;
        }
        public void Accept(TcpClient client)
        {
            Stream = client.GetStream();
            SendPacket(new PROTOCOL_BASE_CONNECT_ACK());
            Stream.BeginRead(buffer, 0, buffer.Length, BeginRead, null);
        }

        public void BeginRead(IAsyncResult asyncResult)
        {
            int received = Stream.EndRead(asyncResult);
            Log.Info("Received = {0}", received);
            while (received >= 6)
            {
                int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
                //byte[] temp = new byte[length + 2];
                byte[] temp = new byte[length + 2];
                Array.Copy(buffer, 2, temp, 0, temp.Length);
                int bits = Id % 7 + 1;
                BitShift.Unshift(temp, bits);
                byte[] opcode = new byte[] { temp[0], temp[1] };
                RecvOpcode packet = (RecvOpcode)BitConverter.ToUInt16(opcode, 0);
                Type t = Type.GetType("PB.Auth.Network.Receive." + packet.ToString());
                Log.Info("PacketId = {0} Lenght = {1}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
                if (t != null)
                {
                    ReceivePacket clientpacket = (ReceivePacket)Activator.CreateInstance(t);
                    clientpacket.Client = this;
                    clientpacket.Process(buffer);
                }
                else
                {
                   // Log.Warn("");
                   Log.Warn(temp.ToHex());
                }
                received -= length + 4;
                Array.Copy(buffer, length + 4, buffer, 0, received); // << Копируем оставшиеся данные в начало буфера
            }
            Stream.BeginRead(buffer, 0, buffer.Length, BeginRead, null);
        }

        public void SendPacket(SendPacket packet)
        {
            packet.Client = this;
            packet.WriteImpl();
            byte[] data = packet.ToByteArray();
            byte[] lenght = BitConverter.GetBytes((short)data.Length);
            byte[] opcode = BitConverter.GetBytes(Convert.ToInt16((int)Enum.Parse(typeof(SendOpcode), packet.GetType().Name)));
            byte[] buff = new byte[data.Length + 4];
            Array.Copy(lenght, 0, buff, 0, lenght.Length);
            Array.Copy(opcode, 0, buff, 2, opcode.Length);
            Array.Copy(data, 0, buff, 4, data.Length);
            Stream.Write(buff, 0, buff.Length);
            Log.Warn("Send {0} bytes", buff.Length);
        }
    }
}
slawa560 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 14:37   #2
Забанен за кидаловo/обман/развод

По умолчанию Re: Помогите

Я так понял тебе нужно помочь с размером пакета и его опкодом?
Boris2105 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 14:39   #3
Пользователь

Автор темы (Топик Стартер) Re: Помогите

да он какую фигню читает а не опкод
slawa560 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 14:48   #4
Забанен за кидаловo/обман/развод

По умолчанию Re: Помогите

Цитата:
Type t = Type.GetType("PB.Auth.Network.Receive." + packet.ToString());
Log.Info("PacketId = {0} Lenght = {1}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
if (t != null)
{
ReceivePacket clientpacket = (ReceivePacket)Activator.CreateInstance(t);
clientpacket.Client = this;
clientpacket.Process(buffer);
}
else
{
// Log.Warn("");
Log.Warn(temp.ToHex());
}
Меняешь на вот это и будет норм длина пакета, а с опкодом смогу вечером помочь или жди пока кто то поможет
Цитата:
Type t = Type.GetType("PB.Auth.Network.Receive." + packet.ToString());
if (t != null)
{
ReceivePacket clientpacket = (ReceivePacket)Activator.CreateInstance(t);
clientpacket.Client = this;
clientpacket.Process(temp);
}
else
{
Log.Info("PacketId = {0} Lenght = {1}", BitConverter.ToUInt16(opcode, 0), temp.Length);
Log.Warn(temp.ToHex());
}
Boris2105 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 14:50   #5
Пользователь

Автор темы (Топик Стартер) Re: Помогите

жду

Добавлено через 16 минут
ну кто еще поможет)) буду благодарен

Последний раз редактировалось slawa560; 26.05.2017 в 15:06. Причина: Добавлено сообщение
slawa560 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 15:34   #6
Забанен за кидаловo/обман/развод

По умолчанию Re: Помогите

Цитата:
Сообщение от slawa560 Посмотреть сообщение
жду

Добавлено через 16 минут
ну кто еще поможет)) буду благодарен
https://forum.zone-game.info/showthr...342#post412342
вот тут решение твоей проблемы.
Boris2105 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 15:42   #7
Пользователь

Автор темы (Топик Стартер) Re: Помогите

Цитата:
Сообщение от Boris2105 Посмотреть сообщение
https://forum.zone-game.info/showthr...342#post412342
вот тут решение твоей проблемы.
причем тут это когда у меня опкод не так читаеться?
slawa560 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 15:48   #8
Забанен за кидаловo/обман/развод

По умолчанию Re: Помогите

Цитата:
Сообщение от slawa560 Посмотреть сообщение
причем тут это когда у меня опкод не так читаеться?
если ты будшь чуть внимательнее то поймешь , что у меня была такая же проблема
вместо опкода пакета PROTOCOL_BASE_CONNECT_ACK
он шлет пакет 32896
Boris2105 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 15:53   #9
Пользователь

Автор темы (Топик Стартер) Re: Помогите

Цитата:
Сообщение от Boris2105 Посмотреть сообщение
если ты будшь чуть внимательнее то поймешь , что у меня была такая же проблема
вместо опкода пакета PROTOCOL_BASE_CONNECT_ACK
он шлет пакет 32896
Код:
Тогда уж так:

class PROTOCOL_BASE_CONNECT_ACK : Packet
{
	NetworkSession session;
 
	public PROTOCOL_BASE_CONNECT_ACK(NetworkSession session)
	{
		this.session = session;
	}
 
	public override void WriteImpl()
	{
		// ...
 
		Write<ushort>(session.Seed);
		Write<int>(session.Id);
	}
}
 
Code: C#

SendPacket(new PROTOCOL_BASE_CONNECT_ACK(this));
у меня это все есть
вот
Код:
  private List<GameServerInfo> allgameservers;
        private int players;
        ClientConnection session;

        public PROTOCOL_BASE_CONNECT_ACK(ClientConnection session)
        {
            this.session = session;
        }
        public override void WriteImpl()
        {
            /* //WriteH(2049);
             writeD(0x151c);
             byte[] buffer = new byte[4];
             buffer[0] = 1;
             buffer[3] = 0x7f;
             writeB(buffer);
             writeH(0x74c2);
             writeH(0x7ff7);
             for (int i = 0; i < 10; i++)
             {
                 WriteC(1);
             }
             WriteC(1);
             allgameservers = GameServerInfoHolder.getInstance().getAllGameserverInfos();
             WriteD(this.allgameservers.Count);
             foreach (GameServerInfo info in allgameservers)
             {
                 players = 0;
                 WriteD(1);
                 WriteB(IPAddress.Parse(info.getIP()).GetAddressBytes());
                 WriteH((short)info.getPort());
                 WriteC((byte)info.getTypeGameServer());
                 WriteH((short)info.getMaxPlayers());
                 foreach (Channel channel in ChannelInfoHolder.getAllChannels())
                 {
                     if (channel.getServerName() == info.getServerName())
                     {
                         this.players += channel.getAllPlayers().Count;
                     }
                 }
                 WriteD(this.players);
             }*/
            //WriteH(0x801);
            writeD(5404);
            writeB(new byte[] { 1, 0, 0, 127 });
            writeH(29890);
            writeH(32759);
            for (int i = 0; i < 10; i++)
            {
                writeC(1);
            }
            writeC(1);
            allgameservers = GameServerInfoHolder.getInstance().getAllGameserverInfos();
            writeD(this.allgameservers.Count);
            foreach (GameServerInfo info in allgameservers)
            {
                players = 0;
                writeD(1);
                writeB(IPAddress.Parse(info.getIP()).GetAddressBytes());
                writeH((short)info.getPort());
                writeC((byte)info.getTypeGameServer());
                writeH((short)info.getMaxPlayers());
                foreach (Channel channel in ChannelInfoHolder.getAllChannels())
                {
                    if (channel.getServerName() == info.getServerName())
                    {
                        this.players += channel.getAllPlayers().Count;
                    }
                }
                writeD(this.players);
            }
        }
    }
}
slawa560 вне форума Ответить с цитированием
Непрочитано 26.05.2017, 16:05   #10
Аватар для PROGRAMMATOR
Администратор

По умолчанию Re: Помогите

Цитата:
Сообщение от slawa560 Посмотреть сообщение
byte[] buffer = new byte[4];
buffer[0] = 1;
buffer[3] = 0x7f;
writeB(buffer);
Такого вот присвоения IP адреса я ещё не видел.

Цитата:
int bits = Id % 7 + 1;
Какое значение Id присваивается?
__________________
composer require laravel/framework
yarn add vue
PROGRAMMATOR вне форума Отправить сообщение для PROGRAMMATOR с помощью ICQ Отправить сообщение для PROGRAMMATOR с помощью Skype™ Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер buffer Sojang Point Blank (Piercing Blow) 1 20.01.2016 00:31
Размер npc pyworld Игровой клиент 3 22.12.2013 15:25
Размер шрифта ников devillord Игровой клиент 1 06.11.2013 20:35
HTML размер окна adaria Lineage II 6 25.02.2013 15:45
Размер подписи VISTALL Курилка / Yak floor 3 02.10.2010 07:41


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

Вверх