Salut les gars je suis en train de dev un sniffer pour l'offi et j'ai des valeurs négatives au niveau de certains messages (e.g GameMapMovementMessage).
Je n'ai pas d'idée quant à l'origine du probleme readers/writers sont bons et la manière dont je build mon packet est bonne aussi (a priori).
C'est déja arrivé a qqun ce genre de souci ? J'utilsie sharpPcap pour sniffer.
Voici la manière dont je build mes packets :
OnDataReceived
Cliquez pour révéler
Cliquez pour masquer
private void SnifferOnOnPacketReceived(Packet packet)
{
var ipPacket = (IPPacket) ((EthernetPacket) packet).PayloadPacket;
Packet payloadPacket = ipPacket.PayloadPacket;
byte[] data = payloadPacket.PayloadData;
if (data.Length <= 0 && (data.Length != 1 || data[0] == 0x00)) return;
bool isClient = Equals(ipPacket.SourceAddress, IPAddress.Parse(_sniffer.DeviceIp));
_buffer.AddRange(data);
while (_packetBuilder.TryBuild(_buffer, out DofusPacket dofusPacket, isClient))
{
Message msg = MessageReceiver.ComputeMessage(dofusPacket.Metadata.MessageId, dofusPacket.Payload);
Type downcastType = msg.GetType();
object downcast = Convert.ChangeType(msg, downcastType);
SniffedPacket sniffedPacket = new(DateTime.Now.ToString("T"),
isClient ? "Client" : "Server",
dofusPacket.Metadata.MessageId,
downcastType.Name,
JsonSerializer.Serialize(downcast, _serializerOptions),
BitConverter.ToString(dofusPacket.Payload));
Application.Current.Dispatcher.InvokeAsync(() => SniffedPackets.Add(sniffedPacket)); // WPF
}
}
TryBuildPacket
Cliquez pour révéler
Cliquez pour masquer
public bool TryBuild(List<byte> buffer, out DofusPacket packet, bool isClient)
{
packet = default;
CollectionReader reader = new(buffer);
if (reader.Remaining < 2) return false;
ushort header = reader.ReadUShort();
if (isClient && reader.Remaining < 4) return false;
uint instanceId = isClient ? reader.ReadUInt() : 0;
int messageId = header >> 2;
int lenType = header & 3;
if (messageId <= 0 || lenType is < 0 or > 3 || !MessageReceiver.EnsureMessageId(messageId) || reader.Remaining < lenType)
return false;
int len = lenType switch
{
0 => 0,
1 => reader.ReadByte(),
2 => reader.ReadUShort(),
3 => ((reader.ReadSByte() & 255) << 16) + ((reader.ReadSByte() & 255) << 8) + (reader.ReadSByte() & 255),
_ => throw new InvalidDataException("Length type must be inside [0;3]")
};
if (reader.Remaining < len) return false;
byte[] payload = reader.ReadBytes(len);
DofusPacketMetadata metadata = new(messageId, lenType, len, instanceId);
packet = new DofusPacket(metadata, payload);
buffer.RemoveRange(0, reader.BytesRead);
return true;
}
Egalement qque chose de bizarre c'est une fois que IG je passe du serveur d'authentication au serveur de jeu je n'arrive plus à build mes packets, la methode me retourne toujours false. Lors de la passation Auth-Game je dois vider mon buffer ??
Peut etre que ces problemes sont dûs à la lib pour pour sniffer (sharpPCap qqun a déja utilisé ça ?)
Pour ceux qui connaissent la lib voici comment je capture le trafic réseau :
sharpcap
Cliquez pour révéler
Cliquez pour masquer
public Task StartCaptureAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
while (cancellationToken == default || !cancellationToken.IsCancellationRequested)
{
GetPacketStatus status = _device.GetNextPacket(out PacketCapture capture);
if (status != GetPacketStatus.PacketRead) continue;
RawCapture raw = capture.GetPacket();
var packet = Packet.ParsePacket(raw.LinkLayerType, raw.Data);
OnPacketReceived?.Invoke(packet);
}
}, cancellationToken);
}
(exemple valeur négative) :
![img]()
Merci pour votre aide.