码迷,mamicode.com
首页 > 其他好文 > 详细

基于libpcap实现抓包程序

时间:2015-04-28 09:44:18      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:抓包   libpcap   wireshark   tcpdump   centos   

前言

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

紧接着上一篇,成功通过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即可。

基于libpcap实现抓包程序

标签:抓包   libpcap   wireshark   tcpdump   centos   

原文地址:http://blog.csdn.net/maxwell_nc/article/details/45330843

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!