示例#1
0
        public void IpV4AddressRandomTest()
        {
            Assert.AreEqual(IpV4Address.AllHostsGroupAddress, new IpV4Address("224.0.0.1"));

            Random random = new Random();

            for (int i = 0; i != 1000; ++i)
            {
                IpV4Address address = random.NextIpV4Address();

                Assert.AreEqual(address, new IpV4Address(address.ToString()));
                Assert.IsTrue(address == new IpV4Address(address.ToString()));
                Assert.IsFalse(address != new IpV4Address(address.ToString()));
                Assert.AreEqual(address.GetHashCode(), new IpV4Address(address.ToString()).GetHashCode());
                Assert.AreEqual(address, new IpV4Address(address.ToValue()));

                Assert.AreNotEqual(address, random.NextIpV4Address());
                Assert.IsFalse(address == random.NextIpV4Address());
                Assert.IsTrue(address != random.NextIpV4Address());
                Assert.AreNotEqual(address.GetHashCode(), random.NextIpV4Address().GetHashCode());

                Assert.AreNotEqual(2, address);
                Assert.IsFalse(address.Equals(null));
            }
        }
示例#2
0
 public void Add(IpV4Address IP, MacAddress Mac)
 {
     if (_arp_table.ContainsKey(IP))
     {
         _arp_table[IP] = Mac;
         VirtualNetwork.Instance.PostTraceMessage("ARP table item update: " + IP.ToString() + " = " + Mac.ToString());
     }
     else
     {
         _arp_table.Add(IP, Mac);
         VirtualNetwork.Instance.PostTraceMessage("ARP table item add: " + IP.ToString() + " = " + Mac.ToString());
     }
 }
示例#3
0
        public static List <string> GetCurrentHostIPv4Addresses()
        {
            //Check https://stackoverflow.com/questions/50386546/net-core-2-x-how-to-get-the-current-active-local-network-ipv4-address
            // order interfaces by speed and filter out down and loopback
            // take first of the remaining
            var allUpInterfaces = NetworkInterface.GetAllNetworkInterfaces()
                                  .OrderByDescending(c => c.Speed)
                                  .Where(c => c.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
                                         c.OperationalStatus == OperationalStatus.Up).ToList();
            List <string> lstIps = new();

            if (allUpInterfaces != null && allUpInterfaces.Count > 0)
            {
                foreach (var singleUpInterface in allUpInterfaces)
                {
                    var props = singleUpInterface.GetIPProperties();
                    // get first IPV4 address assigned to this interface
                    var allIpV4Address = props.UnicastAddresses
                                         .Where(c => c.Address.AddressFamily == AddressFamily.InterNetwork)
                                         .Select(c => c.Address)
                                         .ToList();
                    allIpV4Address.ForEach((IpV4Address) =>
                    {
                        lstIps.Add(IpV4Address.ToString());
                    });
                }
            }

            return(lstIps);
        }
示例#4
0
        public void SendIcmpEchoReply(IpV4Address TargetIP, MacAddress TargetMac, IcmpDatagram icmpRequest)
        {
            EthernetLayer ethernetLayer =
                new EthernetLayer
            {
                Source      = _adapter.MAC,
                Destination = TargetMac,
                EtherType   = EthernetType.None,   // Will be filled automatically.
            };

            VLanTaggedFrameLayer vlanLayer =
                new VLanTaggedFrameLayer
            {
                PriorityCodePoint        = ClassOfService.BestEffort,
                CanonicalFormatIndicator = false,
                VLanIdentifier           = _adapter.VLAN,
                EtherType = EthernetType.None,
            };

            IpV4Layer ipV4Layer =
                new IpV4Layer
            {
                Source             = _adapter.IP,
                CurrentDestination = TargetIP,
                Fragmentation      = IpV4Fragmentation.None,
                HeaderChecksum     = null, // Will be filled automatically.
                Identification     = 123,
                Options            = IpV4Options.None,
                Protocol           = null, // Will be filled automatically.
                Ttl           = 100,
                TypeOfService = 0,
            };

            IcmpEchoReplyLayer icmpReplyLayer = new IcmpEchoReplyLayer
            {
                Identifier     = (ushort)((icmpRequest.Variable >> 16) & 0xFFFF),
                SequenceNumber = (ushort)(icmpRequest.Variable & 0xFFFF),
            };

            PayloadLayer payloadLayer = new PayloadLayer()
            {
                Data = icmpRequest.Payload
            };


            if (_adapter.VLAN > 1)
            {
                VirtualNetwork.Instance.SendPacket(PacketBuilder.Build(DateTime.Now, ethernetLayer, vlanLayer, ipV4Layer, icmpReplyLayer, payloadLayer));
            }
            else
            {
                VirtualNetwork.Instance.SendPacket(PacketBuilder.Build(DateTime.Now, ethernetLayer, ipV4Layer, icmpReplyLayer, payloadLayer));
            }

            VirtualNetwork.Instance.PostTraceMessage("ICMP Reply: " + TargetIP.ToString());
        }
示例#5
0
        public static string GetHostNameByIp(IpV4Address address)
        {
            try
            {
                return(Dns.GetHostEntry(address.ToString())?.HostName);
            }
            catch (SocketException) { }

            return(null);
        }
        public static ReadOnlyCollection <byte> ToBytes(this IpV4Address address)
        {
            var bytes = new byte[4];

            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] = Convert.ToByte(address.ToString().Split('.')[i], 10);
            }

            return(bytes.AsReadOnly());
        }
示例#7
0
        public void ToString_Should_ReturnCorrectString()
        {
            // Arrange
            var ip       = new IpV4Address(192, 168, 250, 123);
            var expected = "192.168.250.123";

            // Act
            var actual = ip.ToString();

            // Assert
            Assert.Equal(expected, actual);
        }
示例#8
0
        public bool Resolve(IpV4Address TargetIP, out MacAddress ResolvedMac)
        {
            bool ResolveResult = false;

            ResolvedMac = MacAddress.Zero;
            _arp_resolve_wait_handle.Reset();
            _current_arp_probe_target_ip = TargetIP;
            SendProbe(TargetIP);

            if (_arp_resolve_wait_handle.WaitOne(ARP_RESOLVE_TIMEOUT))
            {
                ResolveResult = true;
                ResolvedMac   = _current_arp_replay_target_mac;
                VirtualNetwork.Instance.PostTraceMessage("ARP Resolve: " + TargetIP.ToString() + " - SUCCESSFUL: " + ResolvedMac.ToString());
            }
            else
            {
                VirtualNetwork.Instance.PostTraceMessage("ARP Resolve: " + TargetIP.ToString() + " - FAILED");
            }

            return(ResolveResult);
        }
示例#9
0
        private void CreateFakeAddresses(int count)
        {
            FakeIpV4Addresses = new List <IpV4Address>();
            var ipAddress = ParseIpAddress(SourceIpv4);

            while (FakeIpV4Addresses.Count != count)
            {
                var ipAddressFaked = new IpV4Address($"{ipAddress[0]}.{ipAddress[1]}.{ipAddress[2]}.{_rand.Next(FakeIpAddressMin, FakeIpAddressMax)}");
                if (!FakeIpV4Addresses.Contains(ipAddressFaked) && !ipAddressFaked.ToString().Equals(SourceIpv4) && !ipAddressFaked.ToString().Equals(DestinationIpV4))
                {
                    FakeIpV4Addresses.Add(ipAddressFaked);
                }
            }
        }
示例#10
0
        private INetFwRule SetupNetFwRule(IpV4Address scanner)
        {
            Guid       clsid      = new Guid(BlockIPScanningReaction.guidRWRule);
            Type       typeFWRule = Type.GetTypeFromCLSID(clsid);
            INetFwRule newRule    = (INetFwRule)Activator.CreateInstance(typeFWRule);

            newRule.Name            = "AntiScan_Rule";
            newRule.Description     = String.Format("Block inbound traffic from {0}", scanner.ToString());
            newRule.Protocol        = (int)NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_ANY;
            newRule.RemoteAddresses = scanner.ToString();
            newRule.Direction       = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
            newRule.Enabled         = true;
            newRule.Grouping        = "AntiScanning rule added from clr...";
            newRule.Action          = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
            return(newRule);
        }
示例#11
0
        public static ReadOnlyCollection <byte> ToBytes(this IpV4Address ip)
        {
            var hexValues = ip.ToString().Split('.');

            if (hexValues.Length != 4)
            {
                throw new InvalidCastException($"{ip} is not a valid ip address");
            }

            var ipBytes = new byte[4];

            for (int i = 0; i < hexValues.Length; i++)
            {
                ipBytes[i] = Convert.ToByte(hexValues[i]);
            }
            return(ipBytes.AsReadOnly());
        }
示例#12
0
        private bool ExistsBlockingRuleFor(IpV4Address scanner, INetFwPolicy2 fwPolicy)
        {
            INetFwRules rules = fwPolicy.Rules;

            foreach (INetFwRule rule in rules)
            {
                bool   isAppMadeRule    = rule.Name == "AntiScan_Rule";
                string addresses        = rule.RemoteAddresses;
                int    slashPos         = addresses.IndexOf('/');
                string address          = slashPos > 0 ? addresses.Substring(0, slashPos) : String.Empty;
                bool   isScannerBlocked = address == scanner.ToString();
                if (isAppMadeRule && isScannerBlocked)
                {
                    return(true);
                }
            }
            return(false);
        }
示例#13
0
        override public void Open()
        {
            string MACString = string.Empty;

            if (_adapter.ArpService.Resolve(_remote_ip.ToString(), out MACString))
            {
                this._remote_mac = new MacAddress(MACString);
            }
            else
            {
                throw new Exception("Unable resolve mac for remote host: " + _remote_ip.ToString());
            }
            DateTime StartTime      = DateTime.Now;
            TimeSpan ConnectionTime = TimeSpan.Zero;

            while (!IsOpen && ConnectionTime.TotalMilliseconds < CONNECTION_TIMEOUT)
            {
                TcpOpen();
                ConnectionTime = DateTime.Now - StartTime;
            }
        }
示例#14
0
        public void SendProbe(IpV4Address TargetIP)
        {
            EthernetLayer ethernetLayer = new EthernetLayer
            {
                Destination = UtilityLib.BroadcastMac,
                Source      = _adapter.MAC,
                EtherType   = EthernetType.None
            };

            VLanTaggedFrameLayer vlanLayer =
                new VLanTaggedFrameLayer
            {
                PriorityCodePoint        = ClassOfService.BestEffort,
                CanonicalFormatIndicator = false,
                VLanIdentifier           = _adapter.VLAN,
                EtherType = EthernetType.None,
            };

            ArpLayer arpLayer = new ArpLayer
            {
                SenderHardwareAddress = _adapter.MAC.ToBytes().AsReadOnly(),
                SenderProtocolAddress = _adapter.IP.ToBytes().AsReadOnly(),
                TargetHardwareAddress = new MacAddress("FF:FF:FF:FF:FF:FF").ToBytes().AsReadOnly(),
                TargetProtocolAddress = TargetIP.ToBytes().AsReadOnly(),
                ProtocolType          = EthernetType.IpV4,
                Operation             = ArpOperation.Request,
            };

            if (_adapter.VLAN > 1)
            {
                VirtualNetwork.Instance.SendPacket(PacketBuilder.Build(DateTime.Now, ethernetLayer, vlanLayer, arpLayer));
            }
            else
            {
                VirtualNetwork.Instance.SendPacket(PacketBuilder.Build(DateTime.Now, ethernetLayer, arpLayer));
            }
            VirtualNetwork.Instance.PostTraceMessage("ARP Probe: " + TargetIP.ToString());
        }
示例#15
0
        public void SendArpResponse(PacketCommunicator communicator, IpV4Address ipAddress)
        {
            var ethernetLayer = new EthernetLayer
            {
                Source      = SourceMac,
                Destination = DestinationMac,
            };

            var a         = Regex.Matches(SourceMac.ToString().Replace(":", ""), @"\S{2}").Cast <Match>().Select(m => m.Value).ToArray();
            var macParsed = new byte[a.Length];

            for (int i = 0; i < a.Length; i++)
            {
                macParsed[i] = (byte)int.Parse(a[i], System.Globalization.NumberStyles.HexNumber);
            }
            var b = Regex.Matches(DestinationMac.ToString().Replace(":", ""), @"\S{2}").Cast <Match>().Select(m => m.Value).ToArray();
            var targetMacParsed = new byte[b.Length];

            for (int i = 0; i < b.Length; i++)
            {
                targetMacParsed[i] = (byte)int.Parse(b[i], System.Globalization.NumberStyles.HexNumber);
            }

            ArpLayer arpLayer = new ArpLayer
            {
                ProtocolType          = EthernetType.IpV4,
                Operation             = ArpOperation.Reply,
                SenderHardwareAddress = macParsed.AsReadOnly(),
                SenderProtocolAddress = ipAddress.ToString().Split('.').Select(n => Convert.ToByte(n)).ToArray().AsReadOnly(),
                TargetHardwareAddress = macParsed.AsReadOnly(),
                TargetProtocolAddress = DestinationIpV4.ToString().Split('.').Select(n => Convert.ToByte(n)).ToArray().AsReadOnly(),
            };
            var packet = PacketBuilder.Build(DateTime.Now, ethernetLayer, arpLayer);

            communicator.SendPacket(packet);
        }
示例#16
0
        private NetworkInformation ParseNetworkInformation()
        {
            var errorMessage = new Action <string, string>((title, msg) => MetroMessageBox.Show(this, msg, title, MessageBoxButtons.OK, MessageBoxIcon.Error, 120));

            IpV4Address        gatewayIp;
            MacAddress         gatewayMac;
            IpV4Address        netmask;
            List <IpV4Address> subnetRange;
            IntPtr             winDivertHandle;

            if (_currentInterface == null)
            {
                errorMessage("Interface Error", "No network interface selected.");
                return(null);
            }

            try
            {
                gatewayIp = new IpV4Address(tbGatewayIp.Text);
            }
            catch (Exception)
            {
                errorMessage("Value Error", "Invalid gateway IP.");
                return(null);
            }

            try
            {
                gatewayMac = new MacAddress(tbGatewayMac.Text);
            }
            catch (Exception)
            {
                errorMessage("Value Error", "Invalid gateway MAC.");
                return(null);
            }

            try
            {
                netmask = new IpV4Address(tbNetmask.Text);
            }
            catch (Exception)
            {
                errorMessage("Value Error", "Invalid netmask.");
                return(null);
            }

            try
            {
                subnetRange = NetworkUtilities.GetIpRange(string.Format("{0}/{1}", gatewayIp.ToString(), netmask.ToString()));
            }
            catch (Exception)
            {
                errorMessage("Value Error", "Invalid netmask.");
                return(null);
            }

            winDivertHandle = WinDivert.WinDivertOpen("true", WinDivertLayer.Forward, 0, WinDivertOpenFlags.None);
            if (winDivertHandle == new IntPtr(-1))
            {
                errorMessage("WinDivert Error", string.Format("WinDivert handle could not be opened.\nError Code: {0}", Marshal.GetLastWin32Error()));
                return(null);
            }

            return(new NetworkInformation()
            {
                Interface = _currentInterface,
                Communicator = _packetCommunicator,
                InterfaceAddress = _interfaces[_currentInterface],
                GatewayIp = gatewayIp,
                GatewayMac = gatewayMac,
                Netmask = netmask,
                SubnetRange = subnetRange,
                WinDivertHandle = winDivertHandle,
            });
        }
示例#17
0
        private void DispatcherHandler(Packet packet)
        {
            // print packet timestamp and packet length
            Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length);

            // Print the packet
            IpV4Address ipV4 = packet.Ethernet.IpV4.Source;

            SRCIP = ipV4.ToString();

            ipV4  = packet.Ethernet.IpV4.Destination;
            DSTIP = ipV4.ToString();

            String protocol = getProtocol(packet);

            IpV4Datagram ip4      = packet.Ethernet.IpV4;
            Datagram     datagram = null;
            UdpDatagram  udp      = null;
            TcpDatagram  tcp      = null;

            if (protocol.Equals("TCP"))
            {
                DSTPort  = packet.Ethernet.IpV4.Tcp.DestinationPort.ToString();
                SRCPort  = packet.Ethernet.IpV4.Tcp.SourcePort.ToString();
                TCPSYN   = packet.Ethernet.IpV4.Tcp.SequenceNumber.ToString();
                TCPACK   = packet.Ethernet.IpV4.Tcp.AcknowledgmentNumber.ToString();
                TCPFlags = DetermineTCPFlag(packet);
                ushort TCPWinShort = packet.Ethernet.IpV4.Tcp.Window;
                TCPWin = ConvertLinearToString(TCPWinShort);


                tcp      = ip4.Tcp;
                datagram = tcp.Payload;
            }
            else if (protocol.Equals("UDP"))
            {
                DSTPort  = packet.Ethernet.IpV4.Udp.DestinationPort.ToString();
                SRCPort  = packet.Ethernet.IpV4.Udp.SourcePort.ToString();
                TCPACK   = "-";
                TCPFlags = "-";
                TCPSYN   = "-";
                TCPWin   = "-";
                udp      = ip4.Udp;
                datagram = udp.Payload;
            }



            Captured = packet.Timestamp;
            byte[] rx_payload = null;

            if (datagram != null)
            {
                int payloadLength = datagram.Length;
                using (MemoryStream ms = datagram.ToMemoryStream())
                {
                    rx_payload = new byte[payloadLength];
                    ms.Read(rx_payload, 0, payloadLength);
                }
            }
            if (rx_payload != null)
            {
                PayloadText = Encoding.UTF8.GetString(rx_payload, 0, rx_payload.Length);
            }
            else
            {
                PayloadText = "Empty";
            }

            if (protocol.Equals("TCP"))
            {
                list.Add(new SY_Sort_PCap(DSTIP, SRCIP, DSTPort, SRCPort, Captured, Protocol, PayloadText, TCPFlags, TCPSYN, TCPACK, TCPFlags, TCPWin));
            }
            else if (protocol.Equals("UDP"))
            {
                list.Add(new SY_Sort_PCap(DSTIP, SRCIP, DSTPort, SRCPort, Captured, Protocol, PayloadText));
            }
        }
 public void React(IpV4Address scanner)
 {
     Console.WriteLine("{0} is trying to scan your ports!", scanner.ToString());
 }
        public VirtualAdapter(string Name, MacAddress MAC, IpV4Address IP, ushort VLAN)
        {
            this.Name = Name ?? string.Format("Adapter({0}/{1}/{2})", MAC.ToString(), VLAN, IP.ToString());
            this.IP   = IP;
            this.MAC  = MAC;
            this.VLAN = VLAN;

            this._arp_service  = new ArpService(this);
            this._icmp_service = new IcmpService(this);
            this._tcp_service  = new TcpService(this);
        }
示例#20
0
        public bool Ping(IpV4Address IP, MacAddress Mac, int Count = 10)
        {
            this._target_ip  = IP;
            this._target_mac = Mac;
            bool Result = false;

            for (ushort SequenceNumber = 1; SequenceNumber < Count; SequenceNumber++)
            {
                _ping_echo_wait_handle.Reset();
                _current_icmp_sequence_num = SequenceNumber;
                SendIcmpEcho(_target_ip, _target_mac, SequenceNumber);
                VirtualNetwork.Instance.PostTraceMessage(string.Format("PING {0} ({1})", _target_ip.ToString(), SequenceNumber), false);
                _current_state = ICMP_STATE.WAIT_ECHO;
                if (_ping_echo_wait_handle.WaitOne(PING_ECHO_TIMEOUT))
                {
                    VirtualNetwork.Instance.PostTraceMessage(" - OK");
                    Result = true;
                }
                else
                {
                    VirtualNetwork.Instance.PostTraceMessage(" - TIMEOUT");
                }
                _current_state = ICMP_STATE.IDLE;
                Thread.Sleep(1000);
            }
            return(Result);
        }
示例#21
0
 public void Remove(IpV4Address IP)
 {
     if (IP != null && !IP.Equals(IpV4Address.Zero))
     {
         if (_arp_table.ContainsKey(IP))
         {
             _arp_table.Remove(IP);
             VirtualNetwork.Instance.PostTraceMessage("ARP table item remove: " + IP.ToString());
         }
     }
     else
     {
         _arp_table.Clear();
         VirtualNetwork.Instance.PostTraceMessage("ARP table clear");
     }
 }