【asp精品源码栏目提醒】:网学会员鉴于大家对asp精品源码十分关注,论文会员在此为大家搜集整理了“基于 linux 平台的 libpcap 源代码分析(转)-libpcap入门sdfe - 计算机教材”一文,供大家参考学习
libpcap 是 unix/linux 平台下的网络数据包捕获函数包大多数网络监控软件都以它为基础。
Libpcap 可以在绝大多数类 unix 平台下工作本文分析了 libpcap 在
linux 下的
源代码实现其中重点是 linux 的底层包捕获机制和过滤器设置方式同时也简要的讨论了 libpcap 使用的包过滤机制 BPF。
网络监控 绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制在捕获机制之上可以建立网络监控Network Monitoring应用软件。
网络监控也常简称为sniffer其最初的目的在于对网络
通信情况进行监控以对网络的一些异常情况进行调试处理。
但随着互连网的快速普及和网络攻击行为的频繁出现保护网络的运行安全也成为监控
软件的另一个重要目的。
例如网络监控在路由器防火墙、入侵检查等方面使用也很广泛。
除此而外它也是一种比较有效的黑客手段例如美国政府安全部门的肉食动物计划。
包捕获机制 从广义的角度上看一个包捕获机制包含三个主要部分最底层是针对特定操作系统的包捕获机制最高层是针对用户程序的接口第三部分是包过滤机制。
不同的操作系统实现的底层包捕获机制可能是不一样的但从形式上看大同小异。
数据包常规的传输路径依次为网卡、设备驱动层、数据链路层、IP层、传输层、最后到达应用程序。
而包捕获机制是在数据链路层增加一个旁路处理对发送和接收到的数据包做过滤/缓冲等相关处理最后直接传递到应用程序。
值得注意的是包捕获机制并不影响操作系统对数据包的网络栈处理。
对用户程序而言包捕获机制提供了一个统一的接口使用户程序只需要简单的调用若干函数就能获得所期望的数据包。
这样一来针对特定操作
系统的捕获机制对用户透明使用户程序有比较好的可移植性。
包过滤机制是对所捕获到的数据包根据用户的要求进行筛选最终只把满足过滤条件的数据包传递给用户程序。
Libpcap应用程序框架 Libpcap提供了系统独立的用户级别网络数据包捕获接口并充分考虑到应用
程序的可移植性。
Libpcap可以在绝大多数类unix平台下工作参考资料 A 中是对基于 libpcap 的网络应用程序的一个详细
列表。
在windows平台下一个与libpcap 很类似的函数包 winpcap 提供捕获功能其官方网站是http://winpcap.polito.it/。
Libpcap 软件包可从 http://www.tcpdump.org/ 下载然后依此执行下列三条命令即可安装但如果希望libpcap能在linux上正常
工作则必须使内核支持packet协议也即在编译内核时打开配置选项 CONFIG_PACKET选项缺省为打开。
./configure ./make ./make install libpcap源代码由20多个C文件构成但在Linux系统下并不是所有文件都用到。
可以通过查看命令make的输出了解实际所用的文件。
本文所针对的libpcap版本号为0.8.3网络类型为常规以太网。
Libpcap应用程序从形式上看很简单下面是一个简单的程序框架 char device / 用来捕获数据包的网络接口的名称 / pcap_t p / 捕获数据包句柄最重要的数据结构 / struct bpf_program fcode / BPF 过滤代码结构 / / 第一步查找可以捕获数据包的设备 / device pcap_lookupdeverrbuf / 第二步创建捕获句柄准备进行捕获 / p pcap_open_livedevice 8000 1 500 errbuf / 第三步如果用户设置了过滤条件则编译和安装过滤代码 / pcap_compilep fcode filter_string 0 netmask pcap_setfilterp fcode / 第四步进入死循环反复捕获数据包 / for whileptr char pcap_nextp hdr NULL / 第五步对捕获的数据进行类型转换转化成以太数据包类型 / eth struct libnet_ethernet_hdr ptr / 第六步对以太头部进行分析判断所包含的数据包类型做进一步的处理 / ifeth-ether_type ntohsETHERTYPE_IP ………… ifeth-ether_type ntohsETHERTYPE_ARP ………… / 最后一步关闭捕获句柄一个简单技巧是在程序初始化时增加信号处理函数 以便在程序退出前执行本条代码 / pcap_closep 检查
网络设备 libpcap 程序的第一步通常是在系统中找到合适的网络接口设备。
网络接口在Linux网络体系中是一个很重要的概念它是对具体网络硬件设备的一个抽象在它的下面是具体的网卡驱动程序而其上则是网络协议层。
Linux中最常见的接口设备名eth0和lo。
Lo 称为回路设备是一种逻辑意义上的设备其主要目的是为了调试网络程序之间的通讯功能。
eth0对应了实际的物理网卡在真实网络环境下数据包的发送和接收都要通过 eht0。
如果
计算机有多个网卡则还可以有更多的网络接口如eth1eth2 等等。
调用命令ifconfig可以列出当前所有活跃的接口及相关信息注意对eth0的描述中既有物理网卡的MAC地址也有网络协议的IP地址。
查看文件/proc/net/dev也可获得接口信息。
Libpcap中检查网络设备中主要使用到的函数关系如下