1、原理简述 对于SQL Server2000来说,打开SQL Server客户端准备连接,当拉开服务器列表的时候,整个局域网所有的SQL Server服务器都被列出来了。 这是为什么呢? 原理如下: 从我自己的机器(192.168.0.1)上从1434端口广播(192.168.0.255)了这个UDP包,然后,整个局域网中的SQL Server服务器都开始响应这个UDP数据包,所有这些都是明文传输的,我们可以很容易探测一个IP地址的1434端口,获得该IP地址上运行的SQL Server的相关信息。 这些信息包括:主机名称、实例名称、版本、管道名称以及使用的端口等。这个端口是微软自己使用,而且不象默认的1433端口那样可以改变,1434是不能改变的。 2、程序实现 下面是一个利用1434进行探测的c#程序,核心代码如下(很简单,呵呵) : using System; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; namespace ConsoleApplication3 { class Class1 { //创建一个UDPCLIENT实例 private static UdpClient m_Client; //LISTEN用来获取返回的信息 public static string Listen(string hostip) { string HostIP = hostip; IPAddress thisIP = IPAddress.Parse(HostIP); IPEndPoint host = new IPEndPoint(thisIP,1434); byte [] data = m_Client.Receive(ref host); Encoding ASCII = Encoding.ASCII; String strData = ASCII.GetString(data); return strData; } //SEND public static void Send(string hostip) { string HostIP = hostip; byte [] buffer = {02}; //02为要发送的数据,只有02、03、04有回应 int ecode = m_Client.Send(buffer,1,HostIP,1434); //ecode用来返回是否成功发送 if(ecode <= 0) { Console.WriteLine("发送时出错:" + ecode); } } //对返回的信息的简单的处理 public static void OutputInfo(string strdata) { string str = strdata; //str.le char [] that = {‘;‘,‘;‘}; string [] strofthis =str.Split(that); //int i= 0 ; for(int i=0;i Console.Write(strofthis[i]); Console.Write(‘\\n‘); }
} //输入IP public static string InputHostIP() { Console.Write("enter the ip you want to scan:\\n\\n"); string hostip =Console.ReadLine(); Console.Write(‘\\n‘); return hostip; } //EXIT public static void Exit() { Console.WriteLine("if you want to exit ,just input 1\\n"); int a = Console.Read(); if(a!= 1) { Console.WriteLine("if you want to exit ,just input 1\\n"); Console.Read(); } else { } } [STAThread]
static void Main(string[] args) { string HostIP; HostIP = InputHostIP(); Console.WriteLine("Begin to send udp to the host"); m_Client = new UdpClient(); Send(HostIP); string strData=Listen(HostIP); OutputInfo(strData); Exit(); } } } 3一个典型的返回的信息 ServerName;AWEN; InstanceName;AWEN; IsClustered;No; Version;8.00.194; tcp;1044; (TCP的端口,可见就算改了端口也是很容易找到的) np;\\\\AWEN\\pipe\\MSSQL$XHT310\\sql\\query; |