【问题标题】:C# raw socket ARP replyC# 原始套接字 ARP 回复
【发布时间】:2018-09-11 12:33:57
【问题描述】:

我是一名学生,想了解更多关于 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 的知识。

【问题讨论】:

  • 您可以尝试发送到目标广播 ip(类似于 socket.SendTo(buffer, buffer.Length, SocketFlags.None, new IPEndPoint(IPAddress.Parse("192.168.1.255"), 0));,但我不确定它会按照您的意愿行事(尽管它应该会删除异常)。

标签: c# arp


【解决方案1】:

一段时间后我忘记了这个问题,但从an article my teacher showed me about Raw Sockets in a WinSock annex on MSDN得到了答案。

这篇文章的一个部分对这个问题特别感兴趣:

原始套接字的限制

在 Windows 7、Windows Vista、带有 Service Pack 2 (SP2) 的 Windows XP 和带有 Service Pack 3 (SP3) 的 Windows XP 上,通过原始套接字发送流量的能力受到以下几个方面的限制:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多