Exemple #1
0
 public override void ThreadFunction()
 {
     _firstInfoPacket = true;
     Logger.Write("D2GS handler started!");
     while (Connection.Socket.Connected)
     {
         if (Connection.Packets.IsEmpty())
         {
             //_connection.PacketsReady.WaitOne();
         }
         else
         {
             List <byte> packet;
             lock (Connection.Packets) {
                 packet = Connection.Packets.Dequeue();
             }
             if (!packet.Any())
             {
                 continue;
             }
             byte type = packet[0];
             DispatchPacket(type)(type, packet);
         }
     }
     Logger.Write("D2GS Handler Ending...");
 }
Exemple #2
0
        public override void ThreadFunction()
        {
            m_owner.GameRequestId = 0x02;
            m_owner.InGame        = false;

            Console.Write("{0}: [BNCS] Connecting to {1}:{2} .........", m_owner.Account, m_owner.BattleNetServer, s_bncsPort);
            // Establish connection
            m_socket.Connect(m_owner.BattleNetServer, s_bncsPort);
            m_stream = m_socket.GetStream();
            if (m_stream.CanWrite)
            {
                Console.WriteLine(" Connected");
            }
            else
            {
                Console.WriteLine(" Failed To connect");
                return;
            }

            m_stream.WriteByte(0x01);
            m_stream.Write(AuthInfoPacket, 0, AuthInfoPacket.Length);

            List <byte> bncsBuffer = new List <byte>();
            List <byte> data       = new List <byte>();

            while (true)
            {
                if (!GetPacket(ref bncsBuffer, ref data))
                {
                    break;
                }

                if (ClientlessBot.debugging)
                {
                    Console.WriteLine("{0}: [BNCS] Received Packet From Server", m_owner.Account);
                }

                if (ClientlessBot.debugging)
                {
                    Console.WriteLine("\tPacket Data: ");
                    Console.Write("\t\t");
                    for (int i = 0; i < data.Count; i++)
                    {
                        Console.Write("{0:X2} ", (byte)data[i]);
                    }
                    Console.WriteLine("");
                }

                byte type = data.ToArray()[1];
                if (ClientlessBot.debugging)
                {
                    Console.WriteLine("\tPacket Type: 0x{0:X}", type);
                }
                DispatchPacket(type)(type, data);
            }
        }
Exemple #3
0
        public override void ThreadFunction()
        {
            Logger.Write("MCP handler started!");
            while (m_connection.Socket.Connected)
            {
                m_connection.PacketsReady.WaitOne();

                List <byte> packet;
                lock (m_connection.Packets)
                {
                    packet = m_connection.Packets.Dequeue();
                }
                byte type = packet[2];
                DispatchPacket(type)(type, packet);
            }
        }
Exemple #4
0
 public override void ThreadFunction()
 {
     while (Connection.Socket.Connected)
     {
         if (Connection.Packets.IsEmpty())
         {
             Connection.PacketsReady.WaitOne();
         }
         else
         {
             List <byte> packet;
             lock (Connection.Packets)
             {
                 packet = Connection.Packets.Dequeue();
             }
             byte type = packet[1];
             DispatchPacket(type)(type, packet);
         }
     }
 }
        public override void ThreadFunction()
        {
            Console.Write("{0}: [MCP] Connecting to realm server {1}:{2} ...........", m_owner.Account, m_owner.McpIp, m_owner.McpPort);

            m_socket.Connect(m_owner.McpIp, (int)m_owner.McpPort);
            m_stream = m_socket.GetStream();
            if (m_stream.CanWrite)
            {
                Console.WriteLine(" Connected");
            }
            else
            {
                Console.WriteLine(" Failed To connect");
                return;
            }
            m_stream.WriteByte(0x01);
            byte[] packet = BuildPacket((byte)0x01, m_owner.McpData);

            PrintPacket(packet);

            m_stream.Write(packet, 0, packet.Length);

            List <byte> data      = new List <byte>();
            List <byte> mcpBuffer = new List <byte>();

            while (true)
            {
                if (!getMcpPacket(ref m_stream, ref mcpBuffer, ref data))
                {
                    break;
                }

                byte identifier = data.ToArray()[2];

                DispatchPacket(identifier)(identifier, data);
            }
            Console.WriteLine("{0}: [MCP] Disconnected from Realm Server", m_owner.Account);
        }
        public override void ThreadFunction()
        {
            m_socket = new TcpClient();
            //Initialize the game's data
            m_owner.InitializeGameData();

            Console.Write("{0}: [D2GS] Connecting to Game Server {1}:{2} .......", m_owner.Account, m_owner.GsIp, s_gsPort);
            try
            {
                m_socket.Connect(m_owner.GsIp, s_gsPort);
                m_stream = m_socket.GetStream();
                Console.WriteLine(" Connected");
            }
            catch
            {
                Console.WriteLine(" Failed To connect");
                return;
            }

            m_owner.ConnectedToGs = true;
            List <byte> buffer = new List <byte>();

            byte[] byteBuffer = new byte[4096];
            Int32  bytesRead  = 0;

            while (true)
            {
                try
                {
                    /*
                     * while (m_stream.DataAvailable)
                     * {
                     *  buffer.Add((byte)m_stream.ReadByte());
                     *  if(!m_stream.DataAvailable)
                     *      Console.WriteLine("{0}: [D2GS] Finished Reading to Buffer...", m_owner.Account);
                     * }
                     */
                    if (m_stream.DataAvailable)
                    {
                        bytesRead = m_stream.Read(byteBuffer, 0, byteBuffer.Length);
                        buffer.AddRange(new List <byte>(byteBuffer).GetRange(0, bytesRead));
                    }
                    else
                    {
                        if (!m_socket.Connected)
                        {
                            if (m_owner.ConnectedToGs)
                            {
                                m_owner.ConnectedToGs = false;
                                if (m_pingThread.IsAlive)
                                {
                                    m_pingThread.Join();
                                }
                                // Join threads
                            }
                            m_owner.Status = ClientlessBot.ClientStatus.STATUS_NOT_IN_GAME;
                            break;
                        }
                        Thread.Sleep(100);
                    }
                    while (m_stream.DataAvailable)
                    {
                        buffer.Add((byte)m_stream.ReadByte());
                    }
                }
                catch
                {
                    //if (ClientlessBot.debugging)
                    Console.WriteLine("{0}: [D2GS] Disconnected from game server", m_owner.Account);
                    if (m_owner.ConnectedToGs)
                    {
                        m_owner.ConnectedToGs = false;
                        if (m_pingThread.IsAlive)
                        {
                            m_pingThread.Join();
                        }
                        // Join threads
                    }
                    m_owner.Status = ClientlessBot.ClientStatus.STATUS_NOT_IN_GAME;
                    break;
                }


                while (true)
                {
                    try
                    {
                        UInt16 receivedPacket = 0;
                        if (buffer.Count >= 2)
                        {
                            receivedPacket = BitConverter.ToUInt16(buffer.ToArray(), 0);
                        }
                        if (buffer.Count >= 2 && receivedPacket == (UInt16)0x01af)
                        {
                            if (ClientlessBot.debugging)
                            {
                                Console.WriteLine("{0}: [D2GS] Logging on to game server", m_owner.Account);
                            }

                            byte[] temp = { 0x50, 0xcc, 0x5d, 0xed,
                                            0xb6, 0x19, 0xa5, 0x91 };

                            Int32 pad = 16 - m_owner.Character.Length;

                            byte[] padding        = new byte[pad];
                            byte[] characterClass = { m_owner.ClassByte };
                            byte[] joinpacket     = BuildPacket(0x68, m_owner.GsHash, m_owner.GsToken, characterClass, BitConverter.GetBytes((UInt32)0xd), temp, zero, System.Text.Encoding.ASCII.GetBytes(m_owner.Character), padding);
                            Write(joinpacket);
                            //Console.WriteLine("{0}: [D2GS] Join packet sent to server", m_owner.Account);
                            buffer.RemoveRange(0, 2);
                        }

                        if (buffer.Count < 2 || (buffer[0] >= 0xF0 && buffer.Count < 3))
                        {
                            break;
                        }

                        Int32 headerSize;
                        Int32 length = Huffman.GetPacketSize(buffer, out headerSize);
                        if (length > buffer.Count)
                        {
                            break;
                        }

                        byte[] compressedPacket = buffer.GetRange(headerSize, length).ToArray();
                        buffer.RemoveRange(0, length + headerSize);


                        byte[] decompressedPacket;
                        Huffman.Decompress(compressedPacket, out decompressedPacket);
                        List <byte> packet = new List <byte>(decompressedPacket);
                        while (packet.Count != 0)
                        {
                            Int32 packetSize;
                            if (!GetPacketSize(packet, out packetSize))
                            {
                                Console.WriteLine("{0}: [D2GS] Failed to determine packet length", m_owner.Account);
                                break;
                            }
                            List <byte> actualPacket = new List <byte>(packet.GetRange(0, packetSize));
                            packet.RemoveRange(0, packetSize);

                            byte identifier = actualPacket[0];
                            DispatchPacket(identifier)(identifier, actualPacket);
                            m_owner.ReceivedGameServerPacket(actualPacket);
                        }
                    }
                    catch
                    {
                        m_owner.InGame        = false;
                        m_owner.ConnectedToGs = false;

                        Console.WriteLine("{0}: [D2GS] Leaving the game.", m_owner.Account);
                        Write(new byte[] { 0x69 });

                        Thread.Sleep(500);

                        if (m_pingThread.IsAlive)
                        {
                            m_pingThread.Join();
                        }
                        m_owner.Status = ClientlessBot.ClientStatus.STATUS_NOT_IN_GAME;
                        Kill();
                        return;
                    }
                }
            }
        }