端口扫描程序设计.docx
《端口扫描程序设计.docx》由会员分享,可在线阅读,更多相关《端口扫描程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
端口扫描程序设计
网络安全程序设计结课论文
端口扫描程序设计
第一章序言
1.1背景
Internet快速的开展,为我们带来了方便同时也带给了我们信息安全担忧。
在计算机信息安全管理中可以通过端口扫描收集系统的信息来自动监测远程或本地主机安全性弱点的程序,可以发现远程服务器的各种tcp端口的分配与提供的服务与他们的软件版本。
从而让管理员间接的或直观的了解到远程主机所存在的安全问题。
从而端口扫描技术得到人们的重视。
该文章对端口扫描技术的原理和应用进展了阐述,并设计了一个简单的基于windows平台上的端口扫描系统。
此程序主要完成了TCP connect()扫描和UDP扫描功能。
TCP扫描支持多线程,能对单个指定的主机进展扫描或对指定网段内的主机进展逐个扫描。
能扫描特定的局部端口号或对指定的端口段内的端口进展逐个扫描。
此端口扫描程序能快速地进展TCP扫描,准确地检测出对TCP协议开放的端口。
而对于UDP扫描只支持单线程,速度较慢。
扫描结果以列表的形式直观地展现出来。
网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。
网络安全探测的所有功能都是建立在端口扫描的根底上,所以对端口扫描技术的研究有着非常重要的现实意义。
每一个网络主机都相当于一个“房间〞,黑客能否进入“房间〞,取决于是否发现了打开的“门窗〞。
也就是说,能否入侵网络主机,或者网络主机是否安全,关键在于能否查出网络主机的系统信息。
而端口是主机与外界通讯交流的数据出入口,即是“门窗〞。
端口分为硬件端口和软件端口,所谓硬件端口又称为接口,包括:
USB端口、串行端口、并行端口等。
软件端口一般指网络中面向连接服务(TCP)和无连接服务(UDP)的通讯协议的端口。
一个端口就是一个潜在的通信通道,也就是一个入侵通道。
对目标计算机进展端口扫描,能得到许多有用的信息。
通过端口扫描,发现系统的安全漏洞。
它使系统用户了解系统目前向外界提供了哪些服务,从而为系统用户管理网络提供了一种手段
端口有两种,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++
语言:
c++
简易的TCP connect()扫描,支持多线程; UDP扫描功能;
能对单个指定的主机进展扫描或扫描指定网段内的主机;
能扫描特定的局部端口号或对指定的端口段内的端口进展逐个扫描。
2.4程序设计过程
创建工程
使用VC++的应用程序生成向导〔MFCAppWizard[exe]〕创建一个基于对话框的工程,该工程的名称201200824420fandi,如图所示:
单击确定,然后选择根本对话框,如下列图
点击下一步,再在WindowsSockets[W]前打上勾,支持Winsock编程,如图
接下来一直选择默认直到完成。
2.42主机端口扫描程序设计流程
1.设计对话框
2按Ctrl+W打开类向导,添加变量如图
private:
SOCKETSocket;
2.findport100114019Dlg.cpp文件中添加如下文件包含信息:
#pragmament(lib,"ws2_32.lib")//静态库
#include
3..编写Tcpscan按钮下的代码如下:
UpdateData(true);//MFC窗口函数,用来刷新数据
WSADATAWSAData;
CStringstr;
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;
}
intIpAddress;//判断域名或IP地址
inti=0;
CStringr;
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;
}
structsockaddr_indesthost;//定义套接字地址
memset(&desthost,0,sizeof(desthost));
desthost.sin_family=AF_INET;
//desthost.sin_port=htons(atoi(m_Port));
desthost.sin_addr.s_addr=IpAddress;
for(unsignedinta=m_port1;a<=m_port2;a++)
{
desthost.sin_port=htons(a);
char*SendBuf;
SendBuf=newchar[2];
memset(SendBuf,0,2);
intnConnect=connect(Socket,(sockaddr*)&desthost,sizeof(desthost));
if(nConnect==SOCKET_ERROR)
{
str.Format("%d",a);
m_status+="TCPPort";
m_status+=str;
m_status+=":
Close\r\n";
}
else
{
str.Format("%d",a);
m_status+="TCPPort";
m_status+=str;
m_status+=":
open\r\n";
}
}
UpdateData(false);
closesocket(Socket);
WSACleanup();//释放套接字绑定
4.编写Udpscan按钮下的代码如下:
UpdateData(true);//MFC窗口函数,用来刷新数据
WSADATAWSAData;
CStringstr;
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;
}
intnIotrl;
unsignedlongflag=1;
nIotrl=ioctlsocket(Socket,FIONBIO,&flag);
if(nIotrl==SOCKET_ERROR)
{
MessageBox("设置socket模式失败!
");
closesocket(Socket);
WSACleanup();
return;
}
intIpAddress;
inti=0;
CStringr;
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;
}*/
structsockaddr_indesthost;//定义套接字地址
memset(&desthost,0,sizeof(desthost));
desthost.sin_family=AF_INET;
//desthost.sin_port=htons(atoi(m_Port));
desthost.sin_addr.s_addr=IpAddress;
for(unsignedinta=m_port1;a<=m_port2;a++)
{
desthost.sin_port=htons(a);
char*SendBuf;
SendBuf=newchar[2];
memset(SendBuf,0,2);
intnSend=sendto(Socket,SendBuf,1,0,(structsockaddr*)&desthost,sizeof(desthost));
if(nSend==SOCKET_ERROR)
{
MessageBox("UDP包发送失败!
");
closesocket(Socket);
WSACleanup();
return;
}
Sleep(500);
sockaddr_inSourceHost;
intSourceSize;
SourceSize=sizeof(SourceHost);
memset(&SourceHost,0,SourceSize);
char*RecvBuf;
RecvBuf=newchar[2];
memset(RecvBuf,0,2);
intnRecv;
nRecv=recvfrom(Socket,RecvBuf,1,0,(structsockaddr*)&SourceHost,&SourceSize);
if(nRecv==SOCKET_ERROR)
{
intErrorCode=GetLastError();
if(ErrorCode==10054)
{
str.Format("%d",a);
m_status+="UDPPort";
m_status+=str;
m_status+=":
Close\r\n";
}
if(ErrorCode==10035)
{
str.Format("%d",a);
m_status+="UDPPort";
m_status+=str;
m_status+=":
open\r\n";
}
}
else
{
m_status+="UDPPort";
m_status+=a;
m_status+=":
open\r\n";
}
}
UpdateData(false);
closesocket(Socket);
WSACleanup();//释放套接字绑定
如图:
第三章总结与心得
3.1总结
端口扫描是综合扫描器最根底的功能,也是黑客攻击的根本步骤,因此,掌握端口扫描的常用技术和防X措施对维护系统安全有重要作用。
端口扫描不仅可以得知系统哪些端口开 放,还可以根据系统的响应信息得知目标系统的相关信息。
由于不同系统网络协议栈的实现 细节有差异,对不同的系统得到的扫描结果可能不同,这在秘密扫描中表现的较为明显。
对端口扫描的预防多由防火墙完成,因此掌握防火墙的原理对于维护系统安全很有帮助。
3.2心得体会
通过这个程序的设计,我意识到了自己的不足之处:
对端口扫描的原理不清楚,对程序设计的流程图考虑不全面。
最后在教师和同学们的帮助下最终完成了这个程序
第四章参考文献
[1] 肖微.《端口扫描技术的原理与应用》.网络安全技术与应用.2006.10.
[2]