Winpcap不同版本之间的一个小差异导致的错误。

Winpcap for delphi (Snoop 3.0) winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。   winpcap 驱动各项功能    1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;   2> 在数据包发往应用程序之前,按照自定义的规则将某些 阅读详情
原来机器中的Winpcap的版本是3.0,程序总是运行不下去,分析之后得知原来是自己的Winpcap版本出了错,其中的一个函数pcap_findalldevs_ex(),在3.0的版本和3.2的版本中的参数的个数不一样,导致程序出错。事例代码如下:
#include <pcap.h>
#include <remote-ext.h>

/* 4 bytes IP address */
typedef struct ip_address
{
 u_char byte1;
 u_char byte2;
 u_char byte3;
 u_char byte4;
}ip_address;

/* IPv4 header */
typedef struct ip_header
{
 u_char ver_ihl;  /* Version (4 bits)版本 + Internet header length 首部长度(4 bits)*/
 u_char tos;      /* Type of service 服务类型*/
 u_short tlen;    /* Total length 16位标示*/
 u_short identification; /* Identification */
 u_short flags_fo;       /* Flags (3 bits)三位标志 + Fragment offset十三位偏移 (13 bits)*/
 u_char ttl;      /* Time to live八位生存时间 */
 u_char proto;    /* Protocol八位协议 */
 u_short crc;     /* Header checksum 十六位首部校验和*/
 ip_address saddr;/* Source address 32位源IP地址*/
 ip_address daddr;/* Destination address 32位目的IP地址*/
 u_int op_pad;    /* Option + Padding选项和数据 */
}ip_header;

/* UDP header */
typedef struct udp_header
{
 u_short sport;   /* Source port源端口 */
 u_short dport;   /* Destination port 目的端口*/
 u_short len;     /* Datagram length 数据长度*/
 u_short crc;     /* Checksum 校验和*/
}udp_header;

//连接表元素的结构
typedef    struct  link_elem   
{
        ip_address saddr;  //IP地址Source ip address
        ip_address daddr;  //目标IP地址
        u_short    sport;  // Source port
        u_short    dport;  // Destinaion port
        char      *mailsaddr; //源Email地址
        char      *maildaddr; //目的Email地址
        bool       ifdata; //是否Data
        time_t     rtime; //到达时间
}link_elem;
   

    //邮件正文段
typedef    struct data_content
    {
        char *lcontent;  //正文段
        data_content *next_file; //下一个邮件正文段
    }data_content;

/* 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];
 u_int netmask;
 char packet_filter[] = "ip and udp";
 struct bpf_program fcode;////???????????????????????//

 /* Retrieve the device list */
 if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
 {
    /*
    在UNIX操作系统结构中,它把各种外部设备也看成是文件。
    所以 fprintf不仅能把errbuf的内容输出到磁盘文件里,
    也可以输出到像终端这样的特殊文件里。printf是fprintf的一个特例,
    它固定的只能把相应内容输出到终端文件上。
    */
  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("%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, /* 设备名 */
         65536, /* 所截包的大小 */
         /* 65536 guarantees that the whole packet will be captured on all the link layers */
         PCAP_OPENFLAG_PROMISCUOUS, /* 混杂模式 */
         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");
  /* Free the devices list */
  pcap_freealldevs(alldevs);
  return -1;
 }

 /* Check the link layer. We support only Ethernet for simplicity
 
 int pcap_datalink(pcap_t* p)

返回链路层上的一个适配器。返回链路层的类型,链路层的类型包括:

l         DLT_NULL: BSD回路封装;链路层协议头是一个4字节的域,
          以主机字节顺序(host byte order),包含一个从socket.h来的PF_value。
          主机字节顺序(host byte order)是捕获数据包的机器的字节顺序,
          而PF_value是捕获数据包的机器的OS。如果一个读取一个文件,
          字节顺序和PF_value不一定是抓取文件的那些机器。

l         DLT_EN10MB: 以太网(10Mb, 100Mb, 1000Mb, 或者更高)。

l         DLT_IEEE802: IEEE802.5令牌环网。

l         DLT_ARCNET:ARCNET。

l         DLT_SLIP:SLIP。

l         DLT_PPP:PPP;如果第一个字节是0xff或0x03,它是类HDLC帧上的PPP。

l         DLT_FDDI:FDDI

l         DLT_ATM_RFC1483:RFC1483LLC/SNAP ATM;数据包以IEEE802.2 LLC头开始。

l         DLT_RAW:原始IP(raw IP);数据包以IP头开始。

l         DLT_PPP_SERIAL:按照RFC1662,基于类HDLC帧的PPP,或者按照RFC1547的4.3.1,
          基于HDLC帧的Cisco PPP;前者的第一个字节是0xFF,后者的第一个字节是0x0F或0x8F。

l         DLT_PPP_ETHER:按照RFC2516,PPPoE;数据包以PPPoE头开始。

l         DLT_C_HDLC:按照RFC1547的4.3.1,基于HDLC帧的Cisco PPP。

l         DLT_IEEE802_11:IEEE 802.11无线局域网。

l         DLT_FRELAY:帧中继(Frame Relay)。

l         DLT_LOOP:OpenBSD回路封装。

l         DLT_LINUX_SLL:Linux抓包封装。

l         DLT_LTALK:苹果的LocalTalk,数据包以AppleTalk LLAP头开始。

l         DLT_PFLOG:OpenBSD pflog。

l         DLT_PRISM_HEADER:后接802.11头的棱镜监视器模式(Prism monitor mode)信息。

l         DLT_IP_OVER_FC:RFC2625 IP-over-Fiber 频道,以RFC2625中定义的Network_Header开始。

l         DLT_SUNATM:SunATM设备。

l         DLT_IEEE802_11_RADIO:后接802.11头的链路层信息。

l         DLT_ARCNET_LINUX:没有异常帧的ARCNET。

l         DLT_LINUX_IRDA:Linux-IrDA数据包,DLT_LINUX_SLL头后接IrLAP头。
 
*/

 if (pcap_datalink(adhandle) != DLT_EN10MB)
 {
  fprintf(stderr, "/nThis program works only on Ethernet networks./n");
  /* Free the devices list */
  pcap_freealldevs(alldevs);
  return -1;
 }


/******************************************************
就是将pcap_addr结构体中的netmask字段赋值给netmask变量。
if判断表示如果网卡d的addresses不为NULL,
那么就将其中的netmask转化成相应格式的数据并赋值给netmask;
否则,就将netmask变量赋值为ffffffff。
********************************************************/
 if (d->addresses != NULL)
 {
  /* Retrieve the mask of the first address of the interface */
  netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;//????????????
 }
 else
 {
  /* If the interface is without addresses we suppose to be in a C class network */
  netmask = 0xffffffff;
 }

 /* complie the filter */
 if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0)
 {
  fprintf(stderr, "/nUnable to compile the packet filter. Check the syntax./n");
  /* Free the devices list */
  pcap_freealldevs(alldevs);
  return -1;
 }


 /* set the filter */
 if (pcap_setfilter(adhandle, &fcode) < 0)
 {
  fprintf(stderr, "/nError setting the filter./n");
  /* Free the devices 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 1;
}

/* 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];
 ip_header* ih;
 udp_header* uh;
 u_int ip_len;
 u_short sport, dport;

 /* convert the timestamp to readable format */
 ltime = localtime(&header->ts.tv_sec);
 strftime(timestr, sizeof(timestr), "%H:%M:%S", ltime);

 /* print timestamp and length of the packet */
 printf("%s.%.6d len: %d ", timestr, header->ts.tv_usec, header->len);

 /* retrieve the position of the ip header */
 ih = (ip_header*)(pkt_data + 14);  /* length of ethernet header MAC头是14字节*/

 /* retrieve the position of the udp header */

     /***********************************************
     ih->ver_ihl & 0xf就是ih->ver_ihl与00001111按位与,
     这样就能取得ih->ver_ihl的后四位的值,
     也就是ip报头中的“报头长度”字段,
     再将该按位与的结果乘以4(该字段以4个字节为基本单位),
     就得到ip报头有多少个字节。
     ************************************************/

 ip_len = (ih->ver_ihl & 0xf) * 4
/*IP包头的长度域来获得Ip包头的大小*/;
 uh = (udp_header*)((u_char*)ih + ip_len);

 /* convert from network byte order to host byte order */
 /*sport = ntohs(uh->sport);
 dport = ntohs(uh->dport);*/

 /* print ip addresses and udp ports */
 printf("%d.%d.%d.%d -> %d.%d.%d.%d/n",
  ih->saddr.byte1,
  ih->saddr.byte2,
  ih->saddr.byte3,
  ih->saddr.byte4,
  /*sport,*/
  ih->daddr.byte1,
  ih->daddr.byte2,
  ih->daddr.byte3,
  ih->daddr.byte4
  /*dport*/);
}
Wireshark安装遇0x8007007e错误?WinPcap替代方案快速解决网络抓包问题 网络数据包捕获是网络分析、安全审计和协议调试的基础技术,其核心在于系统驱动层对网络接口的访问与控制。在Windows平台上,这通常依赖于特定的数据包捕获库来实现原始数据包的嗅探。从技术原理上看,这类库通过提供标准的API接口,使得上层应用能够绕过操作系统协议栈直接与网卡驱动交互,从而实现对流量的实时监控与分析。其技术价值在于为网络故障诊断、性能优化和安全威胁检测提供了底层数据支撑,广泛应用于网络运维、渗透测试和软件开发等场景。当现代库如Npcap因系统兼容性或驱动冲突导致安装失败时,回归经典的WinPcap 阅读详情

相关推荐

Npcap vs WinPcap 深度对比:5大特性差异与Windows 11兼容性实测

本文深入对比了Npcap与WinPcap在Windows 11环境下的5大特性差异,包括性能、兼容性和安全性。实测数据显示,Npcap在吞吐量、延迟和CPU占用率上显著优于WinPcap,尤其在虚拟网卡支持方面表现突出。Npcap的现代架构和安全特性使其成为网络抓包工具的首选。

weixin_33798152的博客 333

使用pcap_findalldevs_ex 编程出现问题

使用pcap_findalldevs_ex 编程出现问题 分类: C/C++/MFC 2011-10-12 14:42 353人阅读 评论(0) 收藏 举报        使用pcap_findalldevs_ex()函数编程,在文档中是这样介绍这个函数的: This function is a superset of the old 'pcap_findalldevs

longzhiten98的专栏 3542

VC6到VS2022:WinPcap开发环境配置全版本避坑指南(含WpdPack库下载)

本文详细介绍了从VC6到VS2022全版本Visual Studio中配置WinPcap开发环境的完整指南,包括WpdPack库下载和避坑技巧。针对不同版本的IDE,提供了具体的环境配置方案和常见问题解决方案,帮助开发者高效进行网络编程开发。

weixin_30613343的博客 346

winPcap_3_获取设备列表

获取设备列表 int pcap_findalldevs_ex ( char * source, //The 'source' is a parameter that tells the function where the lookup has to be done and it uses the same syntax of the pcap_open(). ...

weixin_33851177的博客 133

VC6到VS2022:WinPcap网络编程环境配置全版本避坑指南(含WpdPack库下载)

本文详细介绍了从VC6到VS2022各版本Visual Studio中配置WinPcap网络编程环境的完整指南,包括WpdPack库的下载与使用。文章涵盖了开发环境准备、各版本IDE的配置要点、常见问题解决方案以及跨版本迁移实战案例,帮助开发者快速搭建稳定的WinPcap开发环境。

weixin_30700099的博客 341

WinPcap环境配置踩坑实录:从VC++6.0到VS2022的兼容性问题全解决

本文详细解析了WinPcap在VC++6.0到VS2022不同开发环境中的兼容性问题及解决方案,涵盖编译器差异、库文件适配和链接器错误处理。通过实战案例和配置指南,帮助开发者高效解决网络编程中的环境配置难题,实现跨时代项目的平滑迁移。

weixin_30480075的博客 423

Winpcap Snoop 3.0 SDK for delphi 开发包

Winpcap Snoop 3.0 SDK for delphi 开发包 去发现同类优质开源项目:https://gitcode.com/ Winpcap Snoop 3.0 SDK for delphi 是一款专为DELPHI开发者设计的开发包,内含基于DELPHI的完整开发工具和DEM演示案例。 Winpcap是一套强大的、开放式的网络底层驱动,它为win32应用程序提供了访问网络底层的能力。...

gitblog_06708的博客 444

别再为eNSP报错发愁了!保姆级VirtualBox 5.2.44 + WinPcap 4.1.3 + Wireshark 3.6.2 环境配置指南

本文提供了一份详细的eNSP环境配置指南,解决常见的VirtualBox、WinPcap和Wireshark兼容性问题。通过黄金组合VirtualBox 5.2.44 + WinPcap 4.1.3 + Wireshark 3.6.2,帮助用户避免报错并实现稳定运行。文章还包含安装步骤、深度配置和实战排错技巧,适合网络初学者和专业人士。

weixin_30652491的博客 451

winpcap捕获数据包

//技术手册:http://www.ferrisxu.com/WinPcap/html/index.html   Winpcap配置编程环境以及出错处理 2011-04-20 11:58 Winpcap配置编程环境: 安装Winpcap,接着: ...

宿命java 749

winpcap3.0

要使用这个程序必需首先安装winpcap3.0,这样你才能抓包.安装完winpcap后,直接运行qqscrak.exe

winpcap_3_1.rar

winpcap_3_1.rar 网络编程的好工具,包括WinPcap的驱动安装程序以及WpdPack_3_1开发包

winpcap

<br /> WinPcap学习笔记<br />——————————————————————————————————————————————————————<br /><br />一、什么是WINPCAP<br />winpcap(windows packet capture)是windows平台下一个免费、开源、公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它的主要功能是进行数据包捕获和网络分析。它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核

hyf699的专栏 838

WinPcap 3.0

WinPcap 3.0 --- ARP欺骗工具

Wireshark抓包失败?Npcap兼容性问题终极解决方案:切换WinPcap

网络数据包捕获是网络分析、安全研究和协议调试的基础技术,其核心在于系统底层的抓包驱动。在Windows平台上,Wireshark作为主流工具,其功能高度依赖于Npcap或WinPcap这类驱动。当驱动与系统环境因**兼容性问题**(如安全软件冲突、系统文件缺失)导致服务创建失败时,核心抓包功能将完全瘫痪。此时,回归成熟稳定的**WinPcap**驱动成为一种高效的工程实践解决方案。它能快速恢复对物理网卡流量的捕获能力,确保网络排查与学习的基本需求。本文聚焦于解决因Npcap驱动错误(如错误代码0x80070

weixin_34127717的博客 415

WinPcap3.0版(驱动程序+开发包+帮助文档)

WinPcap3.0版(驱动程序+开发包+帮助文档),它是一款用于Windows的开源库,用于网络抓包应用程序的开发。

OpenCode:开源代码智能代理平台的全面解析

OpenCode是一个开源代码智能代理平台,采用模块化微服务架构,支持多种AI模型集成。该系统包含前端交互层、代理服务层和模型集成层,提供Build、Plan和General三种代理模式,分别负责代码编写、分析和复杂任务处理。OpenCode支持跨平台安装,具备权限验证、上下文感知等安全机制,并集成LSP协议实现深度代码理解。相比竞品,其开源特性、终端优先设计和提供商无关架构具有明显优势,适用于个人开发、团队协作等多种场景,为开发者提供强大的AI辅助编程能力。

Aaron_945的博客 1425

WinPcap学习笔记

2008年05月09日 星期五 下午 05:33这是上学期上的《网络编程实践》课上,老师提供的学习文档。基本上算比较基础的内容了。第三部分有一些源代码,发过来的时候我删掉了,都是WinPcap官方提供的文档里面的例子,官方文档的内容其实已经非常完整了,如果英文看不懂的话,网上搜索一下也有中文的版本。把官方文档的教程看完了也就能掌握基本的了。———————————————————

许落 1935

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6792
上一篇: How to spawn console processes with redirected standard handles
下一篇: Pragma学习总结
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值