一、libpcap介绍
Libpcap(Packet Capture Libray)即是数据包捕获函数库,该库提供的C函数接口用于捕捉经过指定网络接口的数据包,通常该接口设置为混杂模式。Linux平台的TCPDUMP就是基于Libpcap库进行开发的,Libpcap提供的接口函数实现和封装了与数据包截获有关的过程。主要功能包括:
- 数据包捕获:捕获经过网卡的原始数据包;
- 自定义数据包发送:构造任何格式的原始数据包;
- 流量采集与统计:采集网络中的流量信息;
- 规则过滤:提供自带规则过滤功能,按需要选择过滤规则;
二、libpcap下载
1.libpcap包的下载地址:https://www.tcpdump.org/release/
2.此处以kali linux 系统操作为例说明,下载libpcap版本为:1.10.4
# wget 下载
wget -q https://www.tcpdump.org/release/libpcap-1.10.4.tar.xz -O libpcap-1.10.4.tar.xz
三、libpcap编译
1.解压下载包并创建编译的目录,同时在编译参数中指定该目录所在路径
# 解压文件
tar -xvf libpcap-1.10.4.tar.xz
# 创建编译后的安装目录
cd libpcap-1.10.4 && mkdir static-libpcap-1.10.4
# 编译配置
CFLAGS='-static -O2 -flto' ./configure --prefix=/home/kali/Desktop/libpcap-1.10.4/static-libpcap-1.10.4 --enable-shared=no --enable-bluetooth=no --enable-rdma=no --enable-dbus=no
2.如果在编译配置过程中出现如下错误,是系统缺少相应的依赖,解决思路:
# 搜索error字段提示的相关名称
sudo apt search bison
# 安装相关的包
sudo apt-get install bison -y
3.如果编译配置结束显示如下内容,即是通过
4.下一步,使用下述命令构建、安装
# 编译安装
make -j 4 &&make install
5.最后,在 static-libpcap-1.10.4/lib 目录下即可见编译成功的相关文件
四、libpcap编程
1.libpcap的接口函数简介
参考:https://www.tcpdump.org/manpages/
pcap_lookupdev():函数用于查找网络设备;
pcap_lookupnet():函数获得指定网络设备的网络号和掩码;
pcap_open_live(): 函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字,对于此网络设备的操作都要基于此网络设备描述字;
pcap_compile(): 函数用于将用户制定的过滤策略编译到过滤程序中;
pcap_setfilter():函数用于设置过滤器;
pcap_dump_open():打开用于保存捕获数据包的文件,用于写入;
pcap_dump():向调用pcap_dump_open()函数打开的文件输出一个数据包;
pcap_loop():函数 pcap_dispatch() 函数用于捕获数据包,捕获后还可以进行处理,此外 pcap_next() 和 pcap_next_ex() 两个函数也可以用来捕获数据包;
pcap_close():函数用于关闭网络设备,释放资源;
pcap_dump_close():关闭相应的被打开文件。
2.libpcp抓包例子
1.功能:捕获eth0接口100个数据包并存到当前output.pcap文件
#include <pcap.h>
#include <stdio.h>
int main() {
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
const char *filename = "output.pcap";
const char *device = "eth0";
const int packet_cnt = 100;
/* 打开设备 */
handle = pcap_open_live(device, 65535, 1, 0, errbuf);
if (handle == NULL) {
fprintf(stderr, "Couldn't open device %s: %s\n", "eth0", errbuf);
return 1;
}
/* 创建 pcap_dumper_t 用于保存数据 */
pcap_dumper_t *dumpfile = pcap_dump_open(handle, filename);
if (dumpfile == NULL) {
fprintf(stderr, "Couldn't open dump file %s: %s\n", filename, pcap_geterr(handle));
return 2;
}
/* 进入捕获循环 */
struct pcap_pkthdr header;
const u_char *packet;
int cnt = 0;
while (((packet = pcap_next(handle, &header)) != NULL) && (cnt < packet_cnt) ){
/* 将数据包写入文件 */
pcap_dump(dumpfile, &header, packet);
cnt += 1;
}
/* 关闭资源 */
pcap_close(handle);
pcap_dump_close(dumpfile);
return 0;
}
2.编译生成静态可执行文件
# 编译生成静态文件
gcc -static -O2 -flto -s test.c -I ../libpcap-1.10.4/static-libpcap-1.10.4/include -L ../libpcap-1.10.4/static-libpcap-1.10.4/lib -l pcap
3.执行命令:sudo ./a.out ,output.pcap文件即是捕获的数据包