示例#1
0
        private static void DumpPacket(SROPacket packet)
        {
            if (first)
            {
                FirstPacketGrid();
                first = false;
            }
            string direction;

            if (packet.SendType == PacketSendType.REQUEST)
            {
                direction = string.Format("[CLIENT->{0}]", packet.ServerServiceType);
            }
            else if (packet.SendType == PacketSendType.RESPONSE)
            {
                direction = string.Format("[{0}->CLIENT]", packet.ServerServiceType);
            }
            else
            {
                direction = "[?->?]";
            }
            string id     = string.Format("[{0}]", packet.PacketID);
            string opcode = string.Format("[{0:X4}]", packet.Opcode);

            PrintRow(new string[] { direction, id, opcode, packet.Encrypted.ToString(), packet.Massive.ToString() });
        }
示例#2
0
        private PacketResult GetPacketResultOnClientPacketReceived(SROClient client, SROPacket packet)
        {
            //For ClientlessSwitcher
            if (this.m_client.CanSwitchClient)
            {
                #region Fake Client

                #region 0x2001
                if (packet.Opcode == 0x2001)
                {
                    //[S -> C][2001][16 bytes]
                    //0D 00 47 61 74 65 77 61 79 53 65 72 76 65 72 00   ..GatewayServer.
                    Packet response = new Packet(0x2001);
                    if (!this.m_client.IsConnectedToAgent)
                    {
                        response.WriteAscii("GatewayServer");
                    }
                    else
                    {
                        response.WriteAscii("AgentServer");
                        this.m_client.IsConnectedToAgent = false;
                    }
                    response.WriteByte(0); //Client-Connection
                    response.Lock();

                    client.SendPacket(response);

                    response = new Packet(0x2005, false, true);
                    response.WriteByte(0x01);
                    response.WriteByte(0x00);
                    response.WriteByte(0x01);
                    response.WriteByte(0xBA);
                    response.WriteByte(0x02);
                    response.WriteByte(0x05);
                    response.WriteByte(0x00);
                    response.WriteByte(0x00);
                    response.WriteByte(0x00);
                    response.WriteByte(0x02);
                    response.Lock();

                    client.SendPacket(response);

                    response = new Packet(0x6005, false, true);
                    response.WriteByte(0x03);
                    response.WriteByte(0x00);
                    response.WriteByte(0x02);
                    response.WriteByte(0x00);
                    response.WriteByte(0x02);
                    response.Lock();

                    client.SendPacket(response);
                }
                #endregion

                #region 0x6100
                if (packet.Opcode == 0x6100)
                {
                    byte   local    = packet.ReadByte();
                    string identity = packet.ReadAscii();
                    uint   version  = packet.ReadUInt();

                    //S->P:A100 Data:01
                    Packet response = new Packet(0xA100, false, true);

                    if (local != this.m_client.LocaleID)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x01); //(C4)
                    }
                    else if (identity != "SR_Client")
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x03); //(C4)
                    }
                    else if (version != this.m_client.VersionID)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else
                    {
                        response.WriteByte(0x01); //Success
                    }

                    response.Lock();
                    client.SendPacket(response);
                }
                #endregion

                #region 0x6101

                if (packet.Opcode == 0x6101 && this.m_client.IsConnectedToAgent == false)
                {
                    Packet response = new Packet(0xA102);
                    response.WriteByte(0x01);          //Success
                    response.WriteUInt(uint.MaxValue); //SessionID
                    response.WriteAscii("127.0.0.1");  //AgentIP
                    response.WriteUShort(this.m_client.LocalPort);
                    response.Lock();

                    this.m_client.IsConnectedToAgent = true;
                    client.SendPacket(response);
                }

                #endregion

                #region 0x6103

                if (packet.Opcode == 0x6103)
                {
                    uint   sessionID = packet.ReadUInt();
                    string username  = packet.ReadAscii();
                    string password  = packet.ReadAscii();
                    byte   local     = packet.ReadByte();
                    //byte[] mac = packet.ReadByteArray(6); //No need

                    Packet response = new Packet(0xA103);
                    if (sessionID != uint.MaxValue)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else if (!string.IsNullOrEmpty(username))
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else if (!string.IsNullOrEmpty(password))
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else if (local != this.m_client.LocaleID)
                    {
                        response.WriteByte(0x02);
                        response.WriteByte(0x02);
                    }
                    else
                    {
                        response.WriteByte(0x01); //Success
                    }
                    response.Lock();
                    client.SendPacket(response);
                }

                #endregion

                #region 0x7007

                if (packet.Opcode == 0x7007)
                {
                    byte type = packet.ReadByte();
                    if (type == 0x02)
                    {
                        Packet responseEndCS = new Packet(0xB001);
                        responseEndCS.WriteByte(0x01);

                        Packet responseInitLoad = new Packet(0x34A5);

                        client.SendPacket(responseEndCS);
                        client.SendPacket(responseInitLoad);
                        this.m_client.IsWaitingForData = true;
                    }
                }

                #endregion

                #endregion
            }
            else
            {
                //Not sure why but after clientless->client the clients preferes to send 0x6103 twice.
                if (packet.Opcode == 0x6103)
                {
                    if (this.m_client.AgentLoginFixCounter > 0)
                    {
                        return(new PacketResult(PacketOperationType.IGNORE));
                    }
                    this.m_client.AgentLoginFixCounter++;
                }

                if (packet.Opcode == 0x6102)
                {
                    this.m_client.AgentLoginFixCounter = 0;
                }

                return(new PacketResult(PacketOperationType.NOTHING));

                //if (this.m_client.IsConnectedToAgent) {
                //    this.m_agentComponent.
                //    m_agentSocket.Send(packet);
                //} else {
                //    m_gatewaySocket.Send(packet);
                //}
            }

            return(new PacketResult(PacketOperationType.NOTHING));
        }
示例#3
0
        private void RegisterGatewayPacketListener()
        {
            if (this.m_gatewayComponent != null)
            {
                this.m_gatewayComponent.OnPacketReceived += new Func <SROClient, SROPacket, PacketSocketType, PacketResult>(delegate(SROClient client, SROPacket packet, PacketSocketType socketType) {
                    this.ClientComponent.OnPacketReceived?.Invoke(client, packet, socketType);

                    //Received from CLIENT
                    if (socketType == PacketSocketType.CLIENT)
                    {
                        return(GetPacketResultOnClientPacketReceived(client, packet));

                        //Received from REMOTE
                    }
                    else if (socketType == PacketSocketType.SERVER)
                    {
                        if (this.m_client.IsClientless)
                        {
                            if (!this.m_client.CanSwitchClient)
                            {
                                //Request Patch
                                if (packet.Opcode == 0x2001)
                                {
                                    if (packet.ReadAscii() == "GatewayServer")
                                    {
                                        Packet response = new Packet(0x6100, true);
                                        response.WriteByte(this.m_client.LocaleID);
                                        response.WriteAscii("SR_Client");
                                        response.WriteUInt(this.m_client.VersionID);
                                        return(new PacketResult(PacketOperationType.RESPONSE, new PacketResult.PacketResponseResultInfo(response)));
                                    }
                                }

                                //Reconnect to AgentServer on successfull login
                                if (packet.Opcode == 0xA100)
                                {
                                    byte result = packet.ReadByte();
                                    if (result == 1)
                                    {
                                        this.m_client.SessionID = packet.ReadUInt();
                                        this.m_client.AgentIP   = packet.ReadAscii();
                                        this.m_client.AgentPort = packet.ReadUShort();

                                        //CanDoAgentServerConnect = true;

                                        //this.m_agentComponent.DOConnect(new IPEndPoint(IPAddress.Parse(this.m_client.AgentIP), this.m_client.AgentPort), delegate (bool status, BindErrorType error) {

                                        //    Console.WriteLine("m_agentComponent DOConnect status : " + status);
                                        //    Console.WriteLine("m_agentComponent DOConnect error : " + error);

                                        //});

                                        //this.m_gatewayComponent.UNBind();
                                        //this.m_agentComponent.SetServiceEndPoint(new IPEndPoint(IPAddress.Parse(this.m_client.AgentIP), this.m_client.AgentPort));
                                        //this.m_agentComponent.DOBind(delegate (bool success, BindErrorType error) {
                                        //    if (success) {
                                        //        Console.WriteLine("CONTEXT.Connect() AGENT PROXY bind SUCCESS");
                                        //    } else {
                                        //        Console.WriteLine("AGENT bind FAILED -- Reason : " + error);
                                        //    }
                                        //});
                                    }
                                }

                                if (packet.Opcode == 0xA101)
                                {
                                    //GlobalServer
                                    bool nextGlobalServer = packet.ReadBool();
                                    do
                                    {
                                        packet.ReadByte();  //GlobalOperationID
                                        packet.ReadAscii(); //GlobalOperationName

                                        nextGlobalServer = packet.ReadBool();
                                    } while (nextGlobalServer);

                                    //ShardList
                                    bool nextShard = packet.ReadBool();
                                    this.m_shards.Clear();
                                    do
                                    {
                                        this.m_shards.Add(new Shard(packet));
                                        nextShard = packet.ReadBool();
                                    } while (nextShard);
                                }

                                //Request Server List
                                if (packet.Opcode == 0xA102)
                                {
                                    byte errorCode = packet.ReadByte();
                                    if (errorCode == 1)   //Connected to Agent Server
                                    {
                                        this.ClientComponent.OnAccountStatusChanged?.Invoke(client, AccountStatusType.LOGIN_SUCCESS);

                                        Packet response = new Packet(0x6101, true);
                                        return(new PacketResult(PacketOperationType.RESPONSE, new PacketResult.PacketResponseResultInfo(response)));
                                    }
                                    else if (errorCode == 2)     //Cannot connect Agent Server.
                                    {
                                        switch (packet.ReadUInt8())
                                        {
                                        //Wrong ID/PW
                                        case 1: {
                                            byte totalattempts = packet.ReadUInt8();
                                            byte num1          = packet.ReadUInt8();
                                            byte num2          = packet.ReadUInt8();
                                            byte num3          = packet.ReadUInt8();
                                            byte attempts      = packet.ReadUInt8();

                                            this.ClientComponent.OnAccountStatusChanged?.Invoke(client, AccountStatusType.LOGIN_FAILED);
                                            break;
                                        }

                                        //Account action
                                        case 2:

                                            //Blocked
                                            if (packet.ReadUInt8() == 1)
                                            {
                                                this.ClientComponent.OnAccountStatusChanged?.Invoke(client, AccountStatusType.BANNED);
                                                //Reason -> packet.ReadAscii());
                                            }
                                            break;

                                        //Character is already logged on
                                        case 3:
                                            this.ClientComponent.OnAccountStatusChanged?.Invoke(client, AccountStatusType.ALREADY_LOGGED_ON);
                                            break;

                                        //Maybe offline or error ?
                                        default: {
                                            this.ClientComponent.OnAccountStatusChanged?.Invoke(client, AccountStatusType.LOGIN_FAILED);
                                            break;
                                        }
                                        }
                                    }
                                    else
                                    {
                                        Console.WriteLine("There is an update or you are using an invalid silkroad version.");
                                        return(new PacketResult(PacketOperationType.IGNORE));
                                    }
                                }



                                //CAPTCHA
                                if (packet.Opcode == 0x2322)
                                {
                                    this.ClientComponent.OnCaptchaStatusChanged?.Invoke(client, CaptchaStatusType.FETCH);

                                    //var captcha = Captcha.GeneratePacketCaptcha(packet);
                                    //Captcha.SaveCaptchaToBMP(captcha, Environment.CurrentDirectory + "\\captcha.bmp");
                                    //Program.main.picCaptcha.Image = Bitmap.FromFile(Environment.CurrentDirectory + "\\captcha.bmp");
                                    //Program.main.groupImageCode.Enabled = true;
                                }


                                if (packet.Opcode == 0xA323)
                                {
                                    byte result = packet.ReadByte();
                                    if (result == 1)
                                    {
                                        this.ClientComponent.OnCaptchaStatusChanged?.Invoke(client, CaptchaStatusType.CORRECT);
                                    }
                                    else
                                    {
                                        this.ClientComponent.OnCaptchaStatusChanged?.Invoke(client, CaptchaStatusType.WRONG);
                                    }
                                    //if (result != 1) {
                                    //    //Get captcha image ?
                                    //    this.m_client.CanCaptchaCheck = true;

                                    //    Packet response = this.ClientComponent.GetCaptchaPacket();
                                    //    return new PacketResult(PacketOperationType.RESPONSE, new PacketResult.PacketResponseResultInfo(response));

                                    //} else if (result == 2) {
                                    //    //Wrong Captcha
                                    //    this.m_client.CanCaptchaCheck = false;
                                    //}
                                }
                            }
                        }
                        else
                        {
                            #region Redirect client to local AgentListener

                            if (packet.Opcode == 0xA102)
                            {
                                byte result = packet.ReadByte();
                                if (result == 1)
                                {
                                    this.m_client.SessionID = packet.ReadUInt();
                                    this.m_client.AgentIP   = packet.ReadAscii();
                                    this.m_client.AgentPort = packet.ReadUShort();


                                    //Create fake response for Client to redirect to localIP/localPort
                                    SROPacket response = new SROPacket(0xA102, true);
                                    response.WriteByte(result);
                                    response.WriteUInt(this.m_client.SessionID);
                                    response.WriteAscii(this.ClientComponent.LocalAgentEndPoint.Address.ToString());
                                    response.WriteUShort((ushort)this.ClientComponent.LocalAgentEndPoint.Port);
                                    //response.WriteAscii(System.Net.IPAddress.Loopback.ToString());
                                    //response.WriteUShort(this.m_client.LocalPort);
                                    response.Lock();
                                    this.m_client.IsConnectedToAgent = true;
                                    this.m_agentComponent.SetServiceEndPoint(new IPEndPoint(IPAddress.Parse(this.m_client.AgentIP), this.m_client.AgentPort));
                                    this.m_agentComponent.DOBind(delegate(bool success, BindErrorType error) {
                                        if (success)
                                        {
                                            Console.WriteLine("[AGENT LISTENER] PROXY bind SUCCESS");
                                        }
                                        else
                                        {
                                            Console.WriteLine("[AGENT LISTENER] PROXY bind FAILED -- Reason : " + error);
                                        }
                                    });

                                    return(new PacketResult(PacketOperationType.RESPONSE, new PacketResult.PacketResponseResultInfo(response)));
                                    //packet = response;
                                }
                                else
                                {
                                    this.m_client.CanAccountLogin = true;
                                }

                                client.SendPacket(packet);
                            }

                            #endregion
                        }
                    }

                    return(new PacketResult(PacketOperationType.NOTHING));
                });
            }
        }