示例#1
0
        void IClientPacket.ExecutePacket(AsyncConnection connection, ByteBuffer packet)
        {
            uint id = packet.ReadObjectIDRev();
            int namelen = packet.ReadInt();
            string name = "";
            for (int i = 0; i < namelen; i++)
            {
                name += (char)packet.ReadByte();
            }
            packet.ReadInt(); packet.ReadInt();
            packet.ReadInt();

            uint CHARSPEC1 = packet.ReadUInt();
            byte CHARSPEC2 = (byte)packet.ReadByte();

            packet.ReadBytes(36);

            uint CHARSPECAPP1 = packet.ReadUInt();
            uint CHARSPECAPP2 = packet.ReadUInt();
            uint CHARSPECAPP3 = packet.ReadUInt();
            ushort CHARSPECAPP4 = packet.ReadUShort();

            packet.ReadByte(); // separator

            byte[] classBytes = packet.ReadBytes(8);
            Array.Reverse(classBytes);
            ulong classNodeRefId = BitConverter.ToUInt64(classBytes, 0);

            Console.WriteLine("----- Creating Character -----");
            Console.WriteLine("Name = " + name);
            Console.WriteLine("Class ID = " + classNodeRefId);
            Console.WriteLine("App1 = " + CHARSPECAPP1);
            Console.WriteLine("App2 = " + CHARSPECAPP2);
            Console.WriteLine("App3 = " + CHARSPECAPP3);
            Console.WriteLine("App4 = " + CHARSPECAPP4);

            /*byte[] known_offs = new byte[] { 84, 88, 91, 92, 95, 96, 100, 104, 107, 108, 112 };
            long originalPositon = packet.Position;
            byte[] thispkt = packet.ReadBytes((int)(packet.Length - packet.Position));
            packet.Position = originalPositon;

            if (lastpacket != null)
            {

                for (byte i = 0; i < thispkt.Length; i++)
                {
                    if (lastpacket[i] != thispkt[i] && !known_offs.Contains<byte>(i))
                        Console.WriteLine("Data differs at " + i + " : " + lastpacket[i] + " => " + thispkt[i]);
                }
            }

            lastpacket = thispkt;*/

            Character c = new Character()
            {
                //APP1 = CHARSPECAPP1,
                //APP2 = CHARSPECAPP2,
                //APP3 = CHARSPECAPP3,
                //APP4 = CHARSPECAPP4,
                AreaSpec = TORBusiness.Data.MapAreas.PCShip_XSFreighter,
                Class = (CharacterClass)classNodeRefId,
                Level = 44,
                Name = name,
                spec2 = CHARSPEC1,
                spec3 = CHARSPEC2,
            };

            packet.ReadBytes(78);
            packet.ReadByte();
            byte appDataCount = (byte)packet.ReadByte();
            c.Appearance = new Tuple<byte, byte>[appDataCount];
            packet.ReadByte();
            Console.WriteLine("appearance entries: " + appDataCount);
            for (int i = 0; i < appDataCount; i++)
            {
                byte[] data = packet.ReadBytes(4);
                c.Appearance[i] = new Tuple<byte, byte>(data[0], data[3]);
                Console.WriteLine("Appearance = " + data[3]);
            }

            Program.LastCreatedChar = c;

            connection.SendPacket(new SMsg_CharacterCreateResponse(id, name, 0x07));
        }
示例#2
0
        static void Main(string[] args)
        {
            Console.Title = "Nexus Shard Server";

            Console.WriteLine("Nexus Shard Server\n");
            Utility.WriteLegal();
            Console.WriteLine("");

            AsyncServer server = new AsyncServer(IPAddress.Parse("0.0.0.0"), 20063);
            server.Start();

            server.ConnectionAccepted += new AsyncServer.ConnectionAcceptedHandler(connection =>
            {
                TORLog.Network("CnxAccept => " + connection.GetHashCode());
                connection.DataReceived += new AsyncConnection.ConnectionDataReceivedHandler(data =>
                {
                    if (connection.State == 1)
                    {
                        // rsa packet
                        connection.SetState(2);
                        connection.SendPacket(new SMsg_ClientSignatureRequest("OmegaServerProxyObjectName", 0x0174F5));
                        return;
                    }

                    ByteBuffer buffer = new ByteBuffer(ByteOrder.LittleEndian, data);
                    byte opcode = (byte)buffer.ReadByte();

                    byte[] len_data = buffer.ReadBytes(4);
                    byte chk = (byte)buffer.ReadByte();
                    uint packetid = buffer.ReadUInt();

                    if (chk != (byte)(opcode ^ len_data[0] ^ len_data[1] ^ len_data[2] ^ len_data[3]))
                    {
                        TORLog.Warn("Received packet with invalid checksum!");
                    }

                    if (opcode == 1) // Client Ping Packet
                    {
                        TORLog.Network("Ping from " + connection.GetHashCode() + " Seq = " + packetid);
                        ByteBuffer response = new ByteBuffer(ByteOrder.LittleEndian);
                        response.WriteByte(2); // Pong OPC = 2
                        response.WriteInt(0); // Pong Len
                        response.WriteByte(0); // Pong Chk
                        response.WriteUInt(packetid); // Pong
                        response.WriteInt(0);
                        response.WriteInt(1);
                        response.WriteByte(0);
                        connection.SendTORPacket(response);
                        return;
                    }

                    string packetname = OpcodeManager.Instance.GetPacketName(opcode, packetid);

                    if (packetname == "")
                    {
                        TORLog.Warn("Received unknown packet from SWTOR client\nOpcode = 0x" + opcode.ToString("X2") + " -- PacketID = 0x" + packetid.ToString("X8"));
                        TORLog.Warn("--- dump ---");
                        TORLog.Warn(Utility.HexDump(data));
                    }
                    else
                    {
                        try
                        {
                            IClientPacket pkt = Activator.CreateInstance(Type.GetType("ShardServer.Packets.Client." + packetname)) as IClientPacket;
                            TORLog.Network("PktRecv @ " + connection.GetHashCode() + " << " + packetname);
                            pkt.ExecutePacket(connection, buffer);
                        }
                        catch (Exception ex)
                        {
                            TORLog.Error("Exception occured while processing " + packetname, ex);
                        }
                    }
                });
                // Send HELLO packet
                connection.SendClear(new byte[] { 0x03, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
                // State is 1
                connection.SetState(1);
                connection.EngageReading();
            });

            TORLog.Info("SHARD Server running, press Enter to exit ...");
            Console.ReadLine();
        }
示例#3
0
        public static void ProcessPacket(byte[] data, AsyncConnection connection)
        {
            AsyncConnectionData acd = (connection.AsyncState as AsyncConnectionData);
            ByteBuffer buffer = new ByteBuffer(ByteOrder.LittleEndian, data, 6, data.Length - 6); // 1 opcode 4 len 1 chk
            if (connection.State == 1)
            {
                buffer.ReadInt();
                string rsaBytes = Encoding.UTF8.GetString(buffer.ReadBytes(1024));
                byte[] rsa = new byte[512];
                for (int i = 0; i < rsaBytes.Length; i += 2)
                {
                    rsa[i / 2] = byte.Parse(rsaBytes.Substring(i, 2), NumberStyles.HexNumber);
                }
                uint resultSize = 0;
                IntPtr ptr = TRSADecrypt(rsa, 512, ref resultSize);
                byte[] decrypted = new byte[resultSize];
                Marshal.Copy(ptr, decrypted, 0, (int)resultSize);
                Console.WriteLine("Decrypted Size = " + resultSize);
                Console.WriteLine(Utility.HexDump(decrypted));

                // set salsa keys
                ByteBuffer packetbuffer = new ByteBuffer(ByteOrder.LittleEndian, decrypted);
                string username = packetbuffer.ReadString();
                string hash = packetbuffer.ReadString();

                byte[] key1 = packetbuffer.ReadBytes(32);
                byte[] key2 = packetbuffer.ReadBytes(32); // decrypts client
                byte[] iv1 = packetbuffer.ReadBytes(8);
                byte[] iv2 = packetbuffer.ReadBytes(8); // decrypts client

                connection.CipheredStream.EnableEncryption(key2, iv2, key1, iv1);

                connection.SetState(2); // State 2 = Ready to decrypt
            }
            else
            {
                switch(data.Length)
                {
                    case 14: // discarded client packet
                        break;
                    case 45:
                        byte[] response_45 = new byte[]
                            {
                                0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0xAF, 0xC5, 0x31, 0x67, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x63, 0x61,
                                0x73, 0x74, 0x6C, 0x65, 0x68, 0x69, 0x6C, 0x6C, 0x74, 0x65, 0x73, 0x74, 0x00, 0x09, 0x00, 0x00,
                                0x00, 0x61, 0x66, 0x63, 0x31, 0x62, 0x62, 0x35, 0x61, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x6C, 0x6F,
                                0x67, 0x69, 0x6E, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
                                0x00, 0x00,
                            };
                        connection.SendRegularPacket(response_45);
                        break;
                    case 126: //omega packet
                        ByteBuffer pkt_omega = new ByteBuffer(ByteOrder.LittleEndian);
                        pkt_omega.WriteBytes(new byte[] {
                            0x00, 0x60, // Length
                            0x00, 0x00, 0x00, 0x60, // Length
                            0x84, 0xD0, 0xF2, 0x90, // PacketID (with client hack)
                            0x04, 0x00, 0x00, 0x00 // ObjectCode
                        });
                        pkt_omega.WriteString("swtor-game-lab-1.swtor.com:20063"); // Server Address
                        pkt_omega.WriteString("WIKRQEOYULPBIEHHADRWAAPNVRYGQHMNRXGHBUIV"); // Some key ?

                        Console.WriteLine(Utility.HexDump(pkt_omega.ToArray()));

                        connection.SendRegularPacket(pkt_omega.ToArray());
                        break;
                    default:
                        Console.WriteLine("recv packet, size = " + data.Length);
                        Console.WriteLine(Utility.HexDump(data));
                        break;
                }

                /*List<byte[]> packets = acd.Crypter.ProcessServerFromClient(data);

                foreach (byte[] packet in packets)
                {
                    ByteBuffer pkt = new ByteBuffer(ByteOrder.BigEndian, packet);
                    short opcode = pkt.ReadShort();
                    int length = pkt.ReadInt();

                    switch (opcode)
                    {
                        case 45:
                            // Client Selecting a Shard Server
                            Console.WriteLine(connection.GetHashCode() + " selecting shard.");
                            MemoryStream response_45 = new MemoryStream(new byte[]
                            {
                                0x00, 0x48, 0x0, 0x00, 0x00, 0x48, 0xAF, 0xC5, 0x31, 0x67, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x63, 0x61,
                                0x73, 0x74, 0x6C, 0x65, 0x68, 0x69, 0x6C, 0x6C, 0x74, 0x65, 0x73, 0x74, 0x00, 0x09, 0x00, 0x00,
                                0x00, 0x61, 0x66, 0x63, 0x31, 0x62, 0x62, 0x35, 0x61, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x6C, 0x6F,
                                0x67, 0x69, 0x6E, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
                                0x00, 0x00,
                            });
                            SendPacket(connection, response_45);
                            break;
                        default:
                            Console.WriteLine("PKTRECV Opcode = " + opcode + " Size = " + length);
                            Console.WriteLine("Hex Dump = " + Utility.ToHexString(pkt, true));
                            Console.WriteLine("String Dump = " + Encoding.UTF8.GetString(pkt.ToArray()));
                            break;
                    }
                }*/
            }
        }