网络安全程序设计结课论文端口扫描程序设计目录第一章序言 (3)第二章系统设计 (5)2.1 运行环境及语言 (5)2.2系统功能 (6)2.3程序运行流程图 (6)2.4 程序设计过程 (6)2.41创建工程 (6)2.42 主机端口扫描程序设计流程 (8)2.43主要代码 (9)2.5运行结果测试 (15)第三章总结及心得 (16)3.1 总结 (16)3.2 心得体会 (16)第四章参考文献 (16)第一章序言1.1 背景Internet快速的发展,为我们带来了方便同时也带给了我们信息安全担忧。
在计算机信息安全管理中可以通过端口扫描收集系统的信息来自动监测远程或本地主机安全性弱点的程序,可以发现远程服务器的各种tcp端口的分配及提供的服务与他们的软件版本。
从而让管理员间接的或直观的了解到远程主机所存在的安全问题。
从而端口扫描技术得到人们的重视。
1.2目的该文章对端口扫描技术的原理和应用进行了阐述,并设计了一个简单的基于windows平台上的端口扫描系统。
此程序主要完成了TCP connect()扫描和UDP扫描功能。
TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网段的主机进行逐个扫描。
能扫描特定的部分端口号或对指定的端口段的端口进行逐个扫描。
此端口扫描程序能快速地进行TCP扫描,准确地检测出对TCP协议开放的端口。
而对于UDP扫描只支持单线程,速度较慢。
扫描结果以列表的形式直观地展现出来。
1.3端口扫描概述网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。
网络安全探测的所有功能都是建立在端口扫描的基础上,所以对端口扫描技术的研究有着非常重要的现实意义。
每一个网络主机都相当于一个“房间”,黑客能否进入“房间”,取决于是否发现了打开的“门窗”。
也就是说,能否入侵网络主机,或者网络主机是否安全,关键在于能否查出网络主机的系统信息。
而端口是主机与外界通讯交流的数据出入口,即是“门窗”。
端口分为硬件端口和软件端口,所谓硬件端口又称为接口,包括:USB 端口、串行端口、并行端口等。
软件端口一般指网络中面向连接服务(TCP)和无连接服务(UDP)的通讯协议的端口。
一个端口就是一个潜在的通信通道,也就是一个入侵通道。
对目标计算机进行端口扫描,能得到许多有用的信息。
通过端口扫描,发现系统的安全漏洞。
它使系统用户了解系统目前向外界提供了哪些服务,从而为系统用户管理网络提供了一种手段1.4端口扫描的原理端口有两种,UDP端口和TCP端口。
由于UDP端口是面向无连接的,从原理的角度来看,没有被扫描的可能,或者说不存在一种迅速而又通用的扫描算法;而TCP端口具有连接定向(Connection Oriented)的特性(即是有面向连接的协议),为端口的扫描提供了基础。
TCP建立连接时有三次握手:首先,Client端往Server某一端口发送请求连接的SYN包,如果Server的这一端口允许连接,就会给Client端发一个ACK回包,Client端收到Server的ACK包后再给Server端发一个ACK包,TCP连接正式建立,这就是连接成功的过程。
当Client端往Server某一端口发送请求连接的SYN包,此时若Server的这一端口不允许连接,就会给Client端发一个RST 回包,Client端收到Server的RST包后再给Server端发一个RST 包,这就是连接失败的过程。
基于连接的建立过程,可以想到,假如要扫描某一个TCP端口,可以往该端口发一个SYN包,如果该端口处于打开状态,我们就可以收到一个ACK,也就是说,如果收到ACK,就可以判断目标端口处于打开状态,否则,目标端口处于关闭状态。
这就是TCP端口扫描的基本原理第二章系统设计2.1 运行环境及语言运行环境:Visual C++ 6.0语言:c++2.2系统功能简易的TCP connect()扫描,支持多线程; UDP 扫描功能; 能对单个指定的主机进行扫描或扫描指定网段的主机;能扫描特定的部分端口号或对指定的端口段的端口进行逐个扫描。
2.3程序运行流程图2.4 程序设计过程2.41创建工程使用VC++的应用程序生成向导(MFC AppWizard[exe])创建一个基于对话框的工程,该工程的名称0fandi ,如图 所示:否单击确定,然后选择基本对话框,如图所示点击下一步,再在Windows Sockets[W]前打上勾,支持Winsock编程,如图接下来一直选择默认直到完成。
2.42 主机端口扫描程序设计流程1.设计对话框2按Ctrl+W打开类向导,添加变量如图2.43主要代码1.在头文件findport100114019Dlg.h里添加private:SOCKET Socket;2. findport100114019Dlg.cpp文件中添加如下文件包含信息:#pragma comment (lib,"ws2_32.lib") // 静态库#include <winsock.h>3..编写Tcpscan按钮下的代码如下:UpdateData(true); //MFC窗口函数,用来刷新数据WSADATA WSAData;CString str;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){MessageBox("初始化Winsock失败!");return;}Socket=socket(AF_INET,SOCK_STREAM,0); //创建连接套接字if(Socket==INVALID_SOCKET){MessageBox("创建Socket失败!");WSACleanup();return;}int IpAddress; //判断域名或IP地址int i=0;CString r;m_ip.GetWindowText(r);IpAddress=inet_addr(r);if(IpAddress==INADDR_NONE){hostent* pHostent=gethostbyname(str);if(pHostent)IpAddress=(*(in_addr*)pHostent->h_addr).s_addr;}if (m_port1>m_port2){MessageBox("请确保起始Port不大于终止port");WSACleanup();return;}struct sockaddr_in desthost; //定义套接字地址memset(& desthost,0,sizeof(desthost));desthost.sin_family=AF_INET;//desthost.sin_port=htons(atoi(m_Port));desthost.sin_addr.s_addr=IpAddress;for(unsigned int a =m_port1;a<=m_port2;a++){desthost.sin_port=htons(a);char *SendBuf;SendBuf=new char[2];memset(SendBuf,0,2);int nConnect=connect(Socket,(sockaddr*)&desthost,sizeof(desthost)); if(nConnect==SOCKET_ERROR){str.Format("%d",a);m_status+="TCP Port";m_status+=str;m_status+=": Close\r\n";}else{str.Format("%d",a);m_status+="TCP Port";m_status+=str;m_status+=": open\r\n";}}UpdateData(false);closesocket(Socket);WSACleanup(); //释放套接字绑定4.编写Udpscan按钮下的代码如下:UpdateData(true); //MFC窗口函数,用来刷新数据WSADATA WSAData;CString str;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){MessageBox("初始化Winsock失败!");return;}Socket=socket(AF_INET,SOCK_DGRAM,0); //创建连接套接字if(Socket==INVALID_SOCKET){MessageBox("创建Socket失败!");WSACleanup();return;}int nIotrl;unsigned long flag=1;nIotrl=ioctlsocket(Socket,FIONBIO,&flag);if(nIotrl==SOCKET_ERROR){MessageBox("设置socket模式失败!");closesocket(Socket);WSACleanup();return;}int IpAddress;int i=0;CString r;m_ip.GetWindowText(r);IpAddress=inet_addr(r);if(IpAddress==INADDR_NONE){hostent* pHostent=gethostbyname(str);if(pHostent)IpAddress=(*(in_addr*)pHostent->h_addr).s_addr;}/*if (m_port1>m_port2){MessageBox("请确保起始Port不大于终止port");WSACleanup();return;}*/struct sockaddr_in desthost; //定义套接字地址memset(&desthost,0,sizeof(desthost));desthost.sin_family=AF_INET;//desthost.sin_port=htons(atoi(m_Port));desthost.sin_addr.s_addr=IpAddress;for(unsigned int a =m_port1;a<=m_port2;a++){desthost.sin_port=htons(a);char *SendBuf;SendBuf=new char[2];memset(SendBuf,0,2);int nSend=sendto(Socket,SendBuf,1,0,( struct sockaddr*)&desthost,sizeof(desthost));if(nSend==SOCKET_ERROR){MessageBox("UDP包发送失败!");closesocket(Socket);WSACleanup();return;}Sleep(500);sockaddr_in SourceHost;int SourceSize;SourceSize=sizeof(SourceHost);memset(&SourceHost,0,SourceSize);char *RecvBuf;RecvBuf=new char[2];memset(RecvBuf,0,2);int nRecv;nRecv=recvfrom(Socket,RecvBuf,1,0,(structsockaddr*)&SourceHost,&SourceSize);if(nRecv==SOCKET_ERROR){int ErrorCode=GetLastError();if(ErrorCode==10054){str.Format("%d",a);m_status+="UDP Port";m_status+=str;m_status+=": Close\r\n";}if(ErrorCode==10035){str.Format("%d",a);m_status+="UDP Port";m_status+=str;m_status+=": open\r\n";}}else{m_status+="UDP Port";m_status+=a;m_status+=": open\r\n";}}UpdateData(false);closesocket(Socket);WSACleanup(); //释放套接字绑定2.5运行结果测试如图:第三章总结及心得3.1 总结端口扫描是综合扫描器最基础的功能,也是黑客攻击的基本步骤,因此,掌握端口扫描的常用技术和防措施对维护系统安全有重要作用。