使用libpcao捕获数据报

时间:2022-10-05 02:59:10

使用libpcao捕获数据报

摘 要:随着网络技术的迅速发展和网络应用的普及,越来越多的信息资源在互联网上共享,网络的安全性和可靠性显得越发重要。网络嗅探器已经被广发的应用与模拟网络通信以及测试网络性能等。在网络信息的探测和收集应用中有很高的应用价值。嗅探技术作为网络安全攻防中最基础的技术,既可以用于获取网络中传输的大量敏感信息,也可以用于网络管理。通过获取网络数据包的流向和内容等信息,可以进行网络安全分析和网络威胁应对。而基于libpcap的捕获数据报程序起着很大作用。

关键词:网络嗅探;libpcap ;数据报

一、Libpcap简介

libpcap是由洛仑兹伯克利国家实验室编写的Linux平台下的网络数据包捕获函数库,是一种与系统无关,用于访问数据链路层,是一个独立于系统接口的用户级捕包函数据库,为底层的网络数据提供了可移植框架,它的应用包括网络统计、安全监听、网络调试、性能测量、入侵检测、口令拦截等。Libpcap可以在绝大多数类Unix平台下工作,绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制,在捕获机制之上可以开发网络监控应用软件。采用Libpcap实施网络数据包捕获时,将要用到一个重要的函数pcap_ open_live0,它的函数原型是:pcap_t*pcap_open_live(const char* device,int snaplen,int promisc,int to_ms,char* ebuf)。其中,如果device为NULL或any,则对所有接口捕获,snaplen代表用户期望的捕获数据包最大长度,promisc代表设置接口为混杂模式,捕获所有到达接口的数据包,但只有在设备给定的情况下才有意义,to_ms代表函数超时返回的时间。

二、Libpcap进行数据捕获和分析的步骤

使用libpcap进行数据报捕获和分析的步骤如下:

(1)使用函数pcap_findalldevs()获取设备刘表;

(2)使用函数pcap_lookupnet()获取网络地址和子网掩码;

(3)使用函数pcap_open_live()打开指定的设备;

(4)使用函数pacp_compile()编译过滤规则;

(5)使用函数Pcap_setfilter()设置过滤规则;

(6)使用函数Pcap_loop()来循环捕获数据报,并在该函数中调用数据报分析模块解析数据报;

(7)使用函数pcap_close()关闭设备句柄;

三、使用libpcap捕获数据报的关键代码

使用libpcap关键是获取网络设备列表信息,获取网络地址和子网掩码,打开指定设备,过滤表达式,捕获数据报。

1.获取并且输出网络设备列表信息

首先通过函数获取本机所有网络设备的刘表,并且将其存储在device变量中。然后通过ifprint()函数将找到的设备信息打印出来,代码如下:

if(pcap_findalldevs(&devices,errbuf)==-1)

printf(“Error in pcap_findalldevs():%s\n”,errbuf);

Return-1;

Else

printf(“find the following devices on your machine:\n”);

Ifprint(devices,devname);

2.获取网络地址和子网掩码

其中参数devname为网络设备的名字,获取的网络地址存储在变量net_ip中,子网掩码存储在变量net_mask中,代码如下:

If(pcap_lookupnet(devname,&net_ip,&net_mask,deebuf)==-1)

Printf(“error in the pcap_lookupnet:%s\n,errbuf”);

Goto error;

3.打开指定设备

其中参数devname为要打开的设备名字,代码如下:

If((dev_handle_pcap=pcap_open_live(devname,befsiz,1,0,errbuf))==NULL)

Printf(“error in the pacp_open_live!\n”);

Goto error

4.编译和设置过滤规则

其中参数bpf_filter的数据类型为struct btf_program,参数bpf_filter_string是设置的过滤字符串。Libpcap中支持多种类型的过滤,功能十分强大。 包括基于ip地址,Mac地址,端口号等类型的过滤,还可以通过一些关键字设置过滤表达式,组合出各种过滤类型,设置过滤器最主要的工作在于如何根据贵族构造过滤表达式,代码如下:

If((pcap_compile(dev_handle_pcap,&bpf_filter_string,0,net_ip))==-1)

Printf(“error in the pcap-compile!\n”);

Else

If ((pcap_setfilter(dev_handle_pcap,&bpf_filter))==-1)

Printf(“error in the pcap_setfilter!\n”);

5.过滤表达式

设置过滤字符串示例如下:

(1)只捕获ARP或ICMP;

过滤表达式为:ARP or (ip and ICMP),或者简写为:ARP or ICMP;

(2)捕获以192.168.1.10为源或目的地址的端口号位80的tcp;

过滤表达式为:(ip and tcp)and(host 192.268.1.10)and (port 80);

(3)捕获主机192.168.1.10与192.168.1.11之间传递的所有udp包过滤表达式为:(ip and udp)and ((src host 192.168.1.10 and dst host 192.268.1.11)or (dst host 192.168.1.10 and src host 192.268.1.11));

(4)捕获从mac地址00-13-d2-b5-f6-d3发送至00-50-55-c1-d3-01所有的ARP包Arp and (ether src 0-13-d2-b5-f6-d3 and ether dst 00-50-55-c1-d3-01)

6.捕获数据报

代码如下:

Pcap_loop(dev_handle_pcap,-1,packetthandler,null);

其中第一个参数是已经打开的设备接口句柄,第三个参数是数据报处理函数,该函数有固定的格式,其定义如下。

Void packethandler(u_char*argument,conststruct pcap_pkthdr*packet_header,const u_char*packet_content)

Pcap_loop捕获到一个数据报后会自动调用Packethandler函数对数据报进行处理。并且自动将该数据报的信息作为参数传递给Packethandler函数。可以在packethandler函数中增加对航速举报进行解析的代码,其中第2个参数packet_header为libpcap在捕获数据报时增加的辅助头部信息,包括时间戳,数据报长度等,第三个参数packet_content即为捕获到的数据报。至此,就可以按照前面介绍的数据报的解析过程对数据报进行解析。

7.关闭设备

程序结束注意要关闭设备,释放资源,代码如下:

Pcap_close(dev_handle_pcap);

四、结束语

本文讨论了在Linux环境下,采用Libpcap方法,编程实现网络数据包捕获软件的开发,它可以捕获以太网链路层上所有类型的帧(包括发给本机和送往其它主机的),网络数据包的捕获将会为网络安全、网络监控、网络性能分析、流量分析、用户计费、防火墙实现、入侵检测、口令拦截等工具软件的开发提供帮助,具有较大的实用参考价值。

参考文献:

[1]卢昱等著.网络安全技术[专著].北京:经济管理出版社,2004

[2]小彭.网络窃听器―嗅探器[J].电脑爱好者.2002

[3]石志国,薛为民,尹浩.计算机网络安全教程[M].清华大学出版社.

作者简介:

陈久龙,男,汉族,1990年生, 就读于长春工业大学计算机科学与工程学院网络工程专业,研究方向为网络工程。

上一篇:灯塔灌区调度管理自动监控系统 下一篇:浅谈小学数学教学的重点教育