`
dato0123
  • 浏览: 967948 次
文章分类
社区版块
存档分类
最新评论

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 获取适配器列表

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<pcap.h>
int_tmain(intargc,_TCHAR*argv[])
{
pcap_if_t
*allAdapters;//适配器列表
pcap_if_t*adapter;
charerrorBuffer[PCAP_ERRBUF_SIZE];//错误信息缓冲区
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,
&allAdapters,errorBuffer)==-1)
{
//检索机器连接的所有网络适配器
fprintf(stderr,"Errorinpcap_findalldevs_exfunction:%s/n",errorBuffer);
return-1;
}
if(allAdapters==NULL)
{
//不存在人任何适配器
printf("/nNoadaptersfound!MakesureWinPcapisinstalled./n");
return0;
}
intcrtAdapter=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");
return0;
}

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<pcap.h>
int_tmain(intargc,_TCHAR*argv[])
{
pcap_if_t
*allAdapters;//适配器列表
pcap_if_t*adapter;
pcap_t
*adapterHandle;//适配器句柄
structpcap_pkthdr*packetHeader;
constu_char*packetData;
charerrorBuffer[PCAP_ERRBUF_SIZE];//错误信息缓冲区
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,
&allAdapters,errorBuffer)==-1)
{
//检索机器连接的所有网络适配器
fprintf(stderr,"Errorinpcap_findalldevs_exfunction:%s/n",errorBuffer);
return-1;
}
if(allAdapters==NULL)
{
//不存在任何适配器
printf("/nNoadaptersfound!MakesureWinPcapisinstalled./n");
return0;
}
intcrtAdapter=0;
for(adapter=allAdapters;adapter!=NULL;adapter=adapter->next)
{
//遍历输入适配器信息(名称和描述信息)
printf("/n%d.%s",++crtAdapter,adapter->name);
printf(
"--%s/n",adapter->description);
}
printf(
"/n");
//选择要捕获数据包的适配器
intadapterNumber;
printf(
"Entertheadapternumberbetween1and%d:",crtAdapter);
scanf_s(
"%d",&adapterNumber);
if(adapterNumber<1||adapterNumber>crtAdapter)
{
printf(
"/nAdapternumberoutofrange./n");
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
adapter
=allAdapters;
for(crtAdapter=0;crtAdapter<adapterNumber-1;crtAdapter++)
adapter
=adapter->next;
//打开指定适配器
adapterHandle=pcap_open(adapter->name,//nameoftheadapter
65536,//portionofthepackettocapture
//65536guaranteesthatthewhole
//packetwillbecaptured
PCAP_OPENFLAG_PROMISCUOUS,//promiscuousmode
1000,//readtimeout-1millisecond
NULL,//authenticationontheremotemachine
errorBuffer//errorbuffer
);
if(adapterHandle==NULL)
{
//指定适配器打开失败
fprintf(stderr,"/nUnabletoopentheadapter/n",adapter->name);
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
printf(
"/nCapturesessionstartedonadapter%s/n",adapter->name);
pcap_freealldevs(allAdapters);
//释放适配器列表
//开始捕获数据包
intretValue;
while((retValue=pcap_next_ex(adapterHandle,
&packetHeader,
&packetData))>=0)
{
//timeoutelapsedifwereachthispoint
if(retValue==0)
continue;
//打印捕获数据包的信息
printf("lengthofpacket:%d/n",packetHeader->len);
}
//ifwegethere,therewasanerrorreadingthepackets
if(retValue==-1)
{
printf(
"Errorreadingthepackets:%s/n",pcap_geterr(adapterHandle));
return-1;
}
system(
"PAUSE");
return0;
}

示例程序3 发送数据封包

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<pcap.h>
int_tmain(intargc,_TCHAR*argv[])
{
pcap_if_t
*allAdapters;//适配器列表
pcap_if_t*adapter;
pcap_t
*adapterHandle;//适配器句柄
u_charpacket[20];//待发送的数据封包
charerrorBuffer[PCAP_ERRBUF_SIZE];//错误信息缓冲区
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,
&allAdapters,errorBuffer)==-1)
{
//检索机器连接的所有网络适配器
fprintf(stderr,"Errorinpcap_findalldevs_exfunction:%s/n",errorBuffer);
return-1;
}
if(allAdapters==NULL)
{
//不存在人任何适配器
printf("/nNoadaptersfound!MakesureWinPcapisinstalled./n");
return0;
}
intcrtAdapter=0;
for(adapter=allAdapters;adapter!=NULL;adapter=adapter->next)
{
//遍历输入适配器信息(名称和描述信息)
printf("/n%d.%s",++crtAdapter,adapter->name);
printf(
"--%s/n",adapter->description);
}
printf(
"/n");
//选择适配器
intadapterNumber;
printf(
"Entertheadapternumberbetween1and%d:",crtAdapter);
scanf_s(
"%d",&adapterNumber);
if(adapterNumber<1||adapterNumber>crtAdapter)
{
printf(
"/nAdapternumberoutofrange./n");
//释放适配器列表
pcap_freealldevs(allAdapters);
return-1;
}
adapter
=allAdapters;
for(crtAdapter=0;crtAdapter<adapterNumber-1;crtAdapter++)
adapter
=adapter->next;
//打开指定适配器
adapterHandle=pcap_open(adapter->name,//nameoftheadapter
65536,//portionofthepackettocapture
//65536guaranteesthatthewhole
//packetwillbecaptured
PCAP_OPENFLAG_PROMISCUOUS,//promiscuousmode
1000,//readtimeout-1millisecond
NULL,//authenticationontheremotemachine
errorBuffer//errorbuffer
);
if(adapterHandle==NULL)
{
//指定适配器打开失败
fprintf(stderr,"/nUnabletoopentheadapter/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(intindex=12;index<20;index++)
{
packet[index]
=0xC4;
}
//发送数据封包
if(pcap_sendpacket(adapterHandle,//theadapterhandle
packet,//thepacket
20//thelengthofthepacket
)!=0)
{
fprintf(stderr,
"/nErrorsendingthepacket:/n",pcap_geterr(adapterHandle));
return-1;
}
system(
"PAUSE");
return0;
}

参考文章:

1Introduction to the Winpcap Networking Libraries

分享到:
评论

相关推荐

    Winpcap的配置

    博文链接中提到的《Winpcap网络开发库入门 - Phinecos(洞庭散人) - 博客园》是一篇不错的学习资料,可以帮助开发者深入了解Winpcap的使用。此外,官方文档、Stack Overflow和GitHub上的开源项目也是学习的好去处。 ...

    wpcap开发包,含有中文教程pdf格式

    1. "winpcap网络开发库入门.pdf":这很可能是那本中文教程的名字,它可能包含了关于如何使用wpcap进行网络开发的基础知识,涵盖了wpcap的安装、基本API的使用、数据包捕获、过滤机制等内容,对于初学者来说是非常有...

    Winpcap编程入门

    驱动程序负责捕获和过滤网络数据,而用户空间库则提供了一系列高级API,方便开发者进行网络相关的开发工作。 ### 获取网络接口列表 在使用WinPcap进行编程时,首先需要获取可用的网络接口列表。这通常涉及到调用`...

    winpcap网络分析大全

    《winpcap网络分析大全》是一份全面介绍winpcap技术的资源集合,包含了winpcap开发包、源代码和应用程序,旨在为网络sniffer编程和网络安全领域提供强大的支持。Winpcap是Windows平台上的一款开源的网络数据包捕获和...

    winpcap-source.rar_winpcap 开源库_winpcap开源吗_开源 抓包工具_抓包开源

    3. 教程和书籍:网络上有不少关于WinPCAP的教程和书籍,可以帮助快速入门和提升。 总之,WinPCAP是Windows平台网络监控和分析的重要工具,其开源属性促进了技术的共享和进步。无论是网络管理员、开发人员还是安全...

    Winpcap中文技术文档

    - 安装Winpcap的开发库和相关的API文档。 - 一个集成开发环境(IDE),如Visual Studio。 - 必要的网络编程知识,包括TCP/IP协议栈、套接字编程等。 ### Winpcap编程示例 文档中可能提供了一些基础的编程示例,...

    循序渐进学习WinPcap编程

    WinPcap是Windows平台下用于网络数据包捕获和分析的一个系统软件库,它提供了一套编程接口,让开发者能够在应用程序中直接捕获经过网络适配器的数据包。循序渐进学习WinPcap编程是为新手提供的一份指南,帮助他们从...

    WinPcap 中文教程

    WinPcap 是一个流行的网络嗅探库,提供了一个强大的 API 来捕获和处理网络数据包。下面是 WinPcap 教程的概要信息: 1. 获取设备列表 在编写基于 WinPcap 的应用程序时,第一步通常是获取已连接的网络适配器列表。...

    WinPcap 4.0.2

    总的来说,WinPcap 4.0.2是一个强大且稳定的网络驱动程序,它提供了对网络封包的直接访问和处理能力,对于开发网络监控工具和进行网络分析的IT专业人员来说,这是一个不可或缺的工具。通过利用WinPcap,开发者可以...

    循序渐进学习使用WINPCAP

    2. **入门阶段**:安装WINPCAP库,按照教程完成第一个简单的数据包捕获程序。 3. **进阶阶段**:深入学习API函数,掌握数据包过滤和处理技术。 4. **实战阶段**:设计并实现一个具有特定功能的网络监控或分析应用,...

    Jpcap 64位,完整一套包括Winpcap,Jpcap,jpcap.dll,demo.

    Winpcap提供了网络数据包的过滤、存储、分析等功能,是开发网络分析工具的基础。由于Jpcap是基于Winpcap的,所以这个包中的Winpcap对于Jpcap在Windows上的运行至关重要。 **jpcap.dll** jpcap.dll是Jpcap库的动态...

    wpe入门教程wpe文件

    WPE(WinPcap Packet Editor)是一个强大的网络数据包编辑工具,尤其适用于网络安全分析、软件开发以及网络故障排查等领域。本教程旨在为新手提供一个快速上手的指导,让你能理解并掌握WPE的基本操作和功能。 **一...

    PcapPlusPlus是一个用于捕获,解析和处理网络数据包的多平台C ++库。 它旨在高效,强大且易于使用。 它为最受欢迎的数据包处理引擎(例如libpcap,WinPcap,DPDK和PF_RING)提供了C ++包装器。-C/C++开发

    PcapPlusPlus是一个用于捕获,解析和处理网络数据包的多平台C ++库。 它旨在高效,强大且易于使用。 PcapPlusPlus支持大型变量的解码和伪造功能PcapPlusPlus是用于捕获,解析和制作网络数据包的多平台C ++库。 它...

    Wireshark从入门到精通

    - 下载并安装依赖库。 ##### 2.4 在UNIX下编译Wireshark - 使用`./configure`命令配置编译选项。 - 运行`make`进行编译。 - 使用`sudo make install`安装编译后的程序。 ##### 2.5 在UNIX下安装二进制包 - **Linux...

    运动实时操作系统快速入门指南EC-Motion

    【运动实时操作系统快速入门指南EC-Motion】是一个针对运动控制领域的技术文档,主要介绍如何使用EC-Motion这一实时操作系统,并提供了详细的入门步骤。该指南由acontis technologies GmbH编写,适用于2013年10月18...

    易语言源码易语言网络流量监控器.rar

    由于易语言的底层功能有限,可能需要借助第三方库,如WinPcap或Npcap,来进行更精细的数据包捕获。 3. **数据解析与统计**:捕获到的数据包需要进行解析,提取出流量相关的信息,如数据包大小、方向(发送或接收)...

    易语言源码网络流量监控器.rar

    在Windows系统中,这通常涉及到WinPCap库或者Windows Filtering Platform (WFP)。易语言可能通过P/Invoke(平台调用)技术来调用这些底层API,以捕获网络包并计算流量。例如,`GetIfEntry2`函数可以获取网络接口的...

    基于jpcap的网络嗅探器源码+项目说明(课程大作业).zip

    如果要深入到网络层,就需要libpcap库的支持(在window系统中是winpcap)。由于libpcap是由C/C++实现的,所以需要一个中间件jpcap来实现转换,我们就可以直接在Java环境中调用jpcap提供的API实现上述需求。 基于...

    手机数据抓包入门教程

    - 注意勾选安装WinPcap组件,以便于Wireshark能够捕获网络数据。 ##### 5.3 在Linux下安装Wireshark - 可以通过包管理器直接安装Wireshark及其依赖库。 - 例如,在Ubuntu上可以使用命令`sudo apt-get install ...

    端口扫描工具

    1. **WinPcap_3_0.exe**:这是一个网络数据包捕获和网络分析的库,WinPcap为操作系统提供了一个接口,允许应用程序直接访问网络接口层,捕获网络流量,并进行分析。在端口扫描工具中,WinPcap通常用于收集网络数据,...

Global site tag (gtag.js) - Google Analytics