winpcap 开发

Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。

     

      首先到http://www.winpcap.org/install/default.htm下载安装winpcap 驱动和DLL组件。


 

      然后到http://www.winpcap.org/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:\WpdPack_4_0_2\WpdPack,可以看到里面包含了:Lib,Include,文档和示例程序。


 

首先创建一个C++控制台程序,设置如下:

1)  在“Configuration Properties -> C/C++ -> General”中,在Additional Include Directories加入Include路径(“C:\WpdPack_4_0_2\WpdPack\Include”)。

 

2)  在 “Configuration Properties -> Linker -> General” 中,在Additional Library Directories中加入 winpcap 库文件路径 ( “C:\WpdPack_4_0_2\WpdPack\Lib” ) 。

 

3)  在“Configuration Properties -> Linker -> Input”中, Additional Dependencies 加入用到的两个winpcap 库文件(wpcap.lib and Packet.lib ) 。

 

4)  为了使用Winpcap的远程访问,必须在预处理器中加入HAVE_REMOTE

 

示例程序1  获取适配器列表

 
#include <pcap.h>
int _tmain(int argc, _TCHAR* argv[])
{
    pcap_if_t * allAdapters;//适配器列表
    pcap_if_t * adapter;
    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区
    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, 
                &allAdapters, errorBuffer ) == -1 )
    {//检索机器连接的所有网络适配器
        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );
        return -1;
    }
    if( allAdapters == NULL )
    {//不存在人任何适配器
        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );
        return 0;
    }
    int crtAdapter = 0;
    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)
    {//遍历输入适配器信息(名称和描述信息)
        printf( "\n%d.%s ", ++crtAdapter, adapter->name );
        printf( "-- %s\n", adapter->description );
    }
    printf( "\n" );
    pcap_freealldevs( allAdapters );//释放适配器列表
    system( "PAUSE" );
    return 0;
}
 

示例程序2 打开指定适配器并捕获数据包

 
#include <pcap.h>
int _tmain(int argc, _TCHAR* argv[])
{
    pcap_if_t * allAdapters;//适配器列表
    pcap_if_t * adapter;
    pcap_t           * adapterHandle;//适配器句柄
    struct pcap_pkthdr * packetHeader;
    const u_char       * packetData;
    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区
    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, 
                &allAdapters, errorBuffer ) == -1 )
    {//检索机器连接的所有网络适配器
        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );
        return -1;
    }
    if( allAdapters == NULL )
    {//不存在任何适配器
        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );
        return 0;
    }
    int crtAdapter = 0;
    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)
    {//遍历输入适配器信息(名称和描述信息)
        printf( "\n%d.%s ", ++crtAdapter, adapter->name ); 
        printf( "-- %s\n", adapter->description );
    }
    printf( "\n" );
    //选择要捕获数据包的适配器
    int adapterNumber;
    printf( "Enter the adapter number between 1 and %d:", crtAdapter );
    scanf_s( "%d", &adapterNumber );
    if( adapterNumber < 1 || adapterNumber > crtAdapter )
    {
        printf( "\nAdapter number out of range.\n" );
        // 释放适配器列表
        pcap_freealldevs( allAdapters );
        return -1;
    }
    adapter = allAdapters;
    for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ )
    adapter = adapter->next;
    // 打开指定适配器
    adapterHandle = pcap_open( adapter->name, // name of the adapter
                               65536,         // portion of the packet to capture
                                              // 65536 guarantees that the whole 
                          // packet will be captured
                               PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode
                               1000,             // read timeout - 1 millisecond
                               NULL,          // authentication on the remote machine
                               errorBuffer    // error buffer
                              );
    if( adapterHandle == NULL )
    {//指定适配器打开失败
        fprintf( stderr, "\nUnable to open the adapter\n", adapter->name );
        // 释放适配器列表
        pcap_freealldevs( allAdapters );
        return -1;
    }
    printf( "\nCapture session started on  adapter %s\n", adapter->name );
    pcap_freealldevs( allAdapters );//释放适配器列表
    // 开始捕获数据包
    int retValue;
    while( ( retValue = pcap_next_ex( adapterHandle, 
                      &packetHeader, 
                      &packetData ) ) >= 0 )
    {
        // timeout elapsed if we reach this point
        if( retValue == 0 )
                continue;
        //打印捕获数据包的信息
        printf( "length of packet: %d\n", packetHeader->len );
    }
    // if we get here, there was an error reading the packets
    if( retValue == -1 )
    {
        printf( "Error reading the packets: %s\n", pcap_geterr( adapterHandle ) );
        return -1;
    }
    system( "PAUSE" );
    return 0;
}
 

示例程序3 发送数据封包

#include <pcap.h>

int _tmain(int argc, _TCHAR* argv[])

{

    pcap_if_t * allAdapters;//适配器列表

    pcap_if_t * adapter;

    pcap_t           * adapterHandle;//适配器句柄

    u_char         packet[ 20 ]; //待发送的数据封包

    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区

    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, 

                &allAdapters, errorBuffer ) == -1 )

    {//检索机器连接的所有网络适配器

        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );

        return -1;

    }

    if( allAdapters == NULL )

    {//不存在人任何适配器

        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );

        return 0;

    }

    int crtAdapter = 0;

    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)

    {//遍历输入适配器信息(名称和描述信息)

        printf( "\n%d.%s ", ++crtAdapter, adapter->name ); 

        printf( "-- %s\n", adapter->description );

    }

    printf( "\n" );

    //选择适配器

    int adapterNumber;

    printf( "Enter the adapter number between 1 and %d:", crtAdapter );

    scanf_s( "%d", &adapterNumber );

    if( adapterNumber < 1 || adapterNumber > crtAdapter )

    {

        printf( "\nAdapter number out of range.\n" );

        // 释放适配器列表

        pcap_freealldevs( allAdapters );

        return -1;

    }

    adapter = allAdapters;

    for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ )

    adapter = adapter->next;

    // 打开指定适配器

    adapterHandle = pcap_open( adapter->name, // name of the adapter

                               65536,         // portion of the packet to capture

                                              // 65536 guarantees that the whole 

                          // packet will be captured

                               PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode

                               1000,             // read timeout - 1 millisecond

                               NULL,          // authentication on the remote machine

                               errorBuffer    // error buffer

                              );

    if( adapterHandle == NULL )

    {//指定适配器打开失败

        fprintf( stderr, "\nUnable to open the adapter\n", adapter->name );

        // 释放适配器列表

        pcap_freealldevs( allAdapters );

        return -1;

    }

    pcap_freealldevs( allAdapters );//释放适配器列表

    //创建数据封包

    // 设置目标的MAC地址为01 : 01 : 01 : 01 : 01 : 01

    packet[0] = 0x01;

    packet[1] = 0x01;

    packet[2] = 0x01;

    packet[3] = 0x01;

    packet[4] = 0x01;

    packet[5] = 0x01;

    // 设置源的MAC地址为02 : 02 : 02 : 02 : 02 : 02

    packet[6]  = 0x02;

    packet[7]  = 0x02;

    packet[8]  = 0x02;

    packet[9]  = 0x02;

    packet[10] = 0x02;

    packet[11] = 0x02;

    // 设置封包其他部分内容

    for( int index = 12; index < 20; index++ )

    {

        packet[index] = 0xC4;

    }

    //发送数据封包

    if( pcap_sendpacket( adapterHandle, // the adapter handle

             packet, // the packet
// the length of the packet

               ) != 0 )

    {

        fprintf( stderr,"\nError sending the packet: \n", pcap_geterr( adapterHandle ) );

        return -1;

    }

    system( "PAUSE" );

    return 0;

}
 
winpcap开发相关入门资料: https://www.freebuf.com/articles/network/103526.html

作者:洞庭散人

出处:http://phinecos.cnblogs.com/    

本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。
什么是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、付费专栏及课程。

余额充值