RAW套接字 - C# - 设置标志

时间:2011-09-15 23:58:47

标签: c# sockets

我正在尝试编写一个在C#中发送原始套接字的应用程序。我没有很多C / C ++的经验,所以更喜欢C#。我在C#中找到了几个原始套接字选项,但是没有一个允许我设置ACK,SYN,PSH,FIN等标志。有关这是否可以在C#中完成的任何想法?

任何提示都会非常感激。

更新: 我正在尝试编写一个测试防火墙的工具,我想发出状态数据包,带有不同标志的数据包。我正在使用Win 2008,据我所知,我可以在它上面做原始套接字。如果需要,我将使用C / C ++,到目前为止它就是它的样子。

进一步更新: SharpPcap看起来不错,看来v4.0没有源码,只有3.5。由于文档还没有完成,我将尝试混淆它。有没有人以前用过它?

最终编辑: SharpPcap看起来很棒!它正在做我需要的!!我将发布一个跟进问题,因为我不是.NET专家,它捕获得很好,我只是无法从捕获委托部分发送数据包。

谢谢大家!

3 个答案:

答案 0 :(得分:3)

查看SharpPcap

根据描述:

  

SharpPcap是.NET环境的跨平台数据包捕获框架,基于着名的pcap / WinPcap库。它提供了一个API,用于使用任何.NET语言(如C#和VB.NET)捕获,注入,分析和构建数据包。

它在内部使用WinPcap驱动程序,因此它允许您使用自己的IP / TCP标头构建原始数据包。

答案 1 :(得分:1)

简短的回答,在桌面版的Windows上,你不能。来自Wikipedia

  

当微软在2001年发布Windows XP并在Winsock界面中实现原始套接字支持时,媒体批评微软断言原始套接字仅用于黑客执行TCP重置攻击。在Windows XP发布三年后,Microsoft默默地将Winsock的原始套接字支持限制在一个不可移动的修补程序中,并且不再为使用它们的应用程序提供进一步的支持或解决方法。

答案 2 :(得分:0)

如果您想要达到该级别,可以使用SocketSocketType.Raw创建ProtocolType.IP。但是,我相信你必须手动创建代表ACK,SYN等的数据包。所以你必须阅读一些RFC文档。 :)

我无法在网上找到有关您的特定需求的资源,但是阅读这个C# network sniffer的实施方式可能是值得的。至少它会让你知道如何操作该级别的原始套接字。

编辑:正如Mystere Man所指出的那样,这在桌面版Windows中是不可能的。但是,这应该适用于服务器版本。以下是Microsoft的正式声明:

  

原始套接字的限制

     

在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的原始套接字调用bind函数   不允许使用协议。
  •   
     

注意其他允许带有原始套接字的绑定功能   协议(例如IPPROTO_IP,IPPROTO_UDP或IPPROTO_SCTP)。

     

以上限制不适用于Windows Server 2008 R2,   Windows Server 2008,Windows Server 2003或版本的   操作系统早于Windows XP SP2。