C#原始套接字ARP回复

时间:2018-04-02 09:37:03

标签: c# arp

我是一名学生,想要了解有关C#

中的ARP和套接字的更多信息

为此,我尝试使用C#中的原始Socket发送ARP请求和回复。

我在字节数组中手动​​重建了ARP回复,我尝试使用Socket.Send方法发送它。

static void Main(string[] args)
{
    // Create a raw socket
    var socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw);

    // Setup ARP headers
    byte[] buffer = new byte[]
    {
        0x34, 0x97, 0xf6, 0x22, 0x04, 0xe8, // Ethernet Destination mac
        0x70, 0x1c, 0xe7, 0x51, 0x94, 0x0b, // Ethernet source mac
        0x08, 0x06,                         // Type: ARP
        00, 0x01,                           // Hardware type: Ethernet
        0x08, 0x00,                         // Protocol type: IPv4
        0x06,                               // Hardware size: 6
        0x04,                               // Protocol size: 4
        00, 0x02,                           // Opcode: Reply
        0x70, 0x1c, 0xe7, 0x51, 0x94, 0x0b, // Sender mac addr
        0xc0, 0xa8, 0x01, 0x34,             // Sender IP addr 192.168.1.52
        0x34, 0x97, 0xf6, 0x22, 0x04, 0xe8, // Target mac addr
        0xc0, 0xa8, 0x01, 0x01              // Target ip addr 192.168.1.1
    };

    // Send ARP reply
    socket.Send(buffer, buffer.Length, SocketFlags.None);

    Console.ReadKey();
}

当我尝试运行此代码时,应用程序会抛出SocketException

  

不允许发送或接收数据的请求,因为套接字未连接(使用sendto调用在数据报套接字上发送时)没有提供地址

据我所知,我在请求中提供了目的地MAC地址。

如何使用Socket正确发送ARP回复(/ request)?

PS:我知道可能有一个库,但我认为在使用库时我不太了解套接字和ARP。

2 个答案:

答案 0 :(得分:0)

过了一会儿我忘记了这个问题,但得到了an article my teacher showed me about Raw Sockets in a WinSock annex on MSDN的答案。

本文的一部分对于这个问题特别有趣:

原始套接字的限制

在Windows 7,Windows Vista,Windows XP Service Pack 2(SP2)和Windows XP Service Pack 3(SP3)上,通过原始套接字发送流量的功能受到多种限制:

  • 无法通过原始套接字发送TCP数据。
  • 无法通过原始套接字发送具有无效源地址的UDP数据报。任何传出UDP数据报的IP源地址必须存在于网络接口上,否则数据报将被丢弃。此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送欺骗数据包(具有伪造源IP地址的TCP / IP数据包)的能力。
  • 不允许使用IPPROTO_TCP协议的原始套接字调用绑定函数。
  

无法通过原始套接字发送具有无效源地址的UDP数据报。任何传出UDP数据报的IP源地址必须存在于网络接口上,否则数据报将被丢弃。此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送欺骗数据包(具有伪造源IP地址的TCP / IP数据包)的能力。

所以这个问题的简单答案是:用普通的C#.net框架发送这样的数据包是不可能的。

对于想要使用C#发送数据包的任何人:您可以使用sharppcap library

答案 1 :(得分:-1)

在通过Socket发送数据之前,您应该将套接字连接到端点。 就像这样:

IPEndPoint ipe = new IPEndPoint(address, port);
Socket tempSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw);
tempSocket.Connect(ipe);

只有在成功连接后才尝试发送数据。

MSDN link