コード例 #1
0
ファイル: NetClient.cs プロジェクト: lanicon/HavokNet
        public void PacketDispatcher(PcapDotNet.Packets.Packet packet)
        {
            Common.PacketData pdata = new Common.PacketData(packet);
            if (!NetworkFirewall.TestIncoming(pdata))
            {
                return;
            }
            Task.Run(() =>
            {
                switch (pdata.Type)
                {
                case PacketType.Arp:
                    Arp.OnReceivePacket(pdata);
                    break;

                case PacketType.Icmp:
                    Icmp.OnReceivePacket(pdata);
                    break;

                case PacketType.Dns:
                    Dns.OnReceivePacket(pdata);
                    break;

                case PacketType.Tcp:
                    Tcp.OnReceivePacket(pdata);
                    break;

                case PacketType.Http:
                    Tcp.OnReceivePacket(pdata);
                    break;
                }
            });
        }
コード例 #2
0
ファイル: NetClient.cs プロジェクト: lanicon/HavokNet
        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);
        }
コード例 #3
0
ファイル: PingAndArp.cs プロジェクト: alain1337/TvLight
        public ScannerResult Scan(IPAddress subnet)
        {
            var result = new ScannerResult();

            //var ips = Pinger.PingAllAsync(subnet).Result;
            var ips = PingerThreaded.PingAll(subnet);

            //Console.WriteLine($"PingAll took {ips.Elapsed}");
            result.Online.AddRange(Arp.GetAll()
                                   .Where(ae => ips.OnlineIps.ContainsKey(ae.Ip))
                                   .Select(ae => new IpAndMac(ips.OnlineIps.First(ip => Equals(ae.Ip, ip.Key)).Key, ae.Mac)));

            return(result);
        }
コード例 #4
0
        public async Task <DeviceAddressInfo> GetIPInfo(string macAddress, IEnumerable <string> ips)
        {
            foreach (var ip in ips)
            {
                try
                {
                    PhysicalAddress mac = await Arp.LookupAsync(System.Net.IPAddress.Parse(ip));

                    if (mac.ToString() == macAddress)
                    {
                        return(new DeviceAddressInfo(macAddress, ip));
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
            return(null);
        }
コード例 #5
0
ファイル: NMapScanner.cs プロジェクト: alain1337/TvLight
        public ScannerResult Scan(IPAddress subnet)
        {
            // Step 1: nmap is only used to scan the range. It actually doesn't see my LG TV
            // If issue is found, use sudo for nmap so it gets the MAC

            var psi = new ProcessStartInfo
            {
                FileName  = "nmap",
                Arguments = $"-sP {subnet}/24",
                RedirectStandardOutput = true,
                RedirectStandardError  = true,
                RedirectStandardInput  = true,
                CreateNoWindow         = true
            };

            using var process = Process.Start(psi) ?? throw new Exception($"Failed to start {psi.FileName}");
            process.WaitForExit();
            var output = process.StandardOutput.ReadToEnd().Split(Environment.NewLine);

            /*
             * var result = new ScannerResult();
             * var hostRe = new Regex(@"^Nmap scan report for (?<name>\S+) \((?<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\)");
             * var macRe = new Regex(@"^MAC Ip: (?<mac>(?:[0-9A-F]{2}:){5}[0-9A-F]{2})");
             * IpAndMac entry = null;
             * foreach (var line in output)
             * {
             *  var ma = hostRe.Match(line);
             *  if (ma.Success)
             *  {
             *      if (entry != null)
             *          result.Online.Add(entry);
             *      entry = new IpAndMac(IPAddress.Parse(ma.Groups["ip"].Value));
             *  }
             *
             *  if (entry == null)
             *      continue;
             *  ma = macRe.Match(line);
             *  if (ma.Success)
             *      entry.Mac = PhysicalAddress.Parse(ma.Groups["mac"].Value.ToUpper().Replace(':', '-'));
             * }
             *
             * if (entry?.Mac != null)
             *  result.Online.Add(entry);
             *
             * return result;
             */

            // Step 2: Get arp entries
            var arp = Arp.GetAll();

            // Stop 3: Ping all arp entries
            var result = new ScannerResult();

            using var ping = new Ping();
            foreach (var entry in arp)
            {
                if (ping.Send(entry.Ip, 200)?.Status == IPStatus.Success)
                {
                    result.Online.Add(entry);
                }
            }
            return(result);
        }
コード例 #6
0
        public void analyzuj(Rozhranie rozhranie, EthernetPacket eth, Packet paket)
        {
            if (eth.Type.ToString().Equals("Arp"))
            {
                IPAddress odosielatel_adres = new IPAddress(paket.Bytes.Skip(28).Take(4).ToArray());
                IPAddress ciel_adres        = new IPAddress(paket.Bytes.Skip(38).Take(4).ToArray());

                if (ciel_adres.ToString().Equals("255.255.255.255") || ciel_adres.ToString().Equals(rozhranie.ip_adresa))
                {
                    if (paket.Bytes[21] == 1)
                    {
                        arp_reply(eth, rozhranie, odosielatel_adres, ciel_adres);                            //dosla mi request tak odpovedam
                    }
                    else if (paket.Bytes[21] == 2 && !eth.SourceHwAddress.ToString().Equals("02004C4F4F50")) //IGNORUJEM LOOPBACK
                    {
                        bool pridaj_arp_zaznam = true;
                        arp = new Arp(odosielatel_adres.ToString(), eth.SourceHwAddress.ToString(), arp_casovac);

                        foreach (var zaznam in arp_tabulka)
                        {
                            if (zaznam.ip.Equals(arp.ip) && zaznam.mac.Equals(arp.mac))
                            {
                                zaznam.casovac    = arp_casovac;
                                pridaj_arp_zaznam = false;
                            }
                            if (zaznam.ip.Equals(arp.ip))
                            {
                                pridaj_arp_zaznam = false;
                            }
                        }

                        if (pridaj_arp_zaznam)
                        {
                            arp_tabulka.Add(arp);
                        }
                    }
                }
                else
                {
                    if (paket.Bytes[21] == 1)       // PROXY ARP
                    {
                        Smerovaci_zaznam naslo_zaznam = null;
                        naslo_zaznam = najdi_zaznam_v_smerovacej_tabulke(ciel_adres);
                        if (naslo_zaznam != null && naslo_zaznam.exit_interface == -1)
                        {
                            string via = null;
                            naslo_zaznam = rekurzivne_prehladanie(naslo_zaznam, ref via);
                        }
                        if (naslo_zaznam != null && naslo_zaznam.exit_interface != -1 && (rozhranie.cislo_rozhrania != naslo_zaznam.exit_interface))
                        {
                            arp_reply(eth, rozhranie, odosielatel_adres, ciel_adres);
                        }
                    }
                }
            }
            else if (eth.Type.ToString().Equals("IpV4"))
            {
                if ((--paket.Bytes[22]) > 0)
                {
                    IPAddress        odosielatel_address = new IPAddress(paket.Bytes.Skip(26).Take(4).ToArray());
                    IPAddress        ciel_adres          = new IPAddress(paket.Bytes.Skip(30).Take(4).ToArray());
                    Smerovaci_zaznam smerovaci_zaznam    = null;
                    string           via = null;

                    IPv4Packet ip_pak = (IPv4Packet)eth.PayloadPacket;

                    ip_pak.UpdateIPChecksum();

                    if ((ciel_adres.ToString() == rozhranie1.ip_adresa || ciel_adres.ToString() == rozhranie2.ip_adresa) && (int)eth.Bytes[23] == 1)
                    {
                        ICMPv4Packet ping = (ICMPv4Packet)ip_pak.PayloadPacket;
                        if ((int)eth.Bytes[34] == 8)
                        {
                            ping.Checksum = 0;
                            ping.TypeCode = ICMPv4TypeCodes.EchoReply;

                            byte[] bytes = BitConverter.GetBytes(GetCrc(ping.Bytes));
                            Array.Reverse(bytes);
                            ushort result = BitConverter.ToUInt16(bytes, 0);

                            ping.Checksum = result;

                            ip_pak.SourceAddress      = ciel_adres;
                            ip_pak.DestinationAddress = odosielatel_address;
                            ip_pak.PayloadPacket      = ping;
                            ip_pak.UpdateIPChecksum();

                            eth.PayloadPacket = ip_pak;

                            smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(odosielatel_address);

                            if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1)
                            {
                                smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via);
                            }

                            if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X")
                            {
                                via = smerovaci_zaznam.next_hop;
                            }

                            if (smerovaci_zaznam != null)
                            {
                                if (smerovaci_zaznam.exit_interface == 2)
                                {
                                    rozhranie = rozhranie2;
                                }
                                if (smerovaci_zaznam.exit_interface == 1)
                                {
                                    rozhranie = rozhranie1;
                                }


                                Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, odosielatel_address));
                                posielanie.Start();
                            }
                        }
                        else if ((int)eth.Bytes[34] == 0)
                        {
                            if (zapis_ping)
                            {
                                // main_view.vypis("!", 99);
                                main_view.lbl_ping += "!";
                                zapis_ping          = false;
                            }
                        }
                    }

                    else if ((ciel_adres.ToString() == rozhranie.ip_adresa || ciel_adres.ToString() == "224.0.0.9") && ((int)eth.Bytes[43] == 2))
                    {
                        spracuj_rip(eth, paket, rozhranie, odosielatel_address);
                    }
                    else
                    {
                        smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(ciel_adres);

                        if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1)
                        {
                            smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via);
                        }

                        if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X")
                        {
                            via = smerovaci_zaznam.next_hop;
                        }

                        if (smerovaci_zaznam != null)
                        {
                            if (smerovaci_zaznam.exit_interface == 1)
                            {
                                rozhranie = rozhranie1;
                            }
                            if (smerovaci_zaznam.exit_interface == 2)
                            {
                                rozhranie = rozhranie2;
                            }

                            Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, ciel_adres));
                            posielanie.Start();
                        }
                    }
                }
            }
            if (zastav_vlakno)
            {
                rozhranie.adapter.Close();
            }
        }