public void PacketHandler(Packet packet) { try { // Make this static or at least dont create a new Protocol16 for every package Protocol16 protocol16 = new Protocol16(); IpV4Datagram ip = packet.Ethernet.IpV4; UdpDatagram udp = ip.Udp; if (udp.SourcePort != 5056 && udp.DestinationPort != 5056) { return; } var ms = udp.Payload.ToMemoryStream(); var p = new BinaryReader(ms); var peerId = IPAddress.NetworkToHostOrder(p.ReadUInt16()); var crcEnabled = p.ReadByte(); var commandCount = p.ReadByte(); var timestamp = IPAddress.NetworkToHostOrder(p.ReadInt32()); var challenge = IPAddress.NetworkToHostOrder(p.ReadInt32()); var commandHeaderLength = 12; var signifierByteLength = 1; for (int commandIdx = 0; commandIdx < commandCount; commandIdx++) { var commandType = p.ReadByte(); var channelId = p.ReadByte(); var commandFlags = p.ReadByte(); var unkBytes = p.ReadByte(); var commandLength = IPAddress.NetworkToHostOrder(p.ReadInt32()); var sequenceNumber = IPAddress.NetworkToHostOrder(p.ReadInt32()); switch (commandType) { case 4: //Disconnect break; case 7: //Send unreliable p.BaseStream.Position += 4; commandLength -= 4; goto case 6; case 6: //Send reliable p.BaseStream.Position += signifierByteLength; var messageType = p.ReadByte(); var operationLength = commandLength - commandHeaderLength - 2; var payload = new StreamBuffer(p.ReadBytes(operationLength)); switch (messageType) { case 2: //Operation Request var requestData = protocol16.DeserializeOperationRequest(payload); _eventHandler.OnRequest(requestData.OperationCode, requestData.Parameters); break; case 3: //Operation Response var responseData = protocol16.DeserializeOperationResponse(payload); _eventHandler.OnResponse(responseData.OperationCode, responseData.ReturnCode, responseData.Parameters); break; case 4: //Event var eventData = protocol16.DeserializeEventData(payload); _eventHandler.OnEvent(eventData.Code, eventData.Parameters); break; default: p.BaseStream.Position += operationLength; break; } break; default: p.BaseStream.Position += commandLength - commandHeaderLength; break; } } } catch (System.IO.EndOfStreamException) { Console.WriteLine("End of Stream Error"); } catch (Exception e) { Console.WriteLine("PackeHandler Exception: " + e.ToString()); } }
public void PacketHandler(Packet packet) { Protocol16 protocol16 = new Protocol16(); UdpDatagram udp = packet.Ethernet.IpV4.Udp; if (udp.SourcePort != 5056 && udp.DestinationPort != 5056) { return; } BinaryReader p = new BinaryReader(udp.Payload.ToMemoryStream()); IPAddress.NetworkToHostOrder((int)p.ReadUInt16()); p.ReadByte(); byte commandCount = p.ReadByte(); try { IPAddress.NetworkToHostOrder(p.ReadInt32()); IPAddress.NetworkToHostOrder(p.ReadInt32()); } catch { } int commandHeaderLength = 12; int signifierByteLength = 1; for (int commandIdx = 0; commandIdx < (int)commandCount; commandIdx++) { try { byte commandType = p.ReadByte(); p.ReadByte(); p.ReadByte(); p.ReadByte(); int commandLength = IPAddress.NetworkToHostOrder(p.ReadInt32()); IPAddress.NetworkToHostOrder(p.ReadInt32()); switch (commandType) { case 4: goto IL_1E7; case 5: goto IL_1CF; case 6: break; case 7: p.BaseStream.Position += 4L; commandLength -= 4; break; default: goto IL_1CF; } p.BaseStream.Position += (long)signifierByteLength; byte messageType = p.ReadByte(); int operationLength = commandLength - commandHeaderLength - 2; StreamBuffer payload = new StreamBuffer(p.ReadBytes(operationLength)); switch (messageType) { case 2: { OperationRequest requestData = protocol16.DeserializeOperationRequest(payload); this._eventHandler.OnRequest(requestData.OperationCode, requestData.Parameters); goto IL_1E7; } case 3: { OperationResponse responseData = protocol16.DeserializeOperationResponse(payload); this._eventHandler.OnResponse(responseData.OperationCode, responseData.ReturnCode, responseData.Parameters); goto IL_1E7; } case 4: { EventData eventData = protocol16.DeserializeEventData(payload); this._eventHandler.OnEvent(eventData.Code, eventData.Parameters); goto IL_1E7; } default: p.BaseStream.Position += (long)operationLength; goto IL_1E7; } IL_1CF: p.BaseStream.Position += (long)(commandLength - commandHeaderLength); IL_1E7 :; } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.StackTrace); } } }
public void PacketHandler(Packet packet) { Protocol16 protocol = new Protocol16(); UdpDatagram udp = packet.Ethernet.IpV4.Udp; if (udp.SourcePort == 5056 || udp.DestinationPort == 5056) { BinaryReader binaryReader = new BinaryReader(udp.Payload.ToMemoryStream()); IPAddress.NetworkToHostOrder(binaryReader.ReadUInt16()); binaryReader.ReadByte(); byte b = binaryReader.ReadByte(); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); int num = 12; int num2 = 1; for (int i = 0; i < b; i++) { try { byte b2 = binaryReader.ReadByte(); binaryReader.ReadByte(); binaryReader.ReadByte(); binaryReader.ReadByte(); int num3 = IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); switch (b2) { case 4: break; case 7: binaryReader.BaseStream.Position += 4L; num3 -= 4; goto case 6; case 6: { binaryReader.BaseStream.Position += num2; byte b3 = binaryReader.ReadByte(); int num4 = num3 - num - 2; StreamBuffer streamBuffer = new StreamBuffer(binaryReader.ReadBytes(num4)); switch (b3) { case 2: { OperationRequest operationRequest = protocol.DeserializeOperationRequest(streamBuffer); _eventHandler.OnRequest(operationRequest.OperationCode, operationRequest.Parameters); break; } case 3: { OperationResponse operationResponse = protocol.DeserializeOperationResponse(streamBuffer); _eventHandler.OnResponse(operationResponse.OperationCode, operationResponse.ReturnCode, operationResponse.Parameters); break; } case 4: { EventData eventData = protocol.DeserializeEventData(streamBuffer); _eventHandler.OnEvent(eventData.Code, eventData.Parameters); break; } default: binaryReader.BaseStream.Position += num4; break; } break; } default: binaryReader.BaseStream.Position += num3 - num; break; } } catch (Exception) { } } } }
// Thanks to https://github.com/rafalfigura for the majority of this class public void ParsePacket(byte[] photonPacket) { Protocol16 protocol16 = new Protocol16(); Stream stream = new MemoryStream(photonPacket); BinaryReader reader = new BinaryReader(stream); var peerId = IPAddress.NetworkToHostOrder(reader.ReadUInt16()); var crcEnabled = reader.ReadByte(); var commandCount = reader.ReadByte(); var timestamp = IPAddress.NetworkToHostOrder(reader.ReadInt32()); var challenge = IPAddress.NetworkToHostOrder(reader.ReadInt32()); var commandHeaderLength = 12; var signifierByteLength = 1; for (int commandIdx = 0; commandIdx < commandCount; commandIdx++) { byte commandType = reader.ReadByte(); byte channelId = reader.ReadByte(); byte commandFlags = reader.ReadByte(); byte unkBytes = reader.ReadByte(); int commandLength = IPAddress.NetworkToHostOrder(reader.ReadInt32()); int sequenceNumber = IPAddress.NetworkToHostOrder(reader.ReadInt32()); switch (commandType) { case 4: //Disconnect break; case 7: //Send unreliable reader.BaseStream.Position += 4; commandLength -= 4; goto case 6; case 6: //Send reliable reader.BaseStream.Position += signifierByteLength; byte messageType = reader.ReadByte(); int operationLength = commandLength - commandHeaderLength - 2; StreamBuffer payload = new StreamBuffer(reader.ReadBytes(operationLength)); switch (messageType) { case 2: // OperationRequest var requestData = protocol16.DeserializeOperationRequest(payload); OperationRequestEventArgs requestArgs = new OperationRequestEventArgs(); requestArgs.OperationCode = requestData.OperationCode; requestArgs.Parameters = requestData.Parameters; OnOperationRequest(requestArgs); break; case 3: // OperationResponse var responseData = protocol16.DeserializeOperationResponse(payload); OperationResponseEventArgs responseArgs = new OperationResponseEventArgs(); responseArgs.OperationCode = responseData.OperationCode; responseArgs.ReturnCode = responseData.ReturnCode; responseArgs.Parameters = responseData.Parameters; OnOperationResponse(responseArgs); break; case 4: // EventData var eventData = protocol16.DeserializeEventData(payload); EventDataEventArgs dataArgs = new EventDataEventArgs(); dataArgs.Code = eventData.Code; dataArgs.Parameters = eventData.Parameters; OnEventData(dataArgs); break; default: reader.BaseStream.Position += operationLength; break; } break; default: reader.BaseStream.Position += commandLength - commandHeaderLength; break; } } }
private void PacketHandle(object sender, CaptureEventArgs e) { Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var udpPacket = packet.Extract <UdpPacket>(); if (udpPacket == null) { return; } Protocol16 protocol16 = new Protocol16(); log.Debug($"sourcePort={udpPacket.SourcePort} destPort={udpPacket.DestinationPort}"); BinaryReader binaryReader = new BinaryReader(new MemoryStream(udpPacket.PayloadData)); try { IPAddress.NetworkToHostOrder((int)binaryReader.ReadUInt16()); binaryReader.ReadByte(); byte commandCount = binaryReader.ReadByte(); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); int commandHeaderLength = 12; int signifierByteLength = 1; for (int commandIdx = 0; commandIdx < (int)commandCount; commandIdx++) { try { byte commandType = binaryReader.ReadByte(); binaryReader.ReadByte(); binaryReader.ReadByte(); binaryReader.ReadByte(); int commandLength = IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); switch (commandType) { case 4: goto IL_1E7; case 5: goto IL_1CF; case 6: break; case 7: binaryReader.BaseStream.Position += 4L; commandLength -= 4; break; default: goto IL_1CF; } binaryReader.BaseStream.Position += (long)signifierByteLength; byte messageType = binaryReader.ReadByte(); int operationLength = commandLength - commandHeaderLength - 2; StreamBuffer payload = new StreamBuffer(binaryReader.ReadBytes(operationLength)); switch (messageType) { case 2: { log.Debug($"Request Packet Data: {System.Convert.ToBase64String(udpPacket.PayloadData)}"); OperationRequest requestData = protocol16.DeserializeOperationRequest(payload); Instance.OnRequest(requestData.OperationCode, requestData.Parameters); goto IL_1E7; } case 3: { OperationResponse responseData = protocol16.DeserializeOperationResponse(payload); Instance.OnResponse(responseData.OperationCode, responseData.ReturnCode, responseData.Parameters); goto IL_1E7; } case 4: { EventData eventData = protocol16.DeserializeEventData(payload); Instance.OnEvent(eventData.Code, eventData.Parameters); goto IL_1E7; } default: binaryReader.BaseStream.Position += (long)operationLength; goto IL_1E7; } IL_1CF: binaryReader.BaseStream.Position += (long)(commandLength - commandHeaderLength); IL_1E7 :; } catch (Exception ex) { log.Error(ex.StackTrace); } } } catch (Exception ex) { log.Error(ex.StackTrace); } }
public void PacketHandler(Packet packet) { try { // Make this static or at least dont create a new Protocol16 for every package Protocol16 protocol16 = new Protocol16(); IpV4Datagram ip = packet.Ethernet.IpV4; UdpDatagram udp = ip.Udp; // Not technically necesasry as the bpf limits to only udp 5055 if (udp.SourcePort != 5056 && udp.DestinationPort != 5056 && udp.SourcePort != 5055 && udp.DestinationPort != 5055) { return; } var ms = udp.Payload.ToMemoryStream(); var p = new BinaryReader(ms); var peerId = IPAddress.NetworkToHostOrder(p.ReadUInt16()); var crcEnabled = p.ReadByte(); var commandCount = p.ReadByte(); var timestamp = IPAddress.NetworkToHostOrder(p.ReadInt32()); var challenge = IPAddress.NetworkToHostOrder(p.ReadInt32()); var commandHeaderLength = 12; var signifierByteLength = 1; for (int commandIdx = 0; commandIdx < commandCount; commandIdx++) { var commandType = p.ReadByte(); var channelId = p.ReadByte(); var commandFlags = p.ReadByte(); var unkBytes = p.ReadByte(); var commandLength = IPAddress.NetworkToHostOrder(p.ReadInt32()); var sequenceNumber = IPAddress.NetworkToHostOrder(p.ReadInt32()); void ParseOperation(byte messageType, StreamBuffer payload, int operationLength) { switch (messageType) { case 2: //Operation Request var requestData = protocol16.DeserializeOperationRequest(payload); _eventHandler.OnRequest(requestData.OperationCode, requestData.Parameters); break; case 3: //Operation Response var responseData = protocol16.DeserializeOperationResponse(payload); _eventHandler.OnResponse(responseData.OperationCode, responseData.ReturnCode, responseData.Parameters); break; case 4: //Event var eventData = protocol16.DeserializeEventData(payload); _eventHandler.OnEvent(eventData.Code, eventData.Parameters); break; default: p.BaseStream.Position += operationLength; break; } } switch (commandType) { case 4: //Disconnect break; case 7: //Send unreliable p.BaseStream.Position += 4; commandLength -= 4; goto case 6; case 6: //Send reliable { p.BaseStream.Position += signifierByteLength; var messageType = p.ReadByte(); var operationLength = commandLength - commandHeaderLength - 2; var payload = new StreamBuffer(p.ReadBytes(operationLength)); ParseOperation(messageType, payload, operationLength); break; } case 8: // Reliable Fragment { // Each fragment contains a starting sequence number, its sequence number, // and how many fragments total there are. var startSequenceNumber = IPAddress.NetworkToHostOrder(p.ReadInt32()); var fragmentCount = IPAddress.NetworkToHostOrder(p.ReadInt32()); var fragmentNumber = IPAddress.NetworkToHostOrder(p.ReadInt32()); var totalLength = IPAddress.NetworkToHostOrder(p.ReadInt32()); var fragmentOffset = IPAddress.NetworkToHostOrder(p.ReadInt32()); var operationLength = commandLength - 5 * 4 - commandHeaderLength; // 5 4-byte var payload = p.ReadBytes(operationLength); if (!fragmentMap.TryGetValue(startSequenceNumber, out var fragment)) { fragment = new Fragment { buffer = new byte[totalLength], totalFragments = fragmentCount, readFragments = 0 }; fragmentMap.Add(startSequenceNumber, fragment); } fragment.readFragments++; Array.Copy(payload, 0, fragment.buffer, fragmentOffset, payload.Length); if (fragment.readFragments == fragment.totalFragments) { Console.WriteLine("Fragment Complete"); var stream = new StreamBuffer(fragment.buffer); stream.Position += signifierByteLength; Console.WriteLine("Fragment Stream Read"); var messageType = stream.ReadByte(); Console.WriteLine("Fragment MessageType: " + messageType); ParseOperation(messageType, stream, operationLength); Console.WriteLine("Fragment Successfully Handled"); fragmentMap.Remove(startSequenceNumber); } break; } default: if (commandType != 1 && commandType != 5) { // Console.WriteLine("Received Unhandled Command Type: " + commandType); } p.BaseStream.Position += commandLength - commandHeaderLength; break; } } } catch (Exception e) { Console.WriteLine("PacketHandler Exception: " + e.ToString()); } }
private void PacketHandle(object sender, CaptureEventArgs e) { Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var udpPacket = packet.Extract <UdpPacket>(); var ipPacket = packet.Extract <IPPacket>(); if (udpPacket == null) { return; } //ILog plog = LogManager.GetLogger("Packet"); //plog.Debug(string.Format("{0}:{1}->{2}:{3}", ipPacket.SourceAddress, udpPacket.SourcePort, ipPacket.DestinationAddress, udpPacket.DestinationPort)); String hexPayloadData = Convert.ToBase64String(udpPacket.PayloadData); Protocol16 protocol16 = new Protocol16(); BinaryReader binaryReader = new BinaryReader(new MemoryStream(udpPacket.PayloadData)); try { IPAddress.NetworkToHostOrder((int)binaryReader.ReadUInt16()); binaryReader.ReadByte(); byte commandCount = binaryReader.ReadByte(); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); int commandHeaderLength = 12; int signifierByteLength = 1; for (int commandIdx = 0; commandIdx < (int)commandCount; commandIdx++) { try { byte commandType = binaryReader.ReadByte(); binaryReader.ReadByte(); binaryReader.ReadByte(); binaryReader.ReadByte(); int commandLength = IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); switch (commandType) { case 4: goto IL_1E7; case 5: goto IL_1CF; case 6: break; case 7: binaryReader.BaseStream.Position += 4L; commandLength -= 4; break; default: goto IL_1CF; } binaryReader.BaseStream.Position += (long)signifierByteLength; byte messageType = binaryReader.ReadByte(); int operationLength = commandLength - commandHeaderLength - 2; StreamBuffer payload = new StreamBuffer(binaryReader.ReadBytes(operationLength)); switch (messageType) { case 2: { //ILog rlog = LogManager.GetLogger("Request"); //rlog.Debug(hexPayloadData); OperationRequest requestData = protocol16.DeserializeOperationRequest(payload); Instance.OnRequest(requestData.OperationCode, requestData.Parameters); break; } case 3: { //ILog relog = LogManager.GetLogger("Response"); //relog.Debug(hexPayloadData); OperationResponse responseData = protocol16.DeserializeOperationResponse(payload); Instance.OnResponse(responseData.OperationCode, responseData.ReturnCode, responseData.Parameters); break; } case 4: { //ILog elog = LogManager.GetLogger("Event"); //elog.Debug(hexPayloadData); EventData eventData = protocol16.DeserializeEventData(payload); Instance.OnEvent(eventData.Code, eventData.Parameters); break; } default: //ILog olog = LogManager.GetLogger("Other"); //olog.Debug(hexPayloadData); binaryReader.BaseStream.Position += (long)operationLength; break; } payload.Close(); goto IL_1E7; IL_1CF: binaryReader.BaseStream.Position += (long)(commandLength - commandHeaderLength); IL_1E7 :; } catch (Exception ex) { log.Error(ex.StackTrace); } } } catch (Exception ex) { log.Error(ex.StackTrace); } }