private unsafe int WSARecv_Hook(IntPtr socket, ref WSABuffer buffer, int bufferCount, out int bytesTransferred, ref int socketFlags, IntPtr nativeOverlapped, IntPtr completionRoutine) { int result = Ws2_32.WSARecv(socket, ref buffer, bufferCount, out bytesTransferred, ref socketFlags, nativeOverlapped, completionRoutine); if (_socket == socket) { if (bytesTransferred > ushort.MaxValue || bytesTransferred == 0 || bufferCount != 1) { return(result); } _serverPackets++; byte[] data = buffer.Buffer.ExtractBuffer(bytesTransferred); switch (_serverPackets) { case 1: PacketController.Preinitialize(this, data); break; case 2: sKey1 = data; break; case 3: sKey2 = data; PacketController.Initialize(cKey1, cKey2, sKey1, sKey2); break; default: byte[] processed = PacketController.ProcessServerData(data); if (processed.Take(4).SequenceEqual(GameClient.C_SIGNATURE)) { Marshal.Copy(processed, 4, buffer.Buffer + bytesTransferred, processed.Length - 4); bytesTransferred += processed.Length - 4; } break; } } return(0); }
private unsafe int connect_Hook(IntPtr socket, ref IntPtr sockaddr, int addressLength) { if (_socket == IntPtr.Zero) { _socket = socket; } return(Ws2_32.connect(socket, ref sockaddr, addressLength)); }
private unsafe int closesocket_Hook(IntPtr socket) { if (socket == _socket) { _socket = IntPtr.Zero; _clientPackets = 0; _serverPackets = 0; PacketController.Finish(); } return(Ws2_32.closesocket(socket)); }
public unsafe int WsRecv_Hook(int socket, IntPtr buffer, int len, int flags) { int bytesRead = Ws2_32.recv(socket, buffer, len, flags); if (_pluginProxy != null && socket == ChatSocketListener.Socket) { byte[] trimmedBuffer = new byte[bytesRead]; Marshal.Copy(buffer, trimmedBuffer, 0, bytesRead); List <byte[]> packets = _chatSocketListener.ProcessBuffer(trimmedBuffer); foreach (byte[] packet in packets) { _pluginProxy.ChatRecv(packet); } } return(bytesRead); }
public static int Send(IntPtr s, IntPtr buf, int len, int flags) { string str = Marshal.PtrToStringAnsi(buf, len); if (str.StartsWith("GET ") || str.StartsWith("HEAD ")) { // str = str.Replace("/servserv/cnc3/", "/tsrgame/servserv/"); // str = str.Replace("Host: servserv.generals.ea.com", "Host: rising.cnc-source.com"); str = str.Replace("Host: na.llnet.eadownloads.ea.com", $"Host: {_updateServer}"); _tracer.TraceNote($"Sending '{str}'."); IntPtr pStr = Marshal.StringToHGlobalAnsi(str); int result = Ws2_32.Send(s, pStr, str.Length, flags); Marshal.FreeHGlobal(pStr); return(result); } _tracer.TraceNote($"{nameof(Send)} from 0x{EasyHook.HookRuntimeInfo.ReturnAddress.ToInt32():X8}"); // _tracer.TraceNote($"Sending unmodified '{str}'."); return(Ws2_32.Send(s, buf, len, flags)); }
private unsafe int send_Hook(IntPtr socket, IntPtr buffer, int length, int flags) { if (_socket == socket) { if (length > ushort.MaxValue || length == 0) { return(Ws2_32.send(socket, buffer, length, flags)); } _clientPackets++; byte[] data = buffer.ExtractBuffer(length); switch (_clientPackets) { case 1: cKey1 = data; break; case 2: cKey2 = data; break; default: return(PacketController.ProcessClientData(data)); } return(Ws2_32.send(socket, buffer, length, flags)); } return(Ws2_32.send(socket, buffer, length, flags)); }
public static unsafe IntPtr GetHostByName([In] string host) { _tracer.TraceInfo($"Got host request to: '{host}'."); IntPtr result = IntPtr.Zero; switch (host) { case "servserv.generals.ea.com": case "na.llnet.eadownloads.ea.com": host = _updateServer; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "bfme.fesl.ea.com": case "bfme2.fesl.ea.com": case "bfme2-ep1-pc.fesl.ea.com": case "cnc3-pc.fesl.ea.com": case "cnc3-ep1-pc.fesl.ea.com": case "cncra3-pc.fesl.ea.com": host = "login.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "gpcm.gamespy.com": host = "gpcm.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "peerchat.gamespy.com": host = "peerchat.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "lotrbme.available.gamespy.com": case "lotrbme.master.gamespy.com": case "lotrbme.ms13.gamespy.com": case "lotrbme2r.available.gamespy.com": case "lotrbme2r.master.gamespy.com": case "lotrbme2r.ms9.gamespy.com": case "ccgenerals.ms19.gamespy.com": case "ccgenzh.ms6.gamespy.com": case "cc3tibwars.available.gamespy.com": case "cc3tibwars.master.gamespy.com": case "cc3tibwars.ms17.gamespy.com": case "cc3xp1.available.gamespy.com": case "cc3xp1.master.gamespy.com": case "cc3xp1.ms18.gamespy.com": case "redalert3pc.available.gamespy.com": case "redalert3pc.master.gamespy.com": case "redalert3pc.ms1.gamespy.com": case "master.gamespy.com": host = "master.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "redalert3pc.natneg1.gamespy.com": case "redalert3pc.natneg2.gamespy.com": case "redalert3pc.natneg3.gamespy.com": host = "natneg.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "lotrbme.gamestats.gamespy.com": case "lotrbme2r.gamestats.gamespy.com": case "gamestats.gamespy.com": host = "gamestats.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "cc3tibwars.auth.pubsvs.gamespy.com": case "cc3tibwars.comp.pubsvs.gamespy.com": case "cc3tibwars.sake.gamespy.com": case "cc3xp1.auth.pubsvs.gamespy.com": case "cc3xp1.comp.pubsvs.gamespy.com": case "cc3xp1.sake.gamespy.com": case "redalert3pc.auth.pubsvs.gamespy.com": case "redalert3pc.comp.pubsvs.gamespy.com": case "redalert3pc.sake.gamespy.com": case "redalert3services.gamespy.com": case "psweb.gamespy.com": host = "sake.server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; case "lotrbfme.arenasdk.gamespy.com": case "arenasdk.gamespy.com": case "launch.gamespyarcade.com": case "www.gamespy.com": case "ingamead.gamespy.com": host = "server.cnc-online.net"; _tracer.TraceInfo($"Redirecting to: '{host}'."); break; } return(Ws2_32.GetHostByName(host)); }
public string GetComputerSiteNameManual(string dnsDomain, string dnsHostName) { this.logger.LogTrace("Attempting to query IP addresses for {host}", dnsHostName); IPAddress[] ipAddresses; try { ipAddresses = Dns.GetHostAddresses(dnsHostName); } catch (Exception ex) { this.logger.LogTrace(ex, "Unable to resolve DNS entry for {host}", dnsHostName); return(null); } if (ipAddresses.Length == 0) { return(null); } this.logger.LogTrace("Host {host} has addresses {addresses}", dnsHostName, string.Join(", ", ipAddresses.Select(t => t.ToString()))); List <Ws2_32.SOCKADDR> resolvedAddresses = new List <Ws2_32.SOCKADDR>(); Win32Error result; foreach (IPAddress ipAddress in ipAddresses.OrderBy(t => (int)t.AddressFamily)) { Ws2_32.SOCKADDR socketAddress; if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { socketAddress = new Ws2_32.SOCKADDR_IN(); } else if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { socketAddress = new Ws2_32.SOCKADDR_IN6(); } else { this.logger.LogTrace("Ignoring unknown address type {ipAddressFamily}", ipAddress.AddressFamily.ToString()); continue; } int length = socketAddress.Size; string addr = ipAddress.ToString(); result = Ws2_32.WSAStringToAddress(addr, (Ws2_32.ADDRESS_FAMILY)ipAddress.AddressFamily, IntPtr.Zero, socketAddress, ref length); if (result.Failed) { this.logger.LogTrace(result.GetException(), "WSAStringToAddress failed"); } resolvedAddresses.Add(socketAddress); } if (resolvedAddresses.Count == 0) { return(null); } var socketAddresses = new Ws2_32.SOCKET_ADDRESS[resolvedAddresses.Count]; for (int i = 0; i < resolvedAddresses.Count; i++) { socketAddresses[i].iSockaddrLength = resolvedAddresses[i].Size; socketAddresses[i].lpSockaddr = resolvedAddresses[i].DangerousGetHandle(); } NetApi32.SafeNetApiBuffer siteNames = null; this.FindDcAndExecuteWithRetry(dnsDomain, dc => { result = NetApi32.DsAddressToSiteNames(dc, (uint)socketAddresses.Length, socketAddresses, out siteNames); result.ThrowIfFailed("DsAddressToSiteNames failed"); }); if (siteNames == null || siteNames.IsInvalid) { return(null); } List <string> sites = siteNames.ToStringEnum(resolvedAddresses.Count).ToList(); string site = sites.FirstOrDefault(t => !string.IsNullOrWhiteSpace(t)); if (site == null) { this.logger.LogTrace("There was no site found for host {host} in domain {domain}", dnsHostName, dnsDomain); return(null); } this.logger.LogTrace("Selecting site {site} from site list {sites}", site, string.Join(", ", sites)); return(site); }
public unsafe int SendToServer(byte[] buffer) { fixed(byte *uBuffer = buffer) return(Ws2_32.send(_socket, (IntPtr)uBuffer, buffer.Length, 0)); }