Esempio n. 1
0
        public void DecryptClient()
        {
            List <byte> builder = new List <byte>();

            if (this.ClientConversation.Count == 0)
            {
                return;
            }
            // First packet contains our key
            byte[] keypacket = this.ClientConversation.First().Value;
            int    key       = this.ClientConversation.Keys.First();

            this.ClientKey = Tools.GlobalFunctions.GetKeyFromKnownPacketID(keypacket, 14);
            int length = 0;
            int crc    = 0;

            byte[] toUnXor = Tools.GlobalFunctions.GetPortionsToXOR(keypacket, out length, out crc, true);
            byte[] xor     = Xor.decrypt(toUnXor, this.ClientKey);
            builder.AddRange(BitConverter.GetBytes(length));
            builder.AddRange(BitConverter.GetBytes(14));
            builder.AddRange(xor);
            builder.AddRange(new byte[4]);
            this.ClientConversationDecrypted.Add(key, builder.ToArray());
            // First Client packets Added
            for (int i = 1; i < this.ClientConversation.Count; i++)
            {
                builder.Clear();
                toUnXor = Tools.GlobalFunctions.GetPortionsToXOR(this.ClientConversation.Values.ElementAt(i), out length, out crc);
                xor     = Xor.decrypt(toUnXor, this.ClientKey);
                builder.AddRange(BitConverter.GetBytes(length));
                builder.AddRange(xor);
                builder.AddRange(new byte[4]);
                this.ClientConversationDecrypted.Add(this.ClientConversation.Keys.ElementAt(i), builder.ToArray());
            }
            foreach (KeyValuePair <int, byte[]> values in this.ClientConversationDecrypted)
            {
                WritePaket(values.Value, PacketOrigin.Client);
            }
        }
Esempio n. 2
0
        public void DecodePacket(byte[] packet, PacketOrigin origin)
        {
            int p_len = 0;
            int crc   = 0;

            if (origin == PacketOrigin.Client)
            {
                if (this.ClientPacketsParsed == 0)
                {
                    this.ClientKey = Tools.GlobalFunctions.GetKeyFromKnownPacketID(packet, 14);

                    byte[] toXor = Tools.GlobalFunctions.GetPortionsToXOR(packet, out p_len, out crc, true);
                    byte[] xored = Xor.decrypt(toXor, this.ClientKey);
                    byte[] len   = BitConverter.GetBytes(p_len);
                    byte[] full  = new byte[len.Length + toXor.Length + 8];
                    Array.Copy(len, full, len.Length);
                    Array.Copy(BitConverter.GetBytes(14), 0, full, 4, BitConverter.GetBytes(14).Length);
                    Array.Copy(xored, 0, full, 8, xored.Length);
                    WritePaket(full, PacketOrigin.Client);
                }
                else if (this.ClientKey != null)
                {
                    byte[] toXor = Tools.GlobalFunctions.GetPortionsToXOR(packet, out p_len, out crc);
                    byte[] len   = BitConverter.GetBytes(p_len);
                    byte[] xor   = Xor.decrypt(toXor, this.ClientKey);
                    byte[] full  = new byte[len.Length + toXor.Length + 4];
                    Array.Copy(len, full, len.Length);
                    Array.Copy(xor, 0, full, 4, xor.Length);
                    WritePaket(full, PacketOrigin.Client);
                    //WritePaket(packet, origin);
                }
                this.ClientPacketsParsed++;
            }
            else if (origin == PacketOrigin.Server)
            {
                if (this.ServerPacketsParsed == 1)
                {
                    byte[] p1 = new byte[32];
                    // Get the last 32 bytes
                    Array.Copy(packet, (packet.Length - 32), p1, 0, p1.Length);
                    // This is our server decode packet
                    //int k = 0;
                    int t   = 0;
                    int lnk = 0;
                    #region While
                    while (t < p1.Length)
                    {
                        lnk  = BitConverter.ToInt32(p1, t);
                        lnk += 4;
                        bx   = new byte[lnk];
                        Array.Copy(p1, t + 4, bx, 0, lnk);
                        t += lnk + 4;
                        //if (k == 0)
                        //{
                        this.uc = new cryption(bx);
                        uc.decript(bx, 0x19);
                        //}
                        //else
                        // {

                        // }
                        // Get the length -4
                        Int32  length     = uc.data.Length - 4;
                        byte[] p_len2     = BitConverter.GetBytes(length);
                        byte[] fullPacket = new byte[p_len2.Length + uc.data.Length];
                        Array.Copy(p_len2, fullPacket, p_len2.Length);
                        Array.Copy(uc.data, 0, fullPacket, 4, uc.data.Length);
                        WritePaket(fullPacket, PacketOrigin.Server);

                        //rt_op.AppendText(FormatBytes(fullPacket));//.Text += FormatBytes(fullPacket);//(uc.data) + "\n";//ByteArrayToHexString(uc.data) + "\n";
                        //rt_op.SelectionColor = Color.Red;
                        //rt_op.AppendText(NiceHexOutput(fullPacket));
                    }
                    #endregion
                }
                else if (this.ServerPacketsParsed >= 2)
                {
                    //this.uc.data = packet;
                    // remove first 4
                    byte[] data = new byte[packet.Length - 4];
                    Array.Copy(packet, 4, data, 0, data.Length);
                    //int pos = this.uc.data.Length;
                    //Array.Resize(ref this.uc.data, this.uc.data.Length + packet.Length);
                    //Array.Copy(packet, 0, this.uc.data, pos, packet.Length);
                    //this.uc.data = packet;
                    this.uc.decript(data);
                    //Form1.WriteLine(string.Format("Length of this packet divisible by 4 ? {0}", packet.Length % 4 == 0));
                    WritePaket(this.uc.data, PacketOrigin.Server);
                }
                this.ServerPacketsParsed++;
            }
        }