使用C#编写原始套接字

15

我想用C#编写端口扫描器,但是由于桌面版Windows中移除了原始套接字(SocketType.Raw),因此无法使用它。我也不能使用SharpPcap或其他Winpcap的包装器,因为我使用PPPoE进行Internet连接,而Winpcap不支持PPPoE设备。

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

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

编辑:

对于那些不相信桌面版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函数。
    注意 对于其他协议(例如IPPROTO_IP、IPPROTO_UDP或IPPROTO_SCTP),可以使用原始套接字调用bind函数。

6
在对答案进行投票之前,请了解什么是原始套接字,并且它不仅仅是在.NET中使用套接字。 - Adam Tuliper
纯学术评论:你不能自己编写WinSock DLL吗?我曾经编写过原始套接字并在UNIX / LINUX中自己处理TCP,我认为这应该是可能的。 - HungryBeagle
3个回答

2
请注意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驱动程序超出了我的能力范围。 - Mack
你是否可以通过虚拟适配器扫描,然后通过共享/路由等方式通过PPP连接路由到网络上?我完全不知道它是否可行,只是一个想法 :) - Adam Tuliper
当然,那是个好主意,但我试图将音调/敲击驱动程序或Microsoft Loopback驱动程序与我的PPPoE连接桥接并没有成功。我想找到一个解决方法,可以让我的软件的所有用户都能使用,无论他们连接互联网的方式是什么。 - Mack

0

2
原始套接字与TCP套接字不同。请参见http://msdn.microsoft.com/en-us/library/system.net.sockets.sockettype.aspx。 - Jacob
请看此处:http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms740548(v=vs.85).aspx - Mack
5
不,.Net没有受到限制,但winsock受到了限制。这也会影响到C++。如果我发布了一个关于Java的问题,你会建议我使用Python吗? - Mack
1
请参阅此帖子中第三个评论中的“原始套接字限制”。它在Windows上被禁用,与.net无关。据我了解,其中一部分想法是帮助防止对毫无准备的计算机进行BOT攻击,伪造IP地址并用于DoS洪水攻击等行为。 - Adam Tuliper
1
嗨,@DaveHolitish - 你建议创建自己的winsock库作为解决方法?考虑到测试工作和与较低级别系统接口、分层服务提供程序支持等集成的要求,这似乎有点复杂?除非我错过了一个简单的步骤,否则这似乎是一个相当大的挑战?只是想了解一下这个解决方案的理论,以便更好地理解它。几年前编写ws hooking函数和存根时需要进行相当多的测试工作,现在在这一层面上还有更多的复杂性。 - Adam Tuliper
显示剩余11条评论

-9

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

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

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


2
原始套接字在非服务器版本的Windows上无法工作。请重新阅读原始问题中MSDN引用的段落。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接