搭建WinPcap开发环境

 

本文参考了以下文档:

http://www.winpcap.org/docs/docs_411/html/group__wpcapsamps.html

  

一、 软件准备

1)         下载最新版本的WinPcap安装包。地址:http://www.winpcap.org/install/default.htm

2)         下载最新版本的WinPcap开发包。地址:http://www.winpcap.org/devel.htm

3)         安装WinPcap。双击步骤1)下载的WinPcap_4_1_1.exe(这是到目前为止最新版本的WinPcap安装包),

    

    搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

     图1

 

点击Next按钮,

    搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 

 

    图2

     点击Next按钮,

    搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 

    图3

 

点击I Agree按钮,

    搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 

    图4

 

Automatically start the WinPcap driver at boot time这个复选框可选也可不选,然后点击Install按钮,

    搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 

    图5

 

点击Finish按钮,即安装完成。

 

这个安装过程主要工作是将wpcap.dll拷贝到了系统目录,比如C:/WINDOWS/system32中,并注册。

4)         解压开发包步骤2)下载的WpdPack_4_1_1.zip到一个指定的目录,比如:D:/WinPcapDevelopmentPack,解压后的目录结构如下:

    

    搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

     图6

 

其中docs目录中包含了WinPcap相关文档,Examples-pcap和Examples-remote都是使用WinPcap的一些例子程序,Include目录包含的是头文件,Lib目录中包含的是库文件。

 

         到此,准备工作完成。

 

二、 VC环境配置

用微软Visual C++创建一个应用,使用wpcap.dll,可按照下列步骤:

-       在每个需要使用库导出的函数(functions exported by library)的源文件开始处,包含pcap.h头文件;

-       如果程序用到了WinPcap和Win32平台呢相关的函数,记得在预处理器定义中包含WPCAP;

-       如果程序用到了WinPcap的远程抓取功能,则需要在预处理器定义中加入HAVE_REMOTE,而不要在源文件中直

接包含头文件remote-ext.h;

-            根据你的目标平台(x86 或 x64),将wpcap.lib包含到连接选项中。x86的wpcap.lib可以在WinPcap developer’s pack

的/lib目录下找到,x64的wpcap.lib可以在/lib/x64目录下找到;

 

下面讲述怎样设定Microsoft Visual Studio,主要详细讲解如何在Visual Studio 2010中如何配置相关环境,Visual Studio 6和Visual Studio 2005中配置情况大致如下:

Visual Studio 6

-        要增加一个预处理器定义,你必须从Project菜单中选择Settings,然后选择C/C++标签,在“Preprocessor Definitions”

对话框中添加预处理定义;

-        要在Microsoft Visual C++中一个项目添加库,首先从Project菜单中选择Settings,然后选择Link标签,并将新库

的名字加入到“Object/library modules”文本编辑框中;

-        如果要添加Visual C++搜索库的路径,从Tools菜单中选择Options,然后选择Directories标签,并在下面的Directories中增加相关路径;

 

Visual Studio 2005 (编译x64应用时必须为Visual Studio 2005或更高的版本)

-        要增加一个预处理器定义,你必须从Project菜单中选择Properties然后选择左边立标狂中的C/C++,再选择其下的

Preprocessor,将定义添加在右边的Preprocessor Definitions文本框中;

-        要给项目增加库,选择Project菜单中的Properties,然后选中左边列表中的Linker,在选中其下的Input,将库的名

字加入到右边的Additional Dependecies文本框中;

-        如果要添加Visual Studio搜索库的路径,从Tools菜单中选择Options,在左边的列表框内选中Project and Solutions,

再选中其下的VC++ Directories,在右边选的Show directories for 下拉框中选中Library Files,并在其下面的输入框

中加入相关路径;

-            如果要添加Visual Studio搜索的include路径,从Tools菜单中选择Options,在左边的列表框内选中Project and

Solutions,再选中其下的VC++ Directories,在右边选的Show directories for 下拉框中选中Include Files,并在其

下面的输入框中加入相关路径;

 

Visual Studio 2010

1)         启动Visual Studio 2010,并新建一个项目:

 

     搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

     图7

 

2)         设置项目相关参数如下:

     搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

      图8

 

选择Visual C++,选择Empty Project,项目名称为NetworkAdapterList,Solution的名称为LearnWinPcap,点击OK按钮。

 

3)         为项目NetworkAdapterList增加一个cpp文件,

       搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

      图9

 

不放将该cpp的文件名称也设为NetworkAdapterList如下:

      搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

图10

 

点击Add按钮。

 

4)         如下图,点击菜单Project – NetworkAdapterList Property

       搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

       图11

 

得到,

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

图12

 

5)         增加预处理定义WPCAP和HAVE_REMOTE。在上图中点开Configuration Properties – C/C++ - Preprocessor,选中右边的Preprocessor Definitions,再选中其右边的带向下三角形的按钮,再点击弹出的Edit下拉菜单,

     搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

        图13

 

如下图增加WPCAP和HAVE_REMOTE,

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

图14

 

点击OK按钮,即可。

 

完成后的样子如下:

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图15

 

点击应用按钮,带点击确定按钮。

 

WPCAP的含义只抓去本机的通讯包,HAVE_REMOTE的含义是本地机器可以抓去所在网段上其他机器的通讯包。

 

6)         增加库文件。如下图,选中Configuration Properties – Linker – Input – Additional Dependencies

          搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

          图16

 

选中其右边的带向下三角形的按钮,再点击弹出的Edit下拉菜单,

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图17

 

如上图增加了wpcap.lib和Packet.lib,点击OK按钮,

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图18

 

点击应用按钮,再点击确定按钮。

 

到此,向项目添加库文件的工作也已经完成。

 

7)         在步骤6)中增加的库文件,以及前面提及的头文件,VC并不知道位于何处,因此要为VC增加相关搜索路径。如下图选中Configuration Properties – VC Directories – Include Directories,

     搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

        图19

 

选中Include Directories,并如步骤5)或6)对其编辑,新增路径如下:

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

图20

 

D:/WinPcapDevelopmentPack/Include就是开发包解压后头文件所在的位置。点击OK按钮。这样头文件的搜索路径就增加完成了。

 

下面我们增加库文件的搜索路径。如下图选中Configuration Properties – VC Directories – Library Directories,

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图21

 

并如步骤5)或6)对其编辑,新增路径如下:

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图22

 

点击OK按钮,然后再点击应用按钮,确定按钮。

 

到此所有的配置工作已经完成

 

三、 第一个WinPcap应用程序

         我们把D:/WinPcapDevelopmentPack/Examples-pcap/iflist下的iflist.c文件中的内容拷贝到NetworkAdapterList.cpp

中,并去掉一些相关版权说明信息。发现有很多错误,如下图所示:

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图23

 

这是什么原因呢?原因就在pcap.h中前面几行代码,

#if defined(WIN32)

                 #include <pcap-stdinc.h>

#elif defined(MSDOS)

                 #include <sys/types.h>

                 #include <sys/socket.h>  /* u_int, u_char etc. */

#else /* UN*X */

                 #include <sys/types.h>

                 #include <sys/time.h>

#endif /* WIN32/MSDOS/UN*X */

 

         上面的代码是说,

1)         如果定义了WIN32宏,那么就#include <pcap-stdinc.h>,

2)         否则如果定义了MSDOS宏,那么就#include <sys/types.h>和#include <sys/socket.h>,

3)         否则,就#include <sys/types.h>和#include <sys/time.h>了

其中1)是针对Win32平台的,2)是针对DOS平台的,3)是针对UN*X平台的。

 

很显然我们没有在任何地方定义WIN32预处理,也没有定义MSDOS预处理,因此编译器就选择了3),而这是针对UN*X平台的,故而会出现前面样的错误。

 

网上有人提出这样的解决办法,即只保留上面代码中#include <pcap-stdinc.h>这一行,其他的全部删除,这样做当然可以解决上面的问题,但这样的解决方法不甚妥当。作为原则,除非万不得已,我们不要轻易修改他人提供的头文件,尤其是像WinPcap经过很多人验证过的软件包。

 

解决办法其实很简单,只需在NetworkAdapterList.cpp中的#ifdef _MSC_VER这一行下增加如下一行,

#define WIN32

即定义一个WIN32预处理,这样一来前面的提及的错误就全部消失了。

 

由于我们是在Visual Studio下面编译该程序,因此NetworkAdapterList.cpp中与MINGW32相关的代码尽可删去,最后得到的代码如下:

#ifdef _MSC_VER

#define WIN32

/*

 * we do not want the warnings about the old deprecated and unsecure CRT functions

 * since these examples can be compiled under *nix as well

 */

#define _CRT_SECURE_NO_WARNINGS

#endif

 

#include "pcap.h"

 

#ifndef WIN32

         #include <sys/socket.h>

         #include <netinet/in.h>

#else

         #include <winsock.h>

#endif

 

 

// Function prototypes

void ifprint(pcap_if_t *d);

char *iptos(u_long in);

 

int main()

{

         pcap_if_t *alldevs;

         pcap_if_t *d;

         char errbuf[PCAP_ERRBUF_SIZE+1];

        

         /* Retrieve the device list */

         if(pcap_findalldevs(&alldevs, errbuf) == -1)

         {

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

                   exit(1);

         }

        

         /* Scan the list printing every entry */

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

         {

                   ifprint(d);

         }

 

         /* Free the device list */

         pcap_freealldevs(alldevs);

 

         return 1;

}

 

/* Print all the available information on the given interface */

void ifprint(pcap_if_t *d)

{

  pcap_addr_t *a;

 

  /* Name */

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

 

  /* Description */

  if (d->description)

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

 

  /* Loopback Address*/

  printf("/tLoopback: %s/n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");

 

  /* IP addresses */

  for(a=d->addresses;a;a=a->next) {

    printf("/tAddress Family: #%d/n",a->addr->sa_family);

 

    switch(a->addr->sa_family)

    {

      case AF_INET:

        printf("/tAddress Family Name: AF_INET/n");

        if (a->addr)

          printf("/tAddress: %s/n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));

        if (a->netmask)

          printf("/tNetmask: %s/n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));

        if (a->broadaddr)

          printf("/tBroadcast Address: %s/n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));

        if (a->dstaddr)

          printf("/tDestination Address: %s/n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));

        break;

 

           case AF_INET6:

       printf("/tAddress Family Name: AF_INET6/n");

                   break;

 

           default:

        printf("/tAddress Family Name: Unknown/n");

        break;

    }

  }

  printf("/n");

}

 

/* From tcptraceroute, convert a numeric IP address to a string */

#define IPTOSBUFFERS  12

char *iptos(u_long in)

{

         static char output[IPTOSBUFFERS][3*4+3+1];

         static short which;

         u_char *p;

 

         p = (u_char *)&in;

         which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);

         sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);

         return output[which];

}

编译通过,运行结果为:

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图24

 

找到一个TP-LINK的USB无线网卡。

 

这说明开发环境搭建成功。

 

四、 从Debug到Release版本

如果如下图,将配置从Debug改为Release,你将会发现很多错误。

搭建WinPcap开发环境 - 玄机逸士 - 玄机逸士博客

 图25

 

这是因为,我们在“二、VC环境配置”所配置的全部是Debug这个Configuration,如果要想使Release配置下不出现问题,则只需按照“二、VC环境配置”所述,重新对Release配置一遍即可。

http://www.ferrisxu.com/WinPcap/html/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。 这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。 WinPcap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包 将原始数据包通过网络发送出去 收集并统计网络流量信息 以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。 所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。 如果您现在就想开始摸索这些功能,您可以直接进入 WinPcap用户手册. 哪些程序在使用WinPcap WinPcap可以被用来制作许多类型的网络工具,比如具有分析,解决纷争,安全和监视功能的工具。特别地,一些基于WinPcap的典型应用有: 网络与协议分析器 (network and protocol analyzers) 网络监视器 (network monitors) 网络流量记录器 (traffic loggers) 网络流量发生器 (traffic generators) 用户级网桥及路由 (user-level bridges and routers) 网络入侵检测系统 (network intrusion detection systems (NIDS)) 网络扫描器 (network scanners) 安全工具 (security tools) 什么是WinPcap做不到的 WinPcap能 独立地 通过主机协议发送和接受数据,如同TCP-IP。这就意味着WinPcap不能阻止、过滤或操纵同一机器上的其他应用程序的通讯:它仅仅能简单地"监视"在网络上传输的数据包。所以,它不能提供类似网络流量控制、服务质量调度和个人防火墙之类的支持

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值