




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验6利用WinPcap技术捕获数据包实验目的:通过掌握WinPcap函数库的结构和功能,实现在windows环境下对网卡进行编程,进行网络数据包的捕获。实验准备:(1)winpcap简介WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。WinPcap 为用户级的数据包提供了Windows 下的一个平台。WinPcap 是 BPF 模型和 Libpcap 函数库在 Windows 平台下网络数据包捕获和网络状态分析的一种体系结构,这个体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库 Packet.dll 和一个高层的独
2、立于系统的函数库 Libpcap 组成。底层的包捕获驱动程序实际为一个协议网络驱动程序,通过对 NDIS 中函数的调用为 Win95、Win98、WinNT、和 Win2000 提供一类似于 UNIX 系统下 Berkeley Packet Filter 的捕获和发送原始数据包的能力。Packet.dll 是对这个 BPF 驱动程序进行访问的 API 接口,同时它有一套符合 Libpcap 接口(UNIX 下的捕获函数库)的函数库。WinPcap的结构图如图1。WinPcap 包括三个部分:第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。它的功能是
3、过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码。第二个模块packet.dll为win32平台提供了一个公共的接口。不同版本的Windows系统都有自己的内核模块和用户层模块。Packet.dll用于解决这些不同。调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译。 第三个模块 Wpcap.dll是不依赖于操作系统的。它提供了更加高层、抽象的函数。 packet.dll和Wpcap.dll:packet.dll直接映射了内核的调用。 Wpcap.dll提供了更加友好、功能更加强大的函数调用。WinPcap的优势提供
4、了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。图1WinPcap结构图(2)网络数据包捕获的原理以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3 标准的以太网采用的是持续
5、 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的 CSMA/CD 协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。如果是的话,接收该数据帧,进行物理数据帧的 CRC 校验,然后
6、将数据帧提交给LLC 子层。网卡具有如下的几种工作模式:1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收
7、所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。(3)在windows情况下捕获数据包的结构图2捕获数据包的结构图Wndows下捕获数据包的结构如图2,其中NDIS及其特点是:NDIS(Network Driver Interface Specification) 是 Microsoft 和 3Com 公司联合制定的网络驱动规范,并提供了大量的操作函数。它为上层的协议驱动提供服务,屏蔽了下层各种网卡的差
8、别。NDIS 向上支持多种网络协议,比如 TCP/IP、NWLink IPX/SPX、NETBEUI 等,向下支持不同厂家生产的多种网卡。NDIS 还支持多种工作模式,支持多处理器,提供一个完备的 NDIS 库(Library)。 但库中所提供的各个函数都是工作在核心模式下的,用户不宜直接操作,这就需要寻找另外的接口。NDIS驱动程序的结构如图3。(4)利用winpcap进行网络数据包的捕获和过滤的设计步骤1)打开网卡,并设为混杂模式。2)回调函数 Network Tap 在得到监听命令后,从网络设备驱动程序处收集数据包把监听到的数据包负责传送给过滤程序。图3NDIS驱动程序结构3)当 Pac
9、ket filter 监听到有数据包到达时,NDIS 中间驱动程序首先调用分组驱动程序,该程序将数据传递给每一个参与进程的分组过滤程序。4)然后由 Packet filter 过滤程序决定哪些数据包应该丢弃,哪些数据包应该接收,是否需要将接收到的数据拷贝到相应的应用程序。5)通过分组过滤器后,将数据未过滤掉的数据包提交给核心缓冲区。然后等待系统缓冲区满后,再将数据包拷贝到用户缓冲区。监听程序可以直接从用户缓冲区中读取捕获的数据包。6)关闭网卡。(5)主要源代码根据用 Windows 分组捕获库 WinPcap 提供功能首先要初始化两个结构体,一个是适配器的结构体 LpAdapter, 一个是存
10、放接收到的数据包的结构体 RecvPacket。使用 Packet.dll 动态连接库编写源代码: #define MAX_LINK_NAME_LENGTH 64适配器结构: typedef struct_ADAPTER HANDLE hFile; TCHAR SymboliclinkMAX_LINK_NAME_LENGTH; Int NumWrites; ADAPTER , *LPADAPTER;说明:hFile 是一个指向该网络适配器 Handle 的指针,通过它可以对网络适配器进行操作。symboliclink 包含当前打开的网络适配器的名字。数据包结构: typedef struct
11、_PACKET HANDLE hEvent; OVERLAPPED OverLapped; PVOID Buffer; UINT Length; PVOID Next; UINT ulBytesReceived; BOOLEAN bloComplete; /控制接受包的开始和结束数据包捕获实现的步骤的主要源代码:1)要获得适配器列表。#define Max_Num_Adapter 10 /获得适配器列表 char Adapterlist Max_Num_Adapter512 int i=0 char AdapterNames512, *tempa,*templa; ULONG AdapterL
12、ength=1024; PACKET, *LPPACKET:2)获得系统中网络适配器的名字。PacketGetAdapterNames(AdapterNamea,&AdapterLength); tempa=AdapterNamea; templa=Adapternamea; while (*tempa!=0)(*tempa-1!=0) if (*tempa= =0) memcpy(AdapterListi,temla,tempa-templa); /内存数据拷贝 templa=tempa+1; i+ tempa+ 3)从适配器列表中选择一个默认的 0 号适配器。LPADAPTER l
13、pAdapter lpAdapter = PacketOpenAdapter (AdapterList0); if (!lpAdapter(lpAdapter->hFile=INVALID_HANDLE_VALUE) dwErrorCode=GetLastError(); return FALSE; 4)将所选择的适配器 lpAdapter 设置为混杂模式。PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)5)设置 BPF 内核中包过滤的过滤器的代参政。利用这个函数右以完成对于原始数据包的初始的过滤处理,如根据其中端口号、I
14、P 地址等。 PacketSetBpf(LpAdapter AdapterObject,structbpf_program*fp)6)设置缓冲池为字节。 PacketSetBuff(lpAdapter,512000);7)分配一个数据包对象,并连接已分配的缓冲。 PacketInitPacket(lpPacket,(char*)bufferReceive,512000);8)捕获多个数据包。从网卡 lpAdapter 接收数据包,并将数据包放入 lpPacket所指向的数据包结构体中,若接收成功返回 TRUE,否则返回 FALSE。 PacketReceivePacket(lpAdapter,
15、lpPacket,TRUE);9)通过触发回调函数,把捕获符合过滤器规则的数据包转发给网络协议分析模块进行分析处理。10) 结束接收数据包,释放数据包对象。 if(lpPacket!=NULL PacketFreePacket(lpPacket); lpPacket=NULL; 11)关闭网卡设备,将网卡恢复到正常接收状态。 if(lpAdapter!=NULL PacketCloseAdapter(lpAdapter); lpAdapter=NULL;数据包捕获技术是网络管理系统的关键技术,已经按照标题4中的流程进行了简单的实现。如果在一个繁忙的网络上进行截获,而不设置任何过滤,那得到的数据
16、包是非常多的,可能在一秒钟内得到上千的数据包。如果应用程序不进行必要的性能优化,那么将会大量的丢失数据包。对捕包性能的优化必不可少,考虑采用多线程来处理数据包。若在程序中建立一个公共的数据包缓冲池,这个缓冲池是一个LILO的队列。于是在程序中使用三个线程进行操作:一个线程只进行捕获操作,它将从驱动程序获得的数据包添加到数据包队列的头部;另一个线程只进行过滤操作,它检查新到的队尾的数据包,检查其是否满足过滤条件,如果不满足则将其删除出队列;最后一个线程进行数据包处理操作,象根据接收的数据包发送新数据包这样的工作都由它来进行。考虑尽可能少丢失数据包的条件,应该是进行捕获操作的线程的优先级最高,这样
17、就可以得到更高的捕包性能。实验步骤通过java程序也可以获取网卡的数据包,具体使用开源的WinPcap,jNetPcap;jNetPcap是对接了WinPcap来截获网卡数据包。一、截获网卡步骤:1、电脑上安装WinPcap; 2、下载jNetPcap,解压后得到所要用的jnetpcap.jar,jnetpcap.dll文件;3、在eclipse中新建工程,把jnetpcap.jar加入library,编写Java代码实现网卡截包。二、Java代码import java.util.ArrayList;import java.util.List;import org.jnetpcap.Pcap;
18、import org.jnetpcap.PcapIf;import org.jnetpcap.packet.JPacket;import org.jnetpcap.packet.JPacketHandler;import tocol.tcpip.Http;import tocol.tcpip.Tcp;public class Application public static void main(String args) throws InterruptedException List<PcapIf> alldevs
19、= new ArrayList<PcapIf>(); / Will be filled with/ NICsStringBuilder errbuf = new StringBuilder();int r = Pcap.findAllDevs(alldevs, errbuf);if (r = Pcap.NOT_OK | alldevs.isEmpty() System.err.printf("Can't read list of devices, error is %s",errbuf.toString();return;for (PcapIf pif
20、: alldevs) System.out.println(pif.getName();PcapIf pif = alldevs.get(0);/ select the device which you want to/ monitorint snaplen = 64 * 1024; / Capture all packets, no trucationint flags = Pcap.MODE_PROMISCUOUS; / capture all packetsint timeout = 10 * 1000; / 10 seconds in millisPcap pcap = Pcap.openLive(pif.getName(), snaplen, flags, timeout,errbuf);if (pcap = null) System.err.printf("Error while opening device for capture: "+ errbuf.toString();return;pcap.loop(Pcap.LOOP_INFINITE, new JPacketHandler<StringBuilder>() fin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030客轮市场发展现状调查及供需格局分析预测报告
- 2025-2030年中国SIP电话机行业供需现状及发展规划研究报告
- 宿迁学院《管理统计学实验》2023-2024学年第一学期期末试卷
- 徐州医科大学《篆刻技法》2023-2024学年第二学期期末试卷
- 2025-2030年中国EDI超纯水系统市场运营状况及投资战略研究报告
- 中职语文高教版《归园田居(其一)》同步练习含答案
- 学习学校常规管理心得体会
- 2025-2030年中国MVR蒸汽机械行业规模分析及投资前景研究报告
- 动植物检验检疫学 课件 第1-4章 绪论、动植物检验检疫的重要性 -动植物检验检疫的对象
- 脊柱肌肉萎缩的临床护理
- SL631-637-2012-水利水电工程单元工程施工质量验收评定标准
- 胸腔穿刺术课件
- 门诊办运用PDCA提高门诊预约挂号率品管圈成果汇报
- 市场开拓委托合同书
- 跟骨牵引 跟骨牵引图片
- 简易呼吸器操作流程及考核评分表
- 人行天桥施工组织设计方案
- 工程设计管理规定
- 宝安区地图深圳市宝安区乡镇街道地图高清矢量可填充编辑地图PPT模板
- 信息通信网络线务员
- 安徽筑格桥梁构件有限公司高端工程金属橡胶产品(公路桥梁伸缩装置、板式橡胶支座、盆式橡胶支座、QZ球形支座、橡胶止水带等)项目 环境影响报告书
评论
0/150
提交评论