linux libpcap pcap4j
linux 应用 pcap文件怎么打开
如果你是一个测试入侵侦测系统或一些网络访问控制策略的网络管理员,那么你经常需要抓取数据包并在离线状态下分析这些文件。当需要保存捕获的数据包时,我们一般会存储为 libpcap的数据包格式 pcap,这是一种被许多开源的嗅探工具以及捕包程序广泛使用的格式。如果 pcap文件被用于入侵测试或离线分析的话,那么在将他们注入网络之前通常要先对 pcap文件进行一些操作。
在这篇文章中,我将介绍一些操作 pcap文件的工具,以及如何使用它们。
Editcap与 Mergecap
Wireshark,是最受欢迎的 GUI嗅探工具,实际上它带了一套非常有用的命令行工具集。其中包括 editcap与 mergecap。editcap是一个万能的 pcap编辑器,它可以过滤并且能以多种方式来分割 pcap文件。mergecap可以将多个 pcap文件合并为一个。这篇文章就是基于这些 Wireshark命令行工具的。
Linux 网络编程——libpcap详解
libpcap是一个功能强大的网络数据包捕获函数库,广泛应用于Linux系统,其中著名的tcpdump即基于libpcap实现。
libpcap的主要功能包括数据包捕获、分析和处理。在使用libpcap前,首先需要安装此库,其头文件位于/usr/local/include/pcap/pcap.h。
在使用libpcap开发应用程序时,基本步骤包括获取网络接口设备名、获取网络号(IP地址)和掩码、打开网络接口、捕获数据包以及释放网络接口资源。
获取网络接口设备名的函数为pcap_lookupdev,该函数返回设备名指针,成功时返回第一个合适的网络接口的字符串指针,失败时返回NULL并填充errbuf。
获取网络号(IP地址)和掩码的函数为pcap_lookupnet,它需要指定网络设备名(通过pcap_lookupdev获取),并返回ip地址和子网掩码。
打开网络接口的函数为pcap_open_live,它需要接口名、捕获数据包长度、混杂模式标志以及等待时间作为参数,返回pcap_t类型指针用于后续操作。
捕获数据包的函数有pcap_next和pcap_loop。pcap_next捕获单个数据包并立即返回捕获数据包的地址,而pcap_loop则循环捕获指定数量的数据包或直到遇到错误,每次捕获后调用回调函数。
释放网络接口资源的函数为pcap_close,它接收pcap_t类型指针作为参数,关闭接口并释放相关资源。
在实际应用中,我们可以通过设置过滤条件来接收特定数据包。使用BPF(Berkeley Packet Filter)语法编写过滤表达式,并通过pcap_compile编译为内部格式,然后使用pcap_setfilter应用过滤规则。
例如,要接收目的端口为80的数据包,可以编写过滤规则并应用,然后使用pcap_loop或pcap_next捕获满足过滤条件的数据包。
linux的ubuntu14.04下的libpcap怎么测试
为了开发需要,我决定使用最新libpcap源码包安装。在Unix环境下安装libpcap库,需要
c编译器,flex,bison等,安装Ubuntu系统时,没有这些包。安装flex需要m4编译环境,否则会提示“GNU M4 is required”错误。
1.安装系统依赖包
sudo apt-get install gcc libc6-dev
sudo apt-get install m4
sudo apt-get install flex bison
2.下载libpcap源码并安装
从官网下载最新的libpcap版本
cd/usr/local/src
wget
tar zxvf libpcap-1.5.3.tar.gz
cd libpcap-1.5.3
./configure
make
sudo make install
3.安装开发需要用到的依赖库
sudo apt-get install libpcap-dev
4.测试libpcap的小程序,命名为pcap_demo.c,以检验环境是否配置正确
#include<pcap.h>
#include<stdio.h>
int main(int argc, char*argv[])
{
pcap_t*handle;
/* Session handle*/
char*dev;/* The device to sniff on*/
char errbuf[PCAP_ERRBUF_SIZE];
/* Error string*/
struct bpf_program fp;
/* The compiled filter*/
char filter_exp[]="port 80";
/* The filter expression*/
bpf_u_int32 mask;
/* Our netmask*/
bpf_u_int32 net;
/* Our IP*/
struct pcap_pkthdr header;
/* The header that pcap gives us*/
const u_char*packet;
/* The actual packet*/
/* Define the device*/
dev= pcap_lookupdev(errbuf);
if(dev== NULL){
fprintf(stderr,"Couldn't find default device:%s\n", errbuf);
return(2);
}
/* Find the properties for the device*/
if(pcap_lookupnet(dev,&net,&mask, errbuf)==-1){
fprintf(stderr,"Couldn't get netmask for device%s:%s\n", dev, errbuf);
net= 0;
mask= 0;
}
/* Open the session in promiscuous mode*/
handle= pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if(handle== NULL){
fprintf(stderr,"Couldn't open device%s:%s\n", dev, errbuf);
return(2);
}
/* Compile and apply the filter*/
if(pcap_compile(handle,&fp, filter_exp, 0, net)==-1){
fprintf(stderr,"Couldn't parse filter%s:%s\n", filter_exp, pcap_geterr(handle));
return(2);
}
if(pcap_setfilter(handle,&fp)==-1){
fprintf(stderr,"Couldn't install filter%s:%s\n", filter_exp, pcap_geterr(handle));
return(2);
}
/* Grab a packet*/
packet= pcap_next(handle,&header);
/* Print its length*/
printf("Jacked a packet with length of [%d]\n", header.len);
/* And close the session*/
pcap_close(handle);
return(0);
}
开始编译:
gcc-g pcap_demo.c-o pcap_demo-lpcap
开始执行
./pcap_demo
5.注意的问题
5.1.注意使用root用户来执行,或者对普通用户使用sudo来提升权限
sudo pcap_demo
5.2.对一些PCAP API函数要有全面地理解,并时刻更新文档,比如pcap_loop这个函数,下面是官网的man page地址