基于libpcap实现抓包程序

标签: libpcap 程序 | 发表时间:2015-04-28 16:32 | 作者:maxwell_nc
出处:http://blog.csdn.net

前言

  原创文章欢迎转载,请保留出处。
若有任何疑问建议,欢迎回复。
邮箱:[email protected]

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


创建配置工程

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

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

添加源文件,起名main.c,首先要配置下,右键点击项目,选择属性,链接pcap,如下图所示:
链接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即可。

作者:maxwell_nc 发表于2015/4/28 8:32:48 原文链接
阅读:113 评论:1 查看评论

相关 [libpcap 程序] 推荐:

基于libpcap实现抓包程序

- - CSDN博客推荐文章
原创文章欢迎转载,请保留出处. 邮箱:[email protected]. 紧接着上一篇,成功通过tcpdump和wireshark抓包后,试试自己写一个抓包器. 这里我们使用libpcap库开发. 这里我们使用Eclipse for C/C++开发,安装的话只需要到eclipse官方下载解压就可以运行了,这里要注意的是,Eclipse要以root权限启动不然无法抓包.

Android 应用程序

- - CSDN博客推荐文章
Android 应用程序由四个模块构造而成:Activity、Intent 、Content Provider 、Service. 下面简单介绍一下如下模块的含义:. 1、Activity  "活动". 一个Activity就是单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口并对事件作出响应.

Linux程序调试

- - C++博客-首页原创精华区
Linux下的段错误产生的原因及调试方法    原文地址: http://www.upsdn.net/html/2006-11/775.html .    参考地址: http://www.cnblogs.com/khler/archive/2010/09/16/1828349.html .

Cppentry程序开发

- -
最近修改公司线上kafka集群配置然后直接kill掉进程来重启集群发现所有生产者都无法写入数据导致丢了数据,栽了一个大坑,接下来的工作肯定是补坑找原因,就分享一下. 系统环境说明:kafka版本为0.8.1.1,kafka集群配置为10.12.0.23:2181,10.12.0.24:2181,10.12.0.25:2181/kafka,因此在zookeeper中的根路径为:/kafka.

普通程序员、文艺程序员、2B程序员

- 可可 - 宇宙的心弦
希望能引起广大苦逼的正在学或者已经学过c++人的共鸣和会心一笑吧. 如何辨别自己在现实还是虚拟世界.

如何面试程序员?

- bluesnail - 阮一峰的网络日志
你要面试一个程序员,应该问他什么问题. 有人在Hacker News的讨论区里,请求指点,怎么才能在面试中发现合格的人. 众人纷纷出主意,有很多高质量的回帖,我觉得挺有启发,就整理出了下面这篇文章. 首先,最重要的是,你自己一开始就应该想清楚:. 哪些途径和方法可以发现这样的人. 只有明确这些根本性的问题,才能正确高效地完成面试.

从流水程序到SOA

- Allen - 阿朱=行业趋势+开发管理+架构
咱就从函数代码开始谈起,更史前的Goto和汇编代码咱就不谈了. 函数和变量写多了,自然也就发现有些函数和变量互相粘在一起很高耦合,而与其它的一些却没多达关系,于是为了显性化让其他的开发人员知道哪些函数和变量确实关联性很紧密,于是创造了类. 面向对象在80年代的国外代码开发界颇为流行. 但接口思想的风潮在90年代刮起了.

程序员的本质

- Allen - 译言-电脑/网络/数码科技
来源What do programmers really do?.   很多人(包括我岳母)认为计算机变得如此智能,所以在不久的未来将不再需要程序员. 另外一些人认为程序员是天才,他们在电脑前能不断地解决复杂的数学难题. 甚至不少程序员对他们是做什么的都没有清晰的概念.   在这篇文章中,我想给不知情的人解释一下程序员到底是做什么的:.

程序员人生之路

- myartings - 博客园-首页原创精华区
   程序员人生之路(强烈推荐,分析的透彻. ),某程序达人的人生感悟,估计没有半个甲子的时间,是绝对不可能感悟出来的.    相对同时刚出校门同学从事其它行业而言优厚的薪水,以及不断学习更新的专业知识不仅仅让你感到生活的充实,更满足了你那不让外人知的虚荣心. 在刚出校门的几年中,你经常回头看看被你落在后面的同学们,在内心怜悯他们的同时,你也会对自已天天加班的努力工作感到心里平衡:“有付出才会有回报”这句话在那几年中你说的最多,不管是对自已的朋友们还是自已的爱人.