WinPcap教程(3):打开网卡抓包

PACP学习笔记三:PCAP方法说明 描述 用于创建数据包捕获句柄()以查看网络上的数据包。 source 是一个字符串,指定要打开的网络设备;在具有 2.2 或更高版本内核的 Linux 系统上,可以使用“any”或 NULL 的源参数来捕获来自所有接口的数据包。 返回的句柄必须先用 激活,然后才能用它捕获数据包;捕获的选项,例如混杂模式,可以在激活之前在句柄上设置。 成功时返回 pcap_t *,失败时返回 NULL。如果返回 NULL,则 errbuf 会填充适当的错误消息。假设 errbuf 至少能够保存 PCAP_ERRBUF_S 阅读详情

前篇:WinPcap教程(2):获取设备高级信息

 

我们已经知道如何获取网卡信息了,现在让我们开始进行真正的开发工作,即打开一个网卡并抓取数据包。本文中,我们将写一个程序来打印出流经网卡的每个包的相关信息。

 

打开抓包设备的函数是pcap_open(),该函数的参数中,snaplenflagsto_ms这三个值得解释一下:

snaplen

该参数设定了包需要抓取的部分。在一些操作系统上(xBSDWin32),包驱动程序可以配置成只抓取包的初始部分:这降低了应用拷贝数据的数量,从而提高扎包的效率。在我们使用高于我们可能碰到的最大MTU(Maximum Transmission Unit,最大传输单元,以字节为单位) 65536的情况下,这将确保应用总是接收到包的全部。

 

flags

最重要的标致应该是否将网卡设置成混杂模式(promiscuous mode)。在正常模式下,网卡只抓取来自网络的,以它为目的地的数据包,其他机器之间交换的包将被忽略。而在混杂模式下,将抓取所有的包,而不管该网卡是不是这些包的目的地。这意味着在共享介质(如未经交换的以太网,non-switched Ethernet)的情况下,WinPcap能够抓取到其他机器的包。多数抓包应用,混杂模式都是缺省的模式,下面的示例程序中,我们也采用混杂模式。

 

to_ms

该参数指定了读超时,以毫秒为单位。从网卡读数据时(比如,用pcap_dispatch()或者pcap_next_ex()),如果网络上无包可读,超时后(即过了to_ms毫秒后)总会返回。to_ms也定义了统计报告的时间间隔。将to_ms设为0,表示无超时,即在读网卡时,如果没有数据包到来,将永不返回;另一方面,如果设为-1,会使得对网卡的读操作立即返回。

 

#include "pcap.h"

 

/* prototype of the packet handler */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

 

int main()

{

pcap_if_t *alldevs;

pcap_if_t *d;

int inum;

int i=0;

pcap_t *adhandle;

char errbuf[PCAP_ERRBUF_SIZE];

   

    /* Retrieve the device list on the local machine */

    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)

    {

        fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);

        exit(1);

    }

   

    /* Print the list */

    for(d=alldevs; d; d=d->next)

    {

        printf("%d. %s", ++i, d->name);

        if (d->description)

            printf(" (%s)/n", d->description);

        else

            printf(" (No description available)/n");

    }

   

    if(i==0)

    {

        printf("/nNo interfaces found! Make sure WinPcap is installed./n");

        return -1;

    }

   

    printf("Enter the interface number (1-%d):",i);

    scanf_s("%d", &inum);

   

    if(inum < 1 || inum > i)

    {

        printf("/nInterface number out of range./n");

        /* Free the device list */

        pcap_freealldevs(alldevs);

        return -1;

    }

   

    /* Jump to the selected adapter */

    for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

   

    /* Open the device */

    if ( (adhandle= pcap_open(d->name,      // name of the device

                              65536,      // portion of the packet to capture

                                          // 65536 guarantees that the whole packet will be captured on all the link layers

                              PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode

                              1000,             // read timeout

                              NULL,             // authentication on the remote machine

                              errbuf            // error buffer

                              ) ) == NULL)

    {

        fprintf(stderr,"/nUnable to open the adapter. %s is not supported by WinPcap/n", d->name);

        /* Free the device list */

        pcap_freealldevs(alldevs);

        return -1;

    }

   

    printf("/nlistening on %s.../n", d->description);

   

    /* At this point, we don't need any more the device list. Free it */

    pcap_freealldevs(alldevs);

   

    /* start the capture */

    pcap_loop(adhandle, 0, packet_handler, NULL);

   

    return 0;

}

 

 

/* Callback function invoked by libpcap for every incoming packet */

void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)

{

    struct tm ltime;

    char timestr[16];

    time_t local_tv_sec;

 

    /*

     * unused variables

     */

    (VOID)(param);

    (VOID)(pkt_data);

 

    /* convert the timestamp to readable format */

    local_tv_sec = header->ts.tv_sec;

    localtime_s(&ltime, &local_tv_sec);

    strftime( timestr, sizeof timestr, "%H:%M:%S", &ltime);

   

    printf("%s,%.6d len:%d/n", timestr, header->ts.tv_usec, header->len);

   

}

 

打开网卡后,就可以用pcap_dispatch()或者pcap_loop()开始抓包了。这两个函数非常相似,不同的是当超时到了后,pcap_dispatch()会返回(尽管不能保证),而pcap_loop()则不会返回,直到抓取了cnt个包(译注:cntpcap_loop()函数的一个参数,其含义见pcap_loop()的原型),因此在比较空闲网络情况下,会被阻塞很长时间。在本例中,pcap_loop()就够用了,pcap_dispatch()通常用于更复杂的程序。

 

这两个函数都各有一个callback参数,即packet_handler,它指向用于处理包数据的函数。每当有新的包从网络上到达时,该函数就会自动被libpcap调用,以接收一个通用状态(generic status,和pcap_loop()pcap_dispatch()中的user参数对应);一个含有信息包头,诸如时间戳和长度;以及包括协议头在内的真正包数据。注意CRC帧一般不提供,因为网卡在帧完整性验证后会将其删除。另外,大多数网卡在收到错误的CRC后,会将相应的包丢弃。因此,这些被丢弃的包,WinPcap是抓取不到的。

 

上面的例子从pcap_pkthdr头提取了时间戳和每个包的长度,并打印在屏幕上。

 

请注意到,上面的pcap_loop()或许存在一个不足之处,主要是基于这样一个事实:处理函数(handler)是由抓包驱动程序调用的,因此用户的应用程序不能直接控制它。另外一个方法就是使用pcap_next_ex()函数,将在下一个示例程序说明。

 

后篇:待续

Java搭建winpcap开发环境-使用IDEA 一、前言 计算机网络的课程设计要求简直惜字如金 深深地感受到了被课程设计支配的恐惧… 于是就在winpcap jpcap等不像人话的名次中摸不到头脑 下面先让我们认识一下这几个名词 再屡屡他们之间的关系 1.1 JDK中的java.net包 对于Java开发者来说,java.net包里面提供的类和接口提供是TCP UDP两种网络协议的支持 也就是说基于JDK的网络编程都是在运... 阅读详情

相关推荐

python3使用winpcap

python3使用winpcap关于winpcap的简单介绍winpcap抓包介绍(各函数及其参数)对于上面的示例代码的介绍 关于winpcap的简单介绍 winpcap的历史说起来就比较麻烦了, 简单来说,他使用unix下跨平台 抓包工具libpcap 往上封装而成,感兴趣的可以自行查询,同级别的还有npcap,但是,npcap相对来说比winpcap优势更大,哈哈,从wireshark3.0开...

weixin_43673352的博客 6870

winPcap函数-pcap_open()

pcap_t *pcap_open(const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf); 简介 打开通用源以捕获/发送(仅WinPcap)流量。 pcap_open()用一个调用替换所有pcap_open_xxx()函数。 该函数隐藏了不同的pcap_open_xxx()函数之间的差异,因此程序员不必管理其他打开函数。这样,“ true”打开函数根据源类

西门吹雪 1954

WinPcap到Npcap:Windows网络抓包驱动的演进与实战配置

网络数据包捕获是网络分析、安全审计和故障排查的基础技术,其核心在于通过驱动层接口获取原始网络流量。在Windows平台上,这一功能长期由经典的WinPcap驱动提供支持,它通过NDIS接口在协议栈层面捕获数据包,为Wireshark等工具赋予了“看见”网络流量的能力。随着技术发展,现代网络环境对驱动的性能、安全性和对新硬件的兼容性提出了更高要求,这直接推动了捕获驱动的迭代。Npcap作为WinPcap的现代替代品,基于NDIS 6.x架构重构,不仅提升了驱动稳定性和对USB网卡等新硬件的支持,更引入了仅管理

weixin_34115824的博客 335

pcap_open()函数中的标志位

定义 #define PCAP_OPENFLAG_PROMISCUOUS 1 定义适配器是否必须进入混杂模式。 #define PCAP_OPENFLAG_DATATX_UDP 2 定义是否必须使用UDP协议进行数据传输(在远程捕获的情况下) #define PCAP_OPENFLAG_NOCAPTURE_RPCAP 4 定义远程探针是否将捕获其自己生成的流量。 #define PCAP_OPENFLAG_NOCAPTURE_LOCAL 8 定义本地适配器是否将捕获其自身生成的流量。

西门吹雪 1269

pcap_open() 打开适配器

打开远程捕获,pcap_open()是目前唯一可用的API。

张张的博客 766

pcap_open 和 pcap_open_live

pcap_t* pcap_open ( const char * source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth * auth, char * errbuf ) 打开一个通用源,以便捕获/发送(仅限WinPcap)流量。 该pcap_open()替换所有pcap_open_x

swartz_lubel的专栏 2万+

Java抓包分析一(基于jnetpcap进行抓包)——抓包环境搭建,获取网卡

基于jnetpcap进行抓包环境以及开发环境的搭建

歪桃的博客 2万+

C++ winpcap网络抓包代码实现,以及抓包内容解析。

C++ winpcap网络抓包代码实现,以及抓包内容解析。 c++实现抓包代码 1.安装winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的网络编程。Winpcap提供了一个强大的编程接口,它很容易地在各个操作系统之间进行移植。 百度网盘: 链接:https://pan.baidu.com/s/1ot7H3Vz_KBvdmYKjJqu

qq_34481573的博客 1万+

winpcap抓包原理

WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。WinPcap 是 BPF 模型和 Libpcap 函数库在 Windows 平台下网络数据包捕获和网络状态分析的一种体系结构,这个 体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库 Packet.dll 和一个高层的独立于系统的函数库 Libpcap 组成。

Hacker_Oldv的博客 971

windows下如何正确使用Ethereal抓包工具。

前言:由于课程实验的需要,特地安装了Ethereal,但这个过程非常的曲折,出现了各种报错!首先是安装过程就出现了当前Windows版本不支持winpcap3.1的报错,如果没有这个东西我们是无法抓包的。图么有了。。。下面将总结我遇到的错误。 一、安装过程出现不支持winpcap3.1: 解决办法:到winpcap官网下载一个最新的winpcap安装程序,附上传送门:https://www.w...

lzh 1万+

WinPcap 4.1.3安装包及网络抓包环境搭建指南

WinPcap(Windows Packet Capture)是一个为Windows平台设计的网络数据包捕获与传输库,其核心功能基于底层驱动实现,能够绕过协议栈直接访问网卡数据。它由两个主要部分组成:用户态的动态链接库(wpcap.dll)和内核态的网络驱动(npcap或旧版驱动),使得应用程序可以以高效率、低延迟的方式捕获和发送原始数据包。其广泛应用于网络监控、协议解析、入侵检测系统(IDS)、流量分析以及网络安全审计等领域。

weixin_30798867的博客 2134

实现网络抓包功能的Winpcap工具开发指南

Winpcap是一个强大的网络分析工具库,广泛应用于Windows平台上网络通信数据包的捕获和分析。它的核心功能允许用户无需依赖特定的操作系统协议实现即可直接访问网络层数据。数据链路层是OSI模型的第二层,主要负责网络中相邻节点之间的数据传输。在这一层面上,网络抓包工具可以捕获到帧(Frames),这是网络接口卡(NIC)之间传输的最基本的数据单元。每个数据帧都包含了源地址、目的地址以及数据载荷。

weixin_42511373的博客 2128

Java抓包分析二(基于jnetpcap进行抓包)——快速入门案例

基于jnetpcap进行一个快速入门的抓包案例

歪桃的博客 1万+

winpcap/npcap 提高抓包效率 发UDP包失败

最近使用winpcap在win7下编写网络抓包程序,记录一下。 winpcap是比较老的网络抓包库,在win7和win10上依赖都不是很好,看网上有针对的win10版本的winpcap安装包,这里分享了win10下的winpcap安装包和编译好的库以及winpcap的源程序,连接如下win10pcap安装包 关于win10下重新编译wpcap可参考另外一篇,主要记录了遇到的问题win7编译wpca...

fengsuiyunqing的博客 4261

winpcap php,利用WinpCap 编写抓包程序

Problem1解决编译过程中pcap.h no such file or directory 问题:下载WpdPack_3_2_alpha1.zip(下载地址:)然后解压,解压缩就可以看见Include和lib;然后用VC++打开项目,在"Project->Settings"标签栏中选择"C/C++",在"Preprocessor definitions"的输入框里添加"WPCAP";再选...

weixin_42526015的博客 397

winpcap-Windows抓包工具

winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的网络编程。 特点 Winpcap提供了一个强大的编程接口,它很容易地在各个操作系统之间进行移植,也很方便程序员进行开发。 什么样的程序需要使用Winpcap 很多不...

顺其自然~专栏 7498
上一篇: WinPcap教程(2):获取设备高级信息
下一篇: 迭代器特性介绍
pathuang68
博客等级 码龄18年 1821粉丝 194原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值