今天在阅读WinpcapManual的时候发现一句话:
“Thismeansthatonsharedmedia(likenon-switchedEthernet),WinPcapwillbeabletocapturethepacketsofotherhosts.”
我理解为:如果在通过没有交换功能的集线器连接的网络上,只要把网卡设置为混杂(promiscuous)模式,winpcap能够捕获到其他主机通信的数据包。如果是具有交换功能的集线器连接的网络winpcap还能管用吗?这个在后边的实习中将会进行试验。
试验程序2:
/*
*截获数据包的试验。先打印出所有网络适配器的列表,然后选择
*想在哪个适配器上截获数据包。然后通过pcap_loop()函数将截获
*的数据包传给回调函数packet_handler()处理。
*通过该程序初步了解了使用winpcap截获数据包的步骤以及一些在
*截获数据包时非常重要的函数和结构体。
*2006-1-26
*/
#include<pcap.h>
#include<remote-ext.h>
/*Prototypeofthepackethandler*/
voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);
intmain(){
pcap_if_t*alldevs;
pcap_if_t*d;
intinum;
inti=0;
pcap_t*adhandle;
charerrbuf[PCAP_ERRBUF_SIZE];
/*Retrievethedeviceslistonthelocalmachine*/
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)
{
fprintf(stderr,"Errorinpcap_findalldevs:%s\n",errbuf);
exit(1);
}
/*Printthelist*/
for(d=alldevs;d;d=d->next)
{
/*Printname*/
printf("%d.%s",++i,d->name);
/*Printdescription*/
if(d->description)
{
printf("(%s)\n",d->description);
}
else
{
printf("(Nodescriptionavailable)\n");
}
}
if(i==0)
{
printf("\nNointerfacesfound!MakesureWinpcapisinstalled.\n");
return-1;
}
/*Selectanadapter*/
printf("Entertheinterfacenumber(1-%d):",i);
scanf("%d",&inum);
if(inum<1||inum>i)
{
printf("\nInterfacenumberoutofrange.\n");
/*Freethedevicelist*/
pcap_freealldevs(alldevs);
return-1;
}
/*Jumptotheselectedadapter*/
for(d=alldevs,i=0;i<inum-1;d=d->next,++i);
/*Openthedevice*/
if((adhandle=pcap_open(d->name,/*nameofthedevice*/
65536,/*portionofthepackettocapture*/
/*65535guaranteesthatthewholepacketwillbecapturedonallthelinklayers*/
PCAP_OPENFLAG_PROMISCUOUS,/*promiscuousmode*/
1000,/*readtimeout*/
NULL,/*authenticationontheremotemachine*/
errbuf/*errorbuffer*/
))==NULL)
{
fprintf(stderr,"\nnabletoopentheadapter.%sisnotsupportedbyWinpcap\n",d->name);
/*Freethedeviceslist*/
pcap_freealldevs(alldevs);
return-1;
}
printf("\nlisteningon%s...\n",d->description);
/*Atthispoint,wedon'tneedanymorethedevicelist.Freeit*/
pcap_freealldevs(alldevs);
/*startthecapture*/
pcap_loop(adhandle,0,packet_handler,NULL);
return1;
}
/*Callbackfunctioninvokedbylibpcapforeveryincomingpacket*/
voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data){
structtm*ltime;
chartimestr[16];
/*convertthetimestamptoreadableformat*/
ltime=localtime(&header->ts.tv_sec);
strftime(timestr,sizeof(timestr),"%H:%M:%S",ltime);
printf("%s,%.6dlen:%d\n",timestr,header->ts.tv_usec,header->len);
}
函数1:
pcap_t*pcap_open(constchar*source,
intsnaplen,
intflags,
intread_timeout,
structpcap_rmtauth*auth,
char*errbuf
)
为捕获/发送数据打开一个普通的源。pcap_open()能够替代所有的pcap_open_xxx()函数,它隐藏了不同的pcap_open_xxx()之间的差异,所以程序员不必使用不同的open函数。
source:的是包含要打开的源名称的以’\0’结尾的字符串。源名称得包含新的源规范语法(SourceSpecificationSyntax),并且它不能为NULL。为了方便的使用源语法,请记住:(1)pcap_findalldevs_ex()返回的适配器(网卡)可以直接被pcap_open()使用;(2)万一用户想传递他自己的源字符串给pcap_open(),pcap_createsrcstr()可以创建正确的源标识。
snaplen:需要保留的数据包的长度。对每一个过滤器接收到的数据包,第一个‘snaplen’字节的内容将被保存到缓冲区,并且传递给用户程序。例如,snaplen等于100,那么仅仅每一个数据包的第一个100字节的内容被保存。简言之就是从每一个包的开头到snaplen的那段内容将被保存。
flags:保存一些由于抓包需要的标志。Winpcap定义了三种标志:
lPCAP_OPENFLAG_PROMISCUOUS:1,它定义了适配器(网卡)是否进入混杂模式(promiscuousmode)。
lPCAP_OPENFLAG_DATATX_UDP:2,它定义了数据传输(假如是远程抓包)是否用UDP协议来处理。
lPCAP_OPENFLAG_NOCAPTURE_RPCAP:4,它定义了远程探测器是否捕获它自己产生的数据包。
read_timeout:以毫秒为单位。readtimeout被用来设置在遇到一个数据包的时候读操作不必立即返回,而是等待一段时间,让更多的数据包到来后从OS内核一次读多个数据包。并非所有的平台都支持readtimeout;在不支持readtimeout的平台上它将被忽略。
auth:一个指向’structpcap_rmtauth’的指针,保存当一个用户登录到某个远程机器上时的必要信息。假如不是远程抓包,该指针被设置为NULL。
errbuf:一个指向用户申请的缓冲区的指针,存放当该函数出错时的错误信息。
返回值是一个’pcap_t’指针,它可以作为下一步调用(例如pcap_compile()等)的参数,并且指定了一个已经打开的Winpcap会话。在遇到问题的情况下,它返回NULL并且’errbuf’变量保存了错误信息。
函数2:
intpcap_loop(pcap_t*p,
intcnt,
pcap_handercallback,
u_char*user
)
收集一群数据包。pcap_loop()与pcap_dispatch()类似,但是它会一直保持读数据包的操作直到cnt包被处理或者发生了错误。当有活动的读超时(readtimeout)时它并不返回。然而,对pcap_open_live()指定一个非0的读超时(readtimeout),当发生超时的时候调用pcap_dispatch()来接收并处理到来的所有数据包更好。Cnt指明了返回之前要处理数据包的最大数目。如果cnt为负值,pcap_loop()将一直循环(直到发生错误才停止)。如果出错时返回-1;如果cnt用完时返回0;如果在任何包被处理前调用pcap_breakloop()来中止循环将返回-2。所以,如果程序中使用了pcap_breakloop(),必须准确的来判断返回值是-1还是-2,而不能简单的判断<0。
函数3:
hypedefvoid(*pcap_handler)(u_char*user,
conststructpcap_pkthdr*pkt_header,
constu_char*pkt_data)
接收数据包的回调函数原型。当用户程序使用pcap_dispatch()或者pcap_loop(),数据包以这种回调的方法传给应用程序。用户参数是用户自己定义的包含捕获会话状态的参数,它必须跟pcap_dispatch()和pcap_loop()的参数相一致。pkt_hader是与抓包驱动有关的头。pkt_data指向包里的数据,包括协议头。
结构体1:
structpcap_pkthdr{
structtimevalts;
bpf_u_int32caplen;
bpf_u_int32len;
}
ts:时间戳
cpalen:当前分组的长度
len:数据包的长度
相关推荐
WinPcap编程接口的描述及其源代码。它与详尽的WinPcap核心资料一起,为编程人员提供了详细的函数与结构的描述,同时也提供了若干教程和程序范例
在大、中专院校中,WinPcap通常被用作网络编程、网络安全课程以及网络监控的学习工具。 WinPcap的核心功能包括: 1. **数据包捕获**:它能够实时地抓取网络中的数据包,提供原始网络数据,这对于学习网络通信协议、...
循序渐进学习WinPcap编程是为新手提供的一份指南,帮助他们从基本的安装配置到实现网络数据包捕获,再到深入分析和开发更复杂网络应用的过程。 在开始使用WinPcap之前,需要进行一系列准备工作。首先,需要下载并...
在分析Winpcap的源码时,我们可以学习到网络驱动编程、数据包处理、内存管理、同步机制等多方面的知识。这对于开发网络诊断工具、网络安全软件、网络监控系统等有着重要价值。源码中的例子和示例代码可以帮助我们更...
2. **熟悉WinPCAP API**:深入学习WinPCAP提供的API函数,例如`pcap_open_live()`用于打开网络接口,`pcap_loop()`用于捕获数据包,`pcap_compile()`和`pcap_setfilter()`用于设置过滤规则等。 3. **实践编程**:...
《循序渐进学习使用WinPcap》是一本专注于网络数据包捕获和分析的PDF教程,适合初学者和有经验的IT专业人士。WinPcap是Windows平台上一个强大的开源库,用于在网络层进行数据包捕获和网络分析。它不仅为开发人员提供...
【循序渐进学习使用WINPCAP】 WINPCAP是一个开源的网络数据包捕获库,主要用于网络监控、协议分析和网络安全应用。它允许程序员访问网络接口层,从而可以直接读取网络上的数据包,不受操作系统限制。WINPCAP库包含...
Winpcap 中文文档教程,应该是一些winpcap英文的翻译
二次开发还需要安装WinPcap开发包http://www.winpcap.org/install/bin/WpdPack_4_0_2.zip 4.技术手段:多进程编程,WinPcap使用 主进程用于维护对话框页面,子进程捕获局域网中的数据包并统计。
WinPCAP是一个强大的网络数据包捕获和网络分析工具,主要在Windows操作系统环境下使用。它为应用程序提供了底层网络访问的能力,使得开发者能够直接与网络接口进行通信,抓取、过滤和分析网络数据包。在标题提到的...
这个"Winpcap的官方demo"包含了官方提供的示例和资源,是学习和理解Winpcap功能与用法的重要参考资料。 1. **Winpcap的基本概念** - **数据包捕获**:Winpcap能够直接访问网络接口卡(NIC)的数据包传输,允许程序...
#### 第二天至第七天:深入Winpcap编程实践 在这五天内,我们将通过一系列实验深入了解Winpcap的功能。从简单的设备列表获取,到复杂的数据包捕获与分析,每一天的学习都将带来新的技能和挑战。 ##### 设备列表...
本篇学习笔记主要涵盖了Winpcap的使用和配置,以及如何通过编程接口进行设备列举。 首先,为了进行Winpcap的开发,你需要下载WpdPack_3_2_alpha1.zip,这是一个包含文档、示例代码、Include和lib目录的压缩包。解压...
这个资料集合非常适合初学者学习如何利用WinPCAP进行网络编程。 1. **WinPCAP基本概念**: - 数据包捕获:WinPCAP能够捕获网络接口卡(NIC)上的原始数据包,这些数据包包括进出系统的所有网络流量。 - 数据包...
**绿色版winpcap4.1.0** WinPcap是一款免费、开源的网络数据包捕获和网络分析软件,广泛应用于网络安全、网络监控、数据分析等领域。它为应用程序提供了底层网络访问能力,允许开发者直接与网络接口进行通信,无需...
二、WinPcap组件 1. **libpcap库**:这是WinPcap的主要组成部分,提供了数据包捕获和处理的功能。 2. **Npcap驱动**:在Windows系统下,WinPcap依赖Npcap驱动来与网络接口进行通信。 3. **Packet.dll**:这是一个...
通过这些源代码,我们可以学习到如何初始化winpcap库,打开设备,设置数据包过滤器,以及如何处理捕获到的数据包。 libpcap是winpcap的跨平台版本,用于非Windows系统,如Linux、macOS等。它的接口与winpcap类似,...
"循序渐进学习使用WINPCAP(一).txt"可能是教程的第一部分,其中可能涵盖了以下内容: 1. **安装与配置**:介绍如何下载并安装WINPCAP库,以及配置开发环境,可能包括设置编译器和链接器选项。 2. **API介绍**:...
10. 学习资源:学习WinPcap编程,可以通过官方文档、教程、示例代码以及相关的书籍,如《WinPcap程序员指南》等进行深入学习。 总之,WinPcap为Windows平台的网络编程提供了强大的工具,通过理解和掌握WinPcap编程...
这个“winpcap源码”很可能是包含了WinPcap库的完整源代码,对于学习网络编程和网络监控技术的人来说,这是一个宝贵的资源。 WinPcap的核心功能包括以下几个方面: 1. **数据包捕获**:WinPcap能直接与网络适配器...