private static unsafe void OnClientReceive(WinsockClient Socket, byte[] Packet, int Length) { AuthClient Client = Socket.Wrapper as AuthClient; Client.Decrypt(Packet); fixed(byte *pPacket = Packet) { ushort Size = *(ushort *)pPacket; ushort Type = *(ushort *)(pPacket + 2); HexDump(Packet, "Client -> Server", Size, Type); switch (Type) { case 0x41B: { AuthRequest *Request = (AuthRequest *)pPacket; string Username = new string(Request->Username, 0, 16).Trim('\x00'); string Password = PasswordCipher.Decrypt((uint *)Request->Password); string Server = new string(Request->Server, 0, 16).Trim('\x00'); string Address = ""; if (Database.ServerExists(Server, out Address)) { if (Database.AccountExists(Username, Password, Client)) { #if LOCAL_VERSION IPHostEntry entry = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress address in entry.AddressList) { if (address.AddressFamily == AddressFamily.InterNetwork) { string local_ip = address.ToString(); if (local_ip.StartsWith("10")) { Address = local_ip; break; } } } #endif SendAuthResponse(Client, Address, 5816); } else { SendAuthReject(Client, InvalidCredentials()); //Client.Disconnect(); } } } break; } } }
private static unsafe void SendAuthReject(AuthClient Client, byte[] Payload) { AuthResponse *Response = stackalloc AuthResponse[1]; Response->Size = (ushort)sizeof(AuthResponse); Response->Type = 0x41F; Response->AccountID = 0; Response->LoginToken = 1; for (int i = 0; i < 16; i++) { if (i >= Payload.Length) { Response->Address[i] = 0; } else { Response->Address[i] = (sbyte)Payload[i]; } } Client.Send(Response, Response->Size); }
private static unsafe void SendAuthResponse(AuthClient Client, string Address, ushort Port) { AuthResponse* Response = stackalloc AuthResponse[1]; Response->Size = (ushort)sizeof(AuthResponse); Response->Type = 0x41F; Response->AccountID = Client.GetAccountID(); uint Token = Response->AccountID | 0xAABB; Token = Response->AccountID << 8 | Response->AccountID; Token ^= 0x4321; Token = Token << 8 | Token; Response->LoginToken = Token; Response->Port = Port; for (int i = 0; i < 16; i++) { if (i >= Address.Length) Response->Address[i] = 0; else Response->Address[i] = (sbyte)Address[i]; } Client.Send(Response, Response->Size); }
private static unsafe void SendAuthReject(AuthClient Client, byte[] Payload) { AuthResponse* Response = stackalloc AuthResponse[1]; Response->Size = (ushort)sizeof(AuthResponse); Response->Type = 0x41F; Response->AccountID = 0; Response->LoginToken = 1; for (int i = 0; i < 16; i++) { if (i >= Payload.Length) Response->Address[i] = 0; else Response->Address[i] = (sbyte)Payload[i]; } Client.Send(Response, Response->Size); }