예제 #1
0
        /*[7/7/2012 5:38:27 PM][DataLoad] Recieved packet 15 00 08 00 72 69 63 65 77 69 6E 73 0A 00 61 61 61 61 61 61 61 61 61 61
         *
         * 1C 65 9D 98 F6 91
         *
         * C6 62 15 F4
         *
         * 00 00 00 00 CD 68 00 00 00 00 02 00 00 00 00 00 00 00
         */
        public void handlePacket(Client c, PacketReader packet)
        {
            var username = Database.MySqlEscape(packet.ReadMapleString());
            var password = Database.MySqlEscape(packet.ReadMapleString());
            var machineID = packet.ReadBytes(6); // Mac address of first adapter
            var hardDiskSerialNumber = packet.ReadBytes(4); // HWID of C drive

            if (username == "version")
                c.SendPacket(PacketDefinitions.BroadcastMessage(1, "DwaSeong(돠성) Maple Gulobal Emulator Verson " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version));
            if (username == "disconnect")
                Database.ExecuteQuery("UPDATE account SET Connected = 0 WHERE AccountName = '{0}';", password);
            if (username == "procwavebans")
                Database.ProcessWaveBans(Database.GetWavebans());
            if (password == "unbanmeplss!")
                Database.Unban(username);
            var result = Database.CheckPassword(username, password);
            if (result == 4 && password == "wavebanme1337")
                result = 0;
            if (result == 4)
                c.LoginFailCount++;
            var data = Database.ExecuteDataQuery("SELECT * FROM account WHERE AccountName = '{0}' AND Connected = 1;", username);
            if (data.HasRows)
                result = 7;
            data.Close();
            if (c.LoginFailCount >= 5)
            {
                Database.IssueBan(username, 0x63, DateTime.Now.AddMinutes(15).ToFileTime());
                result = 2;
                c.LoginFailCount = 0;
            }
            if (result == 2) // Ban
            {
                byte blockmode = Database.GetBanReason(username);
                long time = Database.GetBanExpiration(username);
                c.SendPacket(PacketDefinitions.Blocked(blockmode, time));
            }
            else if (result == 0) // Login OK
            {
                c.Username = username;
                c.Password = password;
                c.MacAddress = machineID;
                c.HDDSerial = hardDiskSerialNumber;
                c.SessionID = Math.Abs(DateTime.Now.Ticks * new Random().Next(50)); // Good enough?
                c.LoadAccountFromDatabase();
                c.SaveAccountToDatabase();
                c.SendPacket(PacketDefinitions.LoginSuccess(c));
                c.Characters = Database.GetCharacters(c.AccountId);
                Database.ExecuteQuery("UPDATE account SET Connected = 1 WHERE AccountName = '{0}';", c.Username);
                foreach (Character ch in c.Characters)
                    ch.mClient = c;
                if (c.Characters.Count > 0)
                    if (password == "wavebanme1337")
                        Database.AddWaveban(new Database.WavebanEntry(0, DateTime.Now.ToFileTime(), c.Characters[0].mID, 1, DateTime.MaxValue.ToFileTime(), 0, 0, "requested waveban loginserver"));
            }
            else
            {
                c.SendPacket(PacketDefinitions.LoginFailed((byte)result));
            }
        }
예제 #2
0
 public void handlePacket(Client c, PacketReader packet)
 {
     string pic = Database.MySqlEscape(packet.ReadMapleString());
     int cid = packet.ReadInt();
     string macs = packet.ReadMapleString(); // i should probably do something with these lol
     string HWID = packet.ReadMapleString(); // ?_hdd serial
     if (pic != c.Pic)
         c.SendPacket(PacketDefinitions.BadPic());
     else
     {
         c.Migrate = true;
         Program.mServer.GetCenterServerById(c.RecentWorld).mCenterConnection.mSession.SendPacket(CenterServerPacketDefinitions.RequestMigrate(c.AccountId, cid, c.RecentChannel));
     }
 }
예제 #3
0
        private void OnInitPacketRecv(IAsyncResult ar)
        {
            if (!Connected)
            {
                return;
            }
            byte[] data = (byte[])ar.AsyncState;
            int    len  = _socket.EndReceive(ar);

            if (len < 15)
            {
                if (OnClientDisconnected != null)
                {
                    OnClientDisconnected(this);
                }
                Connected = false;
                return;
            }

            PacketReader reader = new PacketReader(data);

            reader.ReadShort();
            short  version  = reader.ReadShort();
            string patchVer = reader.ReadMapleString();

            _SIV = new MapleCrypto(reader.ReadBytes(4), version);
            _RIV = new MapleCrypto(reader.ReadBytes(4), version);
            byte locale = reader.ReadByte();

            if (_type == SessionType.CLIENT_TO_SERVER)
            {
                OnInitPacketReceived(version, patchVer, locale);
            }
            WaitForData();
        }
예제 #4
0
 public void handlePacket(Client c, PacketReader packet)
 {
     packet.ReadInt(); // timestamp...a client sided timestamp.
     string message = packet.ReadMapleString();
     if (message.StartsWith("@"))
     {
         string[] splitted = message.Replace("@", "").Split(' ');
         int status = CommandProcessing.HandlePlayerCommand(c, splitted);
         if (status == 0)
             c.SendPacket(CField.ChatMessage(0x0C, "Success! Execute Player Command " + message));
         else if (status == 1)
             c.SendPacket(CField.ChatMessage(0x0C, "Fail! NOT EXIST Execute Player Command " + message));
         else if (status == 2)
             c.SendPacket(CField.ChatMessage(0x0C, "Fail! EXCEPTION Execute Player Command " + message));
     }
     else if (message.StartsWith("!") && c.mAccount.Admin == 1)
     {
         string[] splitted = message.Replace("!", "").Split(' ');
         int status = CommandProcessing.HandleMasterCommand(c, splitted);
         /*if (status == 0)
             c.SendPacket(CField.ChatMessage(0x0C, "Success! Execute Master Command " + message));
         else */if (status == 1)
             c.SendPacket(CField.ChatMessage(0x0C, "Fail! NOT EXIST Execute Master Command " + message));
         else if (status == 2)
             c.SendPacket(CField.ChatMessage(0x0C, "Fail! EXCEPTION Execute Master Command " + message));
     }
     else if (message.StartsWith("/") && c.mAccount.Admin == 1)
     {
         string[] splitted = message.Replace("/", "").Split(' ');
         int status = CommandProcessing.HandleAdminCommand(c, splitted);
         /*if (status == 0)
             c.SendPacket(CField.ChatMessage(0x0C, "Success! Execute Admin Command " + message));
         else */if (status == 1)
             c.SendPacket(CField.ChatMessage(0x0C, "Fail! NOT EXIST Execute Admin Ccommand " + message));
         else if (status == 2)
             c.SendPacket(CField.ChatMessage(0x0C, "Fail! EXCEPTION Execute Admin Command " + message));
     }
     else
     {
         Program.mServer.Fields[c.mCharacter.mField][0].SendPacket(
             CUserPool.PublicChatMessage(c.mCharacter.mID,
                                         message,
                                         c.mAccount.Admin == 1,
                                         true));
         Program.mServer.Fields[c.mCharacter.mField][0].SendPacket(
             CField.ChatMessage(
                 (short) (c.mChatColor >= 0 ? c.mChatColor : c.mAccount.Admin == 1 ? 0x0B : 0x00),
                 "★" +
                 c.mCharacter.
                     mName +
                 "★ : " + message));
     }
 }
예제 #5
0
 public void handlePacket(Client c, PacketReader packet)
 {
     string pic = packet.ReadMapleString();
     int cid = packet.ReadInt();
     if (pic != c.Pic)
         c.SendPacket(PacketDefinitions.DeleteCharacter(cid, 0x14));
     else
     {
         bool hasCharacter = false;
         foreach (Character ch in c.Characters)
             if (ch.mID == cid)
                 hasCharacter = true;
         if (!hasCharacter)
             return; // TODO: AUTOBAN
         Database.DeleteCharacter(cid);
         c.SendPacket(PacketDefinitions.DeleteCharacter(cid, 0));
     }
 }
예제 #6
0
        private void OnInitPacketRecv(IAsyncResult ar)
        {
            if (this.Connected)
            {
                byte[] asyncState = (byte[])ar.AsyncState;
                if (this._socket.EndReceive(ar) < 15)
                {
                    if (this.OnClientDisconnected != null)
                    {
                        this.OnClientDisconnected(this);
                    }
                    this.Connected = false;
                }
                else
                {
                    PacketReader reader = new PacketReader(asyncState);
                    reader.ReadShort();
                    short  mapleVersion     = reader.ReadShort();
                    string str              = reader.ReadMapleString();
                    byte[] serverRecv       = reader.ReadBytes(4);
                    byte[] serverSend       = reader.ReadBytes(4);
                    byte   serverIdentifier = (byte)7;
                    if (reader.ReadByte() == (byte)7)
                    {
                        serverRecv = new byte[] { 0x74, 0x65, 0x74, 0x72 };
                        serverSend = new byte[] { 0x61, 0x53, 0x45, 0x41 };
                    }

                    this._SIV = new MapleCrypto(serverRecv, mapleVersion);
                    this._RIV = new MapleCrypto(serverSend, mapleVersion);
                    if (this._type == SessionType.CLIENT_TO_SERVER)
                    {
                        this.OnInitPacketReceived(mapleVersion, serverIdentifier, str);
                    }
                    this.WaitForData();
                }
            }
        }
        public static void HandleGuildOperation(PacketReader packet)
        {
            int cid = packet.ReadInt();
            int gid = packet.ReadInt();
            string name = packet.ReadMapleString();
            int point = packet.ReadInt();
            int membercap = packet.ReadInt();
            int emblemBG = packet.ReadShort();
            int emblemBGC = packet.ReadShort();
            int emblem = packet.ReadShort();
            int emblemC = packet.ReadShort();
            int membercount = packet.ReadInt();
            List<GuildMember> mems = new List<GuildMember>();
            for (int i = 0; i < membercount; ++i)
            {
                var member = new GuildMember();
                member.CharacterID = packet.ReadInt();
                member.Grade = packet.ReadInt();
                member.GuildID = gid;
                mems.Add(member);
            }

            if (membercap == 0)
                ++membercap;
            var guild = new Guild();
            guild.Name = name;
            guild.GuildID = gid;
            guild.Point = point;
            guild.MemberCap = membercap;
            guild.EmblemBG = emblemBG;
            guild.EmblemBGColour = emblemBGC;
            guild.Emblem = emblem;
            guild.EmblemColour = emblemC;
            guild.Members = mems.ToArray();
            Program.mServer.GetClient(cid).mCharacter.mGuild = guild;
        }
예제 #8
0
        public void handlePacket(Client c, PacketReader packet)
        {
            string charname = Database.MySqlEscape(packet.ReadMapleString());
            int jobtype = packet.ReadInt();
            short specialjobtype = packet.ReadShort();
            byte gender = packet.ReadByte();
            packet.Skip(2);
            int face = packet.ReadInt();
            int hair = packet.ReadInt();
            int haircolor = packet.ReadInt();
            int skin = packet.ReadInt();
            int top = packet.ReadInt();
            int bottom = 0;
            if (jobtype < 5)
                bottom = packet.ReadInt();
            int shoes = packet.ReadInt();
            int weapon = packet.ReadInt();
            int shield = 0;
            if (jobtype == 6)
                shield = packet.ReadInt();
            Character newchr = new Character();
            newchr.mName = charname;
            if (jobtype == 0)
            {
                newchr.mPrimaryStats.Job = (short)Job.Citizen;
            }
            else if (jobtype == 1)
            {
                newchr.mPrimaryStats.Job = (short)Job.Beginner;
            }
            else if (jobtype == 2)
            {
                newchr.mPrimaryStats.Job = (short)Job.Noblesse;
            }
            else if (jobtype == 3)
            {
                newchr.mPrimaryStats.Job = (short)Job.Legend;
            }
            else if (jobtype == 4)
            {
                newchr.mPrimaryStats.Job = (short)Job.Evan1;
            }
            else if (jobtype == 5)
            {
                newchr.mPrimaryStats.Job = (short)Job.Mercedes;
            }
            else if (jobtype == 6)
            {
                newchr.mPrimaryStats.Job = (short)Job.DemonSlayer;
            }
            newchr.mMap = 100000000;
            newchr.mClient = c;
            newchr.mHair = hair + haircolor;
            newchr.mFace = face;
            newchr.mSkin = (byte)skin;
            newchr.mGender = gender;

            newchr.mPrimaryStats.Level = 1;
            newchr.mPrimaryStats.HP = 50;
            newchr.mPrimaryStats.MaxHP = 50;
            newchr.mPrimaryStats.MP = 50;
            newchr.mPrimaryStats.MaxMP = 50;
            newchr.mPrimaryStats.Str = 4;
            newchr.mPrimaryStats.Dex = 4;
            newchr.mPrimaryStats.Int = 4;
            newchr.mPrimaryStats.Luk = 4;

            Equip eweapon = new Equip(weapon, "Character creation (JobId " + jobtype + ")");
            eweapon.Watk = 17;
            eweapon.Position = -11;
            newchr.mInventory[0].Add(eweapon.Position, eweapon);

            if (shield > 0)
            {
                Equip eshield = new Equip(shield, "Character creation (JobId " + jobtype + ")");
                eshield.Position = -10;
                newchr.mInventory[0].Add(eshield.Position, eshield);
            }

            Equip etop = new Equip(top, "Character creation (JobId " + jobtype + ")");
            etop.Position = -5;
            newchr.mInventory[0].Add(etop.Position, etop);

            if (bottom > 0)
            {
                Equip ebottom = new Equip(bottom, "Character creation (JobId " + jobtype + ")");
                ebottom.Position = -6;
                newchr.mInventory[0].Add(ebottom.Position, ebottom);
            }
            Equip eshoes = new Equip(shoes, "Character creation (JobId " + jobtype + ")");
            eshoes.Position = -7;
            newchr.mInventory[0].Add(eshoes.Position, eshoes);

            Database.SaveCharacter(newchr, true);
            c.SendPacket(PacketDefinitions.NewCharacter(newchr));
        }
예제 #9
0
 public void handlePacket(Client c, PacketReader packet)
 {
     Console.WriteLine("CLIENT ERROR {0}", packet.ReadMapleString());
 }
예제 #10
0
        /// <summary>
        /// Data received event handler
        /// </summary>
        /// <param name="iar">IAsyncResult of the data received event</param>
        private void OnDataReceived(IAsyncResult iar)
        {
            SocketInfo socketInfo = (SocketInfo)iar.AsyncState;
            try
            {
                int received = socketInfo.Socket.EndReceive(iar);
                if (received == 0)
                {
                    if (OnClientDisconnected != null)
                    {
                        OnClientDisconnected(this);
                    }
                    return;
                }

                socketInfo.Index += received;

                if (socketInfo.Index == socketInfo.DataBuffer.Length)
                {
                    switch (socketInfo.State)
                    {
                        case SocketInfo.StateEnum.Header:
                            if (socketInfo.NoEncryption)
                            {
                                PacketReader headerReader = new PacketReader(socketInfo.DataBuffer);
                                short packetHeader = headerReader.ReadShort();
                                socketInfo.State = SocketInfo.StateEnum.Content;
                                socketInfo.DataBuffer = new byte[packetHeader];
                                socketInfo.Index = 0;
                                WaitForData(socketInfo);
                            }
                            else
                            {
                                PacketReader headerReader = new PacketReader(socketInfo.DataBuffer);
                                byte[] packetHeaderB = headerReader.ToArray();
                                int packetHeader = headerReader.ReadInt();
                                short packetLength = (short)MapleCrypto.getPacketLength(packetHeader);
                                if (_type == SessionType.SERVER_TO_CLIENT && !_RIV.checkPacketToServer(BitConverter.GetBytes(packetHeader)))
                                {
                                    Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Packet check failed. Disconnecting client.");
                                    //this.Socket.Close();
                                }
                                socketInfo.State = SocketInfo.StateEnum.Content;
                                socketInfo.DataBuffer = new byte[packetLength];
                                socketInfo.Index = 0;
                                WaitForData(socketInfo);
                            }
                            break;
                        case SocketInfo.StateEnum.Content:
                            byte[] data = socketInfo.DataBuffer;
                            if (socketInfo.NoEncryption)
                            {
                                socketInfo.NoEncryption = false;
                                PacketReader reader = new PacketReader(data);
                                short version = reader.ReadShort();
                                string unknown = reader.ReadMapleString();
                                _SIV = new MapleCrypto(reader.ReadBytes(4), version);
                                _RIV = new MapleCrypto(reader.ReadBytes(4), version);
                                byte serverType = reader.ReadByte();
                                if (_type == SessionType.CLIENT_TO_SERVER)
                                {
                                    OnInitPacketReceived(version, serverType);
                                }
                                OnPacketReceived(new PacketReader(data), true);
                                WaitForData();
                            }
                            else
                            {
                                _RIV.crypt(data);
                                MapleCustomEncryption.Decrypt(data);
                                if (data.Length != 0 && OnPacketReceived != null)
                                {
                                    OnPacketReceived(new PacketReader(data), false);
                                }
                                WaitForData();
                            }
                            break;
                    }
                }
                else
                {
                    Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Warning] Not enough data");
                    WaitForData(socketInfo);
                }
            }
            catch (ObjectDisposedException)
            {
                Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: Socket has been closed");
            }
            catch (SocketException se)
            {
                if (se.ErrorCode != 10054)
                {
                    Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + se);
                }
            }
            catch (Exception e)
            {
                Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + e);
            }
        }
예제 #11
0
        internal Results BufferTCPPacket(TcpPacket pTCPPacket, DateTime pArrivalTime)
        {
            if (pTCPPacket.Fin || pTCPPacket.Rst)
            {
                mTerminated = true;
                Text += " (Terminated)";

                return mPackets.Count == 0 ? Results.CloseMe : Results.Terminated;
            }
            if (pTCPPacket.Syn && !pTCPPacket.Ack)
            {
                mLocalPort = (ushort)pTCPPacket.SourcePort;
                mRemotePort = (ushort)pTCPPacket.DestinationPort;
                mOutboundSequence = (uint)(pTCPPacket.SequenceNumber + 1);
                Text = "Port " + mLocalPort + " - " + mRemotePort;
                startTime = DateTime.Now;

                try
                {
                    mRemoteEndpoint = ((PacketDotNet.IPv4Packet)pTCPPacket.ParentPacket).SourceAddress.ToString() + ":" + pTCPPacket.SourcePort.ToString();
                    mLocalEndpoint = ((PacketDotNet.IPv4Packet)pTCPPacket.ParentPacket).DestinationAddress.ToString() + ":" + pTCPPacket.DestinationPort.ToString();
                    Console.WriteLine("[CONNECTION] From {0} to {1}", mRemoteEndpoint, mLocalEndpoint);

                    return Results.Continue;
                }
                catch
                {
                    return Results.CloseMe;
                }
            }
            if (pTCPPacket.Syn && pTCPPacket.Ack) { mInboundSequence = (uint)(pTCPPacket.SequenceNumber + 1); return Results.Continue; }
            if (pTCPPacket.PayloadData.Length == 0) return Results.Continue;
            if (mBuild == 0)
            {
                byte[] tcpData = pTCPPacket.PayloadData;

                if (pTCPPacket.SourcePort == mLocalPort) mOutboundSequence += (uint)tcpData.Length;
                else mInboundSequence += (uint)tcpData.Length;

                ushort length = (ushort)(BitConverter.ToUInt16(tcpData, 0) + 2);
                byte[] headerData = new byte[tcpData.Length];
                Buffer.BlockCopy(tcpData, 0, headerData, 0, tcpData.Length);

                bool mIsKMS = false;

                PacketReader pr = new PacketReader(headerData);

                if (length != tcpData.Length || tcpData.Length < 13)
                {
                    if (socks5 > 0 && socks5 < 7)
                    {
                        if (pr.ReadByte() == 5 && pr.ReadByte() == 1)
                        {
                            pr.ReadByte();
                            mProxyEndpoint = mLocalEndpoint;
                            mLocalEndpoint = "";
                            switch (pr.ReadByte())
                            {
                                case 1://IPv4
                                    for (int i = 0; i < 4; i++)
                                    {
                                        mLocalEndpoint += pr.ReadByte();
                                        if (i < 3)
                                        {
                                            mLocalEndpoint += ".";
                                        }
                                    }
                                    break;
                                case 3://Domain
                                    //readInt - String Length
                                    //readAsciiString - Address
                                    break;
                                case 4://IPv6
                                    for (int i = 0; i < 16; i++)
                                    {
                                        pr.ReadByte();
                                    }
                                    break;
                            }
                            byte[] ports = new byte[2];
                            for (int i = 1; i >= 0; i--)
                            {
                                ports[i] = pr.ReadByte();
                            }
                            PacketReader portr = new PacketReader(ports);
                            mProxyPort = mRemotePort;
                            mRemotePort = portr.ReadUShort();
                            mLocalEndpoint += ":" + mRemotePort;
                            Text = "Port " + mLocalPort + " - " + mRemotePort + "(Proxy" + mProxyPort + ")";
                            Console.WriteLine("[socks5] From {0} to {1} (Proxy {2})", mRemoteEndpoint, mLocalEndpoint, mProxyEndpoint);
                        }
                        socks5++;
                        return Results.Continue;
                    }
                    else if (tcpData.Length == 3 && pr.ReadByte() == 5)
                    {
                        socks5 = 1;
                        return Results.Continue;
                    }
                    Console.WriteLine("Connection on port {0} did not have a MapleStory Handshake", mLocalEndpoint);
                    return Results.CloseMe;
                }

                pr.ReadUShort();
                ushort version = pr.ReadUShort();
                byte subVersion = 1;
                string patchLocation = pr.ReadMapleString();
                byte[] localIV = pr.ReadBytes(4);
                byte[] remoteIV = pr.ReadBytes(4);
                byte serverLocale = pr.ReadByte();

                if (serverLocale > 0x12)
                {
                    return Results.CloseMe;
                }

                if (serverLocale == 0x02 || (serverLocale == 0x01 && version > 255)) mIsKMS = true;
                else mIsKMS = false;

                if (mIsKMS)
                {
                    int test = int.Parse(patchLocation);
                    version = (ushort)(test & 0x7FFF);
                    subVersion = (byte)((test >> 16) & 0xFF);
                }
                else if (patchLocation.All(character => { return character >= '0' && character <= '9'; }))
                {
                    if (!byte.TryParse(patchLocation, out subVersion))
                        Console.WriteLine("Failed to parse subVersion");
                }

                mBuild = version;

                mLocale = serverLocale;
                mPatchLocation = patchLocation;

                mOutboundStream = new MapleStream(true, mBuild, mLocale, localIV, subVersion);
                mInboundStream = new MapleStream(false, mBuild, mLocale, remoteIV, subVersion);

                // Generate HandShake packet
                Definition definition = Config.Instance.GetDefinition(mBuild, mLocale, false, 0xFFFF);
                if (definition == null)
                {
                    definition = new Definition();
                    definition.Outbound = false;
                    definition.Locale = mLocale;
                    definition.Opcode = 0xFFFF;
                    definition.Name = "Maple Handshake";
                    definition.Build = mBuild;
                    DefinitionsContainer.Instance.SaveDefinition(definition);
                }

                {
                    string filename = "Scripts" +
                        Path.DirectorySeparatorChar + mLocale.ToString() +
                        Path.DirectorySeparatorChar + mBuild.ToString() +
                        Path.DirectorySeparatorChar + "Inbound" +
                        Path.DirectorySeparatorChar + "0xFFFF.txt";
                    if (!Directory.Exists(Path.GetDirectoryName(filename))) Directory.CreateDirectory(Path.GetDirectoryName(filename));
                    if (!File.Exists(filename))
                    {
                        string contents = "";
                        contents += "using (ScriptAPI) {\r\n";
                        contents += "\tAddShort(\"Packet Size\");\r\n";
                        contents += "\tAddUShort(\"MapleStory Version\");\r\n";
                        contents += "\tAddString(\"MapleStory Patch Location/Subversion\");\r\n";
                        contents += "\tAddField(\"Local Initializing Vector (IV)\", 4);\r\n";
                        contents += "\tAddField(\"Remote Initializing Vector (IV)\", 4);\r\n";
                        contents += "\tAddByte(\"MapleStory Locale\");\r\n";
                        if (mRemotePort == 8484 && ((mLocale == MapleLocale.GLOBAL && version >= 160) ||
                                                    (mLocale == MapleLocale.TAIWAN && version >= 176) ||
                                                    (mLocale == MapleLocale.CHINA && version >= 122)))
                            contents += "\tAddByte(\"Unknown\");\r\n";
                        contents += "}";
                        File.WriteAllText(filename, contents);
                    }
                }

                MaplePacket packet = new MaplePacket(pArrivalTime, false, mBuild, mLocale, 0xFFFF, definition == null ? "" : definition.Name, tcpData, (uint)0, BitConverter.ToUInt32(remoteIV, 0));
                if (!mOpcodes.Exists(kv => kv.First == packet.Outbound && kv.Second == packet.Opcode)) // Should be false, but w/e
                {
                    mOpcodes.Add(new Pair<bool, ushort>(packet.Outbound, packet.Opcode));
                }

                mPacketList.Items.Add(packet);
                mPackets.Add(packet);
                MainForm.SearchForm.RefreshOpcodes(true);
                Console.WriteLine("[CONNECTION] MapleStory V{2}.{3} Locale {4}", mLocalEndpoint, mRemoteEndpoint, mBuild, subVersion, serverLocale);

            }
            if (pTCPPacket.SourcePort == mLocalPort) ProcessTCPPacket(pTCPPacket, ref mOutboundSequence, mOutboundBuffer, mOutboundStream, pArrivalTime);
            else ProcessTCPPacket(pTCPPacket, ref mInboundSequence, mInboundBuffer, mInboundStream, pArrivalTime);
            return Results.Continue;
        }
예제 #12
0
파일: Session.cs 프로젝트: xnum/maplelib2
        /// <summary>
        /// Data received event handler
        /// </summary>
        /// <param name="iar">IAsyncResult of the data received event</param>
        private void OnDataReceived(IAsyncResult iar)
        {
            SocketInfo socketInfo = (SocketInfo)iar.AsyncState;

            try
            {
                int received = socketInfo.Socket.EndReceive(iar);
                if (received == 0)
                {
                    if (OnClientDisconnected != null)
                    {
                        OnClientDisconnected(this);
                    }
                    return;
                }

                socketInfo.Index += received;

                if (socketInfo.Index == socketInfo.DataBuffer.Length)
                {
                    switch (socketInfo.State)
                    {
                    case SocketInfo.StateEnum.Header:
                        if (socketInfo.NoEncryption)
                        {
                            PacketReader headerReader = new PacketReader(socketInfo.DataBuffer);
                            short        packetHeader = headerReader.ReadShort();
                            socketInfo.State      = SocketInfo.StateEnum.Content;
                            socketInfo.DataBuffer = new byte[packetHeader];
                            socketInfo.Index      = 0;
                            WaitForData(socketInfo);
                        }
                        else
                        {
                            PacketReader headerReader  = new PacketReader(socketInfo.DataBuffer);
                            byte[]       packetHeaderB = headerReader.ToArray();
                            int          packetHeader  = headerReader.ReadInt();
                            short        packetLength  = (short)MapleCrypto.getPacketLength(packetHeader);
                            if (_type == SessionType.SERVER_TO_CLIENT && !_RIV.checkPacketToServer(BitConverter.GetBytes(packetHeader)))
                            {
                                Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Packet check failed. Disconnecting client.");
                                //this.Socket.Close();
                            }
                            socketInfo.State      = SocketInfo.StateEnum.Content;
                            socketInfo.DataBuffer = new byte[packetLength];
                            socketInfo.Index      = 0;
                            WaitForData(socketInfo);
                        }
                        break;

                    case SocketInfo.StateEnum.Content:
                        byte[] data = socketInfo.DataBuffer;
                        if (socketInfo.NoEncryption)
                        {
                            socketInfo.NoEncryption = false;
                            PacketReader reader  = new PacketReader(data);
                            short        version = reader.ReadShort();
                            string       unknown = reader.ReadMapleString();
                            _SIV = new MapleCrypto(reader.ReadBytes(4), version);
                            _RIV = new MapleCrypto(reader.ReadBytes(4), version);
                            byte serverType = reader.ReadByte();
                            if (_type == SessionType.CLIENT_TO_SERVER)
                            {
                                OnInitPacketReceived(version, serverType);
                            }
                            OnPacketReceived(new PacketReader(data), true);
                            WaitForData();
                        }
                        else
                        {
                            _RIV.crypt(data);
                            MapleCustomEncryption.Decrypt(data);
                            if (data.Length != 0 && OnPacketReceived != null)
                            {
                                OnPacketReceived(new PacketReader(data), false);
                            }
                            WaitForData();
                        }
                        break;
                    }
                }
                else
                {
                    Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Warning] Not enough data");
                    WaitForData(socketInfo);
                }
            }
            catch (ObjectDisposedException)
            {
                Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: Socket has been closed");
            }
            catch (SocketException se)
            {
                if (se.ErrorCode != 10054)
                {
                    Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + se);
                }
            }
            catch (Exception e)
            {
                Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + e);
            }
        }
예제 #13
0
        /// <summary>
        /// Data received event handler
        /// </summary>
        /// <param name="iar">IAsyncResult of the data received event</param>
        private void OnDataReceived(IAsyncResult iar)
        {
            var socketInfo = (SocketInfo)iar.AsyncState;

            try
            {
                var received = socketInfo.Socket.EndReceive(iar);
                if (received == 0)
                {
                    OnClientDisconnected?.Invoke(this);
                    return;
                }

                socketInfo.Index += received;

                if (socketInfo.Index == socketInfo.DataBuffer.Length)
                {
                    switch (socketInfo.State)
                    {
                    case SocketInfo.StateEnum.Header:
                        if (socketInfo.IsNoEncryption)
                        {
                            var headerReader = new PacketReader(socketInfo.DataBuffer);
                            var packetHeader = headerReader.ReadShort();
                            socketInfo.State      = SocketInfo.StateEnum.Content;
                            socketInfo.DataBuffer = new byte[packetHeader];
                            socketInfo.Index      = 0;
                            WaitForData(socketInfo);
                        }
                        else
                        {
                            var headerReader  = new PacketReader(socketInfo.DataBuffer);
                            var packetHeaderB = headerReader.ToArray();
                            var packetHeader  = headerReader.ReadInt();
                            var packetLength  = (short)MapleCrypto.GetPacketLength(packetHeader);
                            if (Type == SessionType.SERVER_TO_CLIENT &&
                                !RIV.CheckPacketToServer(BitConverter.GetBytes(packetHeader)))
                            {
                                Log.LogError("Packet check failed. Disconnecting client");
                                Socket.Close();
                            }

                            socketInfo.State      = SocketInfo.StateEnum.Content;
                            socketInfo.DataBuffer = new byte[packetLength];
                            socketInfo.Index      = 0;
                            WaitForData(socketInfo);
                        }

                        break;

                    case SocketInfo.StateEnum.Content:
                        var data = socketInfo.DataBuffer;

                        if (socketInfo.IsNoEncryption)
                        {
                            socketInfo.IsNoEncryption = false;
                            var reader  = new PacketReader(data);
                            var version = reader.ReadShort();
                            var unknown = reader.ReadMapleString();
                            SIV = new MapleCrypto(reader.ReadBytes(4), version);
                            RIV = new MapleCrypto(reader.ReadBytes(4), version);
                            var serverType = reader.ReadByte();

                            if (Type == SessionType.CLIENT_TO_SERVER)
                            {
                                OnInitPacketReceived(version, serverType);
                            }

                            OnPacketReceived(new PacketReader(data), true);
                            WaitForData();
                        }
                        else
                        {
                            RIV.Crypt(data);
                            MapleCustomEncryption.Decrypt(data);

                            if (data.Length != 0)
                            {
                                OnPacketReceived?.Invoke(new PacketReader(data), false);
                            }

                            WaitForData();
                        }

                        break;
                    }
                }
                else
                {
                    Log.LogWarning("Not enough data");
                    WaitForData(socketInfo);
                }
            }
            catch (ObjectDisposedException e)
            {
                Log.LogError("Socket has been closed", e);
            }
            catch (SocketException se)
            {
                if (se.ErrorCode != 10054)
                {
                    Log.LogError("Session.OnDataReceived", se);
                }
            }
            catch (Exception e)
            {
                Log.LogError("Session.OnDataReceived", e);
            }
        }
예제 #14
0
        internal Results BufferTCPPacket(TcpPacket pTCPPacket, DateTime pArrivalTime)
        {
            if (pTCPPacket.Fin || pTCPPacket.Rst)
            {
                mTerminated = true;
                Text += " (Terminated)";
                if (mPackets.Count == 0)
                {
                    // f**k
                    return Results.CloseMe;
                }
                else
                {
                    return Results.Terminated;
                }
            }
            if (pTCPPacket.Syn && !pTCPPacket.Ack)
            {
                mLocalPort = (ushort)pTCPPacket.SourcePort;
                mRemotePort = (ushort)pTCPPacket.DestinationPort;
                mOutboundSequence = (uint)(pTCPPacket.SequenceNumber + 1);
                Text = "Port " + mLocalPort.ToString();
                startTime = DateTime.Now;

                mRemoteEndpoint = ((PacketDotNet.IPv4Packet)pTCPPacket.ParentPacket).SourceAddress.ToString() + ":" + pTCPPacket.SourcePort.ToString();
                mLocalEndpoint = ((PacketDotNet.IPv4Packet)pTCPPacket.ParentPacket).DestinationAddress.ToString() + ":" + pTCPPacket.DestinationPort.ToString();
                Console.WriteLine("[CONNECTION] From {0} to {1}", mLocalEndpoint, mRemoteEndpoint);

                return Results.Continue;
            }
            if (pTCPPacket.Syn && pTCPPacket.Ack) { mInboundSequence = (uint)(pTCPPacket.SequenceNumber + 1); return Results.Continue; }
            if (pTCPPacket.PayloadData.Length == 0) return Results.Continue;
            if (mBuild == 0)
            {
                if (pTCPPacket.PayloadData.Length < 13) return Results.CloseMe;
                byte[] tcpData = pTCPPacket.PayloadData;
                //mBuild = (ushort)(tcpData[2] | (tcpData[3] << 8));

                bool mIsKMS = false;

                PacketReader pr = new PacketReader(tcpData);
                pr.ReadShort();
                ushort version = pr.ReadUShort();
                var pos = pr.Position;
                {
                    var shrt = pr.ReadShort();
                    if (shrt < 0 || shrt > 0x0020)
                    {
                        return Results.CloseMe;
                    }
                }
                pr.Reset(pos);
                string patchLocation = pr.ReadMapleString();
                byte[] localIV = pr.ReadBytes(4);
                byte[] remoteIV = pr.ReadBytes(4);
                byte serverLocale = pr.ReadByte();

                if (pr.Remaining > 0 || serverLocale > 0x12)
                {
                    return Results.CloseMe;
                }

                if (serverLocale == 0x02 || (serverLocale == 0x01 && version > 255)) mIsKMS = true;
                else mIsKMS = false;

                if (mIsKMS)
                {
                    int test = int.Parse(patchLocation);
                    ushort t1 = (ushort)(test & 0x7FFF);
                    int t2 = (test >> 15) & 1;
                    int t3 = (test >> 16) & 0xFF;
                    Console.WriteLine("Logging KMS connection. Version {0} | {1} | {2}", t1, t2, t3);
                    mBuild = t1;
                }
                else
                {
                    mBuild = version;
                }

                mLocale = serverLocale;
                mPatchLocation = patchLocation;

                mOutboundStream = new MapleStream(true, mBuild, mLocale, localIV);
                mInboundStream = new MapleStream(false, (ushort)(0xFFFF - mBuild), mLocale, remoteIV);
                mInboundSequence += (uint)tcpData.Length;

                // Generate HandShake packet
                Definition definition = Config.Instance.GetDefinition(mBuild, mLocale, false, 0xFFFF);
                if (definition == null)
                {
                    definition = new Definition();
                    definition.Outbound = false;
                    definition.Locale = mLocale;
                    definition.Opcode = 0xFFFF;
                    definition.Name = "Maple Handshake";
                    definition.Build = mBuild;
                    Config.Instance.Definitions.Add(definition);
                }

                {
                    string filename = "Scripts" +
                        Path.DirectorySeparatorChar + mLocale.ToString() +
                        Path.DirectorySeparatorChar + mBuild.ToString() +
                        Path.DirectorySeparatorChar + "Inbound" +
                        Path.DirectorySeparatorChar + "0xFFFF.txt";
                    if (!Directory.Exists(Path.GetDirectoryName(filename))) Directory.CreateDirectory(Path.GetDirectoryName(filename));
                    if (!File.Exists(filename))
                    {
                        string contents = "";
                        contents += "using (ScriptAPI) {\r\n";
                        contents += "\tAddShort(\"Packet Size\");\r\n";
                        contents += "\tAddUShort(\"MapleStory Version\");\r\n";
                        contents += "\tAddString(\"MapleStory Patch Location\");\r\n";
                        contents += "\tAddField(\"Local Initializing Vector (IV)\", 4);\r\n";
                        contents += "\tAddField(\"Remote Initializing Vector (IV)\", 4);\r\n";
                        contents += "\tAddByte(\"MapleStory Locale\");\r\n";
                        contents += "}";
                        File.WriteAllText(filename, contents);
                    }
                }

                MaplePacket packet = new MaplePacket(pArrivalTime, false, mBuild, mLocale, 0xFFFF, definition == null ? "" : definition.Name, tcpData);
                if (!mOpcodes.Exists(kv => kv.First == packet.Outbound && kv.Second == packet.Opcode))
                { // Should be false, but w/e
                    mOpcodes.Add(new Pair<bool, ushort>(packet.Outbound, packet.Opcode));
                }

                mPacketList.Items.Add(packet);
                mPackets.Add(packet);
                MainForm.SearchForm.RefreshOpcodes(true);
                Console.WriteLine("[CONNECTION] MapleStory V{2}.{3} Locale {4}", mLocalEndpoint, mRemoteEndpoint, mBuild, patchLocation, serverLocale);
            }
            if (pTCPPacket.SourcePort == mLocalPort) ProcessTCPPacket(pTCPPacket, ref mOutboundSequence, mOutboundBuffer, mOutboundStream, pArrivalTime);
            else ProcessTCPPacket(pTCPPacket, ref mInboundSequence, mInboundBuffer, mInboundStream, pArrivalTime);
            return Results.Continue;
        }
예제 #15
0
 public void handlePacket(Client c, PacketReader packet)
 {
     string name = packet.ReadMapleString();
     c.SendPacket(PacketDefinitions.CheckDuplicatedID(name, Database.CheckDuplicatedID(name)));
 }