【问题标题】:Using raw sockets with C#在 C# 中使用原始套接字
【发布时间】:2011-09-23 18:18:15
【问题描述】:

我想用 C# 编写一个端口扫描器,但我不能使用 SocketType.Raw,因为原始套接字是从桌面版本的 Windows 中取出的。我不能使用 SharpPcap 或 Winpcap 的其他包装器,因为我使用 PPPoE 进行互联网连接,而 Winpcap 不支持 PPP 设备。

我需要使用一个实现原始套接字且不依赖于 winpcap 的库。

有什么想法吗?基本上我需要发送 SYN,接收 SYN/ACK 或 RST 但不要发回 ACK。

编辑:

对于不相信 RAW 套接字已从 Windows 桌面版本中消失的人,请参阅此处:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx

在 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 协议的原始套接字调用bind 函数。
    注意其他协议允许使用原始套接字的bind 函数(例如IPPROTO_IPIPPROTO_UDPIPPROTO_SCTP)。

【问题讨论】:

  • 在对答案进行投票之前,请了解什么是原始套接字,并且它不仅仅是在 .net 中使用套接字
  • 纯学术评论:你不能写你自己的 WinSock DLL 吗?编写了原始套接字并且必须自己在 UNIX/LINUX 中执行 TCP,我认为应该是可能的。

标签: c# tcp raw-sockets


【解决方案1】:

请注意 nmap 是如何做到的,目前我相信您的选择是在以太网框架上转到较低级别。

"Nmap 仅支持以太网接口(包括大多数 802.11 无线网卡和许多 VPN 客户端)进行原始数据包扫描。除非您使用 -sT -Pn 选项,否则不支持 RAS 连接(例如 PPP 拨号)和某些 VPN 客户端. 当 Microsoft 在 Windows XP SP2 中删除原始 TCP/IP 套接字支持时,此支持已被删除。现在 Nmap 必须发送较低级别的以太网帧。"

所以 - 这让我们:

http://www.codeproject.com/KB/IP/sendrawpacket.aspx

【讨论】:

  • 感谢您的链接。这是一本有趣的读物,会让我忙上一阵子。如果我有正常的以太网连接,但我的互联网是 FTTH,我可以使用这个人开发的驱动程序,我通过以太网拨打 PPP 连接,所以我不直接使用 NIC。而为 PPPoE 编写 NDIS 驱动程序现在超出了我的能力范围。
  • 嗯,您可以通过任何方式扫描虚拟适配器,然后通过共享/路由/等通过您的 ppp 连接路由到网络?我有 zero 的想法,如果它会工作,只是一个想法:)
  • 当然,这将是一个好主意,但我没有成功尝试用我的 PPPoE 连接桥接 tune/tap 驱动程序或 Microsoft Loopback 驱动程序。而且我想提出一个解决方法,我的软件的所有用户都可以使用,无论他们以何种方式连接到互联网。
【解决方案2】:

就像这样:

http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8h.html

另外,它是在什么时候从 Windows 中删除的?上周我为一个朋友做了一个聊天客户端;同样,http://msdn.microsoft.com/en-us/library/system.net.sockets.sockettype.aspx 仍将其列为活动。

【讨论】:

  • 原始套接字与 TCP 套接字不同。见msdn.microsoft.com/en-us/library/…
  • 不,我只是按照示例混合了我所做的,不需要对给出的链接进行任何更改,因为它仍然有效。 edit 从字面上看,我刚刚复制并粘贴了代码,编译它,并在 Windows 7 上毫无问题地运行可执行文件
  • @Dave 不,.Net 没有瘫痪,但 winsock 是。这也会影响 C++。如果我发布一个关于 Java 的问题,你会建议我使用 Python 吗?
  • 请参阅本文第三条评论中的“原始套接字的限制”。它在 Windows 上被蹂躏,与 .net 一点关系都没有,据我了解,部分想法是帮助防止 BOT 军队在毫无戒心的机器上伪造 IP 地址,以便用于 DoS 洪水攻击等。​​
  • Heya @DaveHolitish - 您是否建议创建自己的 winsock 库作为解决方法?考虑到与较低级别系统接口、分层服务提供商支持等集成的测试工作和要求,这似乎有点复杂?除非我错过了这里可能是一个简单的步骤,否则这似乎是一个很大的挑战?只是寻找有关此解决方案的理论以进一步了解它。几年前在编写 ws 挂钩函数和存根时,这是一项相当大的测试工作,现在该层更加复杂。
【解决方案3】:

尝试以管理员身份运行 Visual Studio

右键--->以管理员身份运行

然后使用原始套接字执行程序..

【讨论】:

  • 原始套接字在 Windows 的非服务器版本上不起作用。请重新阅读原始问题中引用的 MSDN 段落。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多