摘要
ABSTRACT
第一章 绪论
第二章 端口扫描
2.1 端口扫描的相关知识
2.1.1 端口
网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。
按照OSI七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,
端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建
类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端
端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的
●公开端口:0--1023
●注册端口:1024--49151
●动态或私有端口:49152—65535
TCP/IP协议栈是网络扫描技术的基础,最基本的扫描方式TCP Connect()就是利用了TCP协
Ⅰ.TCP数据包结构
一个TCP数据包包括一个TCP头,后面是选项和数据。它的格式如图2-1。
图2-1 TCP报头格式
下面依次介绍TCP报文头中的每个域:
1.源端口和目的端口,各占16位,分别表示发送方和接收方的端口号。
2.发送序号和确认序号字段都是32位。其中发送序号表示数据部分第一个字节的序号,而确认序号表示该数据
3.头长度字段的值表示TCP报文头的长度。即20字节的固定长度加上可选项的长度。
4.紧接在头长度字段后有6位保留域,应该把它设置为0。
一个TCP头包含6个标志位,它们的意义分别为:
(1)SYN :SYN标志位用来建立连接,让连接双方同步序列号。
(2)FIN: FIN标志位表示发送端已经没有数据要求传输了,希望释放连接。
(3)RST :RST标志位用来复位一个连接。RST标志置位的数据包称为复位包。一般情况下,如果TC
(4)URG: URG标志位为紧急数据标志。如果它为1,表示本数据包中包含紧急数据。此时紧急数据指针
(5)ACK :ACK标志位为确认标志位。如果为1,表示包中的确认号是有效的。否则,包中的确认号无效
(6)PSH :PSH标志位如果置位,接收端应尽快把数据传送给应用层
5.窗口大小字段表示从被确认的字节开始,发送方最多可以连续发送的字节个数。接收方通过设置窗口值的大小
6.校验和域是TCP协议提供的一种检错机制。
7.可选项。可选项是用来进行一些参数协商的字段。
Ⅱ.TCP/IP遵循的原则
1.当一个SYN或者FIN数据包到达一个关闭的端口,TCP丢弃数据包,同时发送一个RST数据包。
2.当一个RST数据包到达一个监听端口,RST被丢弃。
3.当一个RST数据包到达一个关闭的端口,RST被丢弃。
4.当一个不包含ACK的数据包到达一个监听端口时,数据包被丢弃,同时发送一个RST数据包。
5.当一个SYN关闭的数据包到达一个监听端口时,数据包被丢弃。
6.当一个SYN数据包到达一个监听端口时,正常的三次握手继续,回答一个SYN|ACK数据包。
7.当一个FIN数据包到达一个监听端口时,数据包被丢弃。“FIN行为”(关闭的端口返回RST,监听端
Ⅲ.TCP三次握手过程如图2-2
图2-2TCP三次握手的过程
(1)主机A向B发送一个SYN=1的TCP连接请求数据报,同时为该数据
报生成一个序号SEQ,放在数据报头中一起发送出去。
(2)主机B若接收本次连接请求,则返回一个确认加同步的数据包SYN&ACK(SEQ=Y,ACK=X+
(3)最后,主机A再向主机B发送第二个数据包,同时对从主机B发来的数据包进行确认。
2.1.3 扫描的定义
扫描程序(Scanner)是自动检测远端主机或者本地主机安全脆弱性的程序。通过使用扫描程序一个用户可
●当前主机正在进行什么服务?
●哪些用户拥有这些服务?
●是否支持匿名登录?
●是否有某些网络服务需要鉴别?
2.2 端口扫描原理
端口扫描(port scanning)是通过连接到目标系统的TCP协议或UDP协议端口,来确定什么服
●判断目标主机是否存在或开机
●寻找开放的端口/服务
●当前目标主机所使用的操作系统类别
●寻找目标主机所提供服务的漏洞
前三种扫描一般是借助于TCP/IP协议的缺陷来完成的,而对服务中漏洞的扫描,由于涉及到不同的服务和不
“端口扫描”通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标
2.3 常用的端口扫描技术
2.3.1 TCP Connect() 扫描
TCP connect()扫描:这是对TCP的最基本形式的侦测。在该操作下,该connect()对目
2.3.2 TCP SYN扫描
TCP SYN扫描:这类技术通常涉及一种“半开”式的扫描——因为你不打开完整的TCP连接。 在这种技
2.3.3 FIN、Null扫描模式
为了增强隐蔽性采用关闭的端口会对你发送的探测信息包返回一个RST,而打开的端口则对其忽略不理。所以F
2.3.4 UDP扫描
这一方法是用来确定哪个UDP端口在主机端开放。这一技术是以发送零字节的UDP信息包到目标机器的各个端
第三章 涉及的相关技术
3.1多线程技术
(2)使用线程的好处有以下几点:
●使用线程可以把占据长时间的程序中的任务放到
●用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处
●程序的运行速度可能加快
●在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以
(3)多线程块模型
多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里
(4)多线程的缺点
●通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享
3.2 网络套接字编程
(1)套接字基本概念
{协议,本地地址,本地端口,远程地址,远程端口}
流套接字是一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制
数据报套接字是无连接的,它支持双向的数据传输,具有开销小、数据传输效率高的特点,但不保证数据传输的可
此外,还有一种较少使用的套接字叫原始套接字(SOCK_RAW),可以使用它对底层协议如IP或ICMP
(2)Winsock编程原理
Winsock是Microsoft Windows平台上使用套接字的设施。它实际上是一组可供应用程序
Winsock 2提供了一组编写网络应用程序的基本API函数,诸如创建套接字、地址绑定、侦听连接请求
Winsock 2所用的API函数代码的实体包含在动态链接库ws2_32.dll中。Winsock
Windows套接字程序执行API 函数I/O操作时有阻塞和非阻塞两种模式。在阻塞模式下,执行I/O
一般,网络应用程序在阻塞模式下使用Winsock 2的API库函数进行流套接字和数据报套接字编程的过
第四章 系统的分析设计
4.1 系统需求分析
根据前面的介绍,本课题要实现TCP端口扫描系统,要涉及到以下几个方面的内容:
首先是输入局域网内某台主机或自身的IP地址。
然后是选择扫描一个端口还是选择扫描对个端口。
其次是输入要开启的进程数(在1~1000之间).
最后是开始扫描将最后结果显示出来即那些TCP端口是打开的。
为了完成上述内容,本课题主要使用使用VC++ 6.0来开发这个程序。
4.2 系统的功能概述
4.2.1程序设计流程
本程序是设计一个TCP端口扫描器,为了提高扫描的速率,所以采用多线程扫描,故要设定开启的线程数,为
图4-1TCP端口扫描程序设计流程
4.2.2界面的设计
因为是对局域网内某台主机进行扫描,故输入被扫描主机的IP,因为有的时候只需要知道某个端口是否开放为了
图4-2 界面设计流程
最后根据界面流程图设计好的界面如下图4-3所示:
图4-3 TCP端口扫描界面
第五章 扫描工具的具体实现
5.1 端口扫描木块的设计与实现
5.1.1 TCP connect()扫描的实现
TCP connect()扫描是最基本端口扫描方式,它的探测过程与数据的正常传输过程一致,实现起来比
1.建立流套接字:sd=socket(AF_INET,SOCK_STREAM,0),其中AF_INE
2.向目标主机发出连接请求:connect(sd,dest_sock,sock_len),其中des
3.根据结果,更新端口状态记录列表。执行上述三个步骤后就完成了对一个端口的一次全连接扫描。
具体如下:
struct thread *threada=(struct thread*)pParam;
//在内部重新打开互斥量
HANDLE hCounterIn=OpenMutex(MUTEX_ALL_ACCESS,FALS
WaitForSingleObject(hCounterIn,INFINITE);
UINT v=m_nCounter;
m_nCounter++;
ReleaseMutex(hCounterIn);
CloseHandle(hCounterIn);
struct sockaddr_in sin;
SOCKET sd;
int IpPort;
char IpAddr[16];
strcpy(IpAddr,threada->ip);
IpPort=v;
// Create the local socket
if ((sd = socket (AF_INET, SOCK_STREAM, IPPROTO_I
{
printf("Create socket error!");
return 1;
}
// Connect to the victim IP Address
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr(IpAddr);
sin.sin_port=htons((short)IpPort);
if (connect (sd, (struct sockaddr *)&sin, sizeof
{
printf("Connect the remote IP error!");
closesocket (sd);
return 1;
}
else
{
::PostMessage(threada->m_hwnd,WM_USER_PRINT_STAR
}
closesocket (sd);
return 0;
}
LRESULT CPortScanDlg::OnPrintStart(WPARAM wParam,L
{
int port=(int)wParam;
char temp[10];
memset(temp,0,10);
itoa(port,temp,10);
m_listInfo.InsertItem(listCounter,m_sIP,0);
m_listInfo.SetItemText(listCounter,1,temp);
listCounter++;
return 0;
}
5.1.2多线程扫描的实现
本程序为了提高应用程序整体的处理速度使用了多线程技术,下面是有关多线程的核心代码:
(1)、取得开启线程数,程序预设一个选择范围(1~100),可以选择此范围内的任意一个整数,如果超出
char strThreadNumber[10];
m_threadNumber.GetWindowText(strThreadNumber,10);
m_nThreadNumber=atoi(strThreadNumber);
if(m_nThreadNumber>1000)
{
AfxMessageBox("最大线程数不能超过1000");
return;
}
m_buttonStart.EnableWindow(FALSE);
m_buttonStop.EnableWindow(TRUE);
(2)、当设置一个开启的线程数后,应用程序会批量创建相应的线程次数。
if(m_nPortFrom==m_nPortTo)
{
v=1;
}
else
{
v=(m_nPortTo-m_nPortFrom+1)/m_nThreadNumber;
if((m_nPortTo-m_nPortFrom+1)%m_nThreadNumber > 0
{
v++;
}
}
m_thread.m_hwnd=this->m_hWnd;
m_thread.ip=m_sIP;
m_nCounter=m_nPortFrom;
AfxBeginThread((AFX_THREADPROC)threadM,NULL);
}
(3)、一个独立线程,主要是处理循环,与窗体脱离,提高窗体的反应能力。用互斥量对象实行线程同步。
UINT threadM(LPVOID pParam)
{
CPortScanDlg *dlg=(CPortScanDlg*)AfxGetApp()->Get
/*********创建互斥量************/
HANDLE hCounter=NULL;
if( (hCounter=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"s
{
//如果没有其他进程创建这个互斥量,则重新创建
hCounter = CreateMutex(NULL,FALSE,"sam sp 44");
}
CWinThread *pT[1001];
HANDLE hThread[1001];
for(int i=0;i
{
int nThreadCounter=0; //每次批量创建的线程实际个数,最后一次是一个
int k;
for(k=0;k
{
if(m_nCounter>m_nPortTo)
{
break;
}
//设置扫描进度提示
char temp[10];
memset(temp,0,10);
itoa(m_nCounter,temp,10);
CString strTemp=(CString)temp;
dlg->m_prompt.SetWindowText("端口:"+strTemp)
//内循环计数
nThreadCounter++;
dlg->m_progressScan.StepIt();
pT[k]=AfxBeginThread((AFX_THREADPROC)threadA,&m_
hThread[k]=pT[k]->m_hThread;
Sleep(5);
}
hThread[k]=NULL; //非常重要,如果不加这一句的话,会经常出错,//如果
if(k!=0)
{
//WaitForMultipleObjects(nThreadCounter,hThread
WaitForMultipleObjects(nThreadCounter,hThread,T
}
}
CloseHandle(hCounter);
//设置提示
dlg->m_buttonStart.EnableWindow(TRUE);
dlg->m_buttonStop.EnableWindow(FALSE);
dlg->m_prompt.SetWindowText(_T(""));
dlg->m_progressScan.SetPos(0);
AfxEndThread(0);
return 0;
}
5.2其他组成模块的实现
5.2.1 对单独的某个端口进行扫
当输入局域网内你需要查询的主机IP后选择扫描一个端口然后输入需要查询是否打开的那个端口号进行查询,获
if(m_bIsSinglePort==TRUE)
{
CString strPort;
m_singlePort.GetWindowText(strPort);
m_nPortFrom=m_nPortTo=atoi(strPort);
}
5.2.2 对某段端口进行扫描
当输入局域网内你需要查询的主机IP后选择扫描多个端口,然后输入需要查询是否打开的那段端口号得范围然后
CString strPort;
m_portFrom.GetWindowText(strPort);
m_nPortFrom=atoi(strPort);
m_portTo.GetWindowText(strPort);
m_nPortTo=atoi(strPort);
}
if(m_nPortFrom>m_nPortTo)
{
MessageBox("开始端口要小于结束端口",_T("错误"),MB_ICONWARNING
return;
}
5.3系统评测结果
实验环境是运行扫描软件的主机和被测主机在同一局域网内。硬件配置都是Intel(R)Core(TM)2
首先查询下本机开启了那些TCP端口如图5-1:
图5-1 本机开启的TCP端口
然后运行本程序输入本机的IP地址:10.10.219.17,线程开启选择200。
(1)、选择扫描一个端口,输入要查询的端口号33673,测试结果如图5-2:
图5-2 扫描一个固定的端口
(2)、选择扫描多个端口,输入要查询的端口范围(1~5000),测试结果如图5-3:
图5-3 扫描一段范围的端口
扫描局域网内一台存活主机10.10.219.13。同样查询1~5000号端口扫描结果如图5-4:
图5-4 扫描局域网内一台主机的1~5000端口的
查询主机打开的TCP端口如图5-5:
图5-5 查询被扫描主机开启的TCP端口
通过以上对本机和对局域网内的存活主机扫描的数据,我们可以发现该扫描工具能够准确的扫描出被扫描机器所打
结束语
经过一个多月的设计和开发,端口扫描系统开发完毕。系统基本符合要求。
在整个设计过程中,出现过很多的问题,得到了老师和同学的帮助,在不断学习的过程中我体会到:
1、做事是一个不断学习的过程,从设计初的模糊认识到最后能够顺利完成,我体会到在实践中学习的重要性。
2、由于开始时对系统缺乏整体认识,不具备软件开发思想,对系统的功能需求分析的要求认识不够清楚,使得后
3、在设计过程中,遇到很多困难,我学会通过别人的代码理解语言的含义但这并不是抄袭,然后根据自己的设计
4、设计过程中,由于要实现某些功能,网上资源解决了我的问题。多借鉴网络资源也是学好软件编程一个不错的
总之,通过这次设计,我深刻体会到要做好一个完整的事情,需要有系统的思维方式和方法,对待一个新的问题,
致谢
此次毕业设计,是我在大学期间做过的较大,较完善的项目之一。在此,我要感谢我的指导老师李频。
首先,要感谢李频老师出给我的题目内容,本次毕业设计的题目内容与我的专业非常贴切,同时又很有挑战性,涉
在此还要感谢信息安全系的所有老师,他们教的前续课程成为我这次毕业设计的理论基础。没有他们,这次毕业设
最后,还要感谢南邮,正是在南邮的四年大学学习和生活,教会我在计算机方面的很多基础知识以及在信息安全方
参考文献
[1]谢希仁. 计算机网络 大连理工大学出版社,2000
[3]李瑞民. 网络端口扫描技术的研究与实现中国人民解放军信息工程大学硕士论文 2002
[4]张玉清. 安全扫描技术 清华大学出版社,2004
[5]W.Richard Stevens. TCP/IP详解卷1:协议 机械工业出版社,2000
[6]张平,蒋凡. 一种改进的网络安全扫描工具 计算机工程,2001
[7]阎雪. 黑客就这么几招 万方数据电子出版社,2000
[8]石淑华. 计算机网络安全基础 人民邮电出版社,2005
[9]陈刚. TCP/IP协议簇弱点分析 计算机网络攻击技术研讨会论文集,2000
[10]杨守君. 黑客技术与网络安全北京中国对外翻译出版公司,2000
[11]陈坚,陈伟. Visual C++网络高级编程 人民邮电出版社,2001
[12]张义荣等.计算机网络扫描技术研究[J] 计算机工程与应用,2004
[25]He Longtao,Fang Binxing,Hu Mingzeng. The study