使用pcapdotnet发送原始以太网数据包

时间:2011-10-06 13:45:12

标签: c# pcap.net

我正在使用pcapdotnet并希望发送原始以太网数据包。 我正在使用此处找到的示例:http://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Sending%20Packets

我想知道两件事:

  1. 为了修改这个以发送mac级别的数据包,我需要离开 PacketBuilder构造函数中只有ethernetLayer?
  2. 如何使用以太网数据包发送的原始位/字节数据加载数据包?
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

我相信你需要使用2层:

  1. EthernetLayer(用于以太网标头)。
  2. PayloadLayer(用于原始字节数据 - 以太网有效负载)。

答案 1 :(得分:0)

class Program
{
    static void Main(string[] args)
    {
        // Retrieve the device list from the local machine
        IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;

        if (allDevices.Count == 0)
        {
            Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");
            return;
        }

        // Print the list
        for (int i = 0; i != allDevices.Count; ++i)
        {
            LivePacketDevice device = allDevices[i];
            Console.Write((i + 1) + ". " + device.Name);
            if (device.Description != null)
                Console.WriteLine(" (" + device.Description + ")");
            else
                Console.WriteLine(" (No description available)");
        }

        int deviceIndex = 0;
        do
        {
            Console.WriteLine("Enter the interface number (1-" + allDevices.Count + "):");
            string deviceIndexString = Console.ReadLine();
            if (!int.TryParse(deviceIndexString, out deviceIndex) ||
                deviceIndex < 1 || deviceIndex > allDevices.Count)
            {
                deviceIndex = 0;
            }
        } while (deviceIndex == 0);

        // Take the selected adapter
        PacketDevice selectedDevice = allDevices[deviceIndex - 1];

        // Open the output device
        using (PacketCommunicator communicator = selectedDevice.Open(100, // name of the device
                                                                     PacketDeviceOpenAttributes.Promiscuous, // promiscuous mode
                                                                     1000)) // read timeout
        {
            // Supposing to be on ethernet, set mac source to 01:01:01:01:01:01
            MacAddress source = new MacAddress("01:01:01:01:01:01");

            // set mac destination to 02:02:02:02:02:02
            MacAddress destination = new MacAddress("02:02:02:02:02:02");

            // Create the packets layers

            // Ethernet Layer
            EthernetLayer ethernetLayer = new EthernetLayer
            {
                Source = source,
                Destination = destination
            };

            // IPv4 Layer
            IpV4Layer ipV4Layer = new IpV4Layer
            {
                Source = new IpV4Address("1.2.3.4"),
                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);

            // Send 100 Pings to different destination with different parameters
            for (int i = 0; i != 1; ++i)
            {
                // Set IPv4 parameters
                ipV4Layer.CurrentDestination = new IpV4Address("2.3.4.1" );
                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.ReadLine();
    }