关于WIN7下扫描UDP端口的问题

123

这两天发现一个很神奇的现象。

由于udp是非面向连接的协议,没有连接建立的过程,所以一般很少有udp端口扫描的工具,多数也只是通过系统命令直接获取,并非扫描得到。

由于要写个程序,其中一项功能就是实现udp的扫描,是桌面软件,所以决定用C#来写。

查阅了很多资料,发现一种可行的方法,就是给UDP端口发送一个包,如果此端口是开启,则没回应;端口是关闭,则会回发一个ICMP包。通过这种方法可以扫描udp端口。这是原理。

但是参考网上的方式实现以后却发现一个问题。

扫描代码如下(省略部分)

private void udp(int i)
{
String ip = null;//127.0.0.2
Dispatcher.Invoke(new Action(delegate {ip = Ip_Box.Text; }));
int recv = 0;
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), i);
EndPoint ipp = (EndPoint)ipep;
client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
host.Bind(ipep);
host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);
byte[] data = new byte[1024];
data = Encoding.Unicode.GetBytes("hi~");
client.SendTo(data, ipep);
byte[] data2 = new byte[10240];
SetProgressBar(Convert.ToInt32(progress + 1));
try
{
recv = host.ReceiveFrom(data2, ref ipp);//如果有接收到ICMP包,则recv>0,此端口关闭,无异常
//i端口关闭
}
catch(Exception)
{
//i端口打开
}
finally
{
client.Close();
host.Close();
}
}

在XP下运行是正常的,确实可以正确扫描udp端口

但是对于同一个.NET Framework版本,在XP和WIN7下却不同,WIN7会显示所有端口均打开,具体原因个人认为应该是系统权限导致吧。暂时没什么解决办法。对于这种扫描方式,本来也就不算是一种正常的扫描方式。如果谁有解决方法,可以提供一下~