基于WinPcap的网络嗅探器设计_第1页
基于WinPcap的网络嗅探器设计_第2页
基于WinPcap的网络嗅探器设计_第3页
基于WinPcap的网络嗅探器设计_第4页
基于WinPcap的网络嗅探器设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 结课论文 题目名称:端口扫描程序的设计和实现 院系名称:计算机学院班 级:网络124学 号:6学生姓名:张继杰 授课教师:孙飞显 2014 年 12月15目录1引言31.1课题的背景及意义31.2端口扫描现状32系统设计32.1系统主要目标32.2开发环境及工具42.3功能模块与系统结构43系统功能程序设计53.1、TCP端口扫描的工作原理:53.2 TCP端口扫描的关键问题:53.3TCP端口扫描程序代码分析64 设计步骤与实现74.1使用vc+6.0创建一个工程74.2 设计程序对话框104.3在的初始化对话框函数OnInitDialog()中添加列表控件的初始化:114.4TCP co

2、nnect() 扫描134.4UDP扫描:144.41UDP相关代码截图:155运行结果16结 论18参考文献18摘 要计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。本程序是在Windows系统中使用C语言用MFC完成的一个端口扫描程序。此程序主要完成了TCP connect()扫描和UDP扫描功能。TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网段内的主机进行逐个扫描。能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描。此端口扫描程序能快速地进行TCP

3、扫描,准确地检测出对TCP协议开放的端口。而对于UDP扫描只支持单线程,速度较慢。扫描结果以列表的形式直观地展现出来。关键词:端口扫描、TCP、UDP扫描1 引言1.1 课题的背景及意义网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却是大门紧闭的。入侵者们是如何找到,并打开它们的城门呢?这些城门究竟通向何处?在网络中,把这些城堡的“城门”称之为计算机的“端口”。端口扫描是入侵者搜索信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。一般说来,扫描端口有以下目的:判断目标主机上开放了哪些服务判断目标主机的操作系统如果入侵者掌握了目标主机开放了哪些服务,运行

4、何种操作系统,他们就能使用相应的手段实现入侵。而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有效的安全措施,防范相应的入侵。1.2 端口扫描现状计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。2 系统设计2.1

5、系统主要目标本程序主要实现了:简易的TCP connect()扫描,支持多线程;UDP扫描功能;能对单个指定的主机进行扫描或扫描指定网段内的主机;能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描;2.2 开发环境及工具测试平台:Windows XP Professional使用软件:Visual C+ 6.0开发语言:C语言2.3 功能模块与系统结构作为端口扫描程序,首先需要完成的功能就是对于系统操作系统的服务端口进行扫描,返回扫描结果。对于端口的扫描,包括对于本机系统服务端口,局域网内目标机系统,以及远程IP的系统服务端口进行扫描。有些时候,用户并不需要去扫描整个系统的所有端口,因

6、为这样的话不仅会浪费大量的时间,而且可能导致难以找到自己需要了解的端口的扫描结果。所以,对于选择性地对端口进行扫描也非常重要。这当然也是扫描程序需要实现的功能之一。用户在等待扫描的时候,往往希望知道它的工作进度。这样用户可以更好地控制自己的操作。站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如上叙述需求,从简列举如下:扫描功能;地址选择功能;端口选择功能;端口扫描程序功能模块如下图所示:端口扫描系统操作显示设置地址设置端口设置协议开始扫描进度显示结果显示3 系统功能程序设计本程序主要实现了简易的TC

7、P connect()扫描和UDP扫描功能,对TCP扫描支持多线程扫描,UDP扫描仅支持单线程。3.1、TCP端口扫描的工作原理:TCP服务的网络应用,可以实现顺序、无差错的数据流传输,在通信过程中首先需要建立连接。端口扫描程序所在的主机是客户机;被扫描的目的主机是服务器。Error! Reference source not found.给出了TCP连接的建立过程。假设客户机向服务器发送SYN=1、ACK=0的TCP包,表示客户机请求与服务器建立连接;客户机向服务器返回SYN=1、ACK=1的TCP包,表示服务器同意与客户机建立连接;客户机再向服务器发送SYN=0、ACK=1的TCP包,表示

8、客户机确认与服务器建立连接(即三次握手的过程)。图1 TCP建立连接的过程3.2 TCP端口扫描的关键问题:TCP端口扫描采用的是Connect扫描,通过Connect系统调用尝试连接目的主机的端口。如果这次TCP连接成功建立,说明该端口处于开启状态;否则,说明该端口处于关闭状态。Connect扫描的最大优点是原理简单,不需要具有管理员或超级用户权限。首先,端口扫描程序调用socket()函数建立套接字,SOCK_STREAM表示流式套接字;其次,调用connect()函数请求与目的主机的指定端口建立连接;最后,根据TCP连接是否成功建立,判断目的主机中的端口状态。TCP端口扫描流程TCP端口

9、扫描的流程如Error! Reference source not found.所示。图2Error! Reference source not found.给出了TCP端口扫描程序流程图。第1步,客户机程序会初始化用户界面;第2步,客户机建立Winsock库绑定关系,并且创建流式或数据报套接字;第3步,客户机请求与目的主机的端口建立连接;第4步,客户机根据连接建立情况判断端口状态;第5步,客户机可能需要断开已经建立的连接;第6步,客户机释放流式或数据报套接字,并且解除|Winsock库绑定关系。3.3TCP端口扫描程序代码分析下面给出的是TCP端口扫描的代码:/建立与Winsock库的绑定W

10、SAStartup(MAKEWORD(2,2),&WSAData);/创建流式套接字Socket=socket(AF_INET,SdOCK_STREAM,0);/判断IP地址或主机名If(m_Address为IP地址)hostent* pHostent=gethostbyname(m_Address);/填充目的主机的套接字地址sockaddr_in DestHost;DestHost.sin_port=htons(m_Port);DestHost.sin_addr.s_addr=m_Address;/向目的主机请求建立连接connect(Socket,(sockaddr*)&serverad

11、dr,sizeof(serveraddr);If(TCP连接建立) 目的主机的端口开启 断开TCP连接else 目的主机的端口关闭/释放流式套接字closesocket(Socket);/解除Winsock库的绑定WSACleanup();4 设计步骤与实现4.1使用vc+6.0创建一个工程打开Microsoft Visual C+6.0编程软件,在新建的向导界面中选择(MFC AppWizardexe)创建一个基于对话框的工程,该工程的名称为6,如Error! Reference source not found.所示:图3 创建工程单击“下一步”按钮, 然后选择基于对话框的方式创建应用程序

12、,如Error! Reference source not found.所示。图4 创建工程6的步骤1勾选“Windows Sockets”复选框,如Error! Reference source not found.所示。图5 创建工程6的步骤2图6 创建工程6的步骤3图7 创建工程6的步骤44.2 设计程序对话框增添控件,如Error! Reference source not found.所示。图8 添加对话框控件在头文件中添加私有成员变量:SOCKET Socket;在MFC ClassWizard中的Member Variables中为控件添加变量,如Error! Reference

13、 source not found.所示。图9 为控件创建变量4.3在的初始化对话框函数OnInitDialog()中添加列表控件的初始化:BOOL CMy6Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);

14、pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereLONG lS

15、tyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);/获取当前窗口stylelStyle &= LVS_TYPEMASK; /清除显示方式位lStyle |= LVS_REPORT; /设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);/设置styleDWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;/选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |

16、= LVS_EX_GRIDLINES;/网格线(只适用与report风格的listctrl)m_list.SetExtendedStyle(dwStyle); /设置扩展风格CRect rc;m_list.GetClientRect(rc);int width=rc.Width()/3;m_list.InsertColumn(0,主机地址,LVCFMT_CENTER,width);m_list.InsertColumn(1,端口号,LVCFMT_CENTER,width);m_list.InsertColumn(2,端口状态,LVCFMT_CENTER,width);return TRUE;

17、/ return TRUE unless you set the focus to a control4.4TCP connect() 扫描这是最基本的TCP扫描。操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞I

18、/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。基本原理:调用connect()函数,根据返回值来判断端口是否打开的,connect()函数返回0说明建立连接成功,说明该端口是打开的,就将该端口保存进静态字符串变量中,然后关闭连接,则线程数减一。RunThreadNum是用来控制最大线程数量的。在资源列表中选择对话框,双击按钮TCP,创建响应函数OnTcps(),在函数中添加代码:void CMy6Dlg:OnTcp() / TODO: Add your

19、 control notification handler code hereUpdateData(true); /MFC窗口函数,用来刷新数据int count=m_list.GetItemCount();WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)MessageBox(初始化Winsock失败!);return;Socket=socket(AF_INET,SOCK_STREAM,0); /创建连接套接字if(Socket=INVALID_SOCKET)MessageBox(创建Socket失败!);WSACleanup(

20、); return;int IpAddress; /判断域名或IP地址IpAddress=inet_addr(m_Address);if(IpAddress=INADDR_NONE)hostent* pHostent=gethostbyname(m_Address);if(pHostent)IpAddress=(*(in_addr*)pHostent-h_addr).s_addr;sockaddr_in DestHost; /定义套接字地址memset(&DestHost,0,sizeof(DestHost);DestHost.sin_family=AF_INET;DestHost.sin_p

21、ort=htons(atoi(m_Port);DestHost.sin_addr.s_addr=IpAddress;int nConnect; /与服务器建立连接nConnect=connect(Socket,(sockaddr*)&DestHost,sizeof(DestHost);if(nConnect !=0)m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,m_Port);m_list.SetItemText(count,2,close);elsem_list.InsertItem(count,m_Address

22、);m_list.SetItemText(count,1,m_Port);m_list.SetItemText(count,2,open);UpdateData(false);closesocket(Socket);WSACleanup(); 4.4UDP扫描:这种方法由于使用的是UDP协议。由于这个协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。幸运的是,许多主机在你向一个未打开的UDP端口发送一个数据包时,会返回一个ICMP_PORT_UNREACH错误。这样就能发现哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描就不那么可靠。而且这种扫描方法是很慢的,因为RFC对ICMP错误消息的产生速率做了规定,而且本程序的UDP扫描只支持单线程。基本原理:首先使用socket()函数创建套接字,再用bind()函数绑定套接字,然后向扫描的目的主机的目的端口发送UDP数据包,再等待目的主机的目的端口是否返回ICMP_PORT_UNREACH错误数据报,若收到返回的错误数据包,则说明该端口是关闭着的,否则该端口是打开的,再将打开的端口保存进静态数组中,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论