我正在尝试编写一个在C#中发送原始套接字的应用程序。我没有很多C / C ++的经验,所以更喜欢C#。我在C#中找到了几个原始套接字选项,但是没有一个允许我设置ACK,SYN,PSH,FIN等标志。有关这是否可以在C#中完成的任何想法?
任何提示都会非常感激。
更新: 我正在尝试编写一个测试防火墙的工具,我想发出状态数据包,带有不同标志的数据包。我正在使用Win 2008,据我所知,我可以在它上面做原始套接字。如果需要,我将使用C / C ++,到目前为止它就是它的样子。
进一步更新: SharpPcap看起来不错,看来v4.0没有源码,只有3.5。由于文档还没有完成,我将尝试混淆它。有没有人以前用过它?
最终编辑: SharpPcap看起来很棒!它正在做我需要的!!我将发布一个跟进问题,因为我不是.NET专家,它捕获得很好,我只是无法从捕获委托部分发送数据包。
谢谢大家!
答案 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)
如果您想要达到该级别,可以使用Socket
和SocketType.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。