예제 #1
0
        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 :(");
                    }
                }
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
 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;
 }
예제 #6
0
        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");
                }
            }
        }