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() }); }
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)); }
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)); }); } }