利用c#实现对sql server的信息探测


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;

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus