基于libpcap实现抓包程序
- - CSDN博客推荐文章原创文章欢迎转载,请保留出处. 邮箱:[email protected]. 紧接着上一篇,成功通过tcpdump和wireshark抓包后,试试自己写一个抓包器. 这里我们使用libpcap库开发. 这里我们使用Eclipse for C/C++开发,安装的话只需要到eclipse官方下载解压就可以运行了,这里要注意的是,Eclipse要以root权限启动不然无法抓包.
原创文章欢迎转载,请保留出处。
若有任何疑问建议,欢迎回复。
邮箱:[email protected]
紧接着上一篇,成功通过tcpdump和wireshark抓包后,试试自己写一个抓包器。这里我们使用libpcap库开发。
这里我们使用Eclipse for C/C++开发,安装的话只需要到eclipse官方下载解压就可以运行了,这里要注意的是,Eclipse要以root权限启动不然无法抓包。
首先创建一个空白的C语言项目,工具链选择Linux GCC
添加源文件,起名main.c,首先要配置下,右键点击项目,选择属性,链接pcap,如下图所示:
这里我不逐一介绍libpcap的api了,可以参考
http://www.ferrisxu.com/WinPcap/html/group__wpcapfunc.html#g659439bf5aa3988b5a92d31990fbf437
这里我写了一个简单的抓包器,获得80端口的数据包30个:
#include <stdio.h>
#include <string.h>
#include <pcap.h>
void 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; // 主机的IP地址
struct bpf_program filter; //已经编译好的过滤器
char filter_app[] = "port 80"; //BPF过滤规则,和tcpdump使用的是同一种过滤规则
/* 探查设备及属性 */
char *dev; //指定需要被抓包的设备 我们在linux下的两个设备eth0和lo分别是网卡和本地环回
dev = pcap_lookupdev(errbuf); //返回第一个合法的设备,我这里是eth0
pcap_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.问题
解决方法: http://www.th7.cn/Program/cp/201408/269716.shtml
然后用wireshark读入文件试试能否解析
成功,如果要改成本地抓包器的话,只需要把dev设置为lo然后bpf过滤规则设置成host localhost即可。