libpcap C语言调用
简介
由于本人需要写一款安卓抓包程序,所以决定C语言写一个.so库供kotlin进行调用,来抓取网卡的包。
安装步骤
- 下载libpcap
- 解压 tar -zxvf <filename>
- 安装libpcap
- 进入其文件夹操作一下命令
- ./configure
make
sudo make install - 这时候ls /usr/local/include应该能看见pcap.h文件。
- 随后是在文件/etc/ld.so.conf的末尾直接添加/usr/local/lib
- 这里原因是/etc/ld.so.conf此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。
- 默认情况下,编译器指挥使用/lib和/usr/lib这两个目录下的库文件。而通常通过源码包进行安装时,如果不指定--prefix会将库安装在/usr/local目录下。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。
测试代码
#include <pcap.h>
#include <stdio.h>
int main()
{
char errBuf[PCAP_ERRBUF_SIZE], * device;
device = pcap_lookupdev(errBuf);
if(device)
{
printf("device: %s\n", device);
}
else
{
printf("error: %s\n", errBuf);
}
return 0;
}
函数使用方法
以下汉化均为本人渣翻,如有错误概不负责!请自行参考官方文档
pcap_findalldevs
pcap_findalldevs 获得一个网卡列表
pcap_freealldevs free pcap_if_t的空间,也就是上面这个列表的空间。
#include <pcap/pcap.h>
char errbuf[PCAP_ERRBUF_SIZE];
int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
void pcap_freealldevs(pcap_if_t *alldevs);
pcap_findalldevs()构造一个网络设备的数组,这个数组能被pcap_create(3PCAP) 和pcap_activate(3PCAP) 或 pcap_open_live(3PCAP)调用。
struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};
pcap_if_t结构
pcap_lookupnet
int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);
确定所制定名字的网卡的IPV4的网络号和掩码。(因为是网络所以x.x.x.0)
pcap_open_live
#include <pcap/pcap.h>
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf);
返回的这个类型在1.10.0版本已经没有定义了,只有一个typedef。原先定义是在<pcap-int.h>中。
其参数为device name。snaplen时设置句柄上的数据包长度。promisc设定是否为接口为混杂模式。如果promisc非零。则设置混杂模式。to_ms 设定数据包的timeout时间。
pcap_dump_open
将pcap_t *类型的句柄和filename传入,无则创建文件,有则覆盖写入文件。
#include <pcap/pcap.h>
pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname);
pcap_dumper_t *pcap_dump_open_append(pcap_t *p, const char *fname);
pcap_dumper_t *pcap_dump_fopen(pcap_t *p, FILE *fp);
pcap_dump_fopen打开一个文件流,随后通过pcap_dump_close来关闭。
pcap_compile
#include <pcap/pcap.h>
int pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask);
将str编译成过滤程序。optimize决定是否结果代码进行优化。netmask指定捕获网络上的ipv4网络掩码。如果不知道网络掩码,或者要捕获“any”接口的数据包。使用PCAP_NETMASK_UNKNOWsN。
在libpcap 1.8.0及更高版本中pcap_compile()可以在单个进程中的多个线程中使用。
pcap_setfilter
#include <pcap/pcap.h>
int pcap_setfilter(pcap_t *p, struct bpf_program *fp);
指定过滤程序。
pcap_dump
#include <pcap/pcap.h>
void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp);
将数据包输出到pcap_dump_open打开的文件。user参数的类型时pcap_dump_t
文章评论