




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络监听技术设计系统目标本课设从实际工程应用角度出发,以计算机网络原理为指导,结合当前网络中的一些常用技术和标准,模拟仿真了一组网络实验。为了能够检验实验的结果,我们开发了这个网络监听工具,帮助实验人员对网络中的信息进行实时的监测、分析,诊断网络故障。同时通过该毕业设计的容,让我们了解各种抓包技术,熟练掌握基于Winpcap开发包的编程模式;了解网络监听技术的新发展和网络安全防的新方向;最后能有所体会。1.1 相关理论与技术的简单介绍1.2.1网络监听原理共享式局域网采用的是广播信道,也就是说每台主机所发出的帧都会被整个网络的所有主机接收到⑴。接收主机对帧的处理根据网卡的工作模式来实现。一般网卡具有一下4种工作模式:广播模式,多播模式,直播模式和混杂模式。网卡缺省工作模式是工作在广播和直播模式下的,即只能接收发送给自己和广播的帧。正常情况下接收主机的网卡根据帧中所包含的目标MAC地址或是广播MAC地址进行判断,若等于自己的MAC地址或是广播MAC地址,则提交给上层处理程序,否则丢弃此数据包。当网卡处于混杂模式的时候,它不作任何判断直接把接收到的所有帧交给上层处理程序。网络监听技术就是基于这个原理,来捕获网络中所有的数据包,实现网络监测和流量分析的。交换式以太网是基于数据链路层的点到点的信道,所以简单采用应用于共享式以太网的监听技术是完全失效的。本文主要讨论共享式以太网的情况,最后给出交换式以太网监听难题的解决方案。1.2.2监听技术相关的实现方法•原始套接字编程模式⑵:RawSocket:原始套接字可以用它来发送和接收IP层以上的原始数据包,如ICMP,TCP,UDP....创建了一个RawSocketintsockRaw=socket(AF_INET,S0CK_RAW,IPPR0T0_RAW);.把网卡置于混杂模式用RawSocket实现代码如下:setsockopt(sock,IPPR0T0_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));设置IP头操作选项。flag标志是用来设置IP头操作的,boolflag=ture也就是说要亲自处理IP头。bind(sockRaw,(PSOCKADDR)&addrLocal,sizeof(addrLocal);把sockRaw绑定到本地网卡上,addrLocal为本地地址:SOCKADDR_INaddrLocaloioctisocket(sockRaw,SIORCVALL,&dwValue);让sockRaw接受所有的数据。dwValue为输入输出参数,为1时执行,0时取消:DWORDdwValue=1;.捕获数据包recv(sockRaw,RecvBuf,BUFFER_SIZE,0);〃接受任意数据包原始套接字编程模式:优点:实现简单,不需要做驱动程序就可实现抓包.缺点:数据不含帧信息,不能接收到与IP同层的其它数据包,如ARP,RARP,IPX-•IMD中间层驱动编程模式⑶:中间层驱动(NDISintermediatedriver)核级网络驱动介绍:MicrosoftWindows2000支持三种基本的核级网络驱动,这三层driver顺序从下到上依次为:MiniportNICdrivers:微端口网卡驱动,位于最底层,直接操纵网卡并且对高层驱动提供接口。Intermediatedrivers:IMD中间层驱动位于1和3之间。Protocoldrivers:高层协议驱动,俗称为TDI(传输驱动程序接口),高于前面两层,直接面向用户级,为用户提供网络服务,也就是绝大多数程序所用到的网络接口。IMD驱动IMD中间层,它的实质很简单,即:中间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,而对下面的网卡则表现为一个协议层的结构。所以,无论是网卡接收并上传的数据报,还是上层要下送至网卡发送的数据报,无一例外地要经过中间层。IMD包过滤技术前面我们已经看到,所有的数据报都要经过中间层,所以,我们可以在中间层加入我们想要过滤的数据报的特征,实现基于中间层驱动的核级包过滤。优势:首先,在驱动级别上做过滤,无须组包,速度快,效率自然就高;其次,所有的数据报无一例外,只要网卡上传的数据报均可以截获,避免了用户级无法得到所有数据报的缺点。缺点:IMD包过滤技术也存在其不可避免的缺点,与操作系统版本关系密切,与硬件联系大,可移植性低,调试困难。•Winpcap编程模式Winpcap(windowspacketcapture)是windows平台下一个免费,公共的网络访问系统。开发Winpcap这个项目的目的在于为Win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:.捕获原始数据报,包括在共享式网络上各主机发送/接收的以及相互之间交换的数据报;.在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;.在网络上发送原始的数据报;.收集网络通信过程中的统计信息。不足:Winpcap的主要功能在于独立于主机协议(如TCPTP)而发送和接收原始数据报。也就是说,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做详细的分析。1选用Winpcap技术的原因:提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具原始套接字的编程模式中不能捕获ARP和IPX的数据包对SNIFFER软件有着致命的限制,所以不能选择这种方法。IMD编程模式虽然功能强大,而且灵活性强,但是开发调试难度比较大,不适合作为SNIFFER软件的开发模式,甚至在防火墙开发技术中也不用IMDoWINPCAP本身不能阻塞,过滤或控制其他应用程序数据报的发收的缺点在我们这个软件的开发过程中,并不影响。所以经过权衡,我选用了Winpcap编程模式来开发MySniffer软件。2 Winpcap的结构分析Winpcap的主要思想来源于Unix系统中著名的BSD包捕获结构,它的基本结构如图2.1所示:整个包捕获框架的基础是NDIS(网络驱动器接口规),它是Windows中最低端的与联网有关的软件,主要是为各种应用协议与网卡之间提供的一套接
OtherprotocolstacksNICDriver口函数。Winpcap由三个模块组成,一个是工作在核级别上的NPF包过滤器;另外两个是用户级的动态连接库packet,dll和wpcap.dll"owpcap.dll是packet.dll的上一层封装,提供了编程的高级接口。为了能更好的了解Winpcap的工作原理,我选用了OtherprotocolstacksNICDriver口函数。Winpcap由三个模块组成,一个是工作在核级别上的NPF包过滤器;另外两个是用户级的动态连接库packet,dll和wpcap.dll"owpcap.dll是packet.dll的上一层封装,提供了编程的高级接口。为了能更好的了解Winpcap的工作原理,我选用了packet,dll作为程序对底层访问的接口。因为基于Winpcap开发涉及到驱动程序开发技术,dll动态连接库开发技术,和vc的MFC应用程序开发技术,所以将对它们做一些介绍。packet.dll图2.1Winpcap及NPF的结构图⑸UserLevelNetworkTapKernelBufferToDiskNetworkPackets।wpcap.dllKernelsBufferKernelLevelCaptureApplic^ionLogging/ApplicationMonitoringAppliedionfilteruser-buffer1NDIS驱动开发技术网络驱动程序使用ISO的开放的系统互连网罗标准(0SI),这是一个七层的模型,它的顶层是应用软件层,底层是硬件连接和网络的拓扑结构,网络接口卡(NIC)给大多数的平台提供网络的硬件接口,网络驱动程序是写给指定的NIC的驱动程序。网络驱动程序接口规(NDIS)给NIC驱动程序提供库支持,通常只允许NIC厂商提供管理硬件特殊细节的MINI驱动程序,更高层的NDIS(中间驱动程序,协议驱动程序)在需要的时候提供媒体转换,过滤。分层的NDIS如图2所示。WIN2000提供一个分层的核模式软件传输驱动接口(TDI),这个分层的在NDIS层和高层软件抽象像插座和NetBIOS,TDI层使WIN2000的高层结构具有更多的可移植性。图2.网络驱动程序接口规DLL动态连接库技术DLL(DynamicLinkableLibrary)文件通常是一个具有独立功能的程序模块,可以进行单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到存空间中。这种方式不仅减少了EXE文件的大小和对存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用,只是增加DLL的计数。当应用程序卸载DLL时,计数则减少,计数为0时DLL就从存被释放。PACKET.DLL就是为上层应用程序开发的,提供操作网卡的模块;而且它屏蔽应用程序直接操作底层协议驱动程序的复杂性。所以应用程序可以使用PACKET.DLL所提供地接口函数,安全简单的操作协议驱动程序,使应用程序更加健壮。第3章系统功能描述这个网络监听工具虽然不是很庞大,但是有几个功能比较明确,也就是监听功能,显示功能,管理功能,连接功能,所以我把它们划分为四个子系统,来实现。监听子系统监听子系统再划分为三个功能,捕获功能,过滤功能,保存功能;三个功能描述如下:捕获功能根据过滤器的设置,捕获ip,arp,ipx,tcp,udp,ospf,icmp,spx,ipx-rip等数据包,并把数据包保存在应用程序的缓冲区。过滤功能用户自己定义过滤信息(特定协议进行捕获),也就说用户可能只需要了解网络中某种类型的数据包的信息,而不需要捕获太多无用的数据,一方面系统负担比较大,另一方面干扰信息过多不利于用户发现网络中存在的问题。保存功能在捕获的过程中,每十秒钟,把统计信息写入文件中,等待图表显示功能模块提取信息。保存功能还根据管理功能的需要,保存数据。如果管理功能被启动,系统将满足管理要求的主机IP地址,记录在IP数据集合中。等待管理子系统从中提取IP地址,实现管理功能。2 显不子系统显示子系统可再划分为五个功能,总量显示功能,分量显示功能,通讯显示功能,列表显示功能,树形显示功能。这些功能的详细描述如下:总量显示功能在抓包过程中显示捕获数据包的总量,也就是从开始监听一直到结束,捕获的说有数据包的数量。分量显示功能在抓包过程中显示各种数据包的分量,以及它们在总量中比例(百分比显示)各种数据包的百分比是指,某种类型的数据包除以捕获的数据包的总量。通讯显示功能用直观的方法表示当前各个节点的通讯对象,如果双方存在TCP,UDP,ICMP数据包的往来我们就认为他们之间存在着通讯,然后我们记录他们的信息,并显示在屏幕上。列表显示功能在抓包终止后,显示捕获的数据包的信息。包括:包的次序,包的源和目的地址(ip数据包显示ip地址,arp数据包显示mac地址,ipx数据包显示ipx的地址形式)包的长度,包的简要说明树形显示功能可以指定一个数据包,并显示它的详细容,信息,首先判断是网络层中的哪种类型数据包,其次判断是传输层中的哪种类型的数据包,最后判断是哪种应用层的服务。才判断的过程中不断记录各个的信息,并以树状结构加以表现。3.3管理子系统简单网络管理功能:主要指可选择监听某个端口,根据一些信息截断节点与外界的联系。设计这个功能的目的是,最近这段时间利用WINDOWS远程管理或是远程调用功能的漏洞,出现很多攻击。它们通常利用135,139或445端口存在的缓冲区溢出的漏洞,使病毒入侵主机,然后利用相同的方法再从被感染的主机向其他网络中的主机发起攻击。所以如果我们在觉察到某台机器中毒并不断攻击其他主机时,我们可以把他们发出的数据包定位到错误的网关地址,这样就把威胁限制在一个网段了,还可以造成IP冲突让部分被感染主机无法和网络连接。连接子系统实现分布式监听,这是指我们在各个网段安排不同的MySniffer,然后把各个网段的信息汇总到一台服务器中。服务器可以对数据加以显示,帮助管理人员觉察到网络的异常情况。第4章系统实现协议驱动程序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(网卡)或者虚拟的NICNPF_UnbindAdapterHand1er: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_SendComp1eteHand1er:当协议驱动程序调用NdisSend函数的返回值为NDIS_STATUS_PENDING,系统调用这个函数指示进行发送的数据时候已经发送。NPF_Read:为用户提供读操作。NPF_Write:为用户提供写操作。NPF」oControl:处理IOCTL操作。以上所罗列的是协议驱动程序中用到或是实现的主要的几个函数。2 动态连接库程序PACKET.DLL的设计首先声明一些相关的数据结构:typedefstruct_ADAPTERADAPTER161〃描述一个网络适配器;typedefstruct.PACKETPACKET〃描述一组网络数据报的结构;typedefstructNetTypeNetType〃描述网络类型的数据结构;typedefstructnpf_if_addrnpf_if_addr〃描述一个网络适配器的ip地址;structbpf_hdr〃数据报头部;structbpf_stat〃当前捕获数据报的统计信息。下面,将介应用程序用到的各个函数,他们都是在packet.dll中定义的:1>LPPACKETPacketAllocatePacket(void)当需要给程序接收数据包的时候,需要先分配一个接收缓冲区,而接受缓冲区又需要一个描述它的结构体。所以在分配缓冲区的时候,调用这个函数分配这个结构体的空间。如果运行成功,返回一个一PACKET结构的指针,否则返回NULLo成功返回的结果将会传送到PacketReceivePacket()函数,接收来自驱动的网络数据报。2>VOIDPacketCloseAdapter(LPADAPTERIpAdapter)当应用程序需要关闭监听功能的时候,需要调用这个函数。关闭参数中提供的网络适配器,释放相关的ADAPTER结构。3>VOIDPacketFreePacket(LPPACKETIpPacket)当应用程序结束监听的时候,调用这个函数,释放描述接收缓冲区的结构体的空间。参数提供的是.PACKET结构的指针。4>BOOLEANPacketGetAdapterNames(LPSTRpStr,PULONGBufferSize)一台主机可能又多个网卡,所以在打开哪个网卡进行监听的时候,需要得到主机的网卡列表。所以应用程序在打开网卡前,要先调用这个函数。通过返回值可以得到的网络适配器列表及描述。5>VOIDPacketlnitPacket(LPPACKETIpPacket,PVOIDBuffer,UINTLength)在应用程序的监听功能启动时,调用这个函数。给一个_PACKET结构中的,buffer分配空间,6>LPADAPTERPacketOpetAdapter(LPTSTRAdapterName)在应用程序的监听功能启动时,根据前面得到的网卡列表,调用这个函数,打开一个网络适配器。7>BOOLEANPacketReceivePacket(LPADAPTERAdapterObject,LPPACKETIpPacket,BOOLEANSync)在应用程序的sniff。函数中调用这个函数,从NPF驱动程序读取网络数据报及统计信息。数据报编码结构如示:bpf_hdrdata|Padding|bpf_hdrIdataPadding8>BOOLEANPacketSendPacket(LPADAPTERAdapterObject,LPPACKETIpPacket,BOOLEANSync)在应用程序的管理子系统的autoctrl函数中调用它,用来发送一个或多个arp数据报的副本。实际上它可以发送任何自己构造的数据包。9>BOOLEANPacketSetHwFiIter(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)在应用程序的监听功能启动时调用它,设置在接收到一个数据报后“休息”的时间。.3 应用程序的结构设计.3.1数据流图•全局关联图(图4.1)
图4.5监听子系统数据流图用户发出启动请求,监听子系统开始监听。监听过程接收过滤信息,然后被系统时钟所触发,每1秒完成一次操作。每次操作过程中,要对数据包进行分析,记录统计信息,捕获的数据包和需要管理的主机ip地址集合,以备显示子系统,管理子系统,和连接子系统使用。•显示子系统数据流图
显示图表信息显示特定数据,显示特定包信图4.4显示子系统数据流图用户发出请求文本信息的要求,显示文本信息子活动,从统计信息中读取数据并显示。用户发出请求图表信息的要求,显示图表信息子活动,从文件中读取数据并显示。用户发出请求列表信息的要求,显示列表信息子活动,从统计信息中读取数据并显示。用户发出请求显示特定数据包的要求,显示特定数据包的子活动,从数据包集合中读取数据并显示。•管理子系统数据流图显示文本信息v—读取统计信息1文本信息统计信息返回查找结果显示列表信息,J显示图表信息显示特定数据,显示特定包信图4.4显示子系统数据流图用户发出请求文本信息的要求,显示文本信息子活动,从统计信息中读取数据并显示。用户发出请求图表信息的要求,显示图表信息子活动,从文件中读取数据并显示。用户发出请求列表信息的要求,显示列表信息子活动,从统计信息中读取数据并显示。用户发出请求显示特定数据包的要求,显示特定数据包的子活动,从数据包集合中读取数据并显示。•管理子系统数据流图显示文本信息v—读取统计信息1文本信息统计信息返回查找结果显示列表信息,J数据包集合数据包图形信息查找关键考请卜特定包信息数据包请求图表信息-< 列表信息读取统计信息2图4.5管理子系统数据流图用户发出启动简单管理请求,启动网络管理子活动打开时钟3。网络管理被时钟3触发,每1秒操作一次。根据IP地址集,给网络上的主机不断发送ARP数据包。•连接子系统数据流图统计信息读取统计信息Ir 1/1〕用八1 —启动连接T开启连接卜连接控制一 连接传递统计信息2[服务器J图4.4连接子系统数据流图用户发出启动连接请求,开启连接子活动打开时钟2。连接子活动被时钟3触发,每10秒操作一次。根据统计信息,给网络上的服务器不断发送信息。4.3.2结构图•顶层结构图:发送数据包»阍di读取统计信息连接子模块I图4.7顶层模块图主模块调用监听,显示,管理,连接子模块。其中管理,连接子模块是可选的。•监听子系统结构图(图4.8)
监听子系统图4.8监听子系统模块图监听子系统调用监听,设置和查看过滤信息,写入统计和数据包集合信息。监听子系统调用监听模块获得统计信息和数据包,并把它们写入相应的存储区域。•显示子系统结构图(图4.9)监听子系统图4.8监听子系统模块图监听子系统调用监听,设置和查看过滤信息,写入统计和数据包集合信息。监听子系统调用监听模块获得统计信息和数据包,并把它们写入相应的存储区域。•显示子系统结构图(图4.9)查看过滤信息写入统计信息写入数据包集合设置过滤信息图4.9显示子系统模块图显示子系统调用显示文本,图表,列表,特定数据包信息四个子模块。后三个子模块是可选模块,根据用户需要,调用它们。显示文本信息子模块由程序部获得统计信息。显示图表模块从文件中获得不同时间不同的统计信息。显示列表信息和显示特定数据包信息子模块从数据包集合中获得数据。•管理子系统结构图,连接子系统结构图。这两个子系统结构实现难度大,但是结构比较简单,所以在顶层模块图中就显示了他们部的模块调用结构。4.3.3源码分析a)主要数据结构:见附录1b)主要全局变量:staticLPADAPTERIpadapter;〃指向描述网络适配器实例的结构的指针;staticLPPACKETIppacketr;〃指向描述一组网络数据报的结构的指针;staticcharpacket_array[1024][1024];〃应用程序中存放数据包的缓冲区staticcharrecvbuf[1024*250];〃协议驱动程序存放数据包的缓冲区staticDWORD auto_ip[255];〃存放需要被管理的主机的ip地址c)监听模块:•voidSniff():功能:获取数据包算法:循环一百次调用PacketReceivePacket函数,如果成功开始分析数据包(即调用GetData函数)。
i<1OO返回•voidGetData(LPPACKETIp)功能:分析捕获的数据包,写入统计信息,写入数据包集合,写入主机IP集合参数:指向描述一组网络数据报的结构的指针;算法:i<1OO返回•voidGetData(LPPACKETIp)功能:分析捕获的数据包,写入统计信息,写入数据包集合,写入主机IP集合参数:指向描述一组网络数据报的结构的指针;算法:—fellse沙冏用GetDatai++弓单出对话框t.ruePacketReceivePacketfalsetrue
ospf_count++〃这些变量由来决定是否对这些协议监听//}}AFX_DATA//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(FilterDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://Generatedmessagemapfunctions//{{AFX_MSG(FilterDig)afx_msgvoidOnArpO,OnDns(),OnFtpO,OnHttpO,Onlcmp(),OnlpO,Onlpx(),OnNetboisO,OnOspf(),OnRipO,OnSmtpO,OnSpx(),OnTcpO,OnTelnet(),OnUdpO,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)显不模块:voidShowPacketCount(CDC*pDC);功能:调用该函数显示数据包的总量和各种协议数据包的分量信息算法:利用统计信息,把统计信息打印出来。voidShowGraphic(CDC*pDC);功能:调用该函数显示数据包的图表信息算法:读取在不同时间点上,记录在文件中的统计信息,然后以时间为横轴,百分比为纵轴把统计信息显示在视图上。voidShowConnection(CDC*pDC);功能:调用该函数显示网络中存在通讯的节点之间的联系算法:从packet_array数据包接收缓冲区中,倒序查找十个数据包,如果数据包类型为tcp,udp,icmp那么就认为数据包的源和目的主机之间存在着通讯关系,于是就把他们的源和目的地址展现在视图上。…Mi。…public:voidSetData(charp[][1024],intc);MyDlg(CWnd*pParent=NULL); //standardconstructorintIndexInFieldList;〃记录被选择需要详细显示的数据包的序号TreeDlgm_treedlg; 〃树行显示数据包的对话框PVOIDpacket; //指向数据包数组packet_arry的指针intcount; 〃数据包数组中数据包的个数//DialogData//{{AFX_DATA(MyDlg)enum{IDD=IDD_DIALOG};CListCtrlm」istCtrl;//}}AFX_DATA//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(MyDlg)public:virtualintDoModal();protected:virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://Generatedmessagemapfunctions//{{AFX_MSG(MyDlg)virtualBOOLOnlnitDialogO;〃对话框的初始化函数afx_msgvoidOnDblclkList(NMHDR*pNMHDR,LRESULT*pResult)〃选择需要详细显示的数据包时触发的函数afx_msgvoidOnPaint();//}}AFX_MSGDECLARE_MESSAGE_MAP()功能:该类用来显示数据包的列表信息算法:首先在实例化该类的时候我们要把packet_a门'ay数据包接收缓冲区的指针传给PVOIDpacket,通过packet指针我们解析每一个数据包,然后把它们的信息以列表形式展现在用户面前。对数据包的解析算法基本上和GetData中的算法相似所以这里就不再重复了。该类中voidOnDblclkList(NMHDR*pNMHDR,LRESULT*pResult)函数的作用是当用户想更加细致地了解数据包地情况下,双击列表中地某一个数据包,那么它会实例化classTreeDlg类,来显示数据包地详细信息。•classTreeDlg:publicCDialog{//Constructionpublic:voidSetData(char*p);TreeDlg(CWnd*pParent=NULL); //standardconstructorHTREEITEMm_hRoot; 〃树行结构的根节点char*packet; 〃指向需要详细显示数据包的指针//DialogData//{{AFX_DATA(TreeDlg)enum{IDD=IDD_TREE_VIEW};CTreeCtrlm_tree;CStringm_str;CStringm_substr;//}}AFX_DATA//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(TreeDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX); //DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected://Generatedmessagemapfunctions//{{AFX_MSG(TreeDlg)virtualBOOLOnlnitDialogO;afx_msgvoidOnSelchangingTree(NMHDR*pNMHDR,LRESULT*pResult);afx_msgvoidOnFind();//}}AFX_MSGDECLARE_MESSAGE_MAP()功能:显示某一个数据包地具体信息,数据包信息以树形结构表现出来,同时提供查找功能,当我们输入一个字符串地时候,可以找到这个字符串的前几个字符,字符串本身,后几个字符。算法:当MyDlg调用TreeDlg时就把要具体显示的数据包在缓冲区中的位置(通过intIndexInFieldList)告诉了TreeDlg这个类,TreeDlg通过该整型数据找到数据包在缓冲区中的位置,然后设置指针指向该区域。有了指向数据包的指针之后,我们解析这个数据包,然后把网络各层的数据包信息转换成字符串形式,最后显示出来。CString m_str;〃把整个数据包可打印的信息存放在该字符串中CStringm_substr;〃需要查找的子串voidOnFind();〃完成查找任务e)连接模块:功能:这个模块主要分为客户端和服务器端,客户端容比较重要,它主动去连接服务器来传输数据。服务器端指做了简单的功能,侦听,接收连接,接收数据,显示数据。算法:•客户端:UINTThreadConnect(LPVOIDpParam)data=(structtransfer_data*)pParam;〃获得被传送数据的指针 〃连接服务器,并把数据传送过去staticvoidCALLBACKEXPORTConnect(HWNDhWnd,//handleofCWndthatcalledSetTimerUINTnMsg,//WM_TIMERUINTnIDEvent, //timeridentification「……data.total_count=total_count;data.ip_count=ip_count;data.tcp_count=tcp_count;〃对被传送数据进行赋值AfxBeginThread(ThreadConnect,PVOID(&data));〃启动新线程去完成数据传送任务voidCList2View::OnConnect()SetTimer(3,10000,Connect);〃打开时钟3,用时钟触发连接函数•服务器端:intmain(){sock=socket(PF_INET,SOCK_STREAM,0); 〃创建侦听套接字bind(sock,(LPSOCKADDR)&m_sockServerAddr,sizeof(m_sockServerAddr))〃与选定的端口绑定listen(sock,5);〃侦听while(l)if((sock_accept=accept(sock,(LPSOCKADDR)&m_sockServerAddr,0))==INVALID_SOCKET)〃创建连接套接字if(recv(sock_accept,(char*)&data,sizeof(structtransfer_data),0)==SOCKET_ERROR)〃接收数据closesocket(sock_accept)"/关闭连接套接字closesocket(sock)"/关闭侦听套接字f)管理模块:voidOnAuto()功能:打开管理功能算法:创建CAutoDlg类,获得本网段地址,和所需要监听的端口启动时钟2,设置时钟2的回调函数为AutoCtrl。classCAutoDlg:publicCDialogpublic:CIPAddressCtrlm_ip;CStringm_port;〃需要被管理的端口virtualBOOLOnlnitDialogO;afx_msgvoidOnPaint();功能:从用户的输入需要被管理的端口算法:把端口值传递给全局变量m_auto_portstaticvoidCALLBACKEXPORTAutoCtrl(HWNDhWnd,//handleofCWndthatcalledSetTimerUINTnMsg,//WM_TIMERUINTnIDEvent, //timeridentificationDWORDdwTime//systemtime功能:根据GetData中记录的需要被管理的ip地址集,发送arp和rarp数据包给各个主机中断它们与外界的联系。算法:伪造arp数据包,包括arp-request,arp-relay,并发送。〃开始监听,并打开网卡1padapter=PacketOpenAdapter(adapterlist[open-11);lppacket=PacketAllocatePacket()for(i=0;i<255;i++)if(auto_ip[i]!=0)〃构造arp-reply欺骗数据包PacketInitPacket(Ippacket,szPacketBuf,50);〃构造air-request欺骗数据包ZeroMemory(szPacketBuf,sizeof(szPacketBuf));memcpy(eth.eh_dst,DstMac,5);〃目标MACmemcpy(eth.eh_src,SrcMac,5);〃发送方MACmemcpy(szPacketBuf,(char*)ð,sizeof(eth));memcpy(szPacketBuf+sizeof(eth),(char*)&arpr,sizeof(arpr));PacketInitPacket(Ippacket,szPacketBuf,50);〃发送数据包PacketSetNumWrites(Ipadapter,2)PacketSendPacket(Ipadapter,Ippacket,TRUE)==FALSE)4.4系统特色本系统的主要两个特色就是分布式网络监听和简单网络管理。4.4.1分布式网络监听由于交换式局域网的存在和普通监听技术只对同一网段的主机有效的缺陷,使监听技术的能力受到了很大的影响。为了能够扩大网络监听的围,诊断不同网络中问题,我认为我们应该把每一个网络监听工具作为一个客户端,然后把各个客户端程序安装到不同网段的网关上。这样每个客户端都可以监听到本网段的信息,最后每个客户端把各自的监听信息发送到一个监听服务器上。这样我们就可以获取不同网段上的网络信息了。但是在跨越不同网段的时候我们又会遇到防火墙或是入侵检测系统的过滤,我个人认为如果我们从开放服务器的80端口,然后把客户端要传送的数据封装在HTTP协议的数据包,这样一般就可以穿透绝大多数的防火墙了。4.4.2简单网络管理选择需要被管理的端口,根据一些信息截断节点与外界的联系。网络蠕虫病毒泛滥,所以如果我们在觉察到某台机器中毒并不断攻击其他主机时,我们可以向他们发送伪造的arp-request和arp-relay数据包,让他们的IP冲突,而且发出的数据包被定位到错误的或者不存在的网关地址。这样部分被感染主机无法和网络连接,或把威胁限制在一个网段了。第5章系统测试与使用说明书5.1系统测试系统采取黑盒测试的方法,即已知系统的功能设计规格,对每个实现了的功能进行测试,观察是否符合要求。下面就按各个子系统的,测试它们的功能是否满足了要求。5.1.1监听功能测试用例:打开监听工具MySniffer,开始监听。测试能否能够捕获网络中的数据包设置过滤信息,测试过滤信息是否由效测试结果:通过显示子系统的几个功能,证明系统成功捕获数据包。图5.1表现如何进行设置过滤信息,同样当设置了需要过滤的协议时,系统只捕获与这些协议有关的数据包,而丢弃无关的数据包。NetWareProtocol□ARP ElIP aIPXIP日TCP □UDP □ICMP □OSPFTCP□FTP[3HTTP 曰TELNET □SMTPUDP□DNS □NETBOIS(UDP)IPXEljSlP| □SPX|Default:| |0K ||Cancel|图5.1设置过滤信息截图1.2显示功能测试用例:测试能否用文本信息显示网络流量的统计信息,包括总量,分量,百分比,通讯情况信息。如果能以文本方式正确显示流量信息,说明测试成功,否则失败。测试能否用图表信息显示统计信息,观察各种流量在最近时间能的变化幅度。如果能正确显示流量信息,说明测试成功,否则失败。测试能否用列表方式显示数据包的概要信息,检验各种概要信息是否准确,详细。如果概要信息准确,说明测试成功,否则失败。
测试能否用树形方式显示特定数据包的详细信息,检验各个信息解析的是否正确。如果各个字段正确,说明测试成功,否则失败。测试能否在特定数据包中查找到关键字和关键字附近的字符。我们使用user关键字来查找。如果数据包中存在user字符串,且查找到说明测试成功,否则失败。测试结果:用文本方式显示统计信息的结果,如图示5.2:文件②编缉查看电)CoalrolCaptureVietCoa&ectDisplay口6。A■IFhetotalnumberofallIFhetotalnumberofallpacket:46Fhenmrberofippacket:11—23.91%Fhenunberofarppacket:19—41.30%Fhenunberofipxpacket:7—15.22%Fhenunberoftcppacket:4~8.70%%Fhenunberofu益packet:7—15.22%Fhenurioeroficcppacket:0~0.00%Fhenunberofospfpacket:0-0.00%Fhenunfcerofftppacket:3―6.52%%Fhenunberofhttppacket:1—2.17%Fhenunberofsntppacket:0-0.00%Fhenunfceroftelnetpacket:0—0.00%Fhenmrberofnetbiospacket:6—13.04%Thenuirberofudp_dnspacket:0―0.00%Fhenumberofspxpacket:0―0.00%Fhenunberofipxjrippacket:1-2.17%sre: 13 udp >dst:sre:13——-udp >dst:sre: 13 u<^ >dst:sre: 13 u<^ >dst:sre: 13 -u4> >dst:sre: 13 u<4> >dst:sre: 1 tcp >dst:sre: 52 tcp 〉dst:sre: 1 tcp >dst:sre: 1 1cp >dst:5555555555555215252图5.2用文本方式显示统计信息的截图用图表方式显示统计信息的结果,如图示5.3:
ARPIPIPXTCPUDPICIPSPXIPX_RIPprotocol图5.3用图表方式显示统计信息的截图用列表方式显示数据包的概要信息的测试结果,如图示5.4:NO.Source|Desbnabon|protocolSummary49152TCPftpthisisafiletransferprotocol50521TCPftpthisisafiletransferprotocol51152TCPftpthisisafiletransferprotocol52521TCPftpthisisafiletransferprotocol53000C767DF56D00096B12E8CCARPARP-REPLY54152TCPftpthisisafiletransferprotocol55000C767DF56C00096B12E8CCARPARP-REPLY5600096B12E8CCFFFFFFFFFFFFARPARP-REQUEST570005313A1E80FFFFFFFFFFFFARPARP-REQUEST■l记155UDPNETBIOS591055UDPNETBIOS1600005313A1E80FFFFFTFFFFFFARPARP-REQUEST0005313A1E80FFFFFFFFFFFFARPARP-REQUEST621055UDPNETBIOS蓟 1m-li— Mm=| >图5.4用列表方式显示数据包的截图用树形方式显示特定数据包的详细信息的结果,如图示5.5:查找关键字的结果,我们在一个FTP数据包中得到用户名b00015007这个,加蓝色的字段就是用户名在特定数据包中如图示5.5:(图5.5用
树形方式显示特定数据包的截图)u...r..c'6.e2..p...n..userb00015007HNOu...r..c'6.e2..p...n..userb00015007SMACsrc:00096B12E8CCdst:000C767DF56Dtype:0x0800(ip)臼IPversionandlenth:0x45tos:OxOOpacketlenth:0x56ident:0xl794flags:0x4000ttl:0x80protocoktcpchecksum:0x2330src:1dst:52etcpsrc_port:1362dst_port:21seq:0x432736CDack:0x4532820D5.1.2管理功能测试用例:在指定端口号之后,系统能否让指定的主机断网。点击auto菜单项,把对话框中的端口地址设置为21,这样系统将记录局域网所有使用FTP应用程序的主机IP。然后在1主机上打开FTP,连接地址为的ftp服务器。如果主机造成IP冲突并且断网说明测试成功,否则失败。测试结果:在1主机的右下角出现,IP冲突的提示,而且FTP连接也中断了,如图5.6。所以证明管理功能成功完成任务。200SwitchingtoASCIImodePORT202,117,21,21,8,117200PORTcommandsuccessful.ConsiderusincPASVLIST150Herecomesthedirectory1istinc226DirectorysendOK.传送完成:1,470字节在0.125杪内(11.76k/W正在连镂到,端口21(#1)正在建隹列,端口21(#1)正在连接到,端口21(#1)缩俣:连镂超时图5.6管理功能测试结果截图5.1.3连接功能测试用例:测试客户端到服务器间能否通讯。首先打开服务器应用程序,然后点击客户端的connect菜单项,设置远程服务器的IP和端口,开始连接操作。观察服务器端是否能收到客户端发来的信息。如果可以成功显示客户端的信息,则说明测试成功,否则测试失败。测试结果:服务器端每十秒种收到客户端发来的监听得到的统计信息。由红色的两个圈可以证明数据成功地从客户端传送到服务器端。客户端的信息如图5.7,服务器端的信息如图5.8:Thetotalnumberofallpacket:3613Thenumberofippacket:^828--5076d)%Thenumberofarppacket:与&弱%Thenumberofipxpacket:135-3.74%Thenumberoftcppacket:506—14.00%Thenumberofudppacket:1315—36.40%Thenumber of icmp packet : 1-0.03 %Thenumber of ospf packet : 0-0.00 %Thenumberofftppacket:245—6.78%Thenumber of http packet : 238—6.59 %Thenumber of smtp packet : 0-0.00 %Thenumberoftelnetpacket:0-0.00%Thenumberofnetbiospacket:1137--31.47%Thenumberofudp-dnspacket:85-2.35%Thenumberofspxpacket:0-0.00%Thenumberofipx_rippacket:24一一0.66%图5.7客户端截图BSientname:ok-0a8yu?J3rl06clientip:1炉885ip:1711ipxBSientname:ok-0a8yu?J3rl06clientip:1炉885ip:1711ipx:125tcp:497udp:1208icmp:0rip:20spx:0ftp:237http:237telnet:0smtp:0ospf:0dns:76netbios1044time:lientname:ok-0a8s/u?J3r106clientip:1rp:1012ip:1746ipx:127tcp:498udp:1242icnp:0ospf:0rip:21spx:0ftp:237http:238telnet:0smtp:0dns:81netbiosl072time:17:11:27lientname:ok-0a8yu7j3rl06clientip:1rp:1135ip:1768ipx:134tcp:498udp:1264icnp:0ospf:0netbiosl090rip:24spx:0ftp:237http:238telnet:0smtp:0dns:85netbiosl090OStime: 17:11:37clientname:ok-0a8szu7J3rl06clientip:1arp:1257ip:1792ipx:134tcp:498udp:1288icnp:0ospf:0rip:24spx:0ftp:237http:238telnet:0smtp:0dns:85netbiosl112OStine: 17:11:47clientnane:ok-0a89u7j3rl06clientip:1«rp:13R7ip:182Kipx:135tcp:506udp:1315icmp:lospf:0rip:24spx:0ftp:245http:238telnet:0smtp:0dns:85netbios1137图5.8服务器截图工具软件的配置软件运行硬件环境:CPU(interPentium4),RAM(512M),网卡,Ethemet802.3(局域网)软件运行软件环境:操作系统(WINDOWS-XP或者WIND0WS-2000),安装WINPCAP开发包软件开发平台:VC++.net集成开放环境监听工具的使用点击工具栏中的三角形按钮开始监听(或者选择菜单栏中start选项),点击工具栏中的正方形按钮结束监听(或者选择菜单栏中stop选项)。监听进行过程中,视图默认显示文本信息,如果要显示图表信息,要先结束监听然后选择菜单栏中View菜单项的子菜单项Graphico如果要显示系统的列表信息,在结束监听状态下,选择Display菜单项。如果要获得某个特定数据包的详细信息,在列表对话框中双击所要查看的数据包,数据包的详细信息就会以树形方式展现在您面前。如果要实现管理功能,在监听状态下点击auto菜单项,输入必要信息,开始管理。再点击一下就结束管理功能如果要实现分布式监听,则首先打开服务器程序,然后在客户端选择connect菜单项,客户端就把信息传送给服务器端,再点击一下结束数据传送。结论系统的不足和改进MySniffer软件基本上完成了一个网络监听工具,所要完成的基本功能,但是它还有很多不足之处.无法实现跨平台性本文主要论述了如何在WindowsNT,2000,xp系统下实现网络监听技术,这种开发方法无法在Unix和linux系统中实现网络监听,甚至不能直接移植到windows98上。在Unix和Linux通常情况下我们采用Libpcap库来实现。Libcap实质上是一个系统独立的API函数接口,用于用户层次的数据包截获工作。它为底层网络监听编程提供了一个易于移植的应用程序框架,底层操作包括数据包的截获和网络调试。Libpcap接口是基于BPF(BerkeleyPacketFilter)数据包过滤机制‘。Libpcap库只支持BPF接口的核过滤。如果主机上没有BPF机制,所有的数据包都必须读取到用户应用程序的空间后,才能进行操作,这样将导致性能严重下降,可能会有丢包的问题出现。对于windows98来说,我们只要替换用一个虚拟协议驱动替代现在的wdm协议驱动程序就可以了。.无法在交换式以太网实现监听用交换机来代替HUB,原先的共享式以太网就变成了交换式以太网,Switch不会把数据包在端口进行广播,它通过自己的ARP缓存来决定数据包传输到哪个端口上。因此如果A,B主机在不同端口处Pa,Pb,A就没有办法监听到B的数据包。因为Switch上的arp表是动态变化的,所以我们如果能够伪造一个ARP数据包包含B的MAC地址,然后从A发送出去,那么Switch就错误得认为Pa-MACb有对应关系,所以它就会把数据包发送到Pa端口,那么A就能监听到B的信息。但是还存在一个问题,就是这样做将影响B正常的网络通讯。暂时没有想出更好的办法。.网络管理子系统的不足MySniffer中的管理功能,其实设计不是很合理,针对端口进行判断主机是否存在安全问题,显然十分武断,那些开启合理服务的主机也将会被怀疑。其实原本的想法是建立一个病毒特征库对网络中数据包进行比对,发现有问题的数据包后,再对主机采取一定的措施。可能有人会认为这样的工作方式,一台管理服务器或者是网关服务器无法胜任大量的网络处理。性能的确是问题,但是我们还可以把任务分担到多台服务器上,不同服务器针对不同协议或者不同长度的数据包进行过滤。.连接子系统的不足MySniffer中的连接子系统也还不很理想,只是一种思想而已。因为在C/S结构下,只是简单的传输数据显然是很消极的管理方式,如果能采取主动的管理方式就会更加合理。比如采用SNMPV3协议实现分布式监听工具的网络管理,将使系统更加紧凑。反监听技术.检测网络监听的手段对发生在局域网的其他主机上的监听,一直以来,都缺乏很好的检测方法。这是由于产生网络监听行为的主机在工作时总是不做声的收集数据包,几乎不会主动发出任何信息。但目前网上已经有了一些解决这个问题的思路和产品:•利用ping模式进行监测当一台主机进入混杂模式时,以太网的网卡会将所有不属于他的数据照单全收;向局域网的主机发送非广播方式的,MAC地址不等于局域网任何主机的硬件地址的icmp包,所以它不会去对比数据包的硬件地址,而是将数据包直接传到上层,上层检查数据包的ip地址,符合自己的ip,于是会对对这个ping的包做出回应。这样,一台处于网络监听模式的主机就被发现了。•利用aq)数据包进行监测除了使用ping进行监测外,目前比较成熟的有利用arp方式进行监测的。这种模式是上述ping方式的一种变体,它使用arp数据包替代了上述的icmp数据包。向局域网的主机发送非广播方式的air包,如果局域网的某个主机响应了这个a中请求,那么我们就可以判断它很可能就是处于网络监听模式了,这是目前相对而言比较好的监测模式。.防网络监听的手段上面我们知道,监听是发生在以太网的,那么,很明显,首先就要确保以太网的整体安全性,因为监听行为要想发生,一个最重要的前提条件就是以太网部的一台有漏洞的主机被攻破,只有利用被攻破的主机,才能进行监听,去收集以太网敏感的数据信息。其次,采用加密手段也是一个很好的办法,因为如果监听工具抓取到的数据都是以密文传输的,那对入侵者即使抓取到了传输的数据信息,意义也是不大的-比如作为telnet,ftp等安全替代产品目前采用ssh2还是安全的。这是目前相对而言使用较多的手段之一,在实际应用中往往是指替换掉不安全的采用明文传输数据的服务,如在server端用ssh,openssh等替换unix系统自带的telnet,ftp,rsh,在client端使用securecrt,sshtransfer替代telnet,ftp等。除了加密外,使用交换机目前也是一个应用比较多的方式,不同于工作在第一层的hub,交换机是工作在二层,也就是说数据链路层的。对二层设备而言,仅有两种情况会发送广播报文,一是数据报的目的MAC地址不在交换机维护的数据库中,此时报文向所有端口转发,二是报文本身就是广播报文。由此,我们可以看到,这在很大程度上解决了网络监听的困扰。此外,对安全性要求比较高的情况可以考虑kerberos,kerberos是一种为网络通信提供可信第三方服务的面向开放系统的认证机制,它提供了一种强加密机制使client端和server即使在非安全的网络连接环境中也能确认彼此的身份,而且在双方通过身份认证后,后续的所有通讯也是被加密的。虽然上述的安全措施可以防网络监听,但是网络监听对安全威胁至今任存在的原因是它能获得主机之间的信任关系,通过信任链从事渗透入侵将是非常难以追踪和觉察的。参考文献:. 《网络侦听器的实现及其优化》少凡,汪为农交通大学学报19
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高中化学新教材同步 必修第一册 第3章 第2节 实验活动2 铁及其化合物的性质
- 【四川卷】四川省德阳市高中2022级(2025届)高三质量监测考试(二)(德阳二诊)(2.21-2.23)英语试卷答案
- 倾废航行数据记录仪战略市场规划报告
- 镍精矿战略市场规划报告
- 信鸽教练合同范本
- 加盟 转让合同范本
- 值守合同范本
- 中国学生发展核心素养心得体会
- 台车出售合同范本
- 水利工程师水力学试题(附参考答案)
- 《航空公司服务质量改善研究8800字(论文)》
- GB/T 9124-2010钢制管法兰技术条件
- GB/T 4117-2008工业用二氯甲烷
- FZ/T 07019-2021针织印染面料单位产品能源消耗限额
- 二类汽修厂汽车维修管理新规制度汇编
- 人教PEP版英语五年级下册第四单元全部课件
- 硬笔书法 社团教案
- 中国脓毒症及脓毒性休克急诊治疗指南
- 工序标准工时及产能计算表
- 人教版体育与健康四年级-《障碍跑》教学设计
- DB32-T 2860-2015散装液体化学品槽车装卸安全作业规范-(高清现行)
评论
0/150
提交评论