基于libpcap实现抓包程序

前言

原创文章欢迎转载,请保留出处。
若有任何疑问建议,欢迎回复。
邮箱:[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即可。

时间: 2024-10-13 02:29:27

基于libpcap实现抓包程序的相关文章

c语言基于Linux下用libpcap实现抓包程序

c语言基于libpcap实现一个抓包程序过程 基于pcap的嗅探器程序的总体架构,其流程如下:(1)首先要决定用哪一个接口进行嗅探开始.在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等.我们也可以用一个字符串来定义这个设备,或者采用pcap提供的接口名来工作.(... 基于pcap的嗅探器程序的总体架构,其流程如下: (1)首先要决定用哪一个接口进行嗅探开始.在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等.我们也可以用一个字符串来定义这个设备,或者采用p

基于Linux C的socket抓包程序和Package分析 (一)

 测试运行平台:CentOS 6.5发行版,内核版本3.11 1. Linux抓包源程序 在OSI七层模型中,网卡工作在物理层和数据链路层的MAC子层. 进行网络通信时,源主机通过socket(或其它)应用程序产生IP报文,经过各个OSI层层封装,数据包以Ethernet帧的形式进入物理层.Ethernet帧包含源主机地址.IP报文.目标地址(IP地址.端口号或映射的6字节MAC地址)和需要传送到目标主机的其它信息. 目标的MAC地址是哪里来的呢?这牵扯到一个ARP协议(介乎于网络层和数据链

基于 libpcap库的sniffer程序

基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的结果用作业务用途. 1.   Libpcap抓取的数据包的结构 在实现我们的基于libcap的程序之前,我们先来了解一下libpcap(wiresharek和tcpdump也是这样)抓取的网络包的结构.下面以tcp/ip协议包为例: 上面的数据包一共有6部分:文件头,数据报报头,以太网帧头,IP头,

NetAnalyzer笔记 之 三. 用C++做一个抓包程序

[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Winpcap开发环境配置 完成了对Winpcap的介绍,什么,你没看到Winpcap的介绍,左转,百度(其实,真的是不想复制).我们就需要做一点有用的事情,比如写一个简单的数据采集工具.当然在此之前,我们需要配置Winpcap的开发环境. (1) 运行环境设置 Win32 平台下Winpcap应用程序

Windows下利用原始套接字实现的一个抓包程序Demo

早就学过了套接字编程,但是原始套接字还没用过.最近听了网络安全老师的课,心血来潮,写了个抓包程序Demo,把代码分享给大家,感兴趣的可以看看.引用一句网络安全老师的话:"你们要本着技术的心态去实践,哎,一部分人,写着写着就成黑客了". #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <WinSock2.h> #include <WS2tcpip.h> #include <s

基于HTTP访问特定URL的抓包程序该怎么写

抓包是一个简单易行的事,它可以帮你分析网络的行为.我记得早在2004年的时候,老师就讲过抓包有多么重要.        作为程序员而言,除了抓包几乎没有任何手段探测网络行为,程序员没有机会触摸网络设备,也就没有能力洞悉网络细节,程序员唯一能触摸到的就是自己的终端,在这个终端上唯一能做的就是抓包.我是半个程序员,所以不管站在谁的立场上,我都认为抓包是一个重要的事,虽然在我内心看来,抓包和分析数据包解决不了大多数的问题....        在一台承载大量业务的机器上怎么抓包成了一个问题.因为虚拟主

在Ubuntu 14.04 64位上使用libpcap进行抓包和解包

为了开发需要,我决定使用最新libpcap源码包安装.在Unix环境下安装libpcap库,需要c编译器,flex,bison等,安装Ubuntu系统时,没有这些包.安装flex需要m4编译环境,否则会提示"GNU M4 is required"错误. 1.安装系统依赖包sudo apt-get install gcc libc6-devsudo apt-get install m4sudo apt-get install flex bison 2.下载libpcap源码并安装从官网h

网络程序抓包工具

抓包程序主要需要理解的是ip结构,和tcp结构和udp结构等等 sinffer.cpp文件 // sinffer.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "pub.h" int main(int argc, char* argv[]) { if (argc < 3) { printf("usage: %s IPAddress port [byte]\n", argv[0]);

C#版的抓包软件

C#版的抓包软件 [创建时间:2015-09-10 22:37:04] NetAnalyzer下载地址 不好意思啊,NetAnalyzer停更有点长了,今天继续填坑^&^ NetAnalyzer实现结构 在上一篇中介绍一点VC++开发环境的配置,与基本的运行方式.因为NetAnalyzer使用的C#作为开发语言,所以在此主要介绍一些在C#环境下的开发环境的配置,与一些基本开发情况,力求在完成本篇后后,读者可以制作一个简单的抓包程序. 在开始编程前先要介绍连个.Net类库SharpPcap.dll