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 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 machineerrorBuffer // 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 machineerrorBuffer // 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 packet
// the length of the packet) != 0 ){fprintf( stderr,"\nError sending the packet: \n", pcap_geterr( adapterHandle ) );return -1;}system( "PAUSE" );return 0;}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
winpcap 开发相关推荐
- 在Visual Studio 2005下配置WinPcap开发环境
在Visual Studio 2005下配置WinPcap开发环境 http://www.winpcap.org/archive/ 4.1beta5_WpdPack.zip http://www.wi ...
- socket编程之DEV C++配置winpcap开发环境并编写网络嗅探器sniffer
欢迎关注我的个人博客:www.zuzhiang.cn 期末计算机网络课程设计让做一个网络嗅探器,要求可以检测和选择网卡,并打开到混杂模式,监听局域网中的所有数据包并解析出所用网络协议以及首部各个字段的 ...
- codeblocks配置winpcap开发环境
转载请注明出处,谢谢_ (:з」∠)_ 起因 最近作业要用Winpcap开发包分析.pcap文件实现报文字段的识别-本来打算用Visual Studio写,不过想起以前打OJ的时候都用Code::Bl ...
- Dev-C++ 配置 WinPcap 开发环境
VC++ 6.0实在是太老了,自己并不愿意在这个平台上开发,所以转而使用Dev-C++,以下是综合网上的教程和自己的试验总结出的用Dev-C++进行WinPcap网络开发的所需的环境配置工作: 首先是 ...
- 一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境
0.说在前面的话 1) 本文将以一个初学者的角度,一步一步几乎是从0开始讲述如何完成一个基于winpcap+MFC的sniffer(嗅探器)当然我指的"0"并不是指连编程都不会,如 ...
- 基于winpcap开发的相关资料
2019独角兽企业重金招聘Python工程师标准>>> http://www.oschina.net/code/snippet_196111_7100 http://wenku.ba ...
- c++ winpcap开发(9)
收集网络流量统计 本课程展示了WinPcap的另一个高级功能:收集网络流量统计信息的能力.统计引擎利用内核级包过滤器对传入的数据包进行有效的分类.如果您想了解更多详细信息,可以参考NPF驱动程序内部手 ...
- c++ winpcap开发(8)
发送数据包 虽然名称WinPcap清楚地表明图书馆的目的是分组捕获,但还提供了其他有用的原始网络功能.其中,用户可以找到一组完整的功能来发送数据包. 请注意,原来的libpcap库目前没有提供任何方式 ...
- c++ winpcap开发(7)
处理离线转储文件 在这个课程中,我们将学习如何处理数据包捕获到一个文件(转储到文件).WinPcap提供广泛的功能来将文件的网络流量保存到文件并读取转储的内容 - 本课将介绍如何使用所有这些功能.我们 ...
最新文章
- Hadoop JobHistory
- PADS 创建封装笔记
- Pydiction : VIM上的PYTHON代码自动补全插件
- 详述欺骗性断言如何引发严重的 Windows 内核漏洞 (CVE-2020-0792)
- centos7提示ifconfig command not found解决
- 1337. 矩阵中战斗力最弱的 K 行
- Java构建工具:Maven与Gradle的对比
- ubuntu16.04 pytorch 安装
- 浏览器到服务器简单流程图
- Zabbix监控系统系列之九:监控网络设备指定接口流量
- ICPC North America Qualifier 2017 B.Bumped! (分层图 + spfa)
- 乒乓球侧旋球MATLAB,【动图】看动图让你了解乒乓球的侧旋转
- Ae 效果快速参考:杂色和颗粒
- Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据
- 基于Openfire Smack开发即时通讯应用、搭建Openfire服务器(一)
- GD MCU的SWD和SCLK管脚被当成IO脚占用导致找不到设备
- Redis(服务端/客户端)的启动、关闭、查看状态
- 代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)
- vuecli4关于Warning in ./src/plugins/element.js “export ‘default’ (imported as ‘Vue’) was not found in
- python中texttable库显示实时数据_用Python串口实时显示数据并绘图pyqtgraph