コード例 #1
0
        public PacketEditor(WPacket packet)
        {
            this.packet             = packet;
            pro                     = new PacketPro(packet);
            pro.onReadPropError    += Pro_onReadPropError;
            pro.onReadPropComplete += Pro_onReadPropComplete;


            InitializeComponent();
        }
コード例 #2
0
        public void OpenFile(string fileName)
        {
            if (!File.Exists(fileName))
            {
                return;
            }

            if (fileName.ToLower().EndsWith(".lrf"))
            {
                loading.Show("Wait..", "Parsing..");
                string checkWDC = new FileInfo(fileName).Directory.FullName + "/" + Path.GetFileNameWithoutExtension(fileName) + ".wdc";
                if (File.Exists(checkWDC))
                {
                    OpenFile(checkWDC);
                    return;
                }
                ParseFile(fileName);
                string newFile = new FileInfo(fileName).Directory.FullName + "/" + Path.GetFileNameWithoutExtension(fileName) + ".json";
                OpenJSON(newFile);
            }
            else if (fileName.ToLower().EndsWith(".json"))
            {
                string checkWDC = new FileInfo(fileName).Directory.FullName + "/" + Path.GetFileNameWithoutExtension(fileName) + ".wdc";
                if (File.Exists(checkWDC))
                {
                    OpenFile(checkWDC);
                    return;
                }
                OpenJSON(fileName);
            }
            else if (fileName.ToLower().EndsWith(".wdc"))
            {
                OpenWDC(fileName);
            }
            else
            {
                //Fake packet
                byte[]  bts  = File.ReadAllBytes(fileName);
                WPacket fake = new WPacket();
                fake.Head  = 0;
                fake.Bytes = bts;

                PacketEditor editor = new PacketEditor(fake);
                TabItem      tbitem = new TabItem()
                {
                    Header = fileName
                };
                tbitem.Content = editor;
                tabControl.Items.Add(tbitem);
                tabControl.SelectedItem = tbitem;
            }
        }
コード例 #3
0
ファイル: Packet.cs プロジェクト: wurucu/LRFPacketDecoder
        private List <WPacket> handleReliable2(BinaryReader reader, float time, bool C2S)
        {
            var len = reader.ReadUInt16(true);
            //if (reader.BaseStream.Length - reader.BaseStream.Position < len)
            //   return;

            List <WPacket> ret    = new List <WPacket>();
            var            packet = reader.ReadBytes(len);

            if (packet.Length < 1)
            {
                return(null);
            }

            var decrypted = decrypt(packet);

            WPacket pck = new WPacket();

            pck.Time   = this.Time;
            pck.Bytes  = decrypted;
            pck.Length = pck.Bytes.Length;
            pck.Head   = (PacketCmdS2C)decrypted[0];
            ret.Add(pck);

            printPacket(decrypted, time, C2S, false);

            if (decrypted[0] == 0xFF)
            {
                logLine(Environment.NewLine + "===Printing batch===");
                try
                {
                    ret.AddRange(decodeBatch(decrypted, time, C2S));
                }
                catch
                {
                    logLine("Batch parsing threw an exception.");
                }
                logLine("======================end batch==========================" + Environment.NewLine);
            }

            return(ret);
        }
コード例 #4
0
        public void Load(WPacket packet)
        {
            this.packet = packet;
            this.Head   = (PacketCmdS2C)packet.Bytes[0];
            //if (packet.Bytes.Length > 1)
            //{
            //    byte[] nwbts = new byte[packet.Bytes.Length - 1];
            //    Buffer.BlockCopy(packet.Bytes, 1, nwbts, 0, nwbts.Length);
            //    packet.Bytes = nwbts;
            //}

            string f1 = AppDomain.CurrentDomain.BaseDirectory + "/Packets/" + Convert.ToInt32(this.Head) + "_" + this.packet.Length + ".json";
            string f2 = AppDomain.CurrentDomain.BaseDirectory + "/Packets/" + Convert.ToInt32(this.Head) + ".json";
            string f3 = AppDomain.CurrentDomain.BaseDirectory + "/Packets/" + this.Head.ToString() + ".json";


            if (File.Exists(f1))
            {
                string rd        = File.ReadAllText(f1);
                var    thisClass = JsonConvert.DeserializeObject <PacketPro>(rd);
                setClass(thisClass);
                LoadPropsValues();
                return;
            }
            if (File.Exists(f2))
            {
                string rd        = File.ReadAllText(f2);
                var    thisClass = JsonConvert.DeserializeObject <PacketPro>(rd);
                setClass(thisClass);
                LoadPropsValues();
                return;
            }
            if (File.Exists(f3))
            {
                string rd        = File.ReadAllText(f3);
                var    thisClass = JsonConvert.DeserializeObject <PacketPro>(rd);
                setClass(thisClass);
                LoadPropsValues();
                return;
            }
            LoadPropsValues();
        }
コード例 #5
0
ファイル: Packet.cs プロジェクト: wurucu/LRFPacketDecoder
        private List <WPacket> decodeBatch(byte[] decrypted, float time, bool C2S)
        {
            List <WPacket> ret = new List <WPacket>();

            var reader = new BinaryReader(new MemoryStream(decrypted));

            reader.ReadByte();

            var packetCount = reader.ReadByte();
            var size        = reader.ReadByte();
            var opCode      = reader.ReadByte();
            var netId       = reader.ReadUInt32(true);
            var firstPacket = new List <byte>();

            firstPacket.Add(opCode);
            firstPacket.AddRange(BitConverter.GetBytes(netId).Reverse());

            if (size > 5)
            {
                firstPacket.AddRange(reader.ReadBytes(size - 5));
            }

            logLine("Packet 1, Length " + size);
            printPacket(firstPacket.ToArray(), time, C2S, false);
            WPacket pc = new WPacket();

            pc.Time   = this.Time;
            pc.Bytes  = firstPacket.ToArray();
            pc.Length = pc.Bytes.Length;
            pc.Head   = (PacketCmdS2C)pc.Bytes[0];
            ret.Add(pc);

            for (int i = 2; i < packetCount + 1; i++)
            {
                var  buffer       = new List <byte>();
                uint newId        = 0;
                bool netIdChanged = false;
                byte command;

                var flagsAndLength = reader.ReadByte(); // 6 first bits = size (if not 0xFC), 2 last bits = flags
                size = (byte)(flagsAndLength >> 2);

                if ((flagsAndLength & 0x01) > 0)
                { // additionnal byte, skip command
                    command = opCode;
                    if ((flagsAndLength & 0x02) > 0)
                    {
                        reader.ReadByte();
                    }
                    else
                    {
                        newId        = reader.ReadUInt32(true);
                        netIdChanged = true;
                    }
                }
                else
                {
                    command = reader.ReadByte();
                    if ((flagsAndLength & 0x02) > 0)
                    {
                        reader.ReadByte();
                    }
                    else
                    {
                        newId        = reader.ReadUInt32(true);
                        netIdChanged = true;
                    }
                }

                if (size == 0x3F)
                    size = reader.ReadByte(); // size is too big to be on 6 bits, so instead it's stored later
}
                logLine("Packet " + i + ", Length " + (size + 5));
                buffer.Add(command);
                if (netIdChanged)
                {
                    buffer.AddRange(BitConverter.GetBytes(newId).Reverse());
                    netId = newId;
                }
                else
                {
                    buffer.AddRange(BitConverter.GetBytes(netId).Reverse());
                }
                buffer.AddRange(reader.ReadBytes(size));
                printPacket(buffer.ToArray(), time, C2S, false);

                WPacket pc2 = new WPacket();
                pc2.Time   = this.Time;
                pc2.Bytes  = buffer.ToArray();
                pc2.Length = pc2.Bytes.Length;
                pc2.Head   = (PacketCmdS2C)pc2.Bytes[0];
                ret.Add(pc2);

                opCode = command;
            }
コード例 #6
0
ファイル: Packet.cs プロジェクト: wurucu/LRFPacketDecoder
        private List <WPacket> decodeBatch2(byte[] decrypted, float time, bool C2S)
        {
            var            reader = new BinaryReader(new MemoryStream(decrypted));
            var            unk1   = reader.ReadByte();
            List <WPacket> ret    = new List <WPacket>();


            try
            {
                var packetCount = reader.ReadByte();
                var size        = reader.ReadByte();
                var opCode      = reader.ReadByte();
                var netId       = reader.ReadUInt32(true);
                var firstPacket = new List <byte>();

                firstPacket.Add(opCode);
                firstPacket.AddRange(BitConverter.GetBytes(netId).Reverse());

                if (size > 5)
                {
                    firstPacket.AddRange(reader.ReadBytes(size - 5));
                }

                logLine("Packet 1, Length " + size);
                printPacket(firstPacket.ToArray(), time, C2S, false);
                WPacket pck = new WPacket();
                pck.Time   = this.Time;
                pck.Bytes  = firstPacket.ToArray();
                pck.Length = pck.Bytes.Length;
                pck.Head   = (PacketCmdS2C)pck.Bytes[0];
                ret.Add(pck);

                for (int i = 2; i < packetCount + 1; i++)
                {
                    var  buffer = new List <byte>();
                    uint newId  = 0;
                    byte command;

                    var flagsAndLength = 0;

                    try
                    {
                        if (reader.BaseStream.Position + 1 > reader.BaseStream.Length)
                        {
                            break;
                        }
                        reader.ReadByte(); // 6 first bits = size (if not 0xFC), 2 last bits = flags
                    }
                    catch (Exception)
                    {
                    }

                    size = (byte)(flagsAndLength >> 2);

                    if ((flagsAndLength & 0x01) > 0)
                    { // additionnal byte, skip command
                        command = opCode;
                        try
                        {
                            if (reader.BaseStream.Position + 1 > reader.BaseStream.Length)
                            {
                                break;
                            }
                            reader.ReadByte();
                        }
                        catch (Exception)
                        {
                        }
                    }
                    else
                    {
                        if (reader.BaseStream.Position + 1 > reader.BaseStream.Length)
                        {
                            break;
                        }
                        command = reader.ReadByte();
                        if ((flagsAndLength & 0x02) > 0)
                        {
                            try
                            {
                                if (reader.BaseStream.Position + 1 > reader.BaseStream.Length)
                                {
                                    break;
                                }
                                reader.ReadByte();
                            }
                            catch (Exception)
                            {
                            }
                        }

                        else
                        {
                            try
                            {
                                if (reader.BaseStream.Position + 4 > reader.BaseStream.Length)
                                {
                                    break;
                                }
                                newId = reader.ReadUInt32(true);
                            }
                            catch (Exception)
                            {
                            }
                        }
                    }

                    try
                    {
                        if (reader.BaseStream.Position + 1 > reader.BaseStream.Length)
                        {
                            break;
                        }

                        if (size == 0x3F)
                        {
                            size = reader.ReadByte(); // size is too big to be on 6 bits, so instead it's stored later
                        }
                    }
                    catch (Exception)
                    {
                    }


                    //logLine("Packet " + i + ", Length " + (size + 5));
                    buffer.Add(command);
                    if (newId > 0)
                    {
                        buffer.AddRange(BitConverter.GetBytes(newId).Reverse());
                    }
                    else
                    {
                        buffer.AddRange(BitConverter.GetBytes(netId).Reverse());
                    }

                    try
                    {
                        if (reader.BaseStream.Position + size > reader.BaseStream.Length)
                        {
                            break;
                        }

                        buffer.AddRange(reader.ReadBytes(size));
                    }
                    catch (Exception)
                    { }

                    printPacket(buffer.ToArray(), time, C2S, false);
                    WPacket pck2 = new WPacket();
                    pck2.Time   = this.Time;
                    pck2.Bytes  = buffer.ToArray();
                    pck2.Length = pck2.Bytes.Length;
                    pck2.Head   = (PacketCmdS2C)pck2.Bytes[0];
                    ret.Add(pck2);

                    opCode = command;
                }
            }
            catch (Exception)
            {
            }
            return(ret);
        }
コード例 #7
0
ファイル: Packet.cs プロジェクト: wurucu/LRFPacketDecoder
        private WPacket handleFragment(BinaryReader reader, float time, bool C2S)
        {
            var fragmentGroup = reader.ReadUInt16(); // Fragment start number
            var len           = reader.ReadUInt16(true);

            if (reader.BaseStream.Length - reader.BaseStream.Position < len + 16)
            {
                return(null);
            }

            var totalFragments  = reader.ReadInt32(true);
            var currentFragment = reader.ReadInt32(true);
            var totalLen        = reader.ReadInt32(true);

            reader.ReadInt32(); // Offset
            var payload = reader.ReadBytes(len);

            if (!fragmentBuffer.ContainsKey(fragmentGroup))
            {
                fragmentBuffer.Add(fragmentGroup, new Dictionary <int, byte[]>());
            }

            var buff = fragmentBuffer[fragmentGroup];

            if (buff.ContainsKey(currentFragment))
            {
                buff[currentFragment] = payload;
            }
            else
            {
                buff.Add(currentFragment, payload);
            }

            if (buff.Count == totalFragments)
            {
                var packet = new List <byte>();
                var temp   = buff.OrderBy(x => x.Key);
                foreach (var t in temp)
                {
                    packet.AddRange(t.Value);
                }

                if (totalLen != packet.Count)
                {
                    return(null);// logLine("Fragment's fishy. " + totalLen + "!=" + packet.Count);
                }
                var decrypted = decrypt(packet.ToArray());

                printPacket(decrypted, time, C2S);

                WPacket pck = new WPacket();
                pck.Time   = time;
                pck.Head   = (PacketCmdS2C)decrypted[0];
                pck.Bytes  = decrypted;
                pck.Length = pck.Bytes.Length;
                fragmentBuffer.Remove(fragmentGroup);
                return(pck);
            }

            return(null);
        }
コード例 #8
0
 public PacketPro(WPacket packet)
 {
     this.Load(packet);
 }