4

我正在尝试创建一个简单的 C# 应用程序来进行端口转发,并且需要知道如何使用 IP_HDRINCL 套接字选项来尝试伪造接收端以认为连接确实是到源的。任何示例将不胜感激。

4

4 回答 4

6
sock = new Socket( AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP );
sock.Bind( new IPEndPoint( IPAddress.Parse( "10.25.2.148" ), 0 ) );
sock.SetSocketOption( SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1 );   
byte[] trueBytes = new byte[] { 1, 0, 0, 0 };
byte[] outBytes = new byte[] { 0, 0, 0, 0 };
sock.IOControl( IOControlCode.ReceiveAll, trueBytes, outBytes );
sock.BeginReceive( data, 0, data.Length, SocketFlags.None, new AsyncCallback( OnReceive ), null );

唯一的问题是我已经能够成功地从这样的原始套接字接收数据(包括 IP 标头)但不能发送它。

于 2009-07-22T13:16:14.847 回答
3

由于恶意软件严重滥用原始套接字,较新版本的 Windows 限制了原始套接字的使用。

引用自MSDN

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

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

上述限制不适用于 Windows Server 2008 R2、Windows Server 2008、Windows Server 2003 或 Windows XP SP2 之前的操作系统版本。

于 2010-09-17T18:47:29.077 回答
0

IP_HDRINCL

.NET 的 Socket 类型确实支持 RAW,并且SocketOptionName.HeaderIncluded可以与Socket.SetSocketOption.

您可能希望使用 Reflector 仔细检查 .NET 实现与枚举值是否一致。

于 2009-02-21T12:55:28.250 回答
0

我找到了这个网站,但不确定代码的效果如何:http: //www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8h.html

于 2010-09-17T18:40:45.113 回答