我正在尝试创建一个简单的C#应用程序来执行端口转发,并且需要知道如何使用IP_HDRINCL套接字选项来尝试伪造接收端以认为连接确实是源。任何例子都将不胜感激。
答案 0 :(得分:4)
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头)成功接收数据,但不能发送它。
答案 1 :(得分:3)
较新版本的Windows限制了原始套接字的使用,因为恶意软件严重滥用它们。
引自MSDN
在Windows 7上, Windows Vista和Windows XP Service Pack 2(SP2),能力 通过原始套接字发送流量已经 受到多种限制:
- 无法通过原始套接字发送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之前的操作系统版本。
答案 2 :(得分:0)
IP_HDRINCL
.NET的Socket类型支持RAW,并且SocketOptionName.HeaderIncluded
可用于Socket.SetSocketOption
。
您可能希望使用Reflector来仔细检查.NET实现是否与枚举值保持一致。
答案 3 :(得分:0)