c# - 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
返回的内容发送给服务器/客户端