private static void HandleIcmp(Packet packet, int threadID) { //Console.WriteLine("ICMP Packet: " + packet.Length); MyDevice newDev = GetDevice(threadID, "other"); CheckAddress(packet, "Icmp"); if (!packet.IpV4.Source.ToString().Equals("0.0.0.0") || !packet.IpV4.Destination.ToString().Equals("0.0.0.0")) { //Console.WriteLine("Device: " + newDev.ID + "ICMP Addresses list count: " + newDev.ComputerAddresses.Count); Address addr = GetTargetAddress(packet, newDev); IpV4Layer ipLayer = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer(); string packetType = "REQUEST"; try { IcmpEchoLayer test = (IcmpEchoLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer(); } catch { packetType = "REPLY"; } // PayloadLayer payload = (PayloadLayer)packet.Ethernet.Payload.ExtractLayer(); //IcmpEchoLayer icmpLayer = (IcmpEchoLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer(); //Console.Write(payload.Data); //Console.WriteLine("ETHER LAYER DESTINATION: " + ethLayer.Destination); Console.WriteLine("ICMP MessageTYPE: " + packet.IpV4.Icmp.MessageType.ToString()); Console.WriteLine("ICMP TYPE: " + packet.IpV4.Icmp.GetType().ToString()); Console.WriteLine("ICMP CODE: " + packet.IpV4.Icmp.Code); Console.WriteLine("PACKET LENGTH: " + packet.Length); if (addr != null && ipLayer != null && packet.Length != 70) { Packet newPacket = BuildIcmpPacket(new MacAddress(newDev.MacAddressWithDots()), new MacAddress(addr.Mac), packet.Ethernet.IpV4.Source, packet.Ethernet.IpV4.Destination, packetType); //Packet newPacket = PacketBuilder.Build(DateTime.Now, ethLayer, ipLayer, icmpLayer); if (newPacket.IsValid) { if (newPacket.Ethernet.Source != newPacket.Ethernet.Destination) { newDev.Communicator.SendPacket(newPacket); Console.WriteLine("Icmp Packet Sent"); } } else { Console.WriteLine("ICMP Packet Is Not Valid :("); } } } }
private static void DiscoverNetworkBroadcast(PacketCommunicator communicator, MyDevice device) { // Supposing to be on ethernet, set mac source MacAddress source = new MacAddress(device.MacAddressWithDots()); // set mac destination to broadcast MacAddress destination = new MacAddress("FF:FF:FF:FF:FF:FF"); // Create the packets layers // Ethernet Layer EthernetLayer ethernetLayer = new EthernetLayer { Source = source, Destination = destination }; // IPv4 Layer IpV4Layer ipV4Layer = new IpV4Layer { Source = new IpV4Address(device.IPAddress), Ttl = 128, // The rest of the important parameters will be set for each packet }; // ICMP Layer IcmpEchoLayer icmpLayer = new IcmpEchoLayer(); // Create the builder that will build our packets PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, icmpLayer); string ipBeg = device.IpWithoutEnd(); //Send 100 Pings to different destination with different parameters for (int i = 0; i < 256; i++) { // Set IPv4 parameters ipV4Layer.CurrentDestination = new IpV4Address(ipBeg + i); ipV4Layer.Identification = (ushort)i; // Set ICMP parameters icmpLayer.SequenceNumber = (ushort)i; icmpLayer.Identifier = (ushort)i; // Build the packet Packet packet = builder.Build(DateTime.Now); // Send down the packet communicator.SendPacket(packet); //Console.WriteLine("172.16.1." + i); } }
private static EthernetLayer BuildEthernetLayer(MyDevice newDev, Address addr) { EthernetLayer ethLayer = null; if (addr != null) { //Console.WriteLine("ADDR: " + addr.Mac.ToString()); ethLayer = new EthernetLayer { Source = new MacAddress(newDev.MacAddressWithDots()), Destination = new MacAddress(addr.Mac) }; //Console.WriteLine("%%%%Src: " + newDev.MacAddressWithDots() + " Dst: " + addr.Mac); } return(ethLayer); }
private static EthernetLayer BuildEthernetLayer(MyDevice newDev, Address addr) { EthernetLayer ethLayer = null; if (addr != null) { //Console.WriteLine("ADDR: " + addr.Mac.ToString()); ethLayer = new EthernetLayer { Source = new MacAddress(newDev.MacAddressWithDots()), Destination = new MacAddress(addr.Mac) }; //Console.WriteLine("%%%%Src: " + newDev.MacAddressWithDots() + " Dst: " + addr.Mac); } return ethLayer; }
private static void HandleTcp(Packet packet, int threadID) { TcpLayer tcpLayer = (TcpLayer)packet.Ethernet.IpV4.Tcp.ExtractLayer(); MyDevice newDev = GetDevice(threadID, "other"); IpV4Layer ipLayer = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer(); PayloadLayer tcpPayload = (PayloadLayer)packet.Ethernet.IpV4.Tcp.Payload.ExtractLayer(); TcpSessionKey tcpKey1 = new TcpSessionKey(ipLayer.Source.ToString(), tcpLayer.SourcePort, ipLayer.Destination.ToString(), tcpLayer.DestinationPort); TcpSessionKey tcpKey2 = new TcpSessionKey(ipLayer.Destination.ToString(), tcpLayer.DestinationPort, ipLayer.Source.ToString(), tcpLayer.SourcePort); bool newSession = false; TcpSessionValue currentSession = null; try { currentSession = sessionDic[tcpKey1]; } catch { try { currentSession = sessionDic[tcpKey2]; } catch { newSession = true; TcpSessionKey tcpKeyN = new TcpSessionKey(ipLayer.Source.ToString(), tcpLayer.SourcePort, ipLayer.Destination.ToString(), tcpLayer.DestinationPort); TcpSessionValue tcpValueN = new TcpSessionValue(tcpLayer.SequenceNumber, tcpLayer.AcknowledgmentNumber, 64000, tcpLayer.SequenceNumber); currentSession = tcpValueN; sessionDic.Add(tcpKeyN, tcpValueN); } } if (!newSession) { int prevAckNum = (int)currentSession.ackNum; int prevSeqNum = (int)currentSession.seqNum; int curAckNum = (int)tcpLayer.AcknowledgmentNumber; int curSeqNum = (int)tcpLayer.SequenceNumber; int oldSeqNum = (int)currentSession.prevseq; if (curSeqNum - oldSeqNum < currentSession.windowSize && curSeqNum - oldSeqNum >= 0 && (curSeqNum == prevSeqNum || curAckNum == prevSeqNum)) { currentSession.prevseq = currentSession.seqNum; currentSession.ackNum = tcpLayer.AcknowledgmentNumber; currentSession.seqNum = tcpLayer.SequenceNumber; Packet newPacket = null; string targetMac = null; targetMac = GetTargetAddress(packet, newDev).Mac; if (targetMac != null) { newPacket = BuildTcpPacket(new MacAddress(newDev.MacAddressWithDots()), new MacAddress(targetMac), ipLayer, tcpLayer, tcpPayload); } else { Console.WriteLine("No target MAC found"); } Console.WriteLine("packet built"); if (newPacket.IsValid) { Console.WriteLine("TCP packet sent"); newDev.Communicator.SendPacket(newPacket); } else { Console.WriteLine("Packet not valid"); } } else { Console.WriteLine("TCP packet not valid"); } } }