网络监听技术的设计与实现.doc_第1页
网络监听技术的设计与实现.doc_第2页
网络监听技术的设计与实现.doc_第3页
网络监听技术的设计与实现.doc_第4页
网络监听技术的设计与实现.doc_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

网络监听技术的设计与实现摘 要网络监听技术是系统安全领域内一个非常敏感的话题,也是一项重要的技术,具有很强的现实应用背景。网络监听是网络监测、负载分析等管理活动常用的方法,同时也是黑客非法窃取信息的手段。网络监听工具通过网络传输介质的共享特性实现抓包,获得当前网络的使用状况,为网络管理员对网络中的信息进行实时的监测、分析提供一个合适的工具;同时也让黑客截获本网段的一些敏感信息,威胁网络安全。本文对网络监听技术的原理和实现进行了比较详细的介绍,讨论了监听技术在windows下的多种实现,并主要介绍了如何在win32环境中利用winpcap开发包开发网络实时监听程序,给出了具体的设计与实现方法。详细描述winpcap开发包的主要功能,分析网络监听程序的层次结构(从底到顶依次为npf驱动程序,winpcap的dll函数库),监听应用程序。最后就当前的监听技术的不足提出了分布式监听的观点,还引入了简单网络管理。关键字:网络监听,winpcap,包捕获abstractnetwork sniffer is an important issue and technique in the domain of system security, so it has strong realism application background . network sniffer is a way which is used in network monitor, load analysis; at the same time it is also a way which is used by hacker to get the information illegally. network sniffer tools snap packets to get the networks current status by the shared characteristic of the network transmission medium. it provides network manager a nice tool which can help them inspect and analyse the information of network ; simultaneously hackers also get some important information, so threaten system security.in this article ,we will introduce the principles and implementations of the network sniffer in details ,discuss multi-implementations of sniffer technique at windows ,and mainly introduce how to develop sniffer program at win32 by winpcap development kit ,the detailed design and implementations . particularly we describe the main function of winpcap , analyse the framework of network sniffer program and the sniffer application program.at last i bring forward distributed sniffer viewpoint for the lack of current sniffer technique . i also import simple network management.keyword: network monitor,winpcap,packet snap目 录前 言1第1章系统概述21.1系统目标21.2相关理论与技术的简单介绍21.2.1 网络监听原理21.2.2 监听技术相关的实现方法31.3系统需求6第2章基于winpcap开发的技术详解82.1选用winpcap技术的原因:82.2winpcap的结构分析82.3ndis驱动开发技术102.4dll动态连接库技术11第3章系统功能描述123.1监听子系统123.2显示子系统133.3管理子系统143.4连接子系统14第4章系统实现154.1协议驱动程序npf的设计154.2动态连接库程序packet.dll的设计174.3应用程序的结构设计204.3.1数据流图204.3.2结构图254.3.3源码分析294.4系统特色464.4.1分布式网络监听464.4.2简单网络管理46第5章系统测试与使用说明书475.1系统测试475.1.1监听功能475.1.2显示功能485.1.2管理功能515.1.3连接功能525.2工具软件的配置545.3监听工具的使用55结论56致谢:61参考文献:62附录16375前 言当今计算机网络及通讯技术的广泛应用,促使internet的迅速发展,给我们带来产生了巨大的社会和经济效益。在这种情况下,计算机网络的设计,维护的难度日益增加,因此人们迫切需要能够分析,诊断与测试网络功能的工具软件。网络监听工具在这种需求下孕育而生。它对网络上的所有数据进行捕获,一方面对数据包进行检查分析,以便找出我们所关心的网络中潜在的问题,对网络故障做出精确定位,帮助管理员解决网络的故障和性能问题;另一方面它又是黑客窃听网络的工具,黑客利用数据包中携带的数据直接或间接获取的机密信息。所以实现网络监听技术具有重要的现实和理论意义。本文主要对网络监听技术的原理和实现进行了比较详细的介绍。讨论了监听技术在windows下的多种实现,并主要论述了如何在win32环境中利用winpcap开发包开发网络实时监听程序,并给出了具体的设计与实现方法。正文第一章主要描述与实现网络监听工具有关的理论,包括网络监听的原理,实现网络监听的多种不同技术。第二章详细描述在实现本网络监听工具中使用的winpcap技术,包括ddk驱动开发技术,dll动态链接库技术,mfc应用程序开发技术。本监听工具所具备的功能。第三章详细描述系统功能。第四章详细描述系统实现,包括npf驱动程序的实现;packet.dll动态链接库程序的实现;应用程序的实现,将给出数据流图,模块结构图,关键程序流程图。第五章叙述系统测试和使用。最后一章得出毕业设计的总结,并阐明本软件的缺陷和解决方法。 第1章 系统概述1.1 系统目标本课设从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术和标准,模拟仿真了一组网络实验。为了能够检验实验的结果,我们开发了这个网络监听工具,帮助实验人员对网络中的信息进行实时的监测、分析,诊断网络故障。同时通过该毕业设计的内容,让我们了解各种抓包技术,熟练掌握基于winpcap开发包的编程模式;了解网络监听技术的新发展和网络安全防范的新方向;最后能有所体会。1.2 相关理论与技术的简单介绍1.2.1 网络监听原理共享式局域网采用的是广播信道,也就是说每台主机所发出的帧都会被整个网络内的所有主机接收到1。接收主机对帧的处理根据网卡的工作模式来实现。一般网卡具有一下4种工作模式:广播模式,多播模式,直播模式和混杂模式。网卡缺省工作模式是工作在广播和直播模式下的,即只能接收发送给自己和广播的帧。正常情况下接收主机的网卡根据帧中所包含的目标mac地址或是广播mac地址进行判断,若等于自己的mac地址或是广播mac地址,则提交给上层处理程序,否则丢弃此数据包。当网卡处于混杂模式的时候,它不作任何判断直接把接收到的所有帧交给上层处理程序。网络监听技术就是基于这个原理,来捕获网络中所有的数据包,实现网络监测和流量分析的。交换式以太网是基于数据链路层的点到点的信道,所以简单采用应用于共享式以太网的监听技术是完全失效的。本文主要讨论共享式以太网的情况,最后给出交换式以太网监听难题的解决方案。1.2.2 监听技术相关的实现方法l 原始套接字编程模式2:raw socket: 原始套接字可以用它来发送和接收 ip 层以上的原始数据包, 如 icmp, tcp, udp.1. 创建了一个 raw socket int sockraw=socket(af_inet, sock_raw, ipproto_raw);2. 把网卡置于混杂模式用 raw socket 实现代码如下:setsockopt(sock,ipproto_ip,ip_hdrincl,(char*)&flag,sizeof(flag); 设置 ip 头操作选项。flag 标志是用来设置 ip 头操作的, bool flag = ture 也就是说要亲自处理 ip 头。bind(sockraw,(psockaddr)&addrlocal,sizeof(addrlocal); 把 sockraw 绑定到本地网卡上,addrlocal 为本地地址: sockaddr_in addrlocal。ioctlsocket(sockraw, sio_rcvall, &dwvalue); 让 sockraw 接受所有的数据。dwvalue 为输入输出参数, 为 1 时执行, 0 时取消: dword dwvalue = 1;3. 捕获数据包recv(sockraw, recvbuf, buffer_size, 0);/接受任意数据包原始套接字编程模式:优点: 实现简单, 不需要做驱动程序就可实现抓包.缺点: 数据包头不含帧信息, 不能接收到与 ip 同层的其它数据包, 如 arp, rarp,ipxl imd中间层驱动编程模式3:中间层驱动(ndis intermediate driver)1 内核级网络驱动介绍:microsoft windows 2000支持三种基本的内核级网络驱动,这三层driver顺序从下到上依次为:a) miniport nic drivers:微端口网卡驱动,位于最底层,直接操纵网卡并且对高层驱动提供接口。b) intermediate drivers:imd中间层驱动位于1和3之间。c) protocol drivers:高层协议驱动,俗称为tdi(传输驱动程序接口),高于前面两层,直接面向用户级,为用户提供网络服务,也就是绝大多数程序所用到的网络接口。2 imd驱动 imd中间层,它的实质很简单,即:中间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,而对下面的网卡则表现为一个协议层的结构。所以,无论是网卡接收并上传的数据报,还是上层要下送至网卡发送的数据报,无一例外地要经过中间层。3 imd包过滤技术前面我们已经看到,所有的数据报都要经过中间层,所以,我们可以在中间层加入我们想要过滤的数据报的特征,实现基于中间层驱动的内核级包过滤。优势:首先,在驱动级别上做过滤,无须组包,速度快,效率自然就高;其次,所有的数据报无一例外,只要网卡上传的数据报均可以截获,避免了用户级无法得到所有数据报的缺点。缺点:imd包过滤技术也存在其不可避免的缺点,与操作系统版本关系密切,与硬件联系大,可移植性低,调试困难。l winpcap编程模式winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:1. 获原始数据报,包括在共享式网络上各主机发送/接收的以及相互之间交换的数据报;2. 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3. 在网络上发送原始的数据报;4. 收集网络通信过程中的统计信息。不足:winpcap的主要功能在于独立于主机协议(如tcp-ip)而发送和接收原始数据报。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于qos调度程序或个人防火墙。目前,winpcap开发的主要对象是windows nt/2000/xp,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/me,并且m$也已经放弃了对win9x的开发。其实winpcap中的面向9x系统的概念和nt系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ansi编码,而nt系统则提倡使用unicode编码。1.3 系统需求l 能够捕获所需要的所有以太网数据包l 分析捕获的包类型,报文信息l 数据形式显示当前以太网中数据包的分布情况l 图表形式显示当前以太网中数据包的分布情况l 能表现网络中各个节点的相互通讯情况l 可以保存数据到文件l 在数据包中查找敏感信息(匹配关键字)l 具备简单的网络管理功能l 实现简单的分布式监听第2章 基于winpcap开发的技术详解讨论了各种不同的编程模式之后,本章将阐明我们选择winpcap技术的原因,然后将对winpcap做详细的分析。2.1 选用winpcap技术的原因:l 提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多unix平台下的网络分析工具快速移植过来便于开发各种网络分析工具 l 原始套接字的编程模式中不能捕获arp和ipx的数据包对sniffer软件有着致命的限制,所以不能选择这种方法。l imd编程模式虽然功能强大,而且灵活性强,但是开发调试难度比较大,不适合作为sniffer软件的开发模式,甚至在防火墙开发技术中也不用imd。l winpcap本身不能阻塞,过滤或控制其他应用程序数据报的发收的缺点在我们这个软件的开发过程中,并不影响。所以经过权衡,我选用了winpcap编程模式来开发mysniffer软件。2.2 winpcap的结构分析winpcap的主要思想来源于unix系统中著名的bsd包捕获结构,它的基本结构如图2.1所示:整个包捕获框架的基础是ndis(网络驱动器接口规范),它是windows中最低端的与联网有关的软件,主要是为各种应用协议与网卡之间提供的一套接口函数。winpcap由三个模块组成,一个是工作在内核级别上的npf包过滤器;另外两个是用户级的动态连接库packet.dll和wpcap.dll4。wpcap.dll是packet.dll的上一层封装,提供了编程的高级接口。为了能更好的了解winpcap的工作原理,我选用了packet.dll作为程序对底层访问的接口。因为基于winpcap开发涉及到驱动程序开发技术,dll动态连接库开发技术,和vc的mfc应用程序开发技术,所以将对它们做一些介绍。图2.1 winpcap及npf的结构图52.3 ndis驱动开发技术网络驱动程序使用iso的开放的系统互连网罗标准(osi),这是一个七层的模型,它的顶层是应用软件层,底层是硬件连接和网络的拓扑结构,网络接口卡(nic)给大多数的平台提供网络的硬件接口,网络驱动程序是写给指定的nic的驱动程序。 网络驱动程序接口规范(ndis)给nic驱动程序提供库支持,通常只允许nic厂商提供管理硬件特殊细节的mini驱动程序,更高层的ndis(中间驱动程序,协议驱动程序)在需要的时候提供媒体转换,过滤。分层的ndis如图2所示。 win2000提供一个分层的内核模式软件传输驱动接口(tdi),这个分层的在ndis层和高层软件抽象像插座和netbios,tdi层使win2000的高层结构具有更多的可移植性。 图2.网络驱动程序接口规范 2.4 dll动态连接库技术dll (dynamic linkable library) 文件通常是一个具有独立功能的程序模块,可以进行单独编译和测试。在运行时,只有当 exe 程序确实要调用这些 dll 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 exe 文件的大小和对内存空间的需求,而且使这些 dll 模块可以同时被多个应用程序使用,只是增加dll的计数。当应用程序卸载dll时,计数则减少,计数为0时dll就从内存被释放。packet.dll就是为上层应用程序开发的,提供操作网卡的模块;而且它屏蔽应用程序直接操作底层协议驱动程序的复杂性。所以应用程序可以使用packet.dll所提供地接口函数,安全简单的操作协议驱动程序,使应用程序更加健壮。第3章 系统功能描述这个网络监听工具虽然不是很庞大,但是有几个功能比较明确,也就是监听功能,显示功能,管理功能,连接功能,所以我把它们划分为四个子系统,来实现。3.1监听子系统监听子系统再划分为三个功能,捕获功能,过滤功能,保存功能;三个功能描述如下:l 捕获功能根据过滤器的设置,捕获ip,arp,ipx,tcp,udp,ospf,icmp,spx,ipx-rip等数据包,并把数据包保存在应用程序的缓冲区内。l 过滤功能用户自己定义过滤信息(特定协议进行捕获),也就说用户可能只需要了解网络中某种类型的数据包的信息,而不需要捕获太多无用的数据,一方面系统负担比较大,另一方面干扰信息过多不利于用户发现网络中存在的问题。l 保存功能在捕获的过程中,每十秒钟,把统计信息写入文件中,等待图表显示功能模块提取信息。保存功能还根据管理功能的需要,保存数据。如果管理功能被启动,系统将满足管理要求的主机ip地址,记录在ip数据集合中。等待管理子系统从中提取ip地址,实现管理功能。3.2显示子系统显示子系统可再划分为五个功能,总量显示功能,分量显示功能,通讯显示功能,列表显示功能,树形显示功能。这些功能的详细描述如下:l 总量显示功能在抓包过程中显示捕获数据包的总量,也就是从开始监听一直到结束,捕获的说有数据包的数量。l 分量显示功能在抓包过程中显示各种数据包的分量,以及它们在总量中比例(百分比显示)各种数据包的百分比是指,某种类型的数据包除以捕获的数据包的总量。l 通讯显示功能用直观的方法表示当前各个节点的通讯对象,如果双方存在tcp,udp,icmp数据包的往来我们就认为他们之间存在着通讯,然后我们记录他们的信息,并显示在屏幕上。l 列表显示功能在抓包终止后,显示捕获的数据包的信息。包括:包的次序,包的源和目的地址(ip数据包显示ip地址,arp数据包显示mac地址,ipx数据包显示ipx的地址形式)包的长度,包的简要说明l 树形显示功能可以指定一个数据包,并显示它的详细内容,包头信息,首先判断是网络层中的哪种类型数据包,其次判断是传输层中的哪种类型的数据包,最后判断是哪种应用层的服务。才判断的过程中不断记录各个包头的信息,并以树状结构加以表现。3.3管理子系统简单网络管理功能:主要指可选择监听某个端口,根据一些信息截断节点与外界的联系。设计这个功能的目的是,最近这段时间利用windows 远程管理或是远程调用功能的漏洞,出现很多攻击。它们通常利用135,139或445端口存在的缓冲区溢出的漏洞,使病毒入侵主机,然后利用相同的方法再从被感染的主机向其他网络中的主机发起攻击。所以如果我们在觉察到某台机器中毒并不断攻击其他主机时,我们可以把他们发出的数据包定位到错误的网关地址,这样就把威胁限制在一个网段内了,还可以造成ip冲突让部分被感染主机无法和网络连接。3.4 连接子系统实现分布式监听,这是指我们在各个网段安排不同的mysniffer,然后把各个网段的信息汇总到一台服务器中。服务器可以对数据加以显示,帮助管理人员觉察到网络的异常情况。第4章 系统实现4.1协议驱动程序npf的设计参考windows系统的ddk(driver development kit)中的网络驱动程序(network driver)开发文档,针对不同类型的网罗驱动程序,ndis定义的一些必须向系统进行登记和实现的接口,作为系统操作和管理某一个网卡的入口。开发驱动程序主要的工作便是对这些接口进行实现。系统采用协议驱动程序(也叫中间驱动程序)来进行网络数据包的读取,下面就是协议驱动程序需要实现和登记的主要几个接口。具体实现包括:l ntstatus driverentry(in pdriver_object driverobject,in punicode_string registrypath) 6:driverentry 是系统调用设备驱动程序的入口函数,当协议驱动程序被加载到内存开始运行时它被调用。它初始化驱动程序,注册所有的驱动程序的回调函数,创建虚拟设备,在ndis结构中定义协议驱动程序。参数:driverobject 系统创建的一个协议驱动程序对象 registerpath 注册表中与协议驱动有关的注册项的路径返回值:包括一组网卡的串。l ndisregisterprotocol:在驱动程序初始化的时候,调用该函数向系统进行登记,将自己注册成一个协议驱动程序。l ndisopenadapter:在驱动程序初始化的时候,调用该函数绑定(bind)和打开(open)一个或多个网络适配器(adapter)。l 在高层应用程序,发出要求绑定协议驱动程序或者要求接收和发送数据包的请求时,协议驱动程序调用以下函数:npf_bindadapterhandler:ndis通过这个函数请求协议驱动程序绑定到一个底层的nic(网卡)或者虚拟的nicnpf_unbindadapterhandler:ndis通过这个函数关闭协议驱动程序到nic或者虚拟nic的连接。npf_openadaptercompletehandler:当协议驱动程序调用ndisopenadapter函数的返回是ndis_status_pending时,这个函数来指定(binding)操作完成。npf_closeadaptercompletehandler:当协议驱动程序调用npf_ndiscloseadapter函数返回是ndis_status_pending时,这个函数来指定(unbinding)操作完成。npf_receivehandler:当一个数据包到达时,便调用这个接口进行处理。npf_receivecompletehandler:指示进行接收的数据是否已经接收完成。npf_transfercompletehandler:当协议驱动程序调用ndistransferdata函数的返回值是ndis_status_pending,系统调用这个函数指示传送的数据时候已经发送完成。npf_sendcompletehandler:当协议驱动程序调用ndissend 函数的返回值为ndis_status_pending,系统调用这个函数指示进行发送的数据时候已经发送。npf_read:为用户提供读操作。npf_write:为用户提供写操作。npf_iocontrol:处理ioctl操作。以上所罗列的是协议驱动程序中用到或是实现的主要的几个函数。4.2动态连接库程序packet.dll的设计首先声明一些相关的数据结构:1. typedef struct _adapter adapter6 /描述一个网络适配器;2. typedef struct _packet packet /描述一组网络数据报的结构;3. typedef struct nettype nettype /描述网络类型的数据结构;4. typedef struct npf_if_addr npf_if_addr /描述一个网络适配器的ip地址;5. struct bpf_hdr /数据报头部;5. struct bpf_stat /当前捕获数据报的统计信息。下面,将介应用程序用到的各个函数,他们都是在packet.dll中定义的:1 lppacket packetallocatepacket(void)当需要给程序接收数据包的时候,需要先分配一个接收缓冲区,而接受缓冲区又需要一个描述它的结构体。所以在分配缓冲区的时候,调用这个函数分配这个结构体的空间。如果运行成功,返回一个_packet结构的指针,否则返回null。成功返回的结果将会传送到packetreceivepacket()函数,接收来自驱动的网络数据报。2 void packetcloseadapter(lpadapter lpadapter)当应用程序需要关闭监听功能的时候,需要调用这个函数。关闭参数中提供的网络适配器,释放相关的adapter结构。3 void packetfreepacket(lppacket lppacket)当应用程序结束监听的时候,调用这个函数,释放描述接收缓冲区的结构体的空间。参数提供的是_packet结构的指针。4 boolean packetgetadapternames(lpstr pstr,pulong buffersize)一台主机可能又多个网卡,所以在打开哪个网卡进行监听的时候,需要得到主机的网卡列表。所以应用程序在打开网卡前,要先调用这个函数。通过返回值可以得到的网络适配器列表及描述。5 void packetinitpacket(lppacket lppacket, pvoid buffer, uint length)在应用程序的监听功能启动时,调用这个函数。给一个_packet结构中的,buffer分配空间。6 lpadapter packetopetadapter(lptstr adaptername)在应用程序的监听功能启动时,根据前面得到的网卡列表,调用这个函数,打开一个网络适配器。7boolean packetreceivepacket(lpadapter adapterobject,lppacket lppacket,boolean sync) 在应用程序的 sniff()函数中调用这个函数,从npf驱动程序读取网络数据报及统计信息。数据报编码结构如示: |bpf_hdr|data|padding|bpf_hdr|data|padding|8 boolean packetsendpacket(lpadapter adapterobject,lppacket lppacket, boolean sync) 在应用程序的管理子系统的autoctrl函数中调用它,用来发送一个或多个arp数据报的副本。实际上它可以发送任何自己构造的数据包。9 boolean packetsethwfilter(lpadapter adapterobject,ulong filter)在应用程序的监听功能启动时调用它,为接收到的数据报设置硬件过滤规则。以下为一些典型的过滤规则:ndis_packet_type_promiscuous: 设置为混杂模式,接收所有流过的数据报;ndis_packet_type_directed: 只有目的地为本地主机网络适配器的数据报才会被接收;ndis_packet_type_broadcast: 只有广播数据报才会被接收;dis_packet_type_multicast: 只有与本地主机网络适配器相对应的为了实现监听数据报,把网卡设置为ndis_packet_type_promiscuous;15 boolean packetsetnumwrites(lpadapter adapterobject,int nwrites)在应用程序的管理子系统的autoctrl函数中调用它,设置调用packetsendpacket()函数发送一个数据报副本所重复的次数。15 boolean packetsetreadtimeout(lpadapter adapterobject,int timeout)在应用程序的监听功能启动时调用它,设置在接收到一个数据报后“休息”的时间。4.3应用程序的结构设计4.3.1数据流图l 全局关联图 (图4.1)图4.1全局关联图用户打开mysniffer 系统,系统以文本方式,图表方式,还有列表方式向用户显示抓包结果。用户还可以给系统设置过滤标准,请求系统执行管理功能和连接功能。系统在监听的时候,不断保存和记录各种信息,以被连接子系统和管理子系统使用。在连接功能启动时,系统将试图与服务器连接,然后返回统计信息到服务器端。图4.2 系统详细关联图这张图充分表现了,各个子系统之间的详细联系。各其他系统以监听子系统为核心。监听子系统把捕获的数据包,传递给显示子系统来显示信息。监听子系统把记录的受怀疑的网络主机的ip集合传递给管理子系统,实现简单网络管理。监听子系统还记录网络流量的统计信息,传递给连接子系统,连接子系统再把信息传送到服务器端。l 监听子系统数据流图图4.5监听子系统数据流图用户发出启动请求,监听子系统开始监听。监听过程接收过滤信息,然后被系统时钟所触发,每1秒完成一次操作。每次操作过程中,要对数据包进行分析,记录统计信息,捕获的数据包和需要管理的主机ip地址集合,以备显示子系统,管理子系统,和连接子系统使用。l 显示子系统数据流图图4.4 显示子系统数据流图用户发出请求文本信息的要求,显示文本信息子活动,从统计信息中读取数据并显示。用户发出请求图表信息的要求,显示图表信息子活动,从文件中读取数据并显示。用户发出请求列表信息的要求,显示列表信息子活动,从统计信息中读取数据并显示。用户发出请求显示特定数据包的要求,显示特定数据包的子活动,从数据包集合中读取数据并显示。l 管理子系统数据流图图4.5管理子系统数据流图用户发出启动简单管理请求,启动网络管理子活动打开时钟3。网络管理被时钟3触发,每1秒操作一次。根据ip地址集,给网络上的主机不断发送arp数据包。l 连接子系统数据流图图4.4 连接子系统数据流图用户发出启动连接请求,开启连接子活动打开时钟2。连接子活动被时钟3触发,每10秒操作一次。根据统计信息,给网络上的服务器不断发送信息。4.3.2结构图l 顶层结构图:图4.7顶层模块图主模块调用监听,显示,管理,连接子模块。其中管理,连接子模块是可选的。l 监听子系统结构图(图4.8) 图4.8监听子系统模块图 监听子系统调用监听,设置和查看过滤信息,写入统计和数据包集合信息。监听子系统调用监听模块获得统计信息和数据包,并把它们写入相应的存储区域。l 显示子系统结构图(图4.9)图4.9显示子系统模块图 显示子系统调用显示文本,图表,列表,特定数据包信息四个子模块。后三个子模块是可选模块,根据用户需要,调用它们。显示文本信息子模块由程序内部获得统计信息。显示图表模块从文件中获得不同时间不同的统计信息。显示列表信息和显示特定数据包信息子模块从数据包集合中获得数据。l 管理子系统结构图,连接子系统结构图。这两个子系统结构实现难度大,但是结构比较简单,所以在顶层模块图中就显示了他们内部的模块调用结构。4.3.3源码分析a) 主要数据结构:见附录1b) 主要全局变量:staticlpadapter lpadapter; /指向描述网络适配器实例的结构的指针;staticlppacket lppacketr; /指向描述一组网络数据报的结构的指针;staticchar packet_array10241024;/应用程序中存放数据包的缓冲区staticchar recvbuf1024*250;/协议驱动程序存放数据包的缓冲区static dword auto_ip255;/存放需要被管理的主机的ip地址c) 监听模块:l void sniff():功能:获取数据包算法:循环一百次调用packetreceivepacket函数,如果成功开始分析数据包(即调用getdata函数)。l void getdata(lppacket lp)功能:分析捕获的数据包,写入统计信息,写入数据包集合,写入主机ip集合参数:指向描述一组网络数据报的结构的指针;算法:l class filterdlg : public cdialog/ constructionpublic:filterdlg(cwnd* pparent = null); / standard constructor/ dialog data/afx_data(filterdlg)enum idd = idd_define_filter ;boolm_arp,m_dns,m_ftp,m_icmp,m_http,m_ip,m_ipx,m_netbios;boolm_ospf,m_rip,m_smtp,m_spx,m_tcp,m_telnet,m_udp;/这些变量由来决定是否对这些协议监听/afx_data/ overrides/ classwizard generated virtual function overrides/afx_virtual(filterdlg)protected:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv support/afx_virtual/ implementationprotected:/ generated message map functions/afx_msg(filterdlg)afx_msg void onarp(),ondns(),onftp(),onhttp(),onicmp(),onip(),onipx(),onnetbois(),onospf(),onrip(),onsmtp(),onspx(),ontcp(),ontelnet(),onudp(),ondefault();/用来在每个checkbox被触发时调用/afx_msgdeclare_message_map();功能:设置过滤信息算法:通过一系列的checkbox控件,我们来决定需要对那些控件进行过滤。比如tcp控件被选中我们就要对tcp协议进行过滤,否则就掠过tcp协议。但是在我们选择tcp协议的同时ip协议也一定会被选上,所以他们之间存在一定的关联关系。if( m_tcp = 1 )m_ip = 1;elsem_ftp = 0;m_smtp = 0;m_http = 0;m_telnet = 0;我们以上面的代码为例讨论这个问题,当tcp被选中时ip也被选中,当tcp被取消时它的高层协议如ftp,http都会被取消。其他的代码也都是仿照tcp的原则来写的。d) 显示模块:l void showpacketcount(cdc *pdc);功能:调用该函数显示数据包的总量和各种协议数据包的分量信息算法:利用统计信息,把统计信息打印出来。l void showgraphic(cdc *pdc);功能:调用该函数显示数据包的图表信息算法:读取在不同时间点上,记录在文件中的统计信息,然后以时间为横轴,百分比为纵轴把统计信息显示在视图上。l void showconnection(cdc *pdc);功能:调用该函数显示网络中存在通讯的节点之间的联系算法:从packet_array数据包接收缓冲区中,倒序查找十个数据包,如果数据包类型为tcp,udp,icmp那么就认为数据包的源和目的主机之间存在着通讯关系,于是就把他们的源和目的地址展现在视图上。l class mydlg : public cdialogpublic:void setdata(char p1024,int c);mydlg(cwnd* pparent = null); / standard constructorint indexinfieldlist;/记录被选择需要详细显示的数据包的序号treedlg m_treedlg; /树行显示数据包的对话框pvoid packet; /指向数据包数组packet_arry的指针int count; /数据包数组中数据包的个数/ dialog data/afx_data(mydlg)enum idd = idd_dialog ;clistctrlm_listctrl;/afx_data/ overrides/ classwizard generated virtual function overrides/afx_virtual(mydlg)public:virtual int domodal();protected:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv support/afx_virtual/ implementationprotected:/ generated message map functions/afx_msg(mydlg)virtual bool oninitdialog(); /对话框的初始化函数afx_msg void ondblclklist(nmhdr* pnmhdr, lresult* presult);/选择需要详细显示的数据包时触发的函数afx_msg void onpaint();/afx_msgdeclare_message_map();功能:该类用来显示数据包的列表信息算法:首先在实例化该类的时候我们要把packet_array数据包接收缓冲区的指针传给pvoid packet,通过packet指针我们解析每一个数据包,然后把它们的信息以列表形式展现在用户面前。对数据包的解析算法基本上和getdata中的算法相似所以这里就不再重复了。该类中void ondblclklist(nmhdr* pnmhdr, lresult* presult)函数的作用是当用户想更加细致地了解数据包地情况下,双击列表中地某一个数据包,那么它会实例化class treedlg类,来显示数据包地详细信息。l class treedlg : public cdialog/ constructionpublic:void setdata(char *p);treedlg(cwnd* pparent = null); / standard constructorhtreeitem m_hroot;/树行结构的根节点char *packet; /指向需要详细显示数据包的指针/ dialog data/afx_data(treedlg)enum idd = idd_tree_view ;ctreectrlm_tree;cstringm_str;cstringm_substr;/afx_data/ overrides/ classwizard generated virtual function overrides/afx_virtual(treedlg)protected:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv support/afx_virtual/ implementationprotected:/ generated message map functions/afx_msg(treedlg)virtual bool oninitdialog();afx_msg void onselchangingtree(nmhdr* pnmhdr, lresult* presult);afx_msg void onfind();/afx_msgdeclare_message_map();功能:显示某一个数据包地具体信息,数据包包头信息以树形结构表现出来,同时提供查找功能,当我们输入一个字符串地时候,可以找到这个字符串的前几个字符,字符串本身,后几个字符。

温馨提示

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

评论

0/150

提交评论