网络扫描器.docx

上传人:b****3 文档编号:10274300 上传时间:2023-05-24 格式:DOCX 页数:25 大小:63.92KB
下载 相关 举报
网络扫描器.docx_第1页
第1页 / 共25页
网络扫描器.docx_第2页
第2页 / 共25页
网络扫描器.docx_第3页
第3页 / 共25页
网络扫描器.docx_第4页
第4页 / 共25页
网络扫描器.docx_第5页
第5页 / 共25页
网络扫描器.docx_第6页
第6页 / 共25页
网络扫描器.docx_第7页
第7页 / 共25页
网络扫描器.docx_第8页
第8页 / 共25页
网络扫描器.docx_第9页
第9页 / 共25页
网络扫描器.docx_第10页
第10页 / 共25页
网络扫描器.docx_第11页
第11页 / 共25页
网络扫描器.docx_第12页
第12页 / 共25页
网络扫描器.docx_第13页
第13页 / 共25页
网络扫描器.docx_第14页
第14页 / 共25页
网络扫描器.docx_第15页
第15页 / 共25页
网络扫描器.docx_第16页
第16页 / 共25页
网络扫描器.docx_第17页
第17页 / 共25页
网络扫描器.docx_第18页
第18页 / 共25页
网络扫描器.docx_第19页
第19页 / 共25页
网络扫描器.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

网络扫描器.docx

《网络扫描器.docx》由会员分享,可在线阅读,更多相关《网络扫描器.docx(25页珍藏版)》请在冰点文库上搜索。

网络扫描器.docx

网络扫描器

第4章网络扫描器

知识点:

TcpClient类

线程基础;

多线程的使用方法;

ProgressBar控件的使用;

4.1实例简介

网络扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器可以丝毫不留痕迹的发现远程服务器的各种TCP端口的分配及提供的服务!

这就能让我们间接的或直观的了解到远程主机所存在的安全问题。

这是最基本的TCP扫描。

用系统提供的connect()方法探测,用来与每一个感兴趣的目标计算机的端口进行连接。

如果端口处于侦听状态,那么connect()就能成功。

否则,这个端口是不能用的,即没有提供服务。

这个技术的一个最大的优点是,你不需要任何权限。

系统中的任何用户都有权利使用这个调用。

另一个好处就是速度。

如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,可以通过动态数组动态调节,从而加速扫描。

4.2必备知识

4.2.1System.Net.Sockets简介

在.Net框架中System.Net.Sockets命名空间为需要严密控制网络访问的开发提供了WindowsSockets(Winsock)接口的托管实现。

System.Net.Sockets命名空间主要提供制作Sockets网络应用程序的相关类,其中几个比较重要的类有Socke类Tcplient类,TcpListener类以及UdpClient类。

其中TcpClient提供TCP网络服务的客户端连接,可以利用创建TcpClient实例对象,提供TCP网络服务的客户端应用程序于服务沟通,这个类定义个方法Connect,用以连接因特网的远程主机,其中包含3个重载版本。

第一个版本的定义如下:

publicvoidConnect(IPEndPointremoteEP);

这个方法接受一个客户端的连接要求,IPEndPoint为一个设计用以表示IP地址和通信端口编号类,remoteEP对象则包含所要连接的终点IP地址以及连接端口等信息。

该方法用以直接连接至参数所指定的网络端终点。

第二个版本的定义如下:

publicvoidConnect(IPAddressaddress,intport);

其中address为一IPAddress类对象,IPAddress类被用以表示因特网上一个特别的地址。

Port则为一个int类型的参数值代表所要连接的主机通信端口编号。

第三个版本的定义如下:

publicvoidConnect(stringhostname,intport);

其中的hostname为一个string类型的主机名字符串,代表所要连接的网络终点。

这些方法皆是经过指定IP地址以及通信端口编号进行连接,而在网络连接过程中,若是没有连接成功的话,系统会抛出一个SocketException异常。

4.2.2ListBox的内容自动上滚实现技巧

其实原理很简单,我们只要在加入一个元素的时候将光标自动定位到最后一个元素,则可以实现其效果.代码如下:

//加入元素

ListBox1.Item.add(myMessage);

//选定最后一个元素(定位到最后一位)

ListBox1.SelectedIndex=ListBox1.Items.Count-1;

//取消选定(消除蓝色的选定条)

ListBox1.SelectedIndex=-1;

4.2.3端口简介

1.端口的概念介绍:

在网络技术中,端口(Port)大致有两种意思:

一是物理意义上的端口,比如,ADSLModem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等;二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。

我们这里将要介绍的就是逻辑意义上的端口。

2.端口的分类:

在Internet上,按照协议类型分类,端口被分为TCP端口和UDP端口两类,虽然他们都用正整数标识,但这并不会引起歧义,比如TCP的80端口和UDP的80端口,因为数据报在标明端口的同时,还将标明端口的类型。

从端口的分配来看,端口被分为固定端口和动态端口两大类(一些教程还将极少被用到的高端口划分为第三类:

私有端口):

固定端口(0-1023):

集中式管理机制,即服从一个管理机构对端口的指派,这个机构负责发布这些指派。

由于这些端口紧绑于一些服务,所以我们会经常扫描这些端口来判断对方是否开启了这些服务,如TCP的21(ftp),80(http),139(netbios),UDP的7(echo),69(tftp)等等一些大家熟知的端口;

动态端口(1024-49151):

这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程,同一进程两次分配有可能分配到不同的端口。

不过一些应用程序并不愿意使用操作系统分配的动态端口,他们有其自己的‘商标性’端口,如oicq客户端的4000端口,木马冰河的7626端口等都是固定而出名的。

3.端口在入侵中的作用:

有人曾经把服务器比作房子,而把端口比作通向不同房间(服务)的门,如果不考虑细节的话,这是一个不错的比喻。

入侵者要占领这间房子,势必要破门而入(物理入侵另说),那么对于入侵者来说,了解房子开了几扇门,都是什么样的门,门后面有什么东西就显得至关重要。

入侵者通常会用扫描器对目标主机的端口进行扫描,以确定哪些端口是开放的,从开放的端口,入侵者可以知道目标主机大致提供了哪些服务,进而猜测可能存在的漏洞,因此对端口的扫描可以帮助我们更好的了解目标主机,而对于管理员,扫描本机的开放端口也是做好安全防范的第一步。

4.常见端口介绍

(1)21FTP

此端口开放表示服务器提供了FTP服务,入侵者通常会扫描此端口并判断是否允许匿名登陆,如果能找到可写目录,还可以上传一些黑客程序做近一步入侵。

要想关闭此端口,需要关闭FTP服务。

(2)23Telnet

此端口开放表示服务器提供了远程登陆服务,如果你有管理员的用户名和密码,可以通过这个服务来完全控制主机(不过要先搞定NTLM身份认证),获得一个命令行下的shell。

许多入侵者喜欢开启这个服务作为后门。

要想关闭此端口,需要关闭Telnet服务。

(3)25SMTP

此端口开放表示服务器提供了SMTP服务,一些不支持身份验证的服务器允许入侵者发送邮件到任何地点,SMTP服务器(尤其是sendmail)也是进入系统的最常用方法之一。

要想关闭此端口,需要关闭SMTP服务。

(4)69TFTP(UDP)

此端口开放表示服务器提供了TFTP服务,它允许从服务器下载文件,也可以写入文件,如果管理员错误配置,入侵者甚至可以下载密码文件。

许多入侵者通过在自己机器运行此服务来传文件到目标机器,从而实现文件的传输。

要想关闭此端口,需要关闭TFTP服务。

(5)79Finger

用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其它机器Finger扫描。

(6)80HTTP

此端口开放表示服务器提供了HTTP服务,可以让访问者浏览其网页等,大部分针对IIS服务器的溢出攻击都是通过这个端口的,可以说是入侵者最常攻击的一个端口了。

要想关闭此端口,需要关闭HTTP服务。

(7)110POP3

用于客户端访问服务器端的邮件服务。

POP3服务有许多公认的弱点。

关于用户名和密码交换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统,成功登陆后还有其它缓冲区溢出错误。

4.2.4线程简介

1.线程基本概念(基础)

什么是线程?

(从机器的CPU角度看)一个线程是程序执行的一个单独过程。

一个线程不能够被任何底层的事件中断,并且不包括执行更小的过程。

线程尚没有统一的定义,一般说来,所谓线程(或称线索),指程序中的一个单一的顺序控制流。

在.NET中,线程功能是在System.Threading名称空间中定义的。

因此,在使用任何线程类之前,必须定义System.Threading名称空间。

定义方法为:

usingSystem.Threading;

2.在程序中使用线程

首先,必须有一个线程函数。

然后,创建线程对象。

在一个线程开始的时候,调用该程序以执行线程的实际工作。

当这个程序终止时,该线程也终止了。

例如:

publicvoidThreadMethord()

{

intnumber=0;

while(true)

{

//Thread.Sleep方法用于将一个线程暂停一段时间

thread.Sleep(1000);

number++;

Console.WriterLine("number:

{0}",number); 

}

}

//然后创建线程启用它:

ThreadmyThread=newThread(newThreadStart(ThreadMethord));

MyThread.Start();

3.Thread类的常用方法介绍

System.threading名称空间中的Thread类代表一个线程对象,用这个类对象可以创建新的线程,删除、暂停和恢复线程。

下面的代码使用Thread类创建一个新的线程,然后启动这个线程:

thread=newThread(newThreadStart(WriteData));

thread.Start();

其中WriteData是这个线程要执行的一个函数;

暂停线程:

Thread.Sleep方法用于将一个线程暂停一段时间,代码如下:

thread.Sleep();

停止线程:

Thread.Abort();

Thread.Interrupt();

延迟线程:

线程被延迟到调用Resume方法为止。

if(thread.ThreadState=ThreadState.Running)

{

thread.Suspend();

}

恢复被延迟的线程

调用Resume方法可以恢复一个被延迟的线程。

如果线程没有被延迟,Resume方法就是无效的。

if(thread.ThreadState=ThreadState.Suspended)

{

thread.Resume();

}

4.3设计思路

打开VisualS,新建一个C#WindowsApplication,名称为PortScann,系统将默认生成一个窗体Form1,我们将使用该窗体作为PortScann工程的主窗体,以下我们详细介绍窗体控件分布;

4.3.1界面设计

“网络扫描器”的主要功能是实现对不同网段IP地址的端口进行探测,主要判断那些端口是打开的那些是关闭的.页面的布局如图4-1所示:

图4-1网络扫描器运行界面

在VisualS窗体编辑器中加入如图4-1所示的5个GroupBox,7个Label,3个TextBox,3个RadioButton,3个NumericUpDown,3个Button,2个ListBox,2个ProgressBar,一个StatusBar,一个Timer,一个ToolTip控件.页面添加的控件属性说明如表4-1所示:

表4-1页面控件属性说明

名称

类型

Text属性值

Name属性值

分组控件

GroupBox

地址

grpAddress

分组控件

GroupBox

端口

grpPort

分组控件

GroupBox

操作

grpOperator

分组控件

GroupBox

扫描

grpScann

分组控件

GroupBox

结果

grpResult

标签

Label

起始

lblStartIP

标签

Label

终止

lblEndIP

标签

Label

线程数

lblThreadCount

标签

Label

1-1000(线程的范围)

lblExplain

标签

Label

lblTo

标签

Label

扫描进度

lblReturn

标签

Label

回应进度

lblScanSpeed

列表框

ListBox

显示扫描过程

lstScann

列表框

ListBox

显示扫描结果

lstResult

文本框

TextBox

输入扫描的起始IP地址

txtStartIp

文本框

TextBox

输入扫描的终止IP地址

txtEndIp

文本框

TextBox

需要扫描的端口

txtListPort

按钮

Button

扫描

btnStart

按钮

Button

停止/继续

btnPause

按钮

Button

停止

btnStop

单选按钮

RadioButton

范围(从起始端口到终止端口的连续扫描)

rbtnRanger

单选按钮

RadioButton

列表(只对文本框中输入的端口进行扫描)

rbtnList

单选按钮

RadioButton

常见病毒入侵端口

rbtnVirous

进度条

ProgressBar

显示扫描进度

pgbScann

进度条

ProgressBar

显示已经扫描结束的进度

pgbResult

状态栏

StatusBar

显示当前进程的个数

stbFoot

时钟

Timer

用于计时

tmrTool

提示控件

ToolTip

用于当鼠标停留在控件上时信息提示

ToolTip1

数字控件

NumericUpDown

连续扫描时开始扫描的端口

numDown

数字控件

NumericUpDown

连续扫描时结束扫描的端口

numUP

数字控件

NumericUpDown

线程执行时的最大数目

numTdCount

4.3.2特殊控件说明

在PortScannerTest工程中,为了能让用户随时知道启动线程的个数,添加了一个时钟控件Timer,为了显示扫描的进度添加了两个显示扫描进度的进度条ProgressBar;以下详细介绍这两个控件;

4.3.3控件Timer

控件Timer,它比较重要的属性为:

Enabled和Interval;

Enable属性的值可以为true和false;当为true时,表明控件Timer处于启用状态,当为false时,控件Timer处于禁用状态。

需要用运控件Timer,只能把Enable设为true;

Interval属性的值用来设置控件Timer的频率,它是以毫秒为单位;

控件Timer它只有一个Tick事件,它的作用是每当经过指定的事件间隔就执行一次指定的程序代码。

在PortScannerTest工程中我们把控件Timer的Enable值设为True,Interval的值为1000,就是每隔一秒执行一次Tick事件。

4.3.4控件ProgressBar

控件ProgressBar比较重要的属性为:

Maximum,Minimum,和Value;

Maximum表示ProgressBar在使用的过程中根据实际情况设置的上限(最大)值;系统默认设置其值为100;Maximum表示ProgressBar在使用的过程中根据实际情况设置的下限(最小)值;系统默认设置其值为0;Value表示ProgressBar的当前值,它的值必须在Maximum和Minimum属性指定的范围之内;

4.4设计实现

4.4.1动态线程实现

在整个扫描过程中为了防止程序扫描的时间过长,我们采用动态线程的方法同步扫描,具体使用ArrayList动态数组来控制扫描中的线程。

方法如下:

1.加入一个线程到动态列中,然后启动该线程

//加入一个线程

this.ThreadList.Add(newThread(threadstartNext));

//开始这个线程

((Thread)ThreadList[ThreadList.Count-1]).Start();

其中ThreadList类型为ArrayList,threadstartNext类型为ThreadStart。

2.结束一个线程,并将线程从动态列中移除

((Thread)ThreadList[i]).About();

ThreadList.RemoveAt(i);

其中i为数组的索引。

3.遍历动态列中线程的状态,并将结束的线程移除

for(inti=0;i

{

//如果线程已经结束,从动态数组中删除

if(!

((Thread)ThreadList[i]).IsAlive)

{

ThreadList.RemoveAt(i);

//移除后所有元素向前移动1,循环计数也向前移动1。

i--;

}

}

4.动态线程数控制

为了能够控制线程数,我们加入下一个线程到动态列之前进行线程数量上的判断,如果达到某一设置的值将不再进行下去,直到线程数少于设置值。

代码如下:

//循环判断,条件不满足让才程序继续。

while(ThreadList.Count>=(int)numTdCount.Value)

{

//暂停1秒。

System.Threading.Thread.Sleep(1000);

}

//加入线程函数

StartThread(IPAddCurrent,m.ToString());

其中,numTdCount为用户控制线程数的控件

4.4.2IP与端口的遍历

在.net中为我们提供了IPAddress类,其中有Address这个属性,它将带有IP格式的地址转换成长整形的地址,但是大家可以发现,当我们再次转换成IP地址的时候,顺序已经倒置了,所以我们需要处理一下。

编译的时候如果出现编译过时的问题。

大家不必管它。

然后再从低位到高位循环。

至于端口,我们直接使用循环便可解决。

方法GetScanIPAddress的主要作用就是实现IP地址的循环,为了实现这一功能,首先把用户输入的IP地址根据”.”分割存入数组中,倒序排列组成新的字符串,然后转化成可以循环的IP,具体的代码如下:

string[]sIPA=this.txtStartIP.Text.Trim().Split('.');//将IP地址按"."分割存入数组中

//将数组的项倒序组成新的字符串

stringnumIPA=sIPA[3]+"."+sIPA[2]+"."+sIPA[1]+"."+sIPA[0];

//将字符串转化成IP地址

longnumIPStart=System.Net.IPAddress.Parse(numIPA).Address;

实现IP地址循环之后再还原它:

变量i为当前循环的Ip地址的循环变量

//将IP地址分割存入数组中

string[]IPCurrent=(newSystem.Net.IPAddress(i).ToString()).Split('.');

stringIPAddCurrent=IPCurrent[3]+"."+IPCurrent[2]+"."+IPCurrent[1]+"."+IPCurrent[0];

代码如下:

publicvoidGetScanIPAddress()

{

string[]sIPA=this.txtStartIP.Text.Trim().Split('.');//将IP地址按"."分割存入数组中

string[]sIPB=this.txtEndIP.Text.Trim().Split('.');

//将数组中的项倒序组成新的字符串

stringnumIPA=sIPA[3]+"."+sIPA[2]+"."+sIPA[1]+"."+sIPA[0];

stringnumIPB=sIPB[3]+"."+sIPB[2]+"."+sIPB[1]+"."+sIPB[0];

longnumIPStart=System.Net.IPAddress.Parse(numIPA).Address;//将字符串转化成IP地址

longnumIPEnd=System.Net.IPAddress.Parse(numIPB).Address;

this.lstScann.Items.Clear();

for(longi=numIPStart;i

{

//扫描特定范围的端口

if(this.rdoRanger.Checked)

{

//定义两个整形变量,用来存贮起始端口和终止端口

intport1,port2;

port1=int.Parse(this.numUP.Text);

port2=int.Parse(this.numDown.Text);

//计算进度条的最大值

this.pgbScann.Maximum=(int)((numIPEnd-numIPStart)+1)*((port2-port1)+1);

this.pgbResult.Maximum=(int)((numIPEnd-numIPStart)+1)*((port2-port1)+1);

for(intm=port1;m<=port2;m++)

{

//将IP地址分割存入数组中

string[]IPCurrent=(newSystem.Net.IPAddress(i).ToString()).Split('.');

stringIPAddCurrent=IPCurrent[3]+"."+IPCurrent[2]+"."+IPCurrent[1]+"."+IPCurrent[0];

//等待线程结束,以便控制线程数

while(ThreadList.Count>=(int)numTdCount.Value)

{

System.Threading.Thread.Sleep(1000);

}

StartThread(IPAddCurrent,m.ToString());

}

}

//扫描固定的端口

if(this.rdoList.Checked)

{

string[]ScannPort=this.txtListPort.Text.Trim().Split('.',',');

this.pgbScann.Maximum=(int)((numIPEnd-numIPStart)+1)*(ScannPort.Length);

this.pgbResult.Maximum=(int)((numIPEnd-numIPStart)+1)*(ScannPort.Length);

for(intl=0;l

{

inte=int.Parse(ScannPort[l]);

string[]IPCurrent=(newSystem.Net.IPAddress(i).ToString()).Split('.');

stringIPAddCurrent=IPCurrent[3]+"."+IPCurrent[2]+"."+IPCurrent[1]+"."+IPCurrent[0];

//等待线程结束,以便控制线程数

while(ThreadList.Count>=(int

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2