计算机网络监听技术设计.docx
- 文档编号:4793111
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:41
- 大小:716.57KB
计算机网络监听技术设计.docx
《计算机网络监听技术设计.docx》由会员分享,可在线阅读,更多相关《计算机网络监听技术设计.docx(41页珍藏版)》请在冰豆网上搜索。
计算机网络监听技术设计
计算机网络监听技术设计
系统目标
本课设从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术和标准,模拟仿真了一组网络实验。
为了能够检验实验的结果,我们开发了这个网络监听工具,帮助实验人员对网络中的信息进行实时的监测、分析,诊断网络故障。
同时通过该毕业设计的容,让我们了解各种抓包技术,熟练掌握基于Winpcap开发包的编程模式;了解网络监听技术的新发展和网络安全防的新方向;最后能有所体会。
1.1相关理论与技术的简单介绍
1.2.1网络监听原理
共享式局域网采用的是广播信道,也就是说每台主机所发出的帧都会被整个网络的所有主机接收到[1]。
接收主机对帧的处理根据网卡的工作模式来实现。
一般网卡具有一下4种工作模式:
广播模式,多播模式,直播模式和混杂模式。
网卡缺省工作模式是工作在广播和直播模式下的,即只能接收发送给自己和广播的帧。
正常情况下接收主机的网卡根据帧中所包含的目标MAC地址或是广播MAC地址进行判断,若等于自己的MAC地址或是广播MAC地址,则提交给上层处理程序,否则丢弃此数据包。
当网卡处于混杂模式的时候,它不作任何判断直接把接收到的所有帧交给上层处理程序。
网络监听技术就是基于这个原理,来捕获网络中所有的数据包,实现网络监测和流量分析的。
交换式以太网是基于数据链路层的点到点的信道,所以简单采用应用于共享式以太网的监听技术是完全失效的。
本文主要讨论共享式以太网的情况,最后给出交换式以太网监听难题的解决方案。
1.2.2监听技术相关的实现方法
●原始套接字编程模式[2]:
RawSocket:
原始套接字
可以用它来发送和接收IP层以上的原始数据包,如ICMP,TCP,UDP...
1.创建了一个RawSocket
intsockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
2.把网卡置于混杂模式
用RawSocket实现代码如下:
setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
设置IP头操作选项。
flag标志是用来设置IP头操作的,boolflag=ture也就是说要亲自处理IP头。
bind(sockRaw,(PSOCKADDR)&addrLocal,sizeof(addrLocal);
把sockRaw绑定到本地网卡上,addrLocal为本地地址:
SOCKADDR_INaddrLocal。
ioctlsocket(sockRaw,SIO_RCVALL,&dwValue);
让sockRaw接受所有的数据。
dwValue为输入输出参数,为1时执行,0时取消:
DWORDdwValue=1;
3.捕获数据包
recv(sockRaw,RecvBuf,BUFFER_SIZE,0);//接受任意数据包
原始套接字编程模式:
优点:
实现简单,不需要做驱动程序就可实现抓包.
缺点:
数据不含帧信息,不能接收到与IP同层的其它数据包,如ARP,RARP,IPX…
●IMD中间层驱动编程模式[3]:
中间层驱动(NDISintermediatedriver)
1.核级网络驱动介绍:
MicrosoftWindows2000支持三种基本的核级网络驱动,这三层driver顺序从下到上依次为:
a)MiniportNICdrivers:
微端口网卡驱动,位于最底层,直接操纵网卡并且对高层驱动提供接口。
b)Intermediatedrivers:
IMD中间层驱动位于1和3之间。
c)Protocoldrivers:
高层协议驱动,俗称为TDI(传输驱动程序接口),高于前面两层,直接面向用户级,为用户提供网络服务,也就是绝大多数程序所用到的网络接口。
2.IMD驱动
IMD中间层,它的实质很简单,即:
中间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,而对下面的网卡则表现为一个协议层的结构。
所以,无论是网卡接收并上传的数据报,还是上层要下送至网卡发送的数据报,无一例外地要经过中间层。
3.IMD包过滤技术
前面我们已经看到,所有的数据报都要经过中间层,所以,我们可以在中间层加入我们想要过滤的数据报的特征,实现基于中间层驱动的核级包过滤。
优势:
首先,在驱动级别上做过滤,无须组包,速度快,效率自然就高;其次,所有的数据报无一例外,只要网卡上传的数据报均可以截获,避免了用户级无法得到所有数据报的缺点。
缺点:
IMD包过滤技术也存在其不可避免的缺点,与操作系统版本关系密切,与硬件联系大,可移植性低,调试困难。
●Winpcap编程模式
Winpcap(windowspacketcapture)是windows平台下一个免费,公共的网络访问系统。
开发Winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项
功能:
1.捕获原始数据报,包括在共享式网络上各主机发送/接收的以及相互之间交换的数据报;
2.在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3.在网络上发送原始的数据报;
4.收集网络通信过程中的统计信息。
不足:
Winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。
也就是说,Winpcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。
因此,它不能用于QoS调度程序或个人防火墙。
目前,Winpcap开发的主要对象是windowsNT/2000/XP,这主要是因为在使用Winpcap的用户中只有一小部分是仅使用windows95/98/Me,并且M$也已经放弃了对win9x的开发。
其实Winpcap中的面向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使用Unicode编码。
1.2系统需求
●能够捕获所需要的所有以太网数据包
●分析捕获的包类型,报文信息
●数据形式显示当前以太网中数据包的分布情况
●图表形式显示当前以太网中数据包的分布情况
●能表现网络中各个节点的相互通讯情况
●可以保存数据到文件
●在数据包中查找敏感信息(匹配关键字)
●具备简单的网络管理功能
●实现简单的分布式监听
第2章基于Winpcap开发的技术详解
讨论了各种不同的编程模式之后,本章将阐明我们选择Winpcap技术的原因,然后将对Winpcap做详细的分析。
2.1选用Winpcap技术的原因:
●提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具
●原始套接字的编程模式中不能捕获ARP和IPX的数据包对SNIFFER软件有着致命的限制,所以不能选择这种方法。
●IMD编程模式虽然功能强大,而且灵活性强,但是开发调试难度比较大,不适合作为SNIFFER软件的开发模式,甚至在防火墙开发技术中也不用IMD。
●WINPCAP本身不能阻塞,过滤或控制其他应用程序数据报的发收的缺点在我们这个软件的开发过程中,并不影响。
所以经过权衡,我选用了Winpcap编程模式来开发MySniffer软件。
2.2Winpcap的结构分析
Winpcap的主要思想来源于Unix系统中著名的BSD包捕获结构,它的基本结构如图2.1所示:
整个包捕获框架的基础是NDIS(网络驱动器接口规),它是Windows中最低端的与联网有关的软件,主要是为各种应用协议与网卡之间提供的一套接口函数。
Winpcap由三个模块组成,一个是工作在核级别上的NPF包过滤器;另外两个是用户级的动态连接库packet.dll和wpcap.dll[4]。
wpcap.dll是packet.dll的上一层封装,提供了编程的高级接口。
为了能更好的了解Winpcap的工作原理,我选用了packet.dll作为程序对底层访问的接口。
因为基于Winpcap开发涉及到驱动程序开发技术,dll动态连接库开发技术,和vc的MFC应用程序开发技术,所以将对它们做一些介绍。
图2.1Winpcap及NPF的结构图[5]
2.3NDIS驱动开发技术
网络驱动程序使用ISO的开放的系统互连网罗标准(OSI),这是一个七层的模型,它的顶层是应用软件层,底层是硬件连接和网络的拓扑结构,网络接口卡(NIC)给大多数的平台提供网络的硬件接口,网络驱动程序是写给指定的NIC的驱动程序。
网络驱动程序接口规(NDIS)给NIC驱动程序提供库支持,通常只允许NIC厂商提供管理硬件特殊细节的MINI驱动程序,更高层的NDIS(中间驱动程序,协议驱动程序)在需要的时候提供媒体转换,过滤。
分层的NDIS如图2所示。
WIN2000提供一个分层的核模式软件传输驱动接口(TDI),这个分层的在NDIS层和高层软件抽象像插座和NetBIOS,TDI层使WIN2000的高层结构具有更多的可移植性。
图2.网络驱动程序接口规
2.4DLL动态连接库技术
DLL(DynamicLinkableLibrary)文件通常是一个具有独立功能的程序模块,可以进行单独编译和测试。
在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到存空间中。
这种方式不仅减少了EXE文件的大小和对存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用,只是增加DLL的计数。
当应用程序卸载DLL时,计数则减少,计数为0时DLL就从存被释放。
PACKET.DLL就是为上层应用程序开发的,提供操作网卡的模块;而且它屏蔽应用程序直接操作底层协议驱动程序的复杂性。
所以应用程序可以使用PACKET.DLL所提供地接口函数,安全简单的操作协议驱动程序,使应用程序更加健壮。
第3章系统功能描述
这个网络监听工具虽然不是很庞大,但是有几个功能比较明确,也就是监听功能,显示功能,管理功能,连接功能,所以我把它们划分为四个子系统,来实现。
3.1监听子系统
监听子系统再划分为三个功能,捕获功能,过滤功能,保存功能;三个功能描述如下:
●捕获功能
根据过滤器的设置,捕获ip,arp,ipx,tcp,udp,ospf,icmp,spx,ipx-rip等数据包,并把数据包保存在应用程序的缓冲区。
●过滤功能
用户自己定义过滤信息(特定协议进行捕获),也就说用户可能只需要了解网络中某种类型的数据包的信息,而不需要捕获太多无用的数据,一方面系统负担比较大,另一方面干扰信息过多不利于用户发现网络中存在的问题。
●保存功能
在捕获的过程中,每十秒钟,把统计信息写入文件中,等待图表显示功能模块提取信息。
保存功能还根据管理功能的需要,保存数据。
如果管理功能被启动,系统将满足管理要求的主机IP地址,记录在IP数据集合中。
等待管理子系统从中提取IP地址,实现管理功能。
3.2显示子系统
显示子系统可再划分为五个功能,总量显示功能,分量显示功能,通讯显示功能,列表显示功能,树形显示功能。
这些功能的详细描述如下:
●总量显示功能
在抓包过程中显示捕获数据包的总量,也就是从开始监听一直到结束,捕获的说有数据包的数量。
●分量显示功能
在抓包过程中显示各种数据包的分量,以及它们在总量中比例(百分比显示)各种数据包的百分比是指,某种类型的数据包除以捕获的数据包的总量。
●通讯显示功能
用直观的方法表示当前各个节点的通讯对象,如果双方存在TCP,UDP,ICMP数据包的往来我们就认为他们之间存在着通讯,然后我们记录他们的信息,并显示在屏幕上。
●列表显示功能
在抓包终止后,显示捕获的数据包的信息。
包括:
包的次序,包的源和目的地址(ip数据包显示ip地址,arp数据包显示mac地址,ipx数据包显示ipx的地址形式)包的长度,包的简要说明
●树形显示功能
可以指定一个数据包,并显示它的详细容,信息,首先判断是网络层中的哪种类型数据包,其次判断是传输层中的哪种类型的数据包,最后判断是哪种应用层的服务。
才判断的过程中不断记录各个的信息,并以树状结构加以表现。
3.3管理子系统
简单网络管理功能:
主要指可选择监听某个端口,根据一些信息截断节点与外界的联系。
设计这个功能的目的是,最近这段时间利用WINDOWS远程管理或是远程调用功能的漏洞,出现很多攻击。
它们通常利用135,139或445端口存在的缓冲区溢出的漏洞,使病毒入侵主机,然后利用相同的方法再从被感染的主机向其他网络中的主机发起攻击。
所以如果我们在觉察到某台机器中毒并不断攻击其他主机时,我们可以把他们发出的数据包定位到错误的网关地址,这样就把威胁限制在一个网段了,还可以造成IP冲突让部分被感染主机无法和网络连接。
连接子系统
实现分布式监听,这是指我们在各个网段安排不同的MySniffer,然后把各个网段的信息汇总到一台服务器中。
服务器可以对数据加以显示,帮助管理人员觉察到网络的异常情况。
第4章系统实现
4.1协议驱动程序NPF的设计
参考Windows系统的DDK(DriverDevelopmentKit)中的网络驱动程序(NetworkDriver)开发文档,针对不同类型的网罗驱动程序,NDIS定义的一些必须向系统进行登记和实现的接口,作为系统操作和管理某一个网卡的入口。
开发驱动程序主要的工作便是对这些接口进行实现。
系统采用协议驱动程序(也叫中间驱动程序)来进行网络数据包的读取,下面就是协议驱动程序需要实现和登记的主要几个接口。
具体实现包括:
●NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,
INPUNICODE_STRINGRegistryPath)[6]:
DriverEntry是系统调用设备驱动程序的入口函数,当协议驱动程序被加载到存开始运行时它被调用。
它初始化驱动程序,注册所有的驱动程序的回调函数,创建虚拟设备,在NDIS结构中定义协议驱动程序。
参数:
DriverObject系统创建的一个协议驱动程序对象
RegisterPath注册表中与协议驱动有关的注册项的路径
返回值:
包括一组网卡的串。
●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:
指示进行接收的数据是否已经接收完成。
NPF_TransferCompleteHandler:
当协议驱动程序调用NdisTransferData函数的返回值是NDIS_STATUS_PENDING,系统调用这个函数指示传送的数据时候已经发送完成。
NPF_SendCompleteHandler:
当协议驱动程序调用NdisSend函数的返回值为NDIS_STATUS_PENDING,系统调用这个函数指示进行发送的数据时候已经发送。
NPF_Read:
为用户提供读操作。
NPF_Write:
为用户提供写操作。
NPF_IoControl:
处理IOCTL操作。
以上所罗列的是协议驱动程序中用到或是实现的主要的几个函数。
4.2动态连接库程序PACKET.DLL的设计
首先声明一些相关的数据结构:
1.typedefstruct_ADAPTERADAPTER[6]//描述一个网络适配器;
2.typedefstruct_PACKETPACKET//描述一组网络数据报的结构;
3.typedefstructNetTypeNetType//描述网络类型的数据结构;
4.typedefstructnpf_if_addrnpf_if_addr//描述一个网络适配器的ip地址;
5.structbpf_hdr//数据报头部;
5.structbpf_stat//当前捕获数据报的统计信息。
下面,将介应用程序用到的各个函数,他们都是在packet.dll中定义的:
1>LPPACKETPacketAllocatePacket(void)
当需要给程序接收数据包的时候,需要先分配一个接收缓冲区,而接受缓冲区又需要一个描述它的结构体。
所以在分配缓冲区的时候,调用这个函数分配这个结构体的空间。
如果运行成功,返回一个_PACKET结构的指针,否则返回NULL。
成功返回的结果将会传送到PacketReceivePacket()函数,接收来自驱动的网络数据报。
2>VOIDPacketCloseAdapter(LPADAPTERlpAdapter)
当应用程序需要关闭监听功能的时候,需要调用这个函数。
关闭参数中提供的网络适配器,释放相关的ADAPTER结构。
3>VOIDPacketFreePacket(LPPACKETlpPacket)
当应用程序结束监听的时候,调用这个函数,释放描述接收缓冲区的结构体的空间。
参数提供的是_PACKET结构的指针。
4>BOOLEANPacketGetAdapterNames(LPSTRpStr,PULONGBufferSize)
一台主机可能又多个网卡,所以在打开哪个网卡进行监听的时候,需要得到主机的网卡列表。
所以应用程序在打开网卡前,要先调用这个函数。
通过返回值可以得到的网络适配器列表及描述。
5>VOIDPacketInitPacket(LPPACKETlpPacket,PVOIDBuffer,UINTLength)
在应用程序的监听功能启动时,调用这个函数。
给一个_PACKET结构中的,buffer分配空间。
6>LPADAPTERPacketOpetAdapter(LPTSTRAdapterName)
在应用程序的监听功能启动时,根据前面得到的网卡列表,调用这个函数,打开一个网络适配器。
7>BOOLEANPacketReceivePacket(LPADAPTERAdapterObject,LPPACKETlpPacket,BOOLEANSync)
在应用程序的sniff()函数中调用这个函数,从NPF驱动程序读取网络数据报及统计信息。
数据报编码结构如示:
|bpf_hdr|data|Padding|bpf_hdr|data|Padding|
8>BOOLEANPacketSendPacket(LPADAPTERAdapterObject,LPPACKETlpPacket,BOOLEANSync)
在应用程序的管理子系统的autoctrl函数中调用它,用来发送一个或多个arp数据报的副本。
实际上它可以发送任何自己构造的数据包。
9>BOOLEANPacketSetHwFilter(LPADAPTERAdapterObject,ULONGFilter)
在应用程序的监听功能启动时调用它,为接收到的数据报设置硬件过滤规则。
以下为一些典型的过滤规则:
NDIS_PACKET_TYPE_PROMISCUOUS:
设置为混杂模式,接收所有流过的数据报;
NDIS_PACKET_TYPE_DIRECTED:
只有目的地为本地主机网络适配器的数据报才会被接收;
NDIS_PACKET_TYPE_BROADCAST:
只有广播数据报才会被接收;
DIS_PACKET_TYPE_MULTICAST:
只有与本地主机网络适配器相对应的为了实现监听数据报,把网卡设置为NDIS_PACKET_TYPE_PROMISCUOUS;
15>BOOLEANPacketSetNumWrites(LPADAPTERAdapterObject,intnwrites)
在应用程序的管理子系统的autoctrl函数中调用它,设置调用PacketSendPacket()函数发送一个数据报副本所重复的次数。
15>BOOLEANPacketSetReadTimeout(LPADAPTERAdapterObject,inttimeout)
在应用程序的监听功能启动时调用它,设置在接收到一个数据报后“休息”的时间。
4.3应用程序的结构设计
4.3.1数据流图
●全局关联图(图4.1)
图4.1全局关联图
用户打开MySniffer系统,系统以文本方式,图表方式,还有列表方式向用户显示抓包结果。
用户还可以给系统设置过滤标准,请求系统执行管理功能和连接功能。
系统在监听的时候,不断保存和记录各种信息,以被连接子系统和管理子系统使用。
在连接功能启动时,系统将试图与服务器连接,然后返回统计信息到服务器端。
图4.2系统详细关联图
这图充分表现了,各个子系统之间的详细联系。
各其他系统以监听子系统为核心。
监听子系统把捕获的数据包,传递给显示子系统来显示信息。
监听子系统把记录的受怀疑的网络主机的IP集合传递给管理子系统,实现简单网络管理。
监听子系统还记录网络流量的统计信息,传递给连接子系统,连接子系统再把信息传送到服务器端。
●监听子系统数据流图
图4.5监听子系统数据流图
用户发出启动请求,监听子系统开始监听。
监听过程接收过滤信息,然后被系统时钟所触发,每1秒完成一次操作。
每次操作过程中,要对数据包进行分析,记录统计信息,捕获的数据包和需要管理的主机ip地址集合,以备显示子系统,管理子系统,和连接子系统使用。
●显示子系统数据流图
图4.4显示子系统数据流图
用户发出请求文本信息的要求,显示文本信息子活动,从统计信息中读取数据并显示。
用户发出请求图表信息的要求,显示图表信息子活动,从文件中读取数据并显示。
用户发出请求列表信息的要求,显示列表信息子活动,从统计信息中读取数据并显示。
用户发出请求显示特定数据包的要求,显示特定数据包的子活动,从数据包集合中读取数据并显示。
●管理子系统数据流图
图4.5管理子系统数据流图
用户发出启动简单管理请求,启动网络管理子活动打开时钟3。
网络管理被时钟3触发,每1秒操作一次。
根据IP地址集,给网络上的主机不断发送ARP数据包。
●连接子系统数据流图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 监听 技术设计
![提示](https://static.bdocx.com/images/bang_tan.gif)