public bool FilterPacket(EthernetPacket ethernetPacket) { var iface = PacketDispatcher.Instance.GetCurrentInterface(); if (ethernetPacket == null) { return(false); } // perform basic checks to detect if we have a valid TCP packet if (ethernetPacket.Type != EthernetPacketType.IpV4) { return(false); } var ipPacket = (IPv4Packet)ethernetPacket.PayloadPacket; if (ipPacket.NextHeader != IPProtocolType.TCP) { return(false); } var tcpPacket = (TcpPacket)ipPacket.PayloadPacket; if (tcpPacket.DestinationPort != 80) { return(false); } // get full TCP payload and try to parse it as a HTTP request var packetData = Encoding.UTF8.GetString(tcpPacket.PayloadData); var request = HttpRequest.TryParse(packetData); if (request == null) { return(false); } // match current request against current filter's settings if (IsFilterMatch(request)) { ethernetPacket = PrepareTCPResponse(ethernetPacket, GenerateHTTPRedirect(RedirectTarget)); iface.SendPacket(ethernetPacket); DebugInformation.WriteLine(String.Format("[FILTER] \"{0}\" applied to client \"{1}\"", Name, ipPacket.DestinationAddress)); return(true); } return(false); }
private void Window_Loaded(object sender, RoutedEventArgs e) { // load network devices ComboInterfaces.ItemsSource = NetworkInterfaceList.Instance.GetList(); ComboInterfaces.SelectedItem = NetworkInterfaceList.Instance.GetBestInterface(); DebugInformation.WriteLine("Finished reading network interfaces."); // prepare PacketDispatcher, add default filters PacketDispatcher.Create(); AddDefaultFilters(); // connect filter list to GUI GridFilters.ItemsSource = PacketDispatcher.Instance.GetPacketFilters(); }
public void ReadPacket(EthernetPacket ethernetPacket) { if (ethernetPacket.Type != EthernetPacketType.Arp) { return; } var packet = (ARPPacket)ethernetPacket.PayloadPacket; var routingTable = IPv4Router.Instance.GetRoutingTable(); if (packet.Operation == ARPOperation.Response) { if (!routingTable.ContainsKey(packet.SenderProtocolAddress)) { routingTable.Add(packet.SenderProtocolAddress, ethernetPacket.SourceHwAddress); DebugInformation.WriteLine(String.Format("[ARP] adding entry {0} - {1} to routing table", packet.SenderProtocolAddress, ethernetPacket.SourceHwAddress)); } } }