首页 > 解决方案 > BSON 对象解码

问题描述

要知道游戏(客户端)发送到服务器的信息,我决定制作一个代理来跟踪收集的内容:客户端 -> 代理 -> 服务器服务器 -> 代理 -> 客户端(->表示发送的数据包)但问题是编码,我发现游戏使用Kernys.BSON,所以我决定也使用它。但我在尝试解码 BSON 对象时卡住了。

        private byte[] OnPacket(byte[] ReceivedBytes)
        {
            // Remove padding and load the bson.
            byte[] data = new byte[ReceivedBytes.Length - 4];
            Buffer.BlockCopy(ReceivedBytes, 4, data, 0, data.Length);

            BSONObject packets = null;
            try
            {
                packets = SimpleBSON.Load(data);
            }catch { }

            if (packets == null || !packets.ContainsKey("mc"))
                return ReceivedBytes;
            for (int i = 0; i < packets["mc"]; i++)
            {
                BSONObject packet = packets["m" + i] as BSONObject;
                ReadBSON(packet);

                if (packet["ID"].stringValue == "OoIP")
                {
                    PIXEL_IP = (packet["IP"].stringValue == "prod.gamev74.portalworldsgame.com" ? "52.73.237.169" : packet["IP"].stringValue);
                    packet["IP"] = "52.73.237.169";
                }
            }

            // Dump the BSON and add padding.
            MemoryStream memoryStream = new MemoryStream();
            using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream))
            {
                byte[] bsonDump = SimpleBSON.Dump(packets);

                binaryWriter.Write(bsonDump.Length + 4);
                binaryWriter.Write(bsonDump);
            }
            return memoryStream.ToArray();
        }

        public void ReadBSON(BSONObject SinglePacket, string Parent = "")
        {
            foreach (string Key in SinglePacket.Keys)
            {
                try
                {
                    BSONValue Packet = SinglePacket[Key];

                    switch (Packet.valueType)
                    {
                        case BSONValue.ValueType.String:
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.stringValue}");
                            break;
                        case BSONValue.ValueType.Boolean:
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.boolValue}");
                            break;
                        case BSONValue.ValueType.Int32:
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.int32Value}");
                            break;
                        case BSONValue.ValueType.Int64:
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.int64Value}");
                            break;
                        case BSONValue.ValueType.Binary:
                            try
                            {
                                Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.binaryValue}");
                                ReadBSON(SimpleBSON.Load(Packet.binaryValue), Key);
                            }
                            catch
                            {
                                Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = [{BitConverter.ToString(Packet.binaryValue)}]");
                            }
                            break;
                        case BSONValue.ValueType.Double:
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.doubleValue}");
                            break;
                        case BSONValue.ValueType.Array:
                            string bamboom = $"{Parent} = {Key} | {Packet.valueType} = [";
                            foreach (var strong in Packet.stringListValue) 
                            {
                                bamboom += strong + ", ";
                            }
                            bamboom = bamboom.Remove(bamboom.Length - 2, 2);
                            bamboom += "]";
                            Console.WriteLine(bamboom);
                            break; 
                        case BSONValue.ValueType.UTCDateTime:
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType} = {Packet.dateTimeValue}");
                            break;
                        case BSONValue.ValueType.Object
                            Console.WriteLine($"{Parent} = {Key} | {Packet.valueType}");
                            ReadBSON(SimpleBSON.Load(Packet), Key); //of course error
                            break;
                    }
                }
                catch(Exception ee)
                {
                    Console.WriteLine(ee);
                }
            }
        }

然后我将OnPacket返回的内容发送给服务器/客户端

标签: c#networkingpacketbson

解决方案


推荐阅读