开发者

Using pcapdotnet to send raw ethernet packet

开发者 https://www.devze.com 2023-04-11 09:19 出处:网络
I am using pcapdotnet and would like to send a raw ethernet packet. I am working with the sample found here: http://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Sending%20Packets

I am using pcapdotnet and would like to send a raw ethernet packet. I am working with the sample found here: http://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Sending%20Packets

I would like to know two things:

  1. In order to modify this to send mac level packets I need to leave only ethernetLayer in the PacketBuilder constructor?
  2. How do I load the packet w开发者_StackOverflowith the raw bit/byte data I want to send in the ethernet packet?

Thank you!


I believe you need to use 2 layers:

  1. EthernetLayer (for the Ethernet header).
  2. PayloadLayer (for the raw byte data - the Ethernet payload).


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

精彩评论

暂无评论...
验证码 换一张
取 消