private void SendIcmpReplyPacket(Packet request) { var icmp = request.Ethernet.IpV4.Icmp as IcmpEchoDatagram; OSI.Layer3Packet packet = new OSI.Layer3Packet(); packet.Destination = request.Ethernet.IpV4.Source.ToString(); packet.SourceIP = _client.Configuration.IpAddress; packet.Ttl = (byte)(request.Ethernet.IpV4.Ttl / 2); var data = icmp.ToArray(); data = data.Subsegment(8, data.Length - 8).ToArray(); PcapDotNet.Packets.Icmp.IcmpEchoReplyLayer icmpLayer = new PcapDotNet.Packets.Icmp.IcmpEchoReplyLayer { Checksum = null, Identifier = icmp.Identifier, SequenceNumber = (ushort)(icmp.SequenceNumber), }; PcapDotNet.Packets.PayloadLayer extra = new PcapDotNet.Packets.PayloadLayer() { Data = new PcapDotNet.Packets.Datagram(data) }; packet.NextLayers.Add(icmpLayer); packet.NextLayers.Add(extra); SendPacket(packet); }
public void SendLayer3Packet(OSI.Layer3Packet packet, PacketSentHandler callback) { IpV4Layer ipV4Layer = new IpV4Layer { Source = new IpV4Address(packet.SourceIP.AsString), Ttl = packet.Ttl, // The rest of the important parameters will be set for each packet }; Common.IPv4Address ip = null; try { System.Net.IPAddress.Parse(packet.Destination); ip = new Common.IPv4Address(packet.Destination); } catch { ip = Dns.ResolveHost(packet.Destination).IPs[0]; } ipV4Layer.CurrentDestination = new IpV4Address(ip.AsString); OSI.Layer2Packet l2 = new OSI.Layer2Packet(); l2.SourceMac = Configuration.MacAddress; l2.DestinationMac = Arp.ResolveIP(ip); foreach (ILayer layer in packet.NextLayers) { l2.NextLayers.Add(layer); } l2.NextLayers.Insert(0, ipV4Layer); SendLayer2Packet(l2, callback); }
private void SendTcpPacket(OSI.Layer4TcpPacket packet, PacketSentHandler callback) { TcpLayer tcpLayer = new TcpLayer { SourcePort = packet.LocalPort, DestinationPort = packet.RemotePort, Checksum = null, // Will be filled automatically. SequenceNumber = packet.SequenceNumber, AcknowledgmentNumber = packet.AcknowledgementNumber, Window = 64512, }; if (packet.ACK) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Acknowledgment; } if (packet.SYN) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Synchronize; } if (packet.RST) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Reset; } if (packet.PSH) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Push; } if (packet.FIN) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Fin; } OSI.Layer3Packet l3 = new OSI.Layer3Packet(); l3.Ttl = 255; l3.SourceIP = Configuration.IpAddress; l3.Destination = packet.Destination; foreach (ILayer layer in packet.NextLayers) { l3.NextLayers.Add(layer); } l3.NextLayers.Insert(0, tcpLayer); SendLayer3Packet(l3, callback); }
private void SendUdpPacket(OSI.Layer4UdpPacket packet, PacketSentHandler callback) { UdpLayer udpLayer = new UdpLayer { SourcePort = packet.LocalPort, DestinationPort = packet.RemotePort, Checksum = null, // Will be filled automatically. CalculateChecksumValue = true, }; OSI.Layer3Packet l3 = new OSI.Layer3Packet(); l3.Ttl = 255; l3.SourceIP = Configuration.IpAddress; l3.Destination = packet.Destination; foreach (ILayer layer in packet.NextLayers) { l3.NextLayers.Add(layer); } l3.NextLayers.Insert(0, udpLayer); SendLayer3Packet(l3, callback); }
private void SendIcmpRequestPacket(Common.IPv4Address ip, byte ttl, ushort bytes, int seqNum, int timeout, PingResultHandler callback) { OSI.Layer3Packet packet = new OSI.Layer3Packet(); packet.Destination = ip.AsString; packet.SourceIP = _client.Configuration.IpAddress; packet.Ttl = ttl; var data = new byte[bytes]; _random.NextBytes(data); var shor = new byte[2]; _random.NextBytes(shor); ushort id = BitConverter.ToUInt16(shor, 0); // Save ping if (CurrentPings.ContainsKey(id)) { CurrentPings[id] = new PingRequest(callback); } else { PingRequest req = new PingRequest(callback); req.Bytes = bytes; CurrentPings.Add(id, req); } PcapDotNet.Packets.Icmp.IcmpEchoLayer icmpLayer = new PcapDotNet.Packets.Icmp.IcmpEchoLayer { Checksum = null, Identifier = id, SequenceNumber = (ushort)(seqNum), }; PcapDotNet.Packets.PayloadLayer extra = new PcapDotNet.Packets.PayloadLayer() { Data = new PcapDotNet.Packets.Datagram(data) }; packet.NextLayers.Add(icmpLayer); packet.NextLayers.Add(extra); SendPacket(packet, () => { CurrentPings[id].TimeStamp = DateTime.Now; }); DateTime now = DateTime.Now; while ((DateTime.Now - now).TotalMilliseconds < timeout) { if (CurrentPings[id].ReplyReceived) { break; } System.Threading.Thread.Sleep(100); } if (!CurrentPings[id].ReplyReceived) { CurrentPings[id].Callback(new PingResult(PingResultType.RequestTimedOut)); } CurrentPings.Remove(id); }