Winpcap设置
使用winpcap的主要流程

使用winpcap的主要流程1. 安装winpcap
•下载winpcap安装包
•运行安装程序
•按照提示完成安装过程
2. 创建WinPcap的应用程序
•引用WinPcap的头文件
•在应用程序中初始化WinPcap
•打开网络适配器
•设置过滤器条件
3. 捕获网络数据包
•创建一个数据包捕获句柄
•设置过滤器条件(可选)
•进入捕获循环
–清空数据包缓冲区
–捕获一个数据包
–处理捕获到的数据包
4. 处理捕获到的数据包
•解析数据包的头部信息
•进行数据包的分析和处理
•可选地将数据包写入文件或发送数据包5. 关闭数据包捕获
•关闭数据包捕获句柄
•释放资源
•结束应用程序
6. WinPcap的高级用法
•配置超时和非阻塞模式
•对多个适配器进行操作
•同时捕获多个数据流
•进行软件过滤器和内核过滤器
•设置数据包缓冲区大小
•错误处理和异常情况处理
7. 示例代码
下面是一个使用WinPcap进行数据包捕获的示例代码:
```c #include <stdio.h> #include <pcap.h>
int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t handle; const u_char packet; struct pcap_pkthdr header;
// 打开网络适配器
handle = pcap_open_live(\。
WinPcap 教程

WinPcap 教程: 循序渐进教您使用WinPcap本节将向您展示如何使用WinPcap API的一些特性。
这部分教程细化成若干节课,以循序渐进的方式介绍给读者,让读者从最基本的部分(获得设备列表)到最复杂的部分(控制发送队列并收集和统计网络流量)来了解如何使用WinPcap进行程序开发。
有时,我们会给出一些简单使用的代码片断,但同时,我们提供完整程序的链接:所有的源代码包含一些指向手册其他地方的链接,这可以让您很方便地通过点击鼠标来跳转到您想查看的函数和数据结构的内容中去。
范例程序都是用纯C语言编写, 所以,掌握基本的C语言编程知识是必须的,而且,这是一部关于处理原始网络数据包的教程,因为,我们希望读者拥有良好的网络及网络协议的知识。
用Microsoft Visual C++ 创建一个使用wpcap.dll 的应用程序,需要按一下步骤:∙在每一个使用了库的源程序中,将pcap.h 头文件包含(include)进来。
∙如果你在程序中使用了WinPcap中提供给Win32平台的特有的函数,记得在预处理中加入WPCAP 的定义。
(工程->设置->c/c++->预处理程序定义中添加WPCAP)∙如果你的程序使用了WinPcap的远程捕获功能,那么在预处理定义中加入HAVE_REMOTE。
不要直接把remote-ext.h直接加入到你的源文件中去。
(工程->设置->c/c++->预处理程序定义中添加HAVE_REMOTE)∙设置VC++的链接器(Linker),把wpcap.lib库文件包含进来。
wpcap.lib可以在WinPcap 中找到。
∙设置VC++的链接器(Linker),把ws2_32.lib库文件包含进来。
这个文件分布于C的编译器,并且包含了Windows的一些socket函数。
本教程中的一些范例程序,会需要它。
获取设备列表通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器列表。
VS2010_Winpcap_配置

VS2010 配置Winpcap新建一个项目,GetDevs.cpp。
用来测试。
测试代码最后有给出。
View->Property ManagerDebug|Win32 -> er(右键)->Properties 注:此处设置为全局的!❑设置环境目录VC++ Directiories -> Include Directories和Library Directories中添加路径。
假如将wpdpack放到c盘。
则:Include Directories:c:\wpdpack\Include;Library Directories:c:\wpdpack\Lib;分号不要漏!❑设置编译条件C/C++下Preprocessor(预处理器)的Preprocessor Definitions(预处理定义)添加;WPCAP;HAVE_REMOTE;注意分号,每个预定义符用“;”分开。
Linker(连接器)下的Command Line(命令行)Additional Options (附加项)中输入:wpcap.lib ws2_32.lib packet.lib(注:用空格分隔。
)确定即可。
Ctrl + F5运行。
显示出网卡驱动信息。
表明配置成功。
代码GetDevs.cpp#include"pcap.h"void main(){pcap_if_t *alldevs,*d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];/* PCAP_ERRBUF_SIZE =256,ê?在¨²pcap.h中D定¡§义°? */if (pcap_findalldevs(&alldevs, errbuf) == -1) /* 这a个?API用®?来¤¡ä获?得Ì?网ª?卡¡§的Ì?列¢D表À¨ª */{ fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);//errbuf参?数ºy,ê?当Ì¡À有®D异°¨¬常¡ê情¨¦况?发¤¡é生¦¨²时º¡À,ê?这a个?参?数ºy会¨¢被À?PCAP填¬?充?为a某3个?特¬?定¡§的Ì?错䨪误¨®字Á?串ä?return;}/* 显?示º?列¢D表À¨ª的Ì?响¨¬应®|字Á?段?的Ì?内¨²容¨Y */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;}/*We don't need any more the device list. Free it */pcap_freealldevs(alldevs); //释º¨ª放¤?掉Ì?内¨²存ä?资Á¨º源¡ä}如有错误的地方,请指出。
实验3:WinPcap技术的使用

实验3:WinPcap技术的使用1实验目的和要求学习使用WinPcap开发包实现网络数据包的捕获、过滤和分析的功能,具体要求如下:1)WinPcap开发包的下载和安装;2)使用WinPcap获取与网络适配器绑定的设备列表;3)使用WinPcap获取网络适配器的高级属性信息;4)使用WinPcap打开网络适配器并实现抓包功能5)使用WinPcap过滤数据包、分析数据包。
2实验设备及材料1)Windows主机2)Visual Studio 2005或Visual Studio 20083实验内容本实验学习WinPcap开发包的使用,利用WinPcap实现网络数据包捕获、过滤和分析的功能,实验内容如下。
3.1 WinPcap开发包的下载和安装下载并安装WinPcap开发包,下载地址:/archive/。
1)4.1.1-WinPcap.exe的安装;2)4.1.1-WpdPack.zip的下载和使用。
3.2获取与网络适配器绑定的设备列表信息pcap_findalldevs_ex()函数的使用。
调用pcap_findalldevs_ex()函数,获取的网络设备信息将存储在结构体pcap_if_t中,然后打印网卡设备列表信息,包括网络适配器名称和描述。
3.3获取网络适配器的高级属性信息在3.2的基础上,除打印本地主机所有网络适配器的名称、描述外,还打印是否回环地址、协议簇类型、协议簇名称、IP地址、子网掩码、广播地址和目标地址等信息。
3.4打开网络适配器并通过事件处理器来捕获数据包pcap_open()函数和pcap_loop()函数的使用。
程序的运行过程如下:1)调用pcap_findalldevs_ex()函数获取并打印本机的网络设备列表。
2)要求用户选择用于捕获数据包的网络设备。
3)使用for语句跳转到选中的网络设备,以便在后面的程序中打开该设备,并在该设备上捕获数据。
4)调用pcap_open()函数打开选择的网络设备。
WINPCAP编程环境设置

因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。
以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。
对于初学者来说,不太好做的可能是编译程序之前应该做什么事。
我就大体说一下我的过程。
首先先大体介绍下Winpcap。
winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3> 在网络上发送原始的数据包;4> 收集网络通信过程中的统计信息。
具体介绍参见/view/696423.htm这里有Winpcap的详细介绍。
下面说一下你在编译Winpcap之前要做的事情。
1 下载Winpcap安装包,地址/install/default.htm。
2 然后到/devel.htm下载WinPcap developer's pack包,解压,里面有配置好的例子和include library。
3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。
然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。
首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。
在里面填写如下代码:#include <pcap.h>main( )pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];if (pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1);}for(d= alldevs; d != NULL; d= d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}pcap_freealldevs(alldevs);return 0;}运行之前我们要手动给它添加一个动态链接库wpcap.lib,方法是在菜单Project中点Settings,然后在选项中选Link,在library modules 后面填上wpcap.lib,注意和前面的要有空格隔开。
winpcap编程设置过滤器之指定获取某个网站的数据

winpcap编程设置过滤器之指定获取某个⽹站的数据下⾯,我将以乱世隋唐页游为例,通过编码获取这⾥⾯的数据。
游戏图:我是乱世隋唐的⽹址是:这个是官⽹⽹址的服务器地址。
42.62.0.14我玩的游戏服是84区。
⽹址是:我所在区的服务器地址是: 42.62.0.7winpcap⾥有⼀个过滤器字符串。
凡是发送给这个服务器的内容,我都要获取到。
我们需要设置它为:dst host 42.62.0.7 表⽰⽬标主机地址是42.62.0.7如果我要获取从这个服务器发来的数据,需要设置过滤器字符串:src host 42.62.0.7关于字符串过滤器的语法,winpcap官⽹有,我这⾥不想讲。
现在开始编程实现获取这个游戏的数据:#include "pcap.h"int main(){pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;int res;char errbuf[PCAP_ERRBUF_SIZE];struct tm *ltime;char timestr[16];struct pcap_pkthdr *header;const u_char *pkt_data;time_t local_tv_sec;u_int netmask;char packet_filter[] = "dst host 42.62.0.7";struct bpf_program fcode;/* 获取本机设备列表 */if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* 打印列表 */for(d=alldevs; d; d=d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (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");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}/* 跳转到已选中的适配器 */for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);/* 打开设备 */if ( (adhandle= pcap_open(d->name, // 设备名65536, // 要捕捉的数据包的部分// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式1000, // 读取超时时间NULL, // 远程机器验证errbuf // 错误缓冲池) ) == NULL){fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* 释放设列表 */pcap_freealldevs(alldevs);return -1;}printf("\nlistening on %s...\n", d->description);/* 设置过滤器 */if (d->addresses != NULL)/* 获取接⼝第⼀个地址的掩码 */netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;else/* 如果这个接⼝没有地址,那么我们假设这个接⼝在C类⽹络中 */netmask=0xffffff;if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)>=0){//设置过滤器if (pcap_setfilter(adhandle, &fcode)<0){fprintf(stderr,"\nError setting the filter.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}}else{fprintf(stderr,"\nError setting the filter.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}/* 释放设备列表 */pcap_freealldevs(alldevs);/* 获取数据包 */while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){if(res == 0)/* 超时时间到 */continue;/* 将时间戳转换成可识别的格式 */local_tv_sec = header->_sec;ltime=localtime(&local_tv_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);printf("%s,%.6d len:%d\n", timestr, header->_usec, header->len);}if(res == -1){printf("Error reading the packets: %s\n", pcap_geterr(adhandle));return -1;}return0;程序运⾏截图:我这⾥获取到四个本地⽹络适配器。
Winpcap 程序员手册
Winpcap 程序员手册Packet.dll API :程序员手册1.介绍PACKET.DLL 是一个动态连接库。
它提供了一套面向用户的包捕捉驱动程序接口。
这套动态连接库实现了一系列的函数,使得用户与驱动器的通信变得更为简便。
这避免了在用户程序中使用系统调用或控制输入/输出设备驱动模式(IOCTLs)。
而且,这套动态连接库还提供了网络适配器控制函数,对网络上捕获的数据包进行读取/写入函数,在驱动器中设置缓冲区和过滤器函数等等。
目前,有两个版本的PACKET.DLL:第一个适用于Windows95/98,第二个版本适用于WindowsNT/2000。
这两个版本都提供了相同的应用程序接口,这使得编写独立于系统的包捕获应用程序变得更为容易。
通过调用PACKET.DLL API,同一个应用程序可不做任何修改就在Windows95/98/NT/2000环境下运行。
本手册讲述了如何使用PACKET.DLL,并详细讲解这套动态连接库提供的函数和数据结构。
2.PACKET.DLL 与wpcap的比较如果你要编写一个没有特别/底层要求的包捕获应用程序,推荐使用wpcap.dll的函数,这是包捕获库(libpcap)的一个扩展集,而不是本章节中讨论的API。
在wpcap.dll中也使用PACKET.DLL的函数。
但wpcap.dll提供了一个更强大、更直接、更简洁的编程环境。
通过使用wpcap.dll,诸如捕获包、创建一个包过滤器或者在文件中保存dump 这些操作会被准确地执行并使程序变得直观。
Libpcap能够为一个标准的网络监听或嗅探程序提供所有需要的函数。
而且,利用libpcap编写的程序也能在UNIX平台上进行编译,这是因为这个库的Win32版本和UNIX版本有很好的兼容性。
然而,PACKET.DLL API 有一些libpcap没有提供的可能的操作。
Libpcap相对简单,它提供了一套系统无关的捕获包的API。
winpcap使用
Winpcap的安装使用方法winpcap的安装包,然后到2.执行安装包,这样你的机子就能运行winpcap 程序了。
3.解压开发包,在VC6.0的Tools-->Option-->Directories的Include fils 和library files加入winpcap的include和lib目录。
4.开始编写wpcap程序。
vs2005:第一步:下载WinPcap的安装包;有不同操作系统环境下的包,我下的是win32版本的。
下载地址:高的版本一般是Beta的。
这个安装包主要是注册一个wpcap.dll的库到操作系统中。
必须安装,如果不安装,在运行例子的时候会弹出窗口提示,找不到wpcap.dll文件;第二步:到上面的网站下载它的开发包,包括一些头文件和库文件;解压到自己指定的目录中;目录中还有HTML格式的说明文档,用于自己学习比较方便;第三步:设置VS2005;1)设置环境目录;在菜单:工具->选项;弹出的选项窗体左边点击:项目和解决方案->VC++目录;在右边:“显示以下内容的目录”标签下面的下拉框中找到“包含文件”,然后对应到第二步下载开发包的Include目录;在同一下拉框中找到“库文件”,然后对应到第二步下载开发包的lib目录;2)设置编译条件;在项目属性页中:配置属性->C/C++->预处理器->预处理器定义,增加;WPCAP;HAVE_REMOTE;每一个预定义符用";"隔开;在项目属性页中:配置属性->链接器->命令行->附加选项对应的文本框中增加:“wpcap.libws2_32.lib”;第四步:非必要步骤;有的时候可能会有些意外错误;比如找不到u_char类型等;我的解决办法是加上#ifndef WIN32#include <sys/socket.h>#include <netinet/in.h>#else#include <winsock.h>#endif============================================= ====================================winpcap开发包使用中的问题总结这里主要讨论一下winpcap开发中可能遇到的问题。
Winpcap抓包 实现
Winpcap实现一配置项目→属性→配置属性→C/C++→在右边的包含目录里添加你winpcap文件夹里include文件夹所在的位置;项目→属性→配置属性→在点击链接器选项,在右边的附加库目录里添加lib 文件夹所在的位置;项目→属性→配置属性→C/C++→预处理定义,WPCAP;HAVE_REMOTE; 项目→属性→配置属性→链接器→输入,在右边附加依赖项里添加上:wpcap.lib ws2_32.lib。
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 adapter65536, // portion of the packet to capture // 65536 guarantees that the whole // packet will be capturedPCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode1000, // read timeout - 1 millisecondNULL, // 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 pointif( retValue == 0 )continue;//打印捕获数据包的信息printf( "length of packet: %d\n", packetHeader->len );}// if we get here, there was an error reading the packetsif( 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 adapter65536, // portion of the packet to capture // 65536 guarantees that the whole // packet will be capturedPCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode1000, // read timeout - 1 millisecondNULL, // 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 : 01packet[0] = 0x01;packet[1] = 0x01;packet[2] = 0x01;packet[3] = 0x01;packet[4] = 0x01;packet[5] = 0x01;// 设置源的MAC地址为02 : 02 : 02 : 02 : 02 : 02packet[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 handlepacket, // the packet20 // the length of the packet) != 0 ){fprintf( stderr,"\nError sending the packet: \n",pcap_geterr( adapterHandle ) );return -1;}system( "PAUSE" );return 0;}运行结果#define _CRT_SECURE_NO_W ARNINGS#include "pcap.h"void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data); int main(){pcap_t *cap_ins_des;pcap_if_t *alldevs;pcap_if_t *d;char source[PCAP_BUF_SIZE];char errbuf[PCAP_ERRBUF_SIZE];int i;u_int netmask;char packet_filter[] = "ip and udp"; // the filterstruct bpf_program fcode; // used in pcap_compile()/* set the source */if (pcap_createsrcstr(source, PCAP_SRC_IFLOCAL, NULL, NULL, NULL, errbuf) == -1){printf("%s\n", errbuf);exit(-1);}printf("source: %s\n", source);/* find all devices */if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1){printf("%s\n", errbuf);exit(-1);}/* choose one devices */d = alldevs;while (d != NULL){printf("%s, %s\n", d->name, d->description);d = d->next;}scanf("%d", &i);d = alldevs;while (--i) d = d->next;printf("selected device: %s\n", d->name);/* open one device */cap_ins_des = pcap_open(d->name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf);if (cap_ins_des == NULL){printf("%s\n", errbuf);pcap_freealldevs(alldevs);exit(-1);}/* get the netmask, used at compiling the filter */if (d->addresses != NULL)netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;/*@#$%^&*!*/else netmask = 0xffffff;/* 255.25.255.0 */// netmask = 0;/* compile the filter */if (pcap_compile(cap_ins_des, &fcode, packet_filter, 1, netmask) < 0){printf("Error\n");pcap_freealldevs(alldevs);exit(-1);}/* set the filter */if (pcap_setfilter(cap_ins_des, &fcode) < 0){printf("Error\n");pcap_freealldevs(alldevs);exit(-1);}pcap_freealldevs(alldevs);/* start the capture */pcap_loop(cap_ins_des, 30, packet_handler, NULL);return 0;}void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) {printf("in packet handler\n");return;}运行结果。
Winpcap使用介绍
Winpcap使用介绍1. Winpcap简介Winpcap(windows packet capture)是在Win32平台上的强大的、有较好扩展性的底层网络分析体系结构,是Unix下的lipbcap移植到windows下的产物,是Win32环境下数据包捕获的开放代码函数库。
Winpcap是第一个Win32开放式的捕获包的体系结构,能够支持大多数应用程序的需要。
如图A-1所示,Winpcap包含了一个内核级的数据包过滤器——NPF (Netgroup Packet Filter)、一个底层动态链接库(Packet.dll)和一个高层的独立于系统的库(Wpcap.dll)。
这三个模块中,NPF属于内核级,其他两模块属于用户级。
图A-1 Winpcap的结构图NPF模块过滤数据包,将数据包不做任何改动的传递给用户,它还包含了一些操作系统专用代码(如:时间戳管理)。
Packet.dll模块提供了Win32平台下的捕获包的驱动接口。
实际上,不同版本的Windows 都提供了不同的内核模块和应用程序之间的接口函数,Packet.dll有一套独立于系统的API 来处理这些差异。
基于Packet.dll编写的程序可以不经过重新编译就在各种Win32平台下实现捕获数据包。
Packet.dll还包含了其他一些函数。
它可以进行一些底层的操作,Packet.dll和NPF都依赖于操作系统,并且由于Windows95/98和WindowsNT/2000之间操作系统结构的不同而在不同版本的操作系统上有所不同。
Wpcap.dll库不依赖于操作系统,并且它包含了一些其它高层的函数,比如:过滤器生成器、用户定义的缓冲区和高层特性(数据统计和构造数据包)。
Winpcap提供的功能包括四个方面:1)捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;2)在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3)在网络上发送原始的数据包;4)收集网络通信过程中的流量信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Winpcap的设置
.net 环境下
1、下载winpcap的开发包
WpdPack_3_2_alpha1.zip(/install/bin/WpdPack_3_2_alpha1.zip)
随便解压到一个目录下,例如我解压的目录是:D:\Program\WpdPack
2、添加include目录
Tools->Options->Projects and Solutions->VC++ Dirextories
看到右边的"Show directories for:",选择"Include files",添加winpcap的include目录即可(即D:\Program\WpdPack\Include)
3、添加lib目录
操作同上,在Linrary files里面添加winpcap的库
4、设置工程参数
主要是设置一些参数
新建一个工程后,进行下列操作
Project->Properties->Configuration Properties->C/C++->Preprocessor
在右边的"Preprocessor Definitions"添加"WPCAP"
在右边的"Addtional Dependencies"添加"wpcap.lib"
注意:根据项目的需求,在<4>中的参数设置部分,需要少许修改。
在你的程序中加入#include<pcap.h>,#include<remote-ext.h>.然后在工程的setting中加入预定义宏:WPCAP,HA VE_REMOTE.导入wpcap.lib库
VC环境下:
1、添加路径:
Tools->Options->Directories同样进行设置
2、设置工程参数
新建一个工程后,
Project->Settings
选择C/C++;在Preprocessor definition里面添加WPCAP
同理设置link。