为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 网络监听技术是系统安全领域内一个非常敏感的话题

网络监听技术是系统安全领域内一个非常敏感的话题

2018-05-17 50页 doc 315KB 17阅读

用户头像

is_682974

暂无简介

举报
网络监听技术是系统安全领域内一个非常敏感的话题网络监听技术是系统安全领域内一个非常敏感的话题 摘 要 网络监听技术是系统安全领域内一个非常敏感的话题,也是一项重要的技术,具有很强的现实应用背景。网络监听是网络监测、负载分析等管理活动常用的方法,同时也是黑客非法窃取信息的手段。网络监听工具通过网络传输介质的共享特性实现抓包,获得当前网络的使用状况,为网络管理员对网络中的信息进行实时的监测、分析提供一个合适的工具;同时也让黑客截获本网段的一些敏感信息,威胁网络安全。 本文对网络监听技术的原理和实现进行了比较详细的介绍,讨论了监听技术在Windows下的多种实现,并主要介绍...
网络监听技术是系统安全领域内一个非常敏感的话题
网络监听技术是系统安全领域内一个非常敏感的话题 摘 要 网络监听技术是系统安全领域内一个非常敏感的话题,也是一项重要的技术,具有很强的现实应用背景。网络监听是网络监测、负载分析等管理活动常用的方法,同时也是黑客非法窃取信息的手段。网络监听工具通过网络传输介质的共享特性实现抓包,获得当前网络的使用状况,为网络管理员对网络中的信息进行实时的监测、分析提供一个合适的工具;同时也让黑客截获本网段的一些敏感信息,威胁网络安全。 本文对网络监听技术的原理和实现进行了比较详细的介绍,讨论了监听技术在Windows下的多种实现,并主要介绍了如何在Win32环境中利用Winpcap开发包开发网络实时监听程序,给出了具体的与实现方法。详细描述Winpcap开发包的主要功能,分析网络监听程序的层次结构(从底到顶依次为NPF驱动程序,Winpcap的dll库),监听应用程序。 最后就当前的监听技术的不足提出了分布式监听的观点,还引入了简单网络管理。 1 关键字:网络监听,Winpcap,包捕获 Abstract Network 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 network’s 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. 2 Keyword: network monitor,winpcap,packet snap 目 录 前 言 ..................................................................................................................................... 1 第1章 系统概述........................................................................................................................... 3 1.1 系统目标........................................................................................................................... 3 1.2 相关理论与技术的简单介绍 ......................................................................................... 3 1.2.1 网络监听原理 .................................................................................................................. 3 1.2.2 监听技术相关的实现方法 ............................................................................................. 4 1.3 系统需求........................................................................................................................... 8 第2章 基于Winpcap开发的技术详解 ................................................................................... 10 2.1 选用Winpcap技术的原因: ....................................................................................... 10 2.2 Winpcap的结构分析..................................................................................................... 11 2.3 NDIS驱动开发技术 ..................................................................................................... 12 2.4 DLL动态连接库技术 ................................................................................................... 13 第3章 系统功能描述 ................................................................................................................ 15 3.1 监听子系统 .................................................................................................................... 15 3.2 显示子系统 .................................................................................................................... 16 3.3 管理子系统 .................................................................................................................... 17 3.4 连接子系统 .................................................................................................................... 17 第4章 系统实现......................................................................................................................... 19 3 4.1 协议驱动程序NPF的设计 .......................................................................................... 19 4.2 动态连接库程序PACKET.DLL的设计 ..................................................................... 21 4.3 应用程序的结构设计 .................................................................................................... 25 4.3.1 数据流图......................................................................................................................... 25 4.3.2 结构图 ............................................................................................................................. 30 4.3.3 源码分析......................................................................................................................... 34 4.4 系统特色......................................................................................................................... 52 4.4.1 分布式网络监听 ............................................................................................................ 52 4.4.2 简单网络管理 ................................................................................................................ 53 第5章 系统测试与使用说明书 ................................................................................................ 54 5.1 系统测试......................................................................................................................... 54 5.1.1 监听功能......................................................................................................................... 54 5.1.2 显示功能......................................................................................................................... 55 5.1.2 管理功能......................................................................................................................... 58 5.1.3 连接功能......................................................................................................................... 59 5.2 工具软件的配置 ............................................................................................................ 61 5.3 监听工具的使用 ............................................................................................................ 62 结论 ................................................................................................................................... 64 致谢: ................................................................................................................................... 70 参考文献: ................................................................................................................................... 71 附录1 ................................................................................................................................... 73 4 前 言 当今计算机网络及通讯技术的广泛应用,促使Internet的迅速发展,给我们带来产生了巨大的社会和经济效益。在这种情况下,计算机网络的设计,维护的难度日益增加,因此人们迫切需要能够分析,诊断与测试网络功能的工具软件。 网络监听工具在这种需求下孕育而生。它对网络上的所有数据进行捕获,一方面对数据包进行检查分析,以便找出我们所关心的网络中潜在的问题,对网络故障做出精确定位,帮助管理员解决网络的故障和性能问题;另一方面它又是黑客窃听网络的工具,黑客利用数据包中携带的数据直接或间接获取的机密信息。所以实现网络监听技术具有重要的现实和理论意义。 本文主要对网络监听技术的原理和实现进行了比较详细的介绍。讨论了监听技术在Windows下的多种实现,并主要论述了如何在Win32环境中利用Winpcap开发包开发网络实时监听程序,并给出了具体的设计与实现方法。 正文第一章主要描述与实现网络监听工具有关的理论,包括网络监听的原理,实现网络监听的多种不同技术。第二章详细描述在实现本网络监听工具中使用的Winpcap技术,包括DDK驱动开发技术,DLL动态链接库技术,MFC应用程序开发技术。本监听工具所具备的功能。第三章详细描述系统功能。第四章详细描述系统实现,包括NPF驱动程序的实现;PACKET.DLL动态链接库程序的实现;应用程序的实现,将给出数据流图,模块结构图,关键 1 程序流程图。第五章叙述系统测试和使用。最后一章得出毕业设计的总结, 并阐明本软件的缺陷和解决方法。 2 第1章 系统概述 1.1 系统目标 本课设从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术和,模拟仿真了一组网络实验。为了能够检验实验的结果,我们开发了这个网络监听工具,帮助实验人员对网络中的信息进行实时的监测、分析,诊断网络故障。同时通过该毕业设计的内容,让我们了解各种抓包技术,熟练掌握基于Winpcap开发包的编程模式;了解网络监听技术的新发展和网络安全防范的新方向;最后能有所体会。 1.2 相关理论与技术的简单介绍 1.2.1 网络监听原理 共享式局域网采用的是广播信道,也就是说每台主机所发出的帧都会被 [1]整个网络内的所有主机接收到。接收主机对帧的处理根据网卡的工作模式来实现。一般网卡具有一下4种工作模式:广播模式,多播模式,直播模式和混杂模式。网卡缺省工作模式是工作在广播和直播模式下的,即只能接收发送给自己和广播的帧。正常情况下接收主机的网卡根据帧中所包含的目标MAC地址或是广播MAC地址进行判断,若等于自己的MAC地址或是广播MAC地址,则提交给上层处理程序,否则丢弃此数据包。当网卡处于混杂模式的 3 时候,它不作任何判断直接把接收到的所有帧交给上层处理程序。网络监听技术就是基于这个原理,来捕获网络中所有的数据包,实现网络监测和流量分析的。 交换式以太网是基于数据链路层的点到点的信道,所以简单采用应用于共享式以太网的监听技术是完全失效的。本文主要讨论共享式以太网的情况,最后给出交换式以太网监听难题的解决。 1.2.2 监听技术相关的实现方法 [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 头。 4 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,IPX… [3], IMD中间层驱动编程模式: 中间层驱动(NDIS intermediate driver) 1( 内核级网络驱动介绍: Microsoft Windows 2000支持三种基本的内核级网络驱动,这三层 driver顺序从下到上依次为: a) Miniport NIC drivers:微端口网卡驱动,位于最底层,直接操纵网卡 并且对高层驱动提供接口。 5 b) Intermediate drivers:IMD中间层驱动位于1和3之间。 c) Protocol drivers:高层协议驱动,俗称为TDI(传输驱动程序接口), 高于前面两层,直接面向用户级,为用户提供网络服务,也就是绝 大多数程序所用到的网络接口。 2( IMD驱动 IMD中间层,它的实质很简单,即:中间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,而对下面的网卡则表现为一个协议层的结构。所以,无论是网卡接收并上传的数据报,还是上层要下送至网卡发送的数据报,无一例外地要经过中间层。 3( IMD包过滤技术 前面我们已经看到,所有的数据报都要经过中间层,所以,我们可以在中间层加入我们想要过滤的数据报的特征,实现基于中间层驱动的内核级包过滤。 优势:首先,在驱动级别上做过滤,无须组包,速度快,效率自然就高;其次,所有的数据报无一例外,只要网卡上传的数据报均可以截获,避免了用户级无法得到所有数据报的缺点。 缺点:IMD包过滤技术也存在其不可避免的缺点,与操作系统版本关系密切,与硬件联系大,可移植性低,调试困难。 , Winpcap编程模式 Winpcap(windows packet capture)是windows平台下一个免费,公共的网 6 络访问系统。开发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编码。 7 1.3 系统需求 , 能够捕获所需要的所有以太网数据包 , 分析捕获的包类型,报文信息 , 数据形式显示当前以太网中数据包的分布情况 , 图表形式显示当前以太网中数据包的分布情况 , 能表现网络中各个节点的相互通讯情况 , 可以保存数据到文件 , 在数据包中查找敏感信息(匹配关键字) , 具备简单的网络管理功能 , 实现简单的分布式监听 8 9 第2章 基于Winpcap开发的技术详解 讨论了各种不同的编程模式之后,本章将阐明我们选择Winpcap技术的原因,然后将对Winpcap做详细的分析。 2.1 选用Winpcap技术的原因: , 提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具 , 原始套接字的编程模式中不能捕获ARP和IPX的数据包对SNIFFER软件有着致命的限制,所以不能选择这种方法。 , IMD编程模式虽然功能强大,而且灵活性强,但是开发调试难度比较大,不适合作为SNIFFER软件的开发模式,甚至在防火墙开发技术中也不用IMD。 , WINPCAP本身不能阻塞,过滤或控制其他应用程序数据报的发收的缺点在我们这个软件的开发过程中,并不影响。 所以经过权衡,我选用了Winpcap编程模式来开发MySniffer软件。 10 2.2 Winpcap的结构分析 Winpcap的主要思想来源于Unix系统中著名的BSD包捕获结构,它的基本结构如图2.1所示: 整个包捕获框架的基础是NDIS(网络驱动器接口),它是Windows中最低端的与联网有关的软件,主要是为各种应用协议与网卡之间提供的一套接口函数。Winpcap由三个模块组成,一个是工作在内核级别上的NPF包 [4]过滤器;另外两个是用户级的动态连接库packet.dll和wpcap.dll。wpcap.dll是packet.dll的上一层封装,提供了编程的高级接口。为了能更好的了解Winpcap的工作原理,我选用了packet.dll作为程序对底层访问的接口。因为基于Winpcap开发涉及到驱动程序开发技术,dll动态连接库开发技术,和vc的MFC应用程序开发技术,所以将对它们做一些介绍。 11 [5] 图2.1 Winpcap及NPF的结构图 2.3 NDIS驱动开发技术 网络驱动程序使用ISO的开放的系统互连网罗标准(OSI),这是一个七层的模型,它的顶层是应用软件层,底层是硬件连接和网络的拓扑结构,网络接口卡(NIC)给大多数的平台提供网络的硬件接口,网络驱动程序是写给指定的NIC的驱动程序。 网络驱动程序接口规范(NDIS)给NIC驱动程序提供库支持,通常只允许 12 NIC厂商提供管理硬件特殊细节的MINI驱动程序,更高层的NDIS(中间驱动程序,协议驱动程序)在需要的时候提供媒体转换,过滤。分层的NDIS如图2所示。 WIN2000提供一个分层的内核模式软件传输驱动接口(TDI),这个分层的在NDIS层和高层软件抽象像插座和NetBIOS,TDI层使WIN2000的高层结构具有更多的可移植性。 图2.网络驱动程序接口规范 2.4 DLL动态连接库技术 DLL (Dynamic Linkable Library) 文件通常是一个具有独立功能的程序模块,可以进行单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用,只是增加 13 DLL的计数。当应用程序卸载DLL时,计数则减少,计数为0时DLL就从内存被释放。PACKET.DLL就是为上层应用程序开发的,提供操作网卡的模块;而且它屏蔽应用程序直接操作底层协议驱动程序的复杂性。所以应用程序可以使用PACKET.DLL所提供地接口函数,安全简单的操作协议驱动程序,使应用程序更加健壮。 14 第3章 系统功能描述 这个网络监听工具虽然不是很庞大,但是有几个功能比较明确,也就是监听功能,显示功能,管理功能,连接功能,所以我把它们划分为四个子系统,来实现。 3.1 监听子系统 监听子系统再划分为三个功能,捕获功能,过滤功能,保存功能;三个功能描述如下: , 捕获功能 根据过滤器的设置,捕获ip,arp,ipx,tcp,udp,ospf,icmp,spx,ipx-rip 等数据包,并把数据包保存在应用程序的缓冲区内。 , 过滤功能 用户自己定义过滤信息(特定协议进行捕获),也就说用户可能只需要了解网络中某种类型的数据包的信息,而不需要捕获太多无用的数据,一方面系统负担比较大,另一方面干扰信息过多不利于用户发现网络中存在的问题。 , 保存功能 在捕获的过程中,每十秒钟,把统计信息写入文件中,等待图表显示功能模块提取信息。保存功能还根据管理功能的需要,保存数据。如果管理功能被启动,系统将满足管理要求的主机IP地址,记录在IP数据集合中。等待管理子系统从中提取IP地址,实现管理功能。 15 3.2 显示子系统 显示子系统可再划分为五个功能,总量显示功能,分量显示功能,通讯显示功能,列表显示功能,树形显示功能。这些功能的详细描述如下: , 总量显示功能 在抓包过程中显示捕获数据包的总量,也就是从开始监听一直到结束,捕获的说有数据包的数量。 , 分量显示功能 在抓包过程中显示各种数据包的分量,以及它们在总量中比例(百分比显示)各种数据包的百分比是指,某种类型的数据包除以捕获的数据包的总量。 , 通讯显示功能 用直观的方法表示当前各个节点的通讯对象,如果双方存在TCP,UDP,ICMP数据包的往来我们就认为他们之间存在着通讯,然后我们记录他们的信息,并显示在屏幕上。 , 列表显示功能 在抓包终止后,显示捕获的数据包的信息。包括:包的次序,包的源和目的地址(ip数据包显示ip地址,arp数据包显示mac地址,ipx数据包显示ipx的地址形式)包的长度,包的简要说明 , 树形显示功能 16 可以指定一个数据包,并显示它的详细内容,包头信息,首先判断是网络层中的哪种类型数据包,其次判断是传输层中的哪种类型的数据包,最后判断是哪种应用层的服务。才判断的过程中不断记录各个包头的信息,并以树状结构加以表现。 3.3 管理子系统 简单网络管理功能:主要指可选择监听某个端口,根据一些信息截断节点与外界的联系。设计这个功能的目的是,最近这段时间利用WINDOWS 远程管理或是远程调用功能的漏洞,出现很多攻击。它们通常利用135,139或445端口存在的缓冲区溢出的漏洞,使病毒入侵主机,然后利用相同的方法再从被感染的主机向其他网络中的主机发起攻击。所以如果我们在觉察到某台机器中毒并不断攻击其他主机时,我们可以把他们发出的数据包定位到错误的网关地址,这样就把威胁限制在一个网段内了,还可以造成IP冲突让部分被感染主机无法和网络连接。 3.4 连接子系统 实现分布式监听,这是指我们在各个网段安排不同的MySniffer,然后把各个网段的信息汇总到一台服务器中。服务器可以对数据加以显示,帮助管理人员觉察到网络的异常情况。 17 18 第4章 系统实现 4.1 协议驱动程序NPF的设计 参考Windows系统的DDK(Driver Development Kit)中的网络驱动程序(Network Driver)开发文档,针对不同类型的网罗驱动程序,NDIS定义的一些必须向系统进行登记和实现的接口,作为系统操作和管理某一个网卡的入口。开发驱动程序主要的工作便是对这些接口进行实现。系统采用协议驱动程序(也叫中间驱动程序)来进行网络数据包的读取,下面就是协议驱动程序需要实现和登记的主要几个接口。具体实现包括: , NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, [6]IN PUNICODE_STRING RegistryPath) : DriverEntry 是系统调用设备驱动程序的入口函数,当协议驱动程序被加载到内存开始运行时它被调用。它初始化驱动程序,注册所有的驱动程序的回调函数,创建虚拟设备,在NDIS结构中定义协议驱动程序。 参数:DriverObject 系统创建的一个协议驱动程序对象 RegisterPath 注册表中与协议驱动有关的注册项的路径 19 返回值:包括一组网卡的串。 , NdisRegisterProtocol:在驱动程序初始化的时候,调用该函数向系统进行登记,将自己注册成一个协议驱动程序。 , NdisOpenAdapter:在驱动程序初始化的时候,调用该函数绑定(BIND)和打开(OPEN)一个或多个网络适配器(Adapter)。 , 在高层应用程序,发出要求绑定协议驱动程序或者要求接收和发送数据包的请求时,协议驱动程序调用以下函数: NPF_BindAdapterHandler:NDIS通过这个函数请求协议驱动程序绑 定到一个底层的NIC(网卡)或者虚拟的NIC NPF_UnbindAdapterHandler:NDIS通过这个函数关闭协议驱动程序 到NIC或者虚拟NIC的连接。 NPF_OpenAdapterCompleteHandler:当协议驱动程序调用 NdisOpenAdapter函数的返回是NDIS_STATUS_PENDING时,这个函数来 指定(Binding)操作完成。 NPF_CloseAdapterCompleteHandler:当协议驱动程序调用 NPF_NdisCloseAdapter函数返回是NDIS_STATUS_PENDING时,这个函数 来指定(Unbinding)操作完成。 NPF_ReceiveHandler:当一个数据包到达时,便调用这个接口进行处 理。 NPF_ReceiveCompleteHandler:指示进行接收的数据是否已经接收 完成。 20 NPF_TransferCompleteHandler:当协议驱动程序调用NdisTransferData函数的返回值是NDIS_STATUS_PENDING,系统调用这个函数指示传送的数据时候已经发送完成。 NPF_SendCompleteHandler:当协议驱动程序调用NdisSend 函数的返回值为NDIS_STATUS_PENDING,系统调用这个函数指示进行发送的数据时候已经发送。 NPF_Read:为用户提供读操作。 NPF_Write:为用户提供写操作。 NPF_IoControl:处理IOCTL操作。 以上所罗列的是协议驱动程序中用到或是实现的主要的几个函数。 4.2 动态连接库程序PACKET.DLL的设计 首先声明一些相关的数据结构: [6] 1. typedef struct _ADAPTER ADAPTER //描述一个网络适配器; 2. typedef struct _PACKET PACKET //描述一组网络数据报的结构; 3. typedef struct NetType NetType //描述网络类型的数据结构; 4. typedef struct npf_if_addr npf_if_addr //描述一个网络适配器的ip地址; 21 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) 一台主机可能又多个网卡,所以在打开哪个网卡进行监听的时候,需要得到主机的网卡列表。所以应用程序在打开网卡前,要先调用这个函数。通过返回值可以得到的网络适配器列表及描述。 22 5> VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer, UINT Length) 在应用程序的监听功能启动时,调用这个函数。给一个_PACKET结构中的,buffer分配空间。 6> LPADAPTER PacketOpetAdapter(LPTSTR AdapterName) 在应用程序的监听功能启动时,根据前面得到的网卡列表,调用这个函数,打开一个网络适配器。 7>BOOLEAN 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) 23 在应用程序的监听功能启动时调用它,为接收到的数据报设置硬件过滤规则。 以下为一些典型的过滤规则: 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) 在应用程序的监听功能启动时调用它,设置在接收到一个数据报后“休息”的时间。 24 4.3 应用程序的结构设计 4.3.1 数据流图 , 全局关联图 (图4.1) 服务器请求连接接受连接 统计数据 开始请求 启动管理功能 显示文本信息 显示图表信息 MySniffer系统结束请求用户 请求列表信息 返回列表信息 启动远程功能 请求过滤信息 显示过滤信息 写入读取设置过滤信息 arp数据包 网络主机监听信息 图4.1全局关联图 用户打开MySniffer 系统,系统以文本方式,图表方式,还有列表方式向用户显示抓包结果。用户还可以给系统设置过滤标准,请求系统执行管理功能和连接功能。系统在监听的时候,不断保存和记录各种信息,以被连接 25 子系统和管理子系统使用。在连接功能启动时,系统将试图与服务器连接,然后返回统计信息到服务器端。 设置过滤信息启动请求监听子系统返回过滤信息结束请求请求过滤信息 统计信息1服务器数据包集合 显示特定数据包统计信息2IP地址集合列表信息 文本信息管理用户1显示子系统请求图表信息信息 图形信息 启动连接连接子系统用户2 启动简单管理管理子系统 数据包 网络主机 图4.2 系统详细关联图 这张图充分表现了,各个子系统之间的详细联系。各其他系统以监听子系统为核心。监听子系统把捕获的数据包,传递给显示子系统来显示信息。监听子系统把记录的受怀疑的网络主机的IP集合传递给管理子系统,实现简单网络管理。监听子系统还记录网络流量的统计信息,传递给连接子系统, 26 连接子系统再把信息传送到服务器端。 , 监听子系统数据流图 读取过滤信息过滤信息 写入过滤信息设置过滤信息设置过滤 请求过滤信息 返回过滤信息数据包过滤控制启动请求开始监听用户1写入 启动控制结束控制监听 结束控制 结束请求 写入统计信息 结束监听 IP地址集合 统计信息读取统计信息1显示子系统 管理子系统 读取信息 连接子系统 图4.5监听子系统数据流图 用户发出启动请求,监听子系统开始监听。监听过程接收过滤信息,然后被系统时钟所触发,每1秒完成一次操作。每次操作过程中,要对数据包进行分析,记录统计信息,捕获的数据包和需要管理的主机ip地址集合,以备显示子系统,管理子系统,和连接子系统使用。 27 , 显示子系统数据流图 读取统计信息1图形信息显示图表信息显示文本信息 请求图表信息统计信息 文本信息用户1 列表信息 读取统计信息2返回查找结果 显示特定数据包 显示列表信息 查找关键字 请求特定包信息数据包集合显示特定包信 息数据包 数据包 图4.4 显示子系统数据流图 用户发出请求文本信息的要求,显示文本信息子活动,从统计信息中读取数据并显示。用户发出请求图表信息的要求,显示图表信息子活动,从文件中读取数据并显示。用户发出请求列表信息的要求,显示列表信息子活动,从统计信息中读取数据并显示。用户发出请求显示特定数据包的要求,显示特定数据包的子活动,从数据包集合中读取数据并显示。 , 管理子系统数据流图 28 监听子系统 IP地址集合 结束控制 启动简单管理用户1启动网络管理网络管理启动控制 数据包 网络主机 图4.5管理子系统数据流图 用户发出启动简单管理请求,启动网络管理子活动打开时钟3。网络管理被时钟3触发,每1秒操作一次。根据IP地址集,给网络上的主机不断发送ARP数据包。 , 连接子系统数据流图 29 统计信息 读取统计信息 开启连接连接 用户1启动连接连接控制 传递统计信息2 服务器 图4.4 连接子系统数据流图 用户发出启动连接请求,开启连接子活动打开时钟2。连接子活动被时钟3触发,每10秒操作一次。根据统计信息,给网络上的服务器不断发送信息。 4.3.2 结构图 , 顶层结构图: 30 主模块 (窗口) 统息计信统计信息IP地址集包集合数据 连接有效计信息统 监听子模块显示子模块连接子模块管理子模块 统计信息 统计信息IP地址集 读取统计传送数据发送数据包信息 图4.7顶层模块图 主模块调用监听,显示,管理,连接子模块。其中管理,连接子模块是 可选的。 , 监听子系统结构图(图4.8) 31 监听子系统 过滤息信数据包 统信计息 写入数据包查看过滤信息写入统计信息设置过滤信息监听集合 图4.8监听子系统模块图 监听子系统调用监听,设置和查看过滤信息,写入统计和数据包集合信息。监听子系统调用监听模块获得统计信息和数据包,并把它们写入相应的存储区域。 , 显示子系统结构图(图4.9) 32 显示子系统 统信息计 显示文本显示图表显示列表显示特定信息信息信息数据包信息 数据包集合 特数据包定统计信息 读取统计文读取数据包件中的信息集合信息 图4.9显示子系统模块图 显示子系统调用显示文本,图表,列表,特定数据包信息四个子模块。后三个子模块是可选模块,根据用户需要,调用它们。显示文本信息子模块由程序内部获得统计信息。显示图表模块从文件中获得不同时间不同的统计信息。显示列表信息和显示特定数据包信息子模块从数据包集合中获得数据。 , 管理子系统结构图,连接子系统结构图。这两个子系统结构实现难度大,但是结构比较简单,所以在顶层模块图中就显示了他们内部的模块调用结构。 33 4.3.3 源码分析 a) 主要数据结构:见附录1 b) 主要全局变量: static LPADAPTER lpadapter; //指向描述网络适配器实例的结构的指针; static LPPACKET lppacketr; //指向描述一组网络数据报的结构的指针; static char packet_array[1024][1024];//应用程序中存放数据包的缓冲区 static char recvbuf[1024*250];//协议驱动程序存放数据包的缓冲区 static DWORD auto_ip[255];//存放需要被管理的主机的ip地址 c) 监听模块: , void Sniff(): 功能:获取数据包 算法: 循环一百次调用PacketReceivePacket函数,如果成功开始分析数据包(即调用GetData函数)。 34 i=0 false i<100 返回 true调用Packet ReceivePacket弹出对话框false成功 调用GetData i++ , void GetData(LPPACKET lp) 功能:分析捕获的数据包,写入统计信息,写入数据包集合,写入主机 IP集合 参数:指向描述一组网络数据报的结构的指针; 算法: 35 偏移量off=0 buf指向接收缓冲 区的首部 true Off<接收到的 字节数eth=(PETHDR)pC har; 数据包ip pChar指向报头 false 数据包arp false falseTrue Ip_count++ ipxArp arp_count++ Truefalseipx_count++ Off=Off+当前数据 包长度 36 返回 TrueIp_count++ Icmptcpfalseudpfalse Trueudp_count++Truetcp_count++turefalseicmp_count++dns ftpTruefalseOspfdns_count++ TruefalseNetbiosftp_count++ httptruefalsenetbios++ Truefalsehttp_count++监听 telnet true TruefalseTelnet_count++ 记录监听ip smtp TrueFalsesmtp_count++ 监听 true 记录监听ip false trueospf_count++ 37 True spx_count++ SpxRipfalse falseTrue ture rip_count++ , class FilterDlg : public CDialog {// Construction public: FilterDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(FilterDlg) enum { IDD = IDD_DEFINE_FILTER }; BOOL m_arp,m_dns,m_ftp,m_icmp,m_http,m_ip,m_ipx, m_netbios; 38 BOOL m_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 // Implementation protected: // 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_MSG 39 DECLARE_MESSAGE_MAP() }; 功能:设置过滤信息 算法:通过一系列的checkbox控件,我们来决定需要对那些控件进行过滤。比如tcp控件被选中我们就要对tcp协议进行过滤,否则就掠过tcp协议。但是在我们选择tcp协议的同时ip协议也一定会被选上,所以他们之间存在一定的关联关系。 if( m_tcp == 1 ) { m_ip = 1; } else { m_ftp = 0; m_smtp = 0; m_http = 0; m_telnet = 0; } 我们以上面的代码为例讨论这个问题,当tcp被选中时ip也被选中,当tcp被取消时它的高层协议如ftp,http都会被取消。其他的代码也都是 40 仿照tcp的原则来写的。 d) 显示模块: , void ShowPacketCount(CDC *pDC); 功能:调用该函数显示数据包的总量和各种协议数据包的分量信息 算法:利用统计信息,把统计信息打印出来。 , void ShowGraphic(CDC *pDC); 功能:调用该函数显示数据包的图表信息 算法:读取在不同时间点上,记录在文件中的统计信息,然后以时间为横轴,百分比为纵轴把统计信息显示在视图上。 , void ShowConnection(CDC *pDC); 功能:调用该函数显示网络中存在通讯的节点之间的联系 算法:从packet_array数据包接收缓冲区中,倒序查找十个数据包,如果数据包类型为tcp,udp,icmp那么就认为数据包的源和目的主机之间存在着通讯关系,于是就把他们的源和目的地址展现在视图上。 , class MyDlg : public CDialog { public: void SetData(char p[][1024],int c); 41 MyDlg(CWnd* pParent = NULL); // standard constructor int IndexInFieldList;//记录被选择需要详细显示的数据包的序号 TreeDlg m_treedlg; //树行显示数据包的对话框 PVOID packet; //指向数据包数组packet_arry的指针 int count; //数据包数组中数据包的个数 // Dialog Data //{{AFX_DATA(MyDlg) enum { IDD = IDD_DIALOG }; CListCtrl m_listCtrl; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(MyDlg) public: virtual int DoModal(); 42 protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(MyDlg) virtual BOOL OnInitDialog(); //对话框的初始化函数 afx_msg void OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult); //选择需要详细显示的数据包时触发的函数 afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; 功能:该类用来显示数据包的列表信息 算法:首先在实例化该类的时候我们要把packet_array数据包接收缓冲 区的指针传给PVOID packet,通过packet指针我们解析每一个数据包,然后 把它们的信息以列表形式展现在用户面前。对数据包的解析算法基本上和 43 GetData中的算法相似所以这里就不再重复了。 该类中void OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)函数的作用是当用户想更加细致地了解数据包地情况下,双击列表中地某一个数据包,那么它会实例化class TreeDlg类,来显示数据包地详细信息。 , class TreeDlg : public CDialog {// Construction public: void SetData(char *p); TreeDlg(CWnd* pParent = NULL); // standard constructor HTREEITEM m_hRoot; //树行结构的根节点 char *packet; //指向需要详细显示数据包的指针 // Dialog Data //{{AFX_DATA(TreeDlg) enum { IDD = IDD_TREE_VIEW }; CTreeCtrl m_tree; CString m_str; CString m_substr; 44 //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(TreeDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(TreeDlg) virtual BOOL OnInitDialog(); afx_msg void OnSelchangingTree(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnFind(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; 功能:显示某一个数据包地具体信息,数据包包头信息以树形结构表现 45 出来,同时提供查找功能,当我们输入一个字符串地时候,可以找到这个字符串的前几个字符,字符串本身,后几个字符。 算法:当MyDlg调用TreeDlg时就把要具体显示的数据包在缓冲区中的位置(通过 int IndexInFieldList)告诉了TreeDlg这个类,TreeDlg通过该整型数据找到数据包在缓冲区中的位置,然后设置指针指向该区域。有了指向数据包的指针之后,我们解析这个数据包,然后把网络各层的数据包包头信息转换成字符串形式,最后显示出来。 CString m_str;//把整个数据包可打印的信息存放在该字符串中 CString m_substr;//需要查找的子串 void OnFind();//完成查找任务 e) 连接模块: 功能:这个模块主要分为客户端和服务器端,客户端内容比较重要,它主动去连接服务器来传输数据。服务器端指做了简单的功能,侦听,接收连接,接收数据,显示数据。 算法: , 客户端: UINT ThreadConnect(LPVOID pParam) { struct transfer_data *data; data = (struct transfer_data *)pParam;//获得被传送数据的指 46 针 ……………………//连接服务器,并把数据传送过去 } static void CALLBACK EXPORT Connect( HWND hWnd, // handle of CWnd that called SetTimer UINT nMsg, // WM_TIMER UINT nIDEvent , // timer identification DWORD dwTime // system time ) { data.total_count = total_count; data.ip_count = ip_count; data.tcp_count = tcp_count;//对被传送数据进行赋值 ……………. AfxBeginThread(ThreadConnect,PVOID(&data));//启动新线程去 完成数据传送任务 } 47 void CList2View::OnConnect() { …………………… SetTimer(3,10000,Connect);//打开时钟3,用时钟触发连接函数 ………………… } , 服务器端: int main(){ ………………… sock=socket(PF_INET,SOCK_STREAM,0); //创建侦听套接字 …………………… bind(sock,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr)) //与选定的端口绑定 …………………… listen(sock,5);//侦听 while(1) { …………… 48 if((sock_accept=accept(sock,(LPSOCKADDR)&m_sockServerAddr,0))==INVALID_SOCKET)//创建连接套接字 if(recv(sock_accept,(char*)&data,sizeof(struct transfer_data),0) == SOCKET_ERROR)//接收数据 ……………… closesocket(sock_accept);//关闭连接套接字 } closesocket(sock);//关闭侦听套接字 } 管理模块: f) , void OnAuto() 功能:打开管理功能 算法: 创建CAutoDlg 类,获得本网段地址,和所需要监听的端口。 启动时钟2,设置时钟2的回调函数为AutoCtrl。 , class CAutoDlg : public CDialog { …………………… 49 public: CIPAddressCtrl m_ip; CString m_port; //需要被管理的端口 virtual BOOL OnInitDialog(); afx_msg void OnPaint(); …………………………… }; 功能:从用户的输入需要被管理的端口 算法:把端口值传递给全局变量m_auto_port , static void CALLBACK EXPORT AutoCtrl( HWND hWnd, // handle of CWnd that called SetTimer UINT nMsg, // WM_TIMER UINT nIDEvent , // timer identification DWORD dwTime // system time ) 功能:根据GetData中记录的需要被管理的ip地址集,发送arp和rarp 数据包给各个主机中断它们与外界的联系。 算法: 伪造arp数据包,包括arp-request,arp-relay,并发送。 50 //开始监听,并打开网卡 …………………… lpadapter=PacketOpenAdapter(adapterlist[open-1]); lppacket=PacketAllocatePacket() …………………… for(i=0;i<255;i++) { if(auto_ip[i] != 0) { //构造arp-reply欺骗数据包 ………………… PacketInitPacket(lppacket, szPacketBuf, 50); //构造arp-request欺骗数据包 ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); memcpy(eth.eh_dst, DstMac, 5); //目标MAC memcpy(eth.eh_src, SrcMac, 5); //发送方MAC 51 ……………………… memcpy(szPacketBuf, (char*)ð, sizeof(eth)); memcpy(szPacketBuf+sizeof(eth), (char*)&arpr, sizeof(arpr)); PacketInitPacket(lppacket, szPacketBuf, 50); //发送数据包 PacketSetNumWrites(lpadapter, 2) PacketSendPacket(lpadapter, lppacket, TRUE)==FALSE) } } …………………… 4.4 系统特色 本系统的主要两个特色就是分布式网络监听和简单网络管理。 4.4.1 分布式网络监听 由于交换式局域网的存在和普通监听技术只对同一网段的主机有效的 52 缺陷,使监听技术的能力受到了很大的影响。为了能够扩大网络监听的范围,诊断不同网络中问题,我认为我们应该把每一个网络监听工具作为一个客户端,然后把各个客户端程序安装到不同网段的网关上。这样每个客户端都可以监听到本网段的信息,最后每个客户端把各自的监听信息发送到一个监听服务器上。这样我们就可以获取不同网段上的网络信息了。但是在跨越不同网段的时候我们又会遇到防火墙或是入侵检测系统的过滤,我个人认为如果我们从开放服务器的80端口,然后把客户端要传送的数据封装在HTTP协议的数据包内,这样一般就可以穿透绝大多数的防火墙了。 4.4.2 简单网络管理 选择需要被管理的端口,根据一些信息截断节点与外界的联系。网络蠕虫病毒泛滥,所以如果我们在觉察到某台机器中毒并不断攻击其他主机时,我们可以向他们发送伪造的arp-request和arp-relay数据包,让他们的IP冲突,而且发出的数据包被定位到错误的或者不存在的网关地址。这样部分被感染主机无法和网络连接,或把威胁限制在一个网段内了。 53 第5章 系统测试与使用说明书 5.1 系统测试 系统采取黑盒测试的方法,即已知系统的功能设计规格,对每个实现了的功能进行测试,观察是否符合要求。下面就按各个子系统的,测试它们的功能是否满足了要求。 5.1.1 监听功能 测试用例: , 打开监听工具MySniffer,开始监听。测试能否能够捕获网络中的数据 包 , 设置过滤信息,测试过滤信息是否由效 测试结果: , 通过显示子系统的几个功能,证明系统成功捕获数据包。 , 图5.1表现如何进行设置过滤信息,同样当设置了需要过滤的协议时, 系统只捕获与这些协议有关的数据包,而丢弃无关的数据包。 54 图5.1设置过滤信息截图 5.1.2 显示功能 测试用例: , 测试能否用文本信息显示网络流量的统计信息,包括总量,分量,百分比,通讯情况信息。如果能以文本方式正确显示流量信息,说明测试成功, 否则失败。 , 测试能否用图表信息显示统计信息,观察各种流量在最近时间能的变化幅度。如果能正确显示流量信息,说明测试成功,否则失败。 , 测试能否用列表方式显示数据包的概要信息,检验各种概要信息是否准 55 确,详细。如果概要信息准确,说明测试成功,否则失败。 , 测试能否用树形方式显示特定数据包的详细信息,检验各个包头信息解析的是否正确。如果各个字段正确,说明测试成功,否则失败。 , 测试能否在特定数据包中查找到关键字和关键字附近的字符。我们使用user关键字来查找。如果数据包中存在user字符串,且查找到说明测试成功,否则失败。 测试结果: , 用文本方式显示统计信息的结果,如图示5.2: 图5.2 用文本方式显示统计信息的截图 , 用图表方式显示统计信息的结果,如图示5.3: 56 图5.3 用图表方式显示统计信息的截图 , 用列表方式显示数据包的概要信息的测试结果,如图示5.4: 图5.4 用列表方式显示数据包的截图 , 用树形方式显示特定数据包的详细信息的结果,如图示5.5: 57 , 查找关键字的结果,我们在一个FTP数据包中得到用户名b00015007这 个帐号,加蓝色的字段就是用户名在特定数据包中如图示5.5:(图5.5 用树形方式显示特定数据包的截图) 5.1.2 管理功能 测试用例: 在指定端口号之后,系统能否让指定的主机断网。点击auto菜单项,把对话框中的端口地址设置为21,这样系统将记录局域网内所有使用FTP应用程序的主机IP。然后在202.117.21.21主机上打开FTP,连接地址为202.117.21.6的ftp服务器。如果主机造成IP冲突并且断网说明测试成功,否则失败。 测试结果: 58 在202.117.21.21主机的右下角出现,IP冲突的提示,而且FTP连接也中断了,如图5.6。所以证明管理功能成功完成任务。 图5.6管理功能测试结果截图 5.1.3 连接功能 测试用例: 测试客户端到服务器间能否通讯。首先打开服务器应用程序,然后点击客户端的connect菜单项,设置远程服务器的IP和端口,开始连接操作。观察服务器端是否能收到客户端发来的信息。如果可以成功显示客户端的信息,则说明测试成功,否则测试失败。 测试结果: 服务器端每十秒种收到客户端发来的监听得到的统计信息。由红色的两个圈可以证明数据成功地从客户端传送到服务器端。客户端的信息如图5.7,服务器端的信息如图5.8: 59 图5.7 客户端截图 60 图5.8 服务器截图 5.2 工具软件的配置 , 软件运行硬件环境: CPU(inter Pentium 4),RAM(512M),网卡,Ethernet802.3(局域网) , 软件运行软件环境: 操作系统(WINDOWS-XP或者WINDOWS-2000),安装WINPCAP开发包 , 软件开发平台: VC++.net集成开放环境 61 5.3 监听工具的使用 , 点击工具栏中的三角形按钮开始监听(或者选择菜单栏中start选项),点击工具栏中的正方形按钮结束监听(或者选择菜单栏中stop选项)。 , 监听进行过程中,视图默认显示文本信息,如果要显示图表信息,要先结束监听然后选择菜单栏中View菜单项的子菜单项Graphic。 , 如果要显示系统的列表信息,在结束监听状态下,选择Display菜单项。 , 如果要获得某个特定数据包的详细信息,在列表对话框中双击所要查看的数据包,数据包的详细信息就会以树形方式展现在您面前。 , 如果要实现管理功能,在监听状态下点击auto菜单项,输入必要信息,开始管理。再点击一下就结束管理功能 , 如果要实现分布式监听,则首先打开服务器程序,然后在客户端选择connect菜单项,客户端就把信息传送给服务器端,再点击一下结束数据传送。 62 63 结 论 系统的不足和改进 MySniffer软件基本上完成了一个网络监听工具,所要完成的基本功能,但是它还有很多不足之处 1. 无法实现跨平台性 本文主要论述了如何在windowsNT,2000,xp系统下实现网络监听技术,这种开发方法无法在Unix和linux系统中实现网络监听,甚至不能直接移植到windows98上。在Unix和Linux通常情况下我们采用Libpcap库来实现。Libcap实质上是一个系统独立的API函数接口,用于用户层次的数据包截获工作。它为底层网络监听编程提供了一个易于移植的应用程序框架,底层操作包括数据包的截获和网络调试。Libpcap接口是基于BPF [7](Berkeley Packet Filter)数据包过滤机制。Libpcap库只支持BPF接口的内核过滤。如果主机上没有BPF机制,所有的数据包都必须读取到用户应用程序的空间后,才能进行操作,这样将导致性能严重下降,可能会有丢包的问题出现。对于windows98来说,我们只要替换用一个虚拟协议驱动替代现在的wdm协议驱动程序就可以了。 2. 无法在交换式以太网实现监听 用交换机来代替HUB,原先的共享式以太网就变成了交换式以太网,Switch不会把数据包在端口进行广播,它通过自己的ARP缓存来决定数据包 64 传输到哪个端口上。因此如果A,B主机在不同端口处Pa,Pb,A就没有办法监听到B的数据包。 因为Switch上的arp表是动态变化的,所以我们如果能够伪造一个ARP数据包包含B的MAC地址,然后从A发送出去,那么Switch就错误得认为Pa-MACb有对应关系,所以它就会把数据包发送到Pa端口,那么A就能监听到B的信息。但是还存在一个问题,就是这样做将影响B正常的网络通讯。暂时没有想出更好的办法。 3. 网络管理子系统的不足 MySniffer中的管理功能,其实设计不是很合理,针对端口进行判断主机是否存在安全问题,显然十分武断,那些开启合理服务的主机也将会被怀疑。其实原本的想法是建立一个病毒特征库对网络中数据包进行比对,发现有问题的数据包后,再对主机采取一定的措施。可能有人会认为这样的工作方式,一台管理服务器或者是网关服务器无法胜任大量的网络处理。性能的确是问题,但是我们还可以把任务分担到多台服务器上,不同服务器针对不同协议或者不同长度的数据包进行过滤。 4. 连接子系统的不足 MySniffer中的连接子系统也还不很理想,只是一种思想而已。因为在C/S结构下,只是简单的传输数据显然是很消极的管理方式,如果能采取主动的管理方式就会更加合理。比如采用SNMPV3协议实现分布式监听工具 65 的网络管理,将使系统更加紧凑。 反监听技术 1. 检测网络监听的手段 对发生在局域网的其他主机上的监听,一直以来,都缺乏很好的检测方法。这是由于产生网络监听行为的主机在工作时总是不做声的收集数据包,几乎不会主动发出任何信息。但目前网上已经有了一些解决这个问题的思路和产品: , 利用ping模式进行监测 当一台主机进入混杂模式时,以太网的网卡会将所有不属于他的数据照单全收;向局域网内的主机发送非广播方式的,MAC地址不等于局域网内任何主机的硬件地址的icmp包,所以它不会去对比数据包的硬件地址,而是将数据包直接传到上层,上层检查数据包的ip地址,符合自己的ip,于是会对对这个ping的包做出回应。这样,一台处于网络监听模式的主机就被发现了。 , 利用arp数据包进行监测 除了使用ping进行监测外,目前比较成熟的有利用arp方式进行监测的。这种模式是上述ping方式的一种变体,它使用arp数据包替代了上述的icmp数据包。向局域网内的主机发送非广播方式的arp包,如果局域网内的某个主机响应了这个arp请求,那 么我们就可以判断它很可能就是处于网络监听模式了,这是目前相对而言比较好的监测模式。 66 2. 防范网络监听的手段 上面我们知道,监听是发生在以太网内的,那么,很明显,首先就要确保以太网的整体安全性,因为监听行为要想发生,一个最重要的前提条件就是以太网内部的一台有漏洞的主机被攻破,只有利用被攻破的主机,才能进行监听,去收集以太网内敏感的数据信息。 其次,采用加密手段也是一个很好的办法,因为如果监听工具抓取到的数据都是以密文传输的,那对入侵者即使抓取到了传输的数据信息,意义也是不大的-比如作为telnet,ftp等安全替代产品目前采用ssh2还是安全的。这是目前相对而言使用较多的手段之一,在实际应用中往往是指替换掉不安全的采用明文传输数据的服务,如在server端用ssh,openssh等替换unix系统自带的telnet,ftp,rsh,在client端使用securecrt,sshtransfer替代telnet, ftp等。 除了加密外,使用交换机目前也是一个应用比较多的方式,不同于工作在第一层的hub,交换机是工作在二层,也就是说数据链路层的。对二层设备而言,仅有两种情况会发送广播报文,一是数据报的目的MAC地址不在交换机维护的数据库中,此时报文向所有端口转发,二是报文本身就是广播报文。由此,我们可以看到,这在很大程度上解决了网络监听的困扰。 此外,对安全性要求比较高的情况可以考虑kerberos,kerberos是一种为网络通信提供可信第三方服务的面向开放系统的认证机制,它提供了一种强加密机制使client端和server即使在非安全的网络连接环境中也能确认彼 67 此的身份,而且在双方通过身份认证后,后续的所有通讯也是被加密的。 虽然上述的安全措施可以防范网络监听,但是网络监听对安全威胁至今任存在的原因是它能获得主机之间的信任关系,通过信任链从事渗透入侵将是非常难以追踪和觉察的。 68 69 致谢: 感谢在整个毕业设计的过程中,我的指导老师冯博琴老师和夏秦老师的大力帮助。刚开始,以前没有接触过网络设备,所以在进行网络实验的配置过程中存在很大的困难。冯老师和夏老师给认真细致地教我们网络实验地各种原理,还帮助我们完成网络实验中遇到地困难。在软件开发地过程中冯老师和夏老师不断询问我在软件开发中遇到地问题,给予我很多地意见和建议,使我少走了不少弯路。最后在论文的撰写过程中,夏秦老师悉心地给我修改论文地框架和内容,在大方向上帮助我确定了论文地主题。在此,还感谢昂正全在组网过程中的帮助。昂正全同学认真,踏实的工作态度,让我钦佩不已。我们一起完成了数十个网络实验,共同讨论编程中的困难,克服一个又一个难题,在工作的过程中建立了深深的友情。 70 参考文献: [1]. 《网络侦听器的实现及其优化》 李少凡,汪为农 上海交通大学学报1998年10期 [2]. 《用原始套接字实现网络监听》 张志强 [3]. 基于IMD的包过滤防火墙原理与实现 [4]. 《基于Winpcap的网络嗅探程序设计》庄春兴, 彭奇志 计算机与现代化2002年05期 [5]. Winpcap源代码 [6]. [7]. 《网络嗅探器Sniffer软件源代码浅析3:采用Libpcap 库的通用设计》 唐正军, 刘代志. 计算机工程 2002年02期 [8]. 《计算机网络》 清华大学出版社 [9]. 《网络编程与开发技术》 西安交通大学出版社 [10]. 《思科网络技术学院教程》人民邮电出版社 [11]. 《防火墙原理与实用技术》北京启明星辰信息技术有限公司编著,北京电子工业出版社 2002 [12]. 《TCP/IP 详解 卷1 协议》史蒂文斯 Shi Di Wen Si (Stevens, W.Richard) 著 北京 机械工业出版社 2000 71 72 附录1 typedef struct ethdr { unsigned char eh_dst[6]; //以太网目的地址6 unsigned char eh_src[6]; //以太网源地址6 unsigned short eh_type; //帧类型2 }ETHDR,*PETHDR; typedef struct arphdr { unsigned short arp_hdr; ///硬件类型 unsigned short arp_pro; //协议类型 unsigned char arp_hln; //硬件地址长度 unsigned char arp_pln; //协议地址长度 unsigned short arp_opt; // 请求还是应答 unsigned char arp_sha[6]; //发送者硬件地址 unsigned long arp_spa; //发送者IP地址 unsigned char arp_tha[6]; //目的硬件地址 unsigned long arp_tpa; //目的IP地址 //填充字段 }ARPHDR,*PARPHDR; 73 typedef struct iphdr { unsigned char h_lenver; //版本号 (4位) IP头长度 (4位) unsigned char tos; //服务类型 (8位) unsigned short total_len; //数据包长度 (16位) unsigned short ident; //标识段 (16位) unsigned short frag_and_flags; //标志段 (16位) unsigned char ttl; //生存时间 (8位) unsigned char protocol; //传输协议 (8位) unsigned short checksum; //头校验和 (16位) unsigned int sourceip; //发送地址 (32位) unsigned int destip; //目标地址 (32位) }IPHDR,*PIPHDR; typedef struct tcphdr //定义TCP首部 { USHORT source_port; //16位源端口 USHORT dest_port; //16位目的端口 unsigned int seq; //32位序列号 unsigned int ack; //32位确认号 unsigned char lenres; //4位首部长度/6位保留字 74 unsigned char flag; //6位标志位 USHORT win; //16位窗口大小 USHORT sum; //16位校验和 USHORT urp; //16位紧急数据偏移量 }TCPHDR,*PTCPHDR; typedef struct udphdr //定义UDP首部 { unsigned short source_port; //16位源端口 unsigned short dest_port; //16位目的端口 unsigned short len; //16位长度 unsigned short sum; //16位校验和 } UDPHDR,*PUDPHDR; typedef struct icmphdr //定义ICMP首部 { BYTE type; //8位类型 BYTE code; //8位代码 USHORT checksum; //16位校验和 USHORT id; //识别号(一般用进程号作为识别号) 75 USHORT seq; //报文序列号 ULONG timestamp; //时间戳 }ICMPHDR,*PICMPHDR; typedef struct llchdr { unsigned char dsap; unsigned char ssap; unsigned char unnumbered_frame; }LLCHDR,*PLLCHDR; typedef struct ipxhdr { unsigned short checksum; unsigned short lenth; unsigned char transport_control; unsigned char type; unsigned char dest[12]; unsigned char source[12]; }IPXHDR,*PIPXHDR; struct sockaddr_in{ short sin_family; unsigned short sin_port; 76 struct in_addr sin_addr; char sin_zero[8]; }; typedef struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; } in_addr; typedef struct _ADAPTER { HANDLE hFile; CHAR SymbolicLink[MAX_LINK_NAME_LENGTH]; int NumWrites; HANDLE ReadEvent; UINT ReadTimeOut; } ADAPTER, *LPADAPTER; typedef struct _PACKET { 77 HANDLE hEvent; OVERLAPPED OverLapped; PVOID Buffer; UINT Length; DWORD ulBytesReceived; BOOLEAN bIoComplete; } PACKET, *LPPACKET; 78
/
本文档为【网络监听技术是系统安全领域内一个非常敏感的话题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索