private void HandleCreateAccount2(BncsReader dr)
        {
            int status = dr.ReadInt32();
            CreationFailureReason reason = CreationFailureReason.Unknown;

            switch (status)
            {
            case 2:
                reason = CreationFailureReason.InvalidCharacters; break;

            case 3:
                reason = CreationFailureReason.InvalidWord; break;

            case 6:
                reason = CreationFailureReason.NotEnoughAlphanumerics; break;

            case 4:
            default:
                reason = CreationFailureReason.AccountAlreadyExists; break;
            }

            if (status == 0)
            {
                AccountCreationEventArgs created = new AccountCreationEventArgs(_settings.Username);
                OnAccountCreated(created);

                LoginAccountOld();
            }
            else
            {
                AccountCreationFailedEventArgs failed = new AccountCreationFailedEventArgs(_settings.Username, reason);
                OnAccountCreationFailed(failed);
            }
        }
Beispiel #2
0
        private async void Listen()
        {
            while (_connection.IsConnected)
            {
                NetworkBuffer nextPacket = _storage.Acquire();
                NetworkBuffer result     = await _connection.ReceiveAsync(nextPacket, 0, 4, true);

                if (result == null)
                {
                    return;                 // disconnected
                }
                BncsReader reader = new BncsReader(result);

                if (reader.Length > 4)
                {
                    result = await _connection.ReceiveAsync(nextPacket, 4, reader.Length - 4);

                    if (result == null)
                    {
                        return;                 // disconnected
                    }
                }
                else if (reader.Length == 4)
                {
                    // packet is complete
                }
                else
                {
                    throw new ProtocolViolationException("The Battle.net server indicated an invalid packet size.");
                }

                DispatchPacketHandler(reader);
                _storage.Release(nextPacket);
            }
        }
        private async void HandleLogonResponse2(BncsReader dr)
        {
            int success = dr.ReadInt32();

            if (success == 0)
            {
                OnLoginSucceeded();
                ClassicProduct product = _settings.Client;
                if (product.UsesUdpPing)
                {
                    BncsPacket pck = new BncsPacket(BncsPacketId.UdpPingResponse, _storage.Acquire());
                    pck.InsertDwordString("bnet");
                    await pck.SendAsync(_connection);
                }

                EnterChat();
            }
            else
            {
                LoginFailureReason reason = LoginFailureReason.Unknown;
                switch (success)
                {
                case 1:     // account DNE
                    reason = LoginFailureReason.AccountDoesNotExist; break;

                case 2:     // invalid password
                    reason = LoginFailureReason.InvalidAccountOrPassword; break;

                case 6:     // account closed
                    reason = LoginFailureReason.AccountClosed; break;
                }
                LoginFailedEventArgs args = new LoginFailedEventArgs(reason, success, dr.ReadCString());
                OnLoginFailed(args);
            }
        }
Beispiel #4
0
        public void Handle_AUTH_CHECK(BncsReader Reader)
        {
            int num = Reader.ReadInt32();

            if (num == 0)
            {
                this.Send_SID_LOGONRESPONSE();
            }
        }
        private async void HandlePing(BncsReader packet)
        {
            int ping = packet.ReadInt32();

            NetworkBuffer buffer   = _storage.Acquire();
            BncsPacket    response = new BncsPacket(BncsPacketId.Ping, buffer);

            response.InsertInt32(ping);

            await response.SendAsync(_connection);
        }
Beispiel #6
0
 private void InitServers(String character, String account, String password,
                          Client.GameDifficulty difficulty, String classicKey,
                          String expansionKey, String exeInfo)
 {
     _bncsConnection = new BncsConnection();
     _bncsReader     = new BncsReader(ref _bncsConnection);
     _bncsHandler    = new BncsHandler(ref _bncsConnection, account, password,
                                       classicKey, expansionKey, exeInfo);
     _mcpConnection = new McpConnection();
     _mcpReader     = new McpReader(ref _mcpConnection);
     _mcpHandler    = new McpHandler(ref _mcpConnection, character, difficulty);
 }
        private async void HandleGetChannelList(BncsReader dr)
        {
            List <string> channelList = new List <string>();
            string        channel;

            do
            {
                channel = dr.ReadCString();
                if (!string.IsNullOrEmpty(channel))
                {
                    channelList.Add(channel);
                }
            } while (!string.IsNullOrEmpty(channel));

            ChannelListEventArgs e = new ChannelListEventArgs(channelList.ToArray());

            ((IChatConnectionEventSource)this).OnChannelListReceived(e);

            if (!_firstChannelList)
            {
                _firstChannelList = true;

                BncsPacket pckJoinChan = CreatePacket(BncsPacketId.JoinChannel);
                if (_settings.Client == ClassicProduct.Diablo2Retail || _settings.Client == ClassicProduct.Diablo2Expansion)
                {
                    pckJoinChan.InsertInt32((int)ChannelJoinFlags.Diablo2FirstJoin);
                }
                else
                {
                    pckJoinChan.InsertInt32((int)ChannelJoinFlags.FirstJoin);
                }

                switch (_settings.Client.ProductCode)
                {
                case "STAR":
                case "SEXP":
                case "W2BN":
                case "D2DV":
                case "D2XP":
                case "JSTR":
                    pckJoinChan.InsertCString(_settings.Client.ProductCode);
                    break;

                case "WAR3":
                case "W3XP":
                    pckJoinChan.InsertCString("W3");
                    break;
                }

                await pckJoinChan.SendAsync(_connection);
            }
        }
        private void HandleAuthCheck(BncsReader packet)
        {
            uint   result    = packet.ReadUInt32();
            string extraInfo = packet.ReadCString();

            if (result == 0)
            {
                OnClientCheckPassed();
            }
            else
            {
                OnClientCheckFailed(new ClientCheckFailedEventArgs((ClientCheckFailureCause)result, extraInfo));
                Disconnect();
                return;
            }

            ContinueLogin();
        }
Beispiel #9
0
        public void Handle_SID_QUERYREALMS2(BncsReader Reader)
        {
            Reader.ReadInt32();
            int num = Reader.ReadInt32();

            if (num == 0)
            {
                this.WriteToLog("Realm logon failed. No realms found.", Color.Red);
                this.Disconnect();
                return;
            }
            string text     = num + " realm(s) found: ";
            string text2    = "";
            int    arg_47_0 = 0;

            checked
            {
                int num2 = num - 1;
                for (int i = arg_47_0; i <= num2; i++)
                {
                    Reader.ReadInt32();
                    string text3 = Reader.ReadCString();
                    string text4 = Reader.ReadCString();
                    if (i == 0)
                    {
                        text2 = text3;
                    }
                    text = string.Concat(new string[]
                    {
                        text,
                        text3,
                        " (",
                        text4,
                        "), "
                    });
                }
                text = text.Substring(0, text.Length - 1) + ".";
                this.WriteToLog(text, Color.Gray);
                this.WriteToLog("Getting logon information for " + text2 + "..", Color.Gray);
                this.Send_SID_LOGONREALMEX(text2);
            }
        }
Beispiel #10
0
        private void DispatchPacketHandler(BncsReader packet)
        {
            ParseCallback result;

            if (_packetToParserMap.TryGetValue(packet.PacketID, out result))
            {
                result(packet);
            }
            else
            {
                switch (packet.PacketID)
                {
                    #region SID_NULL
                case BncsPacketId.Null:
                    break;

                    #endregion
                default:
                    Trace.WriteLine(packet.PacketID, "Unhandled packet");
                    break;
                }
            }
        }
        private async void HandleLogonResponse(BncsReader dr)
        {
            int status = dr.ReadInt32();

            if (status == 1)
            {
                OnLoginSucceeded();
                ClassicProduct product = _settings.Client;
                if (product.UsesUdpPing)
                {
                    BncsPacket pck = new BncsPacket(BncsPacketId.UdpPingResponse, _storage.Acquire());
                    pck.InsertDwordString("bnet");
                    await pck.SendAsync(_connection);
                }

                EnterChat();
            }
            else
            {
                LoginFailedEventArgs args = new LoginFailedEventArgs(LoginFailureReason.InvalidAccountOrPassword, status);
                OnLoginFailed(args);
            }
        }
Beispiel #12
0
        public void Handle_SID_AUTH_INFO(BncsReader Reader)
        {
            int    num     = Reader.ReadInt32();
            int    num2    = Reader.ReadInt32();
            int    num3    = Reader.ReadInt32();
            long   num4    = Reader.ReadInt64();
            string mpqName = Reader.ReadCString();

            byte[]        array = Reader.ReadNullTerminatedByteArray();
            List <string> list  = new List <string>();

            this.g_iServerToken = num2;
            int num5;

            if (this.Exp)
            {
                num5 = 2;
            }
            else
            {
                num5 = 1;
            }
            BattleNetClient battleNetClient = new BattleNetClient(this.Exp);

            checked
            {
                string[] array2 = new string[num5];
                CdKey[]  array3 = new CdKey[num5];
                byte[][] array4 = new byte[num5][];
                int[]    array5 = new int[num5];
                array2[0] = this.BnetInfo.ClassicCdKey;
                array2[0] = array2[0].Replace("-", "");
                array2[0] = array2[0].Replace(" ", "");
                if (num5 >= 2)
                {
                    array2[1] = this.BnetInfo.ExpCdKey;
                    array2[1] = array2[1].Replace("-", "");
                    array2[1] = array2[1].Replace(" ", "");
                }
                int arg_111_0 = 0;
                int num6      = num5 - 1;
                for (int i = arg_111_0; i <= num6; i++)
                {
                    try
                    {
                        array5[i] = array2[i].Length;
                        array3[i] = CdKey.CreateDecoder(array2[i]);
                        array4[i] = array3[i].GetHash(this.g_iClientToken, this.g_iServerToken);
                        if (!array3[i].IsValid)
                        {
                            this.WriteToLog("Warning Cd-Key(" + Conversions.ToString(i) + ") is invalid", Color.Red);
                            this.Disconnect();
                        }
                    }
                    catch (Exception expr_186)
                    {
                        ProjectData.SetProjectError(expr_186);
                        this.WriteToLog("Error while preparing the cd-key " + i, Color.Red);
                        this.Disconnect();
                        ProjectData.ClearProjectError();
                        return;
                    }
                }
                string str       = "";
                char[] array6    = new char[array.Length];
                int    arg_1EF_0 = 0;
                int    num7      = array.Length - 1;
                for (int j = arg_1EF_0; j <= num7; j++)
                {
                    array6[j] = Strings.ChrW((int)array[j]);
                }
                int exeInfo = CheckRevision.GetExeInfo(battleNetClient.g_sHashes[0], out str);
                int i2      = CheckRevision.DoCheckRevision(new string(array6), battleNetClient.g_sHashes,
                                                            CheckRevision.ExtractMPQNumber(mpqName));
                BncsPacket bncsPacket = new BncsPacket(81);
                bncsPacket.InsertInt32(this.g_iClientToken);
                bncsPacket.InsertInt32(exeInfo);
                bncsPacket.InsertInt32(i2);
                bncsPacket.InsertInt32(num5);
                bncsPacket.InsertBoolean(false);
                int arg_27B_0 = 0;
                int num8      = num5 - 1;
                for (int k = arg_27B_0; k <= num8; k++)
                {
                    bncsPacket.InsertInt32(array5[k]);
                    bncsPacket.InsertInt32(array3[k].Product);
                    bncsPacket.InsertInt32(array3[k].Value1);
                    bncsPacket.InsertInt32(0);
                    bncsPacket.InsertByteArray(array4[k]);
                }
                bncsPacket.InsertCString(str);
                bncsPacket.InsertCString(this.BnetInfo.CdKeyOwner);
                this.SendPacket(bncsPacket.UnderlyingBuffer);
            }
        }
Beispiel #13
0
        public override void ParsePacket(byte[] Data)
        {
            BncsReader       bncsReader = new BncsReader(Data);
            BnetServerPacket packetID   = (BnetServerPacket)bncsReader.PacketID;

            this.ReportPacket((int)packetID);
            switch (packetID)
            {
            case BnetServerPacket.KeepAlive:
            {
                this.OnServerKeepAliveEvent?.Invoke(new BotCore.BnetServer.KeepAlive(Data));
                break;
            }

            case BnetServerPacket.EnterChatResponse:
            {
                this.OnEnterChatResponseEvent?.Invoke(new EnterChatResponse(Data));
                break;
            }

            case BnetServerPacket.ChannelList:
            {
                this.OnChannelListEvent?.Invoke(new ChannelList(Data));
                break;
            }

            case BnetServerPacket.ChatEvent:
            {
                this.OnChatEventEvent?.Invoke(new ChatEvent(Data));
                break;
            }

            case BnetServerPacket.AdInfo:
            {
                this.OnAdInfoEvent?.Invoke(new AdInfo(Data));
                break;
            }

            case BnetServerPacket.BnetPing:
            {
                this.OnBnetPingEvent?.Invoke(new BnetPing(Data));
                break;
            }

            case BnetServerPacket.FileTimeInfo:
            {
                this.OnFileTimeInfoEvent?.Invoke(new FileTimeInfo(Data));
                break;
            }

            case BnetServerPacket.BnetLogonResponse:
            {
                this.OnBnetLogonResponseEvent?.Invoke(new BnetLogonResponse(Data));
                break;
            }

            case BnetServerPacket.RealmLogonResponse:
            {
                this.OnRealmLogonResponseEvent?.Invoke(new RealmLogonResponse(Data));
                break;
            }

            case BnetServerPacket.QueryRealmsResponse:
            {
                this.Handle_SID_QUERYREALMS2(bncsReader);
                this.OnQueryRealmsResponseEvent?.Invoke(new QueryRealmsResponse(Data));
                break;
            }

            case BnetServerPacket.NewsInfo:
            {
                this.OnNewsInfoEvent?.Invoke(new NewsInfo(Data));
                break;
            }

            case BnetServerPacket.ExtraWorkInfo:
            {
                this.OnExtraWorkInfoEvent?.Invoke(new ExtraWorkInfo(Data));
                break;
            }

            case BnetServerPacket.RequiredExtraWorkInfo:
            {
                this.OnRequiredExtraWorkInfoEvent?.Invoke(new RequiredExtraWorkInfo(Data));
                break;
            }

            case BnetServerPacket.BnetConnectionResponse:
            {
                this.Handle_SID_AUTH_INFO(bncsReader);
                this.OnBnetConnectionResponseEvent?.Invoke(new BnetConnectionResponse(Data));
                break;
            }

            case BnetServerPacket.BnetAuthResponse:
            {
                this.Handle_AUTH_CHECK(bncsReader);
                this.OnBnetAuthResponseEvent?.Invoke(new BnetAuthResponse(Data));
                break;
            }
            }
        }
        private async void HandleAuthInfo(BncsReader dr)
        {
            try
            {
                //DataReader dr = new DataReader(data.Data);
                //if (m_pingPck != null)
                //{
                //    Send(m_pingPck);
                //    m_pingPck = null;
                //}
                _received0x50 = true;

                _loginType          = dr.ReadUInt32();
                _srvToken           = dr.ReadInt32();
                _udpVal             = dr.ReadUInt32();
                _mpqFileTime        = dr.ReadInt64();
                _versioningFilename = dr.ReadCString();
                _usingLockdown      = _versioningFilename.StartsWith("LOCKDOWN", StringComparison.OrdinalIgnoreCase);

                int    crResult = -1, exeVer = -1;
                string exeInfo = null;

                if (!_usingLockdown)
                {
                    _valString = dr.ReadCString();
                    int mpqNum = CheckRevision.ExtractMPQNumber(_versioningFilename);
                    crResult = CheckRevision.DoCheckRevision(_valString, new Stream[] { File.OpenRead(_settings.GameExe), File.OpenRead(_settings.GameFile2), File.OpenRead(_settings.GameFile3) }, mpqNum);
                    exeVer   = CheckRevision.GetExeInfo(_settings.GameExe, out exeInfo);
                }
                else
                {
                    _ldValStr = dr.ReadNullTerminatedByteArray();
                    string dllName = _versioningFilename.Replace(".mpq", ".dll");

                    BnFtpVersion1Request req = new BnFtpVersion1Request(_settings.Client, _versioningFilename, null);
                    req.Gateway       = _settings.Gateway;
                    req.LocalFileName = Path.Combine(Path.GetTempPath(), _versioningFilename);
                    await req.ExecuteRequest();

                    string ldPath = null;
                    using (MpqArchive arch = MpqServices.OpenArchive(req.LocalFileName))
                    {
                        if (arch.ContainsFile(dllName))
                        {
                            ldPath = Path.Combine(Path.GetTempPath(), dllName);
                            arch.SaveToPath(dllName, Path.GetTempPath(), false);
                        }
                    }

                    _ldDigest = CheckRevision.DoLockdownCheckRevision(_ldValStr, new string[] { _settings.GameExe, _settings.GameFile2, _settings.GameFile3 },
                                                                      ldPath, _settings.ImageFile, ref exeVer, ref crResult);
                }

                string prodCode = _settings.Client.ProductCode;

                if (prodCode == "WAR3" || prodCode == "W3XP")
                {
                    _w3srv = dr.ReadByteArray(128);

                    if (!NLS.ValidateServerSignature(_w3srv, _connection.RemoteEP.Address.GetAddressBytes()))
                    {
                        //OnError(new ErrorEventArgs(ErrorType.Warcraft3ServerValidationFailure, Strings.War3ServerValidationFailed, false));
                        //Close();
                        //return;
                    }
                }

                //    BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data);

                CdKey key1 = _settings.CdKey1, key2 = _settings.CdKey2;
                _clientToken = new Random().Next();

                byte[] key1Hash = key1.GetHash(_clientToken, _srvToken);
                if (WardenHandler != null)
                {
                    try
                    {
                        if (!WardenHandler.InitWarden(BitConverter.ToInt32(key1Hash, 0)))
                        {
                            WardenHandler.UninitWarden();
                            //OnError(new ErrorEventArgs(ErrorType.WardenModuleFailure, "The Warden module failed to initialize.  You will not be immediately disconnected; however, you may be disconnected after a short period of time.", false));
                            WardenHandler = null;
                        }
                    }
                    catch (Win32Exception we)
                    {
                        //OnError(new ErrorEventArgs(ErrorType.WardenModuleFailure, "The Warden module failed to initialize.  You will not be immediately disconnected; however, you may be disconnected after a short period of time.", false));
                        //OnError(new ErrorEventArgs(ErrorType.WardenModuleFailure, string.Format(CultureInfo.CurrentCulture, "Additional information: {0}", we.Message), false));
                        WardenHandler.UninitWarden();
                        WardenHandler = null;
                    }
                }

                BncsPacket pck0x51 = new BncsPacket(BncsPacketId.AuthCheck, _connection.NetworkBuffers.Acquire());
                pck0x51.InsertInt32(_clientToken);
                pck0x51.InsertInt32(exeVer);
                pck0x51.InsertInt32(crResult);
                if (prodCode == "D2XP" || prodCode == "W3XP")
                {
                    pck0x51.InsertInt32(2);
                }
                else
                {
                    pck0x51.InsertInt32(1);
                }
                pck0x51.InsertBoolean(false);
                pck0x51.InsertInt32(key1.Key.Length);
                pck0x51.InsertInt32(key1.Product);
                pck0x51.InsertInt32(key1.Value1);
                pck0x51.InsertInt32(0);
                pck0x51.InsertByteArray(key1Hash);
                if (key2 != null)
                {
                    pck0x51.InsertInt32(key2.Key.Length);
                    pck0x51.InsertInt32(key2.Product);
                    pck0x51.InsertInt32(key2.Value1);
                    pck0x51.InsertInt32(0);
                    pck0x51.InsertByteArray(key2.GetHash(_clientToken, _srvToken));
                }

                if (_usingLockdown)
                {
                    pck0x51.InsertByteArray(_ldDigest);
                    pck0x51.InsertByte(0);
                }
                else
                {
                    pck0x51.InsertCString(exeInfo);
                }

                pck0x51.InsertCString(_settings.CdKeyOwner);

                await pck0x51.SendAsync(_connection);
            }
            catch (Exception ex)
            {
                //OnError(new ErrorEventArgs(ErrorType.General, "There was an error while initializing your client.  Refer to the exception message for more information.\n" + ex.ToString(), true));
                Disconnect();

                Console.WriteLine(ex.ToString());
            }
        }
 private void HandleChatEvent(BncsReader dr)
 {
 }
        private void HandleChatEvent(BncsReader dr)
        {
            if (_oldParseCallback != null)
            {
                _oldParseCallback(dr);
                dr.Seek(-dr.Position);
                dr.Seek(4);
            }

            ChatEventType type  = (ChatEventType)dr.ReadInt32();
            int           flags = dr.ReadInt32();
            int           ping  = dr.ReadInt32();

            dr.Seek(12);
            string user = dr.ReadCString();

            byte[] userInfo = dr.ReadNullTerminatedByteArray();
            string text     = Encoding.ASCII.GetString(userInfo);

            switch (type)
            {
            case ChatEventType.UserInChannel:
            case ChatEventType.UserJoinedChannel:
                ChatUser newUser = new ChatUser(user, ping, (ClassicUserFlags)flags, UserStats.Parse(user, userInfo));
                if (_namesToUsers.ContainsKey(user))
                {
                    _namesToUsers.Remove(user);
                }
                _namesToUsers.Add(user, newUser);
                UserEventArgs <ChatUser> uArgs = new UserEventArgs <ChatUser>(type, newUser);
                HandleUserChatEvent(uArgs);
                break;

            case ChatEventType.UserFlagsChanged:
                if (_namesToUsers.ContainsKey(user))
                {
                    ChatUser changedUser = _namesToUsers[user];
                    changedUser.Flags = (ClassicUserFlags)flags;
                    UserEventArgs <ChatUser> updatedArgs = new UserEventArgs <ChatUser>(type, changedUser);
                    HandleUserChatEvent(updatedArgs);
                }
                else if (_channelName.Equals("The Void", StringComparison.OrdinalIgnoreCase))
                {
                    ChatUser voidUser = new ChatUser(user, ping, (ClassicUserFlags)flags, UserStats.Parse(user, userInfo));
                    _namesToUsers.Add(user, voidUser);
                    UserEventArgs <ChatUser> voidArgs = new UserEventArgs <ChatUser>(type, voidUser);
                    HandleUserChatEvent(voidArgs);
                }
                break;

            case ChatEventType.UserLeftChannel:
                if (_namesToUsers.ContainsKey(user))
                {
                    ChatUser goneUser = _namesToUsers[user];
                    UserEventArgs <ChatUser> leftArgs = new UserEventArgs <ChatUser>(type, goneUser);
                    HandleUserChatEvent(leftArgs);
                }
                break;

            case ChatEventType.Emote:
            case ChatEventType.Talk:
            case ChatEventType.WhisperReceived:
            case ChatEventType.WhisperSent:
                ChatMessageEventArgs <UserFlags> cmArgs = new ChatMessageEventArgs <UserFlags>(type, (UserFlags)flags, user, Encoding.UTF8.GetString(userInfo));
                HandleChatMessageEvent(cmArgs);
                break;

            case ChatEventType.NewChannelJoined:
                ServerChatEventArgs joinArgs = new ServerChatEventArgs(type, flags, text);
                _channelName = text;
                _namesToUsers.Clear();
                OnJoinedChannel(joinArgs);
                break;

            case ChatEventType.Broadcast:
            case ChatEventType.ChannelDNE:
            case ChatEventType.ChannelFull:
            case ChatEventType.ChannelRestricted:
            case ChatEventType.Error:
            case ChatEventType.Information:
                ServerChatEventArgs scArgs = new ServerChatEventArgs(type, flags, text);
                HandleServerChatEvent(scArgs);
                break;
            }
        }