基于libpcap实现抓包程序

前言原创文章欢迎转载,请保留出处。若有任何疑问建议,欢迎回复。邮箱:Maxwell_nc@163.com

紧接着上一篇,成功通过tcpdump和wireshark抓包后,,试试自己写一个抓包器。这里我们使用libpcap库开发。

创建配置工程

这里我们使用Eclipse for C/C++开发,安装的话只需要到eclipse官方下载解压就可以运行了,这里要注意的是,Eclipse要以root权限启动不然无法抓包。

首先创建一个空白的C语言项目,工具链选择Linux GCC

添加源文件,起名main.c,首先要配置下,右键点击项目,选择属性,链接pcap,如下图所示:

编写抓包程序

这里我不逐一介绍libpcap的api了,可以参考

这里我写了一个简单的抓包器,获得80端口的数据包30个:

packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data){pcap_dump(user, pkt_header, pkt_data);// 输出数据到文件printf(“Jacked a packet with length of [%d]\n”, pkt_header->len);// 打印抓到的包的长度}int main(int argc,char *argv[]){pcap_t *handle;// 会话句柄 char errbuf[PCAP_ERRBUF_SIZE]; // 存储错误信息的字符串bpf_u_int32 mask;//所在网络的掩码 bpf_u_int32 net;filter_app[] = *dev;//指定需要被抓包的设备 我们在linux下的两个设备eth0和lo分别是网卡和本地环回dev = pcap_lookupdev(errbuf); //返回第一个合法的设备,我这里是eth0pcap_lookupnet(dev, &net, &mask, errbuf);//dev = “lo”;//如果需要抓取本地的数据包,比如过滤表达式为host localhost的时候可以直接指定/* 以混杂模式打开会话 */handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);/* 编译并应用过滤器 */pcap_compile(handle, &filter, filter_app, 0, net);pcap_setfilter(handle, &filter);/* 定义输出文件 */pcap_dumper_t* out_pcap;out_pcap = pcap_dump_open(handle,”/home/max/pack.pcap”);/* 截获30个包 */pcap_loop(handle,30,packet_handler,(u_char *)out_pcap);/* 刷新缓冲区 */pcap_dump_flush(out_pcap);/* 关闭资源 */pcap_close(handle);pcap_dump_close(out_pcap);return(0);}

编译运行,运行后,启动浏览器随便浏览,就可以抓到包,并且保存在文件里。

如果出现A program file was not specified in the launch configuration.问题 解决方法:

然后用wireshark读入文件试试能否解析

成功,如果要改成本地抓包器的话,只需要把dev设置为lo然后bpf过滤规则设置成host localhost即可。

如果没法忘记他,就不要忘记好了。真正的忘记,是不需要努力的。

基于libpcap实现抓包程序

相关文章:

你感兴趣的文章:

标签云: