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; } }); }
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); }
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); }
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); }
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); }
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(); } }