LINUX CH5基于Libpcap网络编程.ppt_第1页
LINUX CH5基于Libpcap网络编程.ppt_第2页
LINUX CH5基于Libpcap网络编程.ppt_第3页
LINUX CH5基于Libpcap网络编程.ppt_第4页
LINUX CH5基于Libpcap网络编程.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

第5章基于Libpcap的网络编程技术 第二篇网络编程方法与技术 5 1常见的包捕获机制简介 包捕获就是利用以太网的介质共享特性 通过将网络适配器设置为混杂模式的方法 接收到所有网络上的以太帧 包捕获机制大致可以分为两类 一类是由操作系统内核提供的捕获机制 另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制 其中最主要的是下列4种 1 BPF BerkeleyPacketFilter BSD包过滤器 2 DLPI DataLinkProviderInterface 3 NIT NetworkInterfaceTap 4 SOCK PACKET类型接口注意 Windows操作系统没有包捕获机制 只提供了数量很少并且功能有限的API调用 在Windows环境下由于自身的封装性 很难对其底层进行编程 本章主要对BSD系列的Libpcap进行深入介绍 5 2Libpcap与BPF 1 Libpcap概述Libpcap PacketCapturelibrary 即数据包捕获函数库 该库提供的C函数接口可用于捕获经过网络接口 只要经过该接口 目标地址不一定为本机 的数据包 它是由洛仑兹伯克利 Berkeley 试验室的研究人员StevenMcCanne和VanJacobson于1993年在Usenix93会议上正式提出的一种用于Unix内核数据包过滤体制 该函数库支持Linux Solaris和BSD系统平台 采用libpcap可以捕获本地网络数据链路层上的数据 广泛应用于 网络参数统计协议分析防火墙入侵检测系统网络调试 Libpcap概述 libpcap库是基于BPF BerkeleyPacketFilter BSD包过滤器 系统的 BPF是BSD系统在TCP IP软件实现时所提供的一个接口 通过这个接口 外部程序可以获取到达本机的数据链路层网络数据 同时也可以设置过滤器 嵌入到网络软件中 获得过滤后的数据包 2 BPF结构及工作原理 BPF是一种内核包捕获的体系结构 它使得UNIX下的应用程序通过一个高度优化的方法读取流经网络适配器的数据包 BPF主要由两部分组成 Networktap和PacketFilter 1 Networktap是一个回调函数 callbackfunction 它实时监视共享网络中的所有数据包 从网络设备驱动程序中搜集数据拷贝并转发给包过滤器 注意 这个回调函数并不是直接由BPF执行 当一个新的数据包到达时 它由网络适配器的设备驱动程序激活 从网络复制每个数据包 并且将它们复制到对应的应用程序 2 PacketFilter 包过滤器 决定是否接收该数据包 以及接收该数据包的那些部分 Slice 分片 技术 BPF的工作原理如图 参见教材P139图5 1 所示 BPF过滤机制 图BPF的结构 5 3Libpcap库函数接口简介 1 Libpcap库函数Libpcap所提供的主要函数如下 pcap t pcap open live 用于获取一个包捕获描述符char pcap lookupdev 返回一个适于pcap open live 和pcap lookupnet 函数使用的 指向网络设备的指针intpcap lookupnet 用于返回与网络设备相关的网络号和掩码intpcap dispatch 或intpcap loop 收集和处理数据包voidpcap dump 将一个包输出到由pcap dump open 打开的文件中保存intpcap compile 用于将过滤规则字符串编译成一个内核过滤程序intpcap setfilter 设定一个过滤程序intpcap datalink 返回数据链路层类型 如10M以太网 SLIP PPP FDDI ATM IEEE802 3等voidpcap close 关闭关联设备 文件 并回收资源intpcap stats pcap t structpcap stat 参数统计intpcap read pcap t intcnt pcap handler u char 打开设备 dump文件格式如下所示 首先是文件头 structpcap file header bpf u int32magic 0 xa1b2c3d4u shortversion major u shortversion minor bpf int32thiszone 本地时间 bpf u int32sigfigs 时间戳 bpf u int32snaplen 数据长度 bpf u int32linktype 链路类型 然后是每一个包的包头和数据structpcap pkthdr structtimevalts bpf u int32caplen bpf u int32len 其中数据部分的长度为caplen Libpcap dump文件格式 2 Libpcap数据结构相关的数据结构如下 1 typedefvoid pcap handler u char conststructpcap pkthdr constu char 2 typedefstructpcappcap t 3 structbpf program u intbf len structbpf insn bf insns 3 利用libpcap函数库开发应用程序的基本步骤 Y N 利用libpcap函数库开发应用程序的基本步骤以及几个关键的函数使用方法 1 获取设备名char pcap lookupdev char errbuf 该函数用于返回可被pcap open live 或pcap lookupnet 函数调用的网络设备名 一个字符串指针 如果函数出错 则返回NULL 同时errbuf中存放相关的错误消息 2 获取网络号和掩码intpcap lookupnet char device bpf u int32 netp bpf u int32 maskp char errbuf 获得指定网络设备的网络号和掩码 netp参数和maskp参数都是bpf u int32指针 如果函数出错 则返回 1 同时errbuf中存放相关的错误消息 Libpcap 3 打开设备pcap t pcap open live char device intsnaplen intpromisc intto ms char ebuf 获得用于捕获网络数据包的数据包捕获句柄 后续很多Libpcap函数将使用该句柄 类似于文件操作函数频繁使用文件句柄 device参数为指定打开的网络设备名 如eth0 snaplen参数定义捕获数据的最大字节数 promisc指定是否将网络接口置于混杂模式 promisc 1混杂模式 0正常模式 to ms参数指定超时时间 毫秒 ebuf参数仅在pcap open live 函数出错返回NULL时用于传递错误消息 Libpcap 4 编译和设置过滤器intpcap compile pcap t p structbpf program fp char str intoptimize bpf u int32netmask 该函数用于解析过滤规则串 填写bpf program结构 a str参数指向过滤规则串 格式参见tcpdump的man手册 b fp是一个bpf program结构的指针 在pcap compile 函数中被赋值 c optimize参数为1表示对过滤规则进行优化处理 d netmask参数指定本地网络的网络掩码 intpcap setfilter pcap t p structbpf program fp 指定一个过滤程序 即用于设置由pcap compile 函数解析完毕的过滤规则 fp参数是bpf program结构指针 通常取自pcap compile 函数调用 出错时返回 1 成功时返回0 Libpcap 5 抓取数据包intpcap dispatch pcap t p intcnt pcap handlercallback u char user 功能是捕获并处理数据包 即该函数用于捕捉报文 分发报文到预先指定好的处理函数 回调函数 其中 cnt参数指定函数返回前所处理数据包的最大值 cnt 1表示在一个缓冲区中处理所有的数据包 cnt 0表示处理所有数据包 直到产生以下错误之一 读取到EOF 超时读取 callback参数指定一个带有三个参数的回调函数 这三个参数为 typedefvoid pcap handler u char agrs conststructpcap pkthdr header constu char packet 其中agrs是从pcap dispatch 函数传递过来的第四个形参 一般我们自己的包捕捉程序不需要提供它 总是为NULL header指向pcap pkthdr结构 该结构位于真正的物理帧前面 用于消除不同链路层支持的差异 packet指向所捕获报文的物理帧 参数user为用户传递给回调函数的指针 如果成功则返回读取到的字节数 读取到EOF时则返回零值 出错时则返回 1 此时可调用pcap perror 或pcap geterr 函数获取错误消息 Libpcap intpcap loop pcap t p intcnt pcap handlercallback u char user 功能基本与pcap dispatch 函数相同 只不过此函数在cnt个数据包被处理或出现错误时才返回 但读取超时不会返回 而如果为pcap open live 函数指定了一个非零值的超时设置 然后调用pcap dispatch 函数 则当超时发生时pcap dispatch 函数会返回 cnt参数为负值时pcap loop 函数将始终循环运行 除非出现错误 例如 pcap loop pd 10 eth printer NULL 主循环 开始抓包 共抓10个 由第二个参数指定 抓到包后就进入回调函数eth printer处理u char pcap next pcap t p structpcap pkthdr h 返回指向下一个数据包的u char指针 Libpcap 6 关闭voidpcap close pcap t p 关闭p参数相应的文件 并释放资源 7 其他的辅助函数FILE pcap file pcap t p 返回被打开文件的文件名 intpcap fileno pcap t p 返回被打开文件的文件描述字号 pcap read 这个函数从包捕获驱动器中读取一组数据包并针对每一个包运行包过滤程序 然后把过滤后的数据送应用程序缓冲器 pcap next 循环包捕获 其他的辅助函数 脱机方式监听部分 Libpcap支持脱机监听 即先将网络上的数据截获下来 存到磁盘上 在以后方便的时候再从磁盘上获取数据来做分析 主要函数为pcap open offline pcap offline read intpcap datalink pcap t 返回网络类型 如DLT EN10MB就是10M以太网intpcap major version pcap t 返回libpcap主版本号intpcap minor version pcap t 返回libpcap次版本号 其他的辅助函数 intpcap snapshot pcap t 返回最长捕获字节数 就是在pcap open live中第二个参数设置 intpcap stats pcap t structpcap stat 计数 共抓了多少 过滤掉了多少structpcap stat u intps recv numberofpacketsreceived u intps drop numberofpacketsdropped u intps ifdrop dropsbyinterfaceXXXnotyetsupported 8 出错处理 象其它库一样 libpcap也有自己的错误处理机制 基本上每个函数都有返回值 出错时返回值 0 voidpcap perror pcap t char char pcap strerror int char pcap geterr pcap t 在pcap t中有一个成员存放着错误字串structpcap charerrbuf PCAP ERRBUF SIZE 安装前需下载下列文件 1 libpcap tar z公用函数库 下载地址 ftp ftp ee lbl gov libpcap tar z2 libnet 1 0 2a tar gz底层支持 3 NDISPacketCaptureDriverforwindows 安装配置 2 安装 1 ForLinux用户 安装libpcap 先检查文件下列文件是否存在 usr local lib libpcap a usr include pcap pcap h pcap namedb h和 usr include pcap net bpf h 如都存在表明系统

温馨提示

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

评论

0/150

提交评论