前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇网络安全攻防技术教程范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
关键词:网络嗅探;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].清华大学出版社.