コード例 #1
0
        public static void Send(string source, QPacket p, IPEndPoint ep, UdpClient listener)
        {
            byte[]        data = p.toBuffer();
            StringBuilder sb   = new StringBuilder();

            foreach (byte b in data)
            {
                sb.Append(b.ToString("X2") + " ");
            }
            Log.WriteLine(5, "[" + source + "] send : " + p.ToStringShort());
            Log.WriteLine(10, "[" + source + "] send : " + sb.ToString());
            Log.WriteLine(10, "[" + source + "] send : " + p.ToStringDetailed());
            listener.Send(data, data.Length, ep);
            Log.LogPacket(true, data);
        }
コード例 #2
0
        public static void Send(UdpClient udp, QPacket p, ClientInfo client)
        {
            byte[]        data = p.toBuffer();
            StringBuilder sb   = new StringBuilder();

            foreach (byte b in data)
            {
                sb.Append(b.ToString("X2") + " ");
            }
            WriteLog(5, "send : " + p.ToStringShort());
            WriteLog(10, "send : " + sb.ToString());
            WriteLog(10, "send : " + p.ToStringDetailed());
            udp.Send(data, data.Length, client.ep);
            Log.LogPacket(true, data);
        }
コード例 #3
0
        public static void ProcessPacket(string source, byte[] data, IPEndPoint ep, UdpClient listener, uint serverPID, ushort listenPort, bool removeConnectPayload = false)
        {
            StringBuilder sb = new StringBuilder();

            foreach (byte b in data)
            {
                sb.Append(b.ToString("X2") + " ");
            }
            while (true)
            {
                QPacket      p    = new QPacket(data);
                MemoryStream m    = new MemoryStream(data);
                byte[]       buff = new byte[(int)p.realSize];
                m.Seek(0, 0);
                m.Read(buff, 0, buff.Length);
                Log.LogPacket(false, buff);
                Log.WriteLine(5, "[" + source + "] received : " + p.ToStringShort());
                Log.WriteLine(10, "[" + source + "] received : " + sb.ToString());
                Log.WriteLine(10, "[" + source + "] received : " + p.ToStringDetailed());
                QPacket    reply  = null;
                ClientInfo client = null;
                if (p.type != QPacket.PACKETTYPE.SYN && p.type != QPacket.PACKETTYPE.NATPING)
                {
                    client = Global.GetClientByIDrecv(p.m_uiSignature);
                }
                switch (p.type)
                {
                case QPacket.PACKETTYPE.SYN:
                    reply = QPacketHandler.ProcessSYN(p, ep, out client);
                    break;

                case QPacket.PACKETTYPE.CONNECT:
                    if (client != null && !p.flags.Contains(QPacket.PACKETFLAG.FLAG_ACK))
                    {
                        client.sPID  = serverPID;
                        client.sPort = listenPort;
                        if (removeConnectPayload)
                        {
                            p.payload     = new byte[0];
                            p.payloadSize = 0;
                        }
                        reply = QPacketHandler.ProcessCONNECT(client, p);
                    }
                    break;

                case QPacket.PACKETTYPE.DATA:
                    if (p.m_oSourceVPort.type == QPacket.STREAMTYPE.OldRVSec)
                    {
                        RMC.HandlePacket(listener, p);
                    }
                    if (p.m_oSourceVPort.type == QPacket.STREAMTYPE.DO)
                    {
                        DO.HandlePacket(listener, p);
                    }
                    break;

                case QPacket.PACKETTYPE.DISCONNECT:
                    if (client != null)
                    {
                        reply = QPacketHandler.ProcessDISCONNECT(client, p);
                    }
                    break;

                case QPacket.PACKETTYPE.PING:
                    if (client != null)
                    {
                        reply = QPacketHandler.ProcessPING(client, p);
                    }
                    break;

                case QPacket.PACKETTYPE.NATPING:
                    ulong time = BitConverter.ToUInt64(p.payload, 5);
                    if (timeToIgnore.Contains(time))
                    {
                        timeToIgnore.Remove(time);
                    }
                    else
                    {
                        reply = p;
                        m     = new MemoryStream();
                        byte b = (byte)(reply.payload[0] == 1 ? 0 : 1);
                        m.WriteByte(b);
                        Helper.WriteU32(m, 166202);     //RVCID
                        Helper.WriteU64(m, time);
                        reply.payload = m.ToArray();
                        Send(source, reply, ep, listener);
                        m = new MemoryStream();
                        b = (byte)(b == 1 ? 0 : 1);
                        m.WriteByte(b);
                        Helper.WriteU32(m, 166202);     //RVCID
                        time = Helper.MakeTimestamp();
                        timeToIgnore.Add(time);
                        Helper.WriteU64(m, Helper.MakeTimestamp());
                        reply.payload = m.ToArray();
                    }
                    break;
                }
                if (reply != null)
                {
                    Send(source, reply, ep, listener);
                }
                if (p.realSize != data.Length)
                {
                    m = new MemoryStream(data);
                    int    left    = (int)(data.Length - p.realSize);
                    byte[] newData = new byte[left];
                    m.Seek(p.realSize, 0);
                    m.Read(newData, 0, left);
                    data = newData;
                }
                else
                {
                    break;
                }
            }
        }
コード例 #4
0
ファイル: Log.cs プロジェクト: LeoCodes21/GRPBackendWV
        public static string MakeDetailedPacketLog(byte[] data, bool isSinglePacket = false)
        {
            StringBuilder sb = new StringBuilder();

            while (true)
            {
                QPacket qp = new QPacket(data);
                sb.AppendLine("##########################################################");
                sb.AppendLine(qp.ToStringDetailed());
                if (qp.type == QPacket.PACKETTYPE.DATA && qp.m_byPartNumber == 0)
                {
                    switch (qp.m_oSourceVPort.type)
                    {
                    case QPacket.STREAMTYPE.OldRVSec:
                        if (qp.flags.Contains(QPacket.PACKETFLAG.FLAG_ACK))
                        {
                            break;
                        }
                        sb.AppendLine("Trying to process RMC packet...");
                        try
                        {
                            MemoryStream m = new MemoryStream(qp.payload);
                            RMCP         p = new RMCP(qp);
                            m.Seek(p._afterProtocolOffset + 4, 0);
                            if (!p.isRequest)
                            {
                                m.ReadByte();
                            }
                            p.methodID = Helper.ReadU32(m);
                            sb.AppendLine("\tRMC Request  : " + p.isRequest);
                            sb.AppendLine("\tRMC Protocol : " + p.proto);
                            sb.AppendLine("\tRMC Method   : " + p.methodID.ToString("X"));
                            if (p.proto == RMCP.PROTOCOL.GlobalNotificationEventProtocol && p.methodID == 1)
                            {
                                sb.AppendLine("\t\tNotification :");
                                sb.AppendLine("\t\t\tSource".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                                uint type = Helper.ReadU32(m);
                                sb.AppendLine("\t\t\tType".PadRight(20) + ": " + (type / 1000));
                                sb.AppendLine("\t\t\tSubType".PadRight(20) + ": " + (type % 1000));
                                sb.AppendLine("\t\t\tParam 1".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                                sb.AppendLine("\t\t\tParam 2".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                                sb.AppendLine("\t\t\tParam String".PadRight(20) + ": " + Helper.ReadString(m));
                                sb.AppendLine("\t\t\tParam 3".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                            }
                            sb.AppendLine();
                        }
                        catch
                        {
                            sb.AppendLine("Error processing RMC packet");
                            sb.AppendLine();
                        }
                        break;

                    case QPacket.STREAMTYPE.DO:
                        if (qp.flags.Contains(QPacket.PACKETFLAG.FLAG_ACK))
                        {
                            break;
                        }
                        sb.AppendLine("Trying to unpack DO messages...");
                        try
                        {
                            MemoryStream m    = new MemoryStream(qp.payload);
                            uint         size = Helper.ReadU32(m);
                            byte[]       buff = new byte[size];
                            m.Read(buff, 0, (int)size);
                            DO.UnpackMessage(buff, 1, sb);
                            sb.AppendLine();
                        }
                        catch
                        {
                            sb.AppendLine("Error processing DO messages");
                            sb.AppendLine();
                        }
                        break;
                    }
                }
                int size2 = qp.toBuffer().Length;
                if (size2 == data.Length || isSinglePacket)
                {
                    break;
                }
                MemoryStream m2 = new MemoryStream(data);
                m2.Seek(size2, 0);
                size2 = (int)(m2.Length - m2.Position);
                if (size2 <= 8)
                {
                    break;
                }
                data = new byte[size2];
                m2.Write(data, 0, size2);
            }
            return(sb.ToString());
        }