端口扫描程序的设计与实现.docx
- 文档编号:24512492
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:25
- 大小:301.27KB
端口扫描程序的设计与实现.docx
《端口扫描程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《端口扫描程序的设计与实现.docx(25页珍藏版)》请在冰豆网上搜索。
端口扫描程序的设计与实现
理工大学
《网络协议编程课程设计》报告
端口扫描程序的设计与实现
学院计算机与通信工程学院专业网络工程
班级学号
学生指导教师
课程成绩完成日期
课程设计任务书
计算机与通信工程学院网络工程专业
课程名称
网络协议编程课程设计
时间
2015~2016学年第1学期18~19周
学生
指导老师
题目
端口扫描程序的设计与实现
主要容:
(1)实现通过异步扫描对指定网段的主机或者单个主机对指定端口或者指定的端口围进行扫描。
(2)实现通过多线程批量扫描对指定网段的主机或者单个主机对指定端口或者指定的端口围进行扫描。
(3)设置异常处理机制,能对端口扫描出现异常时做出处理。
要求:
(1)结合网络协议编程课程设计所学知识设计并实现端口扫描程序的设计与实现。
(2)学会文献检索的基本方法和综合运用文献的能力。
(3)通过课程设计培养严谨的科学态度,认真的工作作风和团队协作精神。
应当提交的文件:
(1)课程设计学年论文。
(2)课程设计附件(相关图纸、设备配置清单、报告等)。
课程设计成绩评定
院系计算机与通信工程专业
班级学号
学生指导教师
指导教师对学生在课程设计中的评价
评分项目
优
良
中
及格
不及格
学习态度与遵守纪律情况
课程设计完成情况
课程设计报告的质量
指导教师成绩指导教师签字2016年月日
课程设计答辩组对学生在课程设计中的评价
评分项目
优
良
中
及格
不及格
课程设计完成情况
课程设计报告的质量
课程设计答辩
答辩组成绩答辩组长签字2016年月日
课程设计综合成绩
注:
课程设计综合成绩=指导教师成绩×60%+答辩组成绩×40%
端口扫描程序的设计与实现
学生:
指导老师:
摘要计算机信息网络的发展加速了信息化时代的进程,随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全也日益明显。
端口扫描技术是发现安全问题的重要手段之一。
本程序是在.NET平台上使用C#语言完成的一个端口扫描程序。
此程序主要完成了多线程批量扫描和异步扫描功能。
多线程批量扫描,能对单个指定的主机或者指定网段的所有主机进行特定端口或指定的端口段的端口进行逐个扫描,此端口扫描程序能以较快的速度准确地扫描出主机侦听的空闲端口。
相对于多线程批量扫描,异步扫描能以更快的速度准确地扫描出主机侦听的空闲端口。
扫描结果以列表的形式直观显示出来。
关键词端口扫描;多线程批量扫描;异步扫描
Designandimplementationofportscanningprogram
Studentname:
YUWenlongAdvisor:
LONGJizhen
AbstractComputerinformationnetworkdevelopmentspeedsuptheprocessoftheinformationage,withtheincreaseofthedegreeofsocialnetworks,thecomputernetworkhasbecomeincreasinglydependenton,networksecurityisincreasinglyobvious.Portscanningtechnologyisoneoftheimportantmethodstofindsecurityproblems.Thisprocedureisinthe.NETplatformusingC#languagetocompleteaportscanner.Thisprogrammainlycompletesthemultithreadbatchscanningandasynchronousscanningfunction.Multi-threadedbatchscanning,allthehosttospecifyasinglehostornetworksegmentspecifiedforaparticularportandtheportspecifiedportscansonebyone,theportscanningprocedurescanfastaccuratelyscanhostlistenstothefreeport.Comparedwiththemultithreadasynchronousbatchscanning,scanningcanaccuratelyscanhostlistenstothefreeportatafasterspeed.Scanresultsaredisplayedintheformofalist.
Keywords:
portscanning;multithreadbatchscan;asynchronousscan
1前言
端口在计算机网络中用于标识上层应用程序服务,端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关)。
端口扫描是计算机解密高手喜欢的一种方式。
攻击者可以通过它了解到从哪里可探寻到攻击弱点。
实质上,端口扫描包括向每个端口发送消息,一次只发送一个消息。
接收到的回应类型表示是否在使用该端口并且可由此探寻弱点。
扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种端口的状态!
这就能让我们间接的或直观的了解到远程主机所存在的安全问题。
1.1课程设计的目的
计算机网络的发展使得社会网络化程度增加,人们对计算机网络的依赖也越来越大,端口扫描技术是发现安全问题的重要手段之一。
端口扫描的主要目的是判断目标主机或目标网段的主机开放了哪些服务,网络管理员了解了这些信息后,便于管理整个网络以及采取相应的安全防。
2设计的软硬件平台
本程序基于.NET平台使用C#语言开发的一个端口扫描程序。
.NET是MicrosoftXMLWebservices平台。
XMLWebservices允许应用程序通过Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。
Microsoft.NET平台提供创建XMLWebservices并将这些服务集成在一起之所需。
.NET支持多种语言,包括C#,VC++,COBOL等,是一个全面的开发工具。
3端口扫描的主要工作原理
端口扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息。
最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。
如果端口处于侦听状态,那么connect()就能成功。
否则,这个端口是不能用的,即没有提供服务。
这个技术的一个最大的优点是,你不需要任何权限。
系统中的任何用户都有权利使用这个调用。
另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描,也就是本设计中的多线程批量扫描。
使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。
但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。
目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。
常见的端口扫描方法有TCPconnect,TCPSYN,TCPFIN,TCPACK,多线程socket批量扫描等,本次课程设计主要采用TCPconnect实现异步扫描,调用socket实现多线程批量扫描。
3.1多线程批量扫描工作原理
操作系统提供的socket系统调用,用来与每一个感兴趣的目标主机的端口进行连接。
如果端口处于侦听状态,那么socket()就能成功,否则这个端口没有提供服务。
多线程批量扫描使用for循环来实现逐个扫描的,多端口也是使用for循环来实现逐个扫描的,调用connect()和accept()建立套接字连接,这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。
accept()用于使服务器等待来自某主机进程的实际连接。
借助for循环通过thread[i]=newThread(ThreadPort)创建多个线程,采用异常处理机制调用socket进行连接,实现端口扫描。
3.2异步扫描工作原理
调用操作系统提供的BeginConnect()方法进行TCP连接,用来与每一个感兴趣的目标主机的端口进行连接。
如果端口处于侦听状态,那么就能连接成功,否则不能连接成功。
通过while()循环来返回连接结果,并显示在列表中。
4端口扫描实现的主要步骤
4.1多线程批量扫描设计的主要步骤
(1)使用自定义的方法GetListIP()获取待扫描的指定主机或指定网段主机的IP地址和指定端口或端口段。
(2)初始化并保存为IPEndPoint对象。
(3)借助for循环通过thread[i]=newThread(ThreadPort)创建多个线程。
(4)调用线程的实现方法,使用socket连接,通过for循环进行批量扫描。
(5)采用trycatch进行异常处理。
4.2异步扫描设计的主要步骤
(1)使用自定义的方法GetListIP()获取待扫描的指定主机或指定网段主机的IP地址和指定端口或端口段。
(2)初始化并保存为IPEndPoint对象。
(3)通过for循环创建线程。
(4)调用操作系统提供的BeginConnect()方法进行TCP连接,进行循环扫描。
(5)采用trycatch进行异常处理。
5程序运行与测试
5.1对指定主机指定端口异步扫描,如图5.1所示。
图5.1异步扫描单主机单端口
5.2对指定主机指定端口围异步扫描,如图5.2所示。
图5.2异步扫描单主机多端口
5.3对指定IP指定端口围多线程批量扫描,如图5.3所示。
图5.3多线程扫描单主机多端口
5.4对指定IP围指定端口围多线程批量扫描,如图5.4所示。
图5.4多线程扫描多主机多端口
5.5对指定IP围指定端口围异步扫描,如图5.5。
图5.5异步扫描多主机多端口
6设计的结论及意义
经过不断的修改和完善程序,基本满足了一个端口扫描成宿的基本要求,实现了对单个指定的主机进行扫描或扫描指定网段的主机,实现了对特定端口进行扫描,或扫描指定的端口围的端口,以避免在不需要了解的端口号上浪费时间。
端口扫描技术是网络安全中重要的技术之一,有利于用户,特别是网管人员了解被管理主机的服务的开启情况,对网络安全有着重大意义。
7参考文献
[1]谢希仁计算机网络[M]第6版.北京:
电子工业,2013.6
[2]马骏C#网络应用编程第3版.北京:
人民邮电,2014.9
[3]建华,涛等译TCP/IP详解卷1.北京:
机械工业,2009.1
[4]梁亚声计算机网络安全教程第2版.北京:
机械工业,2010.
附录:
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
namespacePortFyz
{
publicpartialclassForm1:
Form
{
privatevolatileintN=0;//用来说明每次扫描时的索引
privatevolatileintT=0;//用来说明线程执行的次数
ManualResetEventmanualResetEvent=newManualResetEvent(false);
List
intthreadNumber=10;//创建的线程数
Thread[]thread;
AutoResetEventautoEvent=newAutoResetEvent(false);
delegatevoidAddStr(stringstr);
AddStraddstr;
#region1简单控件操作
voidAddList(stringstr)
{
listBox1.Items.Add(str);
}
publicForm1()
{
InitializeComponent();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
addstr+=AddList;
}
privatevoidbutton2_Click(objectsender,EventArgse)
{
Application.Exit();
}
privatevoidcheckBox2_CheckedChanged(objectsender,EventArgse)
{
if(checkBox2.Checked)
{
textBox3.Enabled=false;
textBox4.Enabled=false;
}
else
{
textBox3.Enabled=true;
textBox4.Enabled=true;
}
}
privatevoidcheckBox1_CheckedChanged(objectsender,EventArgse)
{
if(checkBox1.Checked)
{
textBox1.Enabled=false;
textBox2.Enabled=false;
}
else
{
textBox1.Enabled=true;
textBox2.Enabled=true;
}
}
#endregion
#region2.1多线程批量扫描privatevoidbutton1_Click(objectsender,EventArgse)
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(textBox8.Text.Trim()=="")
{
MessageBox.Show("请输入线程数");
}
else
{
threadNumber=Convert.ToInt32(textBox8.Text.Trim());
}
Initialization();
//设置进度条
progressBar1.Minimum=0;
progressBar1.Maximum=listIpe.Count;
progressBar1.Value=0;
if(listIpe.Count<=threadNumber)
{
threadNumber=listIpe.Count;
}
//开始创建线程扫描
thread=newThread[threadNumber];
for(inti=0;i { thread[i]=newThread(ThreadPort); thread[i].Priority=ThreadPriority.AboveNormal; thread[i].IsBackground=true; thread[i].Start(); } manualResetEvent.WaitOne(); } #endregion #region2.2多线程批量扫描publicvoidThreadPort() /// ///多线程批量扫描 /// publicvoidThreadPort() { IPEndPointcurrentIpe=listIpe[0]; while(true) { if(N>=listIpe.Count) { if(T>=listIpe.Count) { //注意return时,只是当前线程被销毁,其IsAlive为false,这个时候还有线程在跑 //有可能后面的没执行完就已经把结果送给textBox5了 //当所有线程执行完后,才通知textBox5的text为result manualResetEvent.Set(); return; } } else { lock(this) { currentIpe=listIpe[N]; N++; } Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.IP); try { socket.Connect(currentIpe); if(socket.Connected) { IPEndPointep=socket.LocalEndPointasIPEndPoint; stringss=ep.Address+": "+ep.Port+"连接"+currentIpe.Address+": "+currentIpe.Port+"已打开"+"\r\n"; addstr(ss); T++; } else { stringss=currentIpe.Address+": "+currentIpe.Port+"未连接成功"+"\r\n"; addstr(ss); T++; } } catch(Exceptionex) { stringss=currentIpe.Address+": "+(ex.Message.Split(': '))[1]+"未连接成功"+"\r\n"; addstr(ss); T++; } finally { socket.Close(); } } } } #endregion #region3.1异步扫描privatevoidbutton3_Click(objectsender,EventArgse) privatevoidbutton3_Click(objectsender,EventArgse) { //进行初始化 Initialization(); //设置进度条 progressBar1.Minimum=0; progressBar1.Maximum=listIpe.Count; progressBar1.Value=0; //开始创建线程扫描 Form1form=this; ListBoxlistbox=listBox1; ProgressBarprogressBar=progressBar1; thread=newThread[threadNumber]; for(inti=0;i { thread[i]=newThread(newParameterizedThreadStart(sport)); thread[i].Start(newArrayList(){listbox,progressBar,i}); } } #endregion #region3.2异步扫描的实现方法voidsport(objects) voidsport(objects) { //进行一系列对象的转化 ArrayListal=(ArrayList)s; ListBoxlistbox=(ListBox)al[0]; ProgressBarprogressBar=(ProgressBar)al[1]; intith=Convert.ToInt32(al[2]); //开始循环去进行连接 for(intiport=ith;iport { TcpClienttcpClient=newTcpClient(AddressFamily.InterNetwork); try { //异步连接 tcpClient.BeginConnect(listIpe[iport].Address,listIpe[iport].Port,AsyncPort,newArrayList(){tcpClient,iport,progressBar,listbox}); } catch(Exceptionex) { } //让当前线程等待 autoEvent.WaitOne(200); } } #endregion #region3.3异步扫描的结果处理publicvoidAsyncPort(IAsyncResultresult) /// ///异步扫描 /// publicvoidAsyncPort(IAsyncResultresult) { //进行一系列对象的转化 ArrayListarr=(ArrayList)result.AsyncS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 端口扫描 程序 设计 实现