//发送ARP广播,返回192.168局域网中其他计算机的ARP相应数据包 public static ArrayList ARPBroadcast(LivePcapDevice device) { ArrayList tmpArrayList = new ArrayList(); PhysicalAddress localMAC = device.Interface.MacAddress; //这是我们伪造的一个IP IPAddress srcIP = IPAddress.Parse("192.168.3.3"); String arpFilter = "arp and ether dst " + localMAC.ToString(); //open the device with 20ms timeout device.Open(DeviceMode.Normal, 20); device.Filter = arpFilter; IPAddress destIP; SharpPcap.ARP tmpArp=new ARP(); //发送65535个数据包耗时30秒,这30秒内到达的数据包由网卡缓存 for (int i = 0; i < 256; i++) { for (int j = 0; j < 256; j++) { destIP = IPAddress.Parse("192.168." + i.ToString() + "." + j.ToString()); //request是Packet类型 var request = tmpArp.BuildRequest(destIP, localMAC, srcIP); //发送数据包到网络中 device.SendPacket(request); } } DateTime StartTime = DateTime.Now; DateTime endTime = StartTime.AddSeconds(5); PacketDotNet.ARPPacket arpPacket = null; //接收5秒钟数据包,然后闪人 while (DateTime.Now <= endTime) { var reply = device.GetNextPacket(); if (reply == null) continue; var packet = PacketDotNet.Packet.ParsePacket(reply); arpPacket = PacketDotNet.ARPPacket.GetEncapsulated(packet); if (arpPacket == null) { continue; } else { //exists判断是否ARP回应包存在重复 bool exists = false; foreach (Object obj in tmpArrayList) { ARPPacket tmp=(ARPPacket)obj; if (arpPacket.SenderHardwareAddress==tmp.SenderHardwareAddress) { exists = true; break; } } if (exists == false) { tmpArrayList.Add(arpPacket); } } } device.Close(); return tmpArrayList; }
public static void Main(string[] args) { // Print SharpPcap version string ver = SharpPcap.Version.VersionString; Console.WriteLine("SharpPcap {0}, Example2.ArpResolve.cs\n", ver); // Retrieve the device list var devices = LibPcapLiveDeviceList.Instance; // If no devices were found print an error if(devices.Count < 1) { Console.WriteLine("No devices were found on this machine"); return; } Console.WriteLine("The following devices are available on this machine:"); Console.WriteLine("----------------------------------------------------"); Console.WriteLine(); int i = 0; // Print out the available devices foreach(var dev in devices) { Console.WriteLine("{0}) {1} {2}", i, dev.Name, dev.Description); i++; } Console.WriteLine(); Console.Write("-- Please choose a device for sending the ARP request: "); i = int.Parse( Console.ReadLine() ); var device = devices[i]; System.Net.IPAddress ip; // loop until a valid ip address is parsed while(true) { Console.Write("-- Please enter IP address to be resolved by ARP: "); if(System.Net.IPAddress.TryParse(Console.ReadLine(), out ip)) break; Console.WriteLine("Bad IP address format, please try again"); } // Create a new ARP resolver ARP arper = new ARP(device); // print the resolved address or indicate that none was found var resolvedMacAddress = arper.Resolve(ip); if(resolvedMacAddress == null) { Console.WriteLine("Timeout, no mac address found for ip of " + ip); } else { Console.WriteLine(ip + " is at: " + arper.Resolve(ip)); } }