示例#1
0
文件: DllMain.cs 项目: itsreiji/Terax
        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);
        }
示例#2
0
文件: DllMain.cs 项目: itsreiji/Terax
 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));
 }
示例#3
0
文件: DllMain.cs 项目: itsreiji/Terax
 private unsafe int closesocket_Hook(IntPtr socket)
 {
     if (socket == _socket)
     {
         _socket        = IntPtr.Zero;
         _clientPackets = 0;
         _serverPackets = 0;
         PacketController.Finish();
     }
     return(Ws2_32.closesocket(socket));
 }
示例#4
0
        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);
        }
示例#5
0
        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));
        }
示例#6
0
文件: DllMain.cs 项目: itsreiji/Terax
        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));
        }
示例#7
0
        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));
        }
示例#8
0
        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);
        }
示例#9
0
文件: DllMain.cs 项目: itsreiji/Terax
 public unsafe int SendToServer(byte[] buffer) { fixed(byte *uBuffer = buffer) return(Ws2_32.send(_socket, (IntPtr)uBuffer, buffer.Length, 0)); }