winpcap是什么,第1张

Winpcap是windows平台下的免费公共网络访问系统。开发winpcap的目的是为win32应用程序提供访问网络底层的能力。用于windows系统下的直接网络编程。

Winpcap(windows数据包捕获)是windows平台下的免费公共网络访问系统。开发winpcap的目的是为win32应用程序提供访问网络底层的能力。用于windows系统下的直接网络编程。

winpcap是什么,winpcap是什么,第2张

特征

Winpcap提供了强大的编程接口,可以方便地在操作系统之间移植,方便程序员开发。

什么样的程序需要使用Winpcap

许多不同的工具和软件在网络分析、故障排除、网络安全监控等方面使用Winpcap。Winpcap特别适合以下经典领域:

1.网络和协议分析

2.网络监视

3、通讯日志记录

4、交通发电机

5.用户级网桥和路由

6.网络入侵检测系统(NIDS)

7.网络扫描

8.安全工具

Winpcap不能做一些事情。它不依赖主机的TCP/IP协议来发送和接收数据包。这意味着它不能阻塞和处理同一主机中程序之间的通信数据。它只能“嗅探”物理线路上的数据包。因此,它不适用于流量整形器、服务质量调度和个人防火墙。

Winpcap内部结构

Winpcap是在Win32平台下捕获和分析包的系统。包括一个内核级包过滤,一个底层动态链接库和一个高级独立于系统的动态链接库(Wpcap.dll)

驱动功能

捕获原始数据包,包括主机在共享网络上发送/接收并相互交换的数据包;

在数据包发送到应用程序之前,根据自定义规则过滤掉一些特殊的数据包;

在网络上发送原始数据包;

收集网络传播过程中的统计信息。

Winpcap的主要功能是独立于主机协议(如TCP-IP)发送和接收原始数据包。也就是说,winpcap不能阻塞、过滤或控制其他应用程序的数据包发送和接收,它只是监听共享网络上传输的数据包。所以不能用于QoS调度器或个人防火墙。winpcap开发的主要对象是windows NT/2000/XP,主要是因为只有少数使用winpcap的用户只使用windows 95/98/Me,而MS已经放弃了win9x的开发。所以相关程序T-ARP也是针对NT/2000/XP用户的。其实winpcap中面向9x的系统的概念和NT系统很像,只是在一些实现上有一些区别。比如9x只支持ANSI编码,而NT系统提倡使用Unicode编码。有一个软件叫snifferpro,可以做网管软件。它具有监控网络运行、网络中每台机器的数据流、实时反映每台机器访问的IP和它们之间的数据流、捕获数据包、设置过滤器等多种功能,以便只捕获所需的数据包,如POP3数据包、smtp数据包、ftp数据包等。,并查找电子邮件用户名和密码,以及ftp用户名和密码。它也可以使用交换机在网络上监听,但是在交换机上安装它的一个软件。还有一个简单的监控软件叫Passwordsniffer,可以截取邮件用户名和密码,ftp用户名和密码,只能在HUB网络上使用。著名软件tcpdump和idssnort都是基于libpcap编写的。此外,Nmap scanner基于libpcap捕获目标主机返回的数据包。

Winpcap为用户提供了两个不同级别的编程接口:一个是基于libpcap的wpcap.dll,另一个是低级别的packet.dll。对于在unix平台上兼容libpcap的一般开发,使用wpcap.dll是一个自然的选择。

内部结构

Winpcap是在Win32平台上进行数据包捕获和网络分析的架构。它包括一个核心包过滤器,一个底层动态链接库(packet.dll)和一个顶层独立于系统的库(wpcap.dll)。

为什么用「建筑」而不用「图书馆」?由于数据包捕获是一种需要与网络适配器(网卡)和操作系统交互的底层机制,与网络的实现密切相关,仅用“库”是无法充分表达Winpcap的作用的。

下图显示了Winpcap的组件:

首先,包捕获系统必须绕过操作系统的协议栈才能访问网络上传输的原始包,这需要一部分运行在操作系统的核心内部,并直接与网络接口驱动程序交互。这部分取决于系统。在Winpcap的解决方案中,它被认为是一个设备驱动程序,称为NPF(网络组包过滤)。Winpcap开发团队为Windows95、Windows98、WindowsME、Windows NT 4、Windows2000、WindowsXP提供了不同版本的驱动。这些驱动程序不仅提供基本功能(如数据包捕获和注入),还提供更高级的功能(如可编程过滤器系统和监控引擎)。前者可用于将数据包捕获会话仅限于网络通信的子集(例如,仅捕获特殊主机生成的ftp通信数据包),而后者提供了一种强大而简单的网络流量计数机制(例如,获取网络负载或两台主机之间的数据交换)。

其次,包捕获系统必须有用户级的程序接口,通过这些接口,用户程序可以利用内核驱动程序提供的高级功能。Winpcap提供了两个不同的库:packet.dll和wpcap.dll。前者提供一个底层API,附带一个独立于微软操作系统的编程接口,可以直接用来访问驱动函数;后者派生出一组与libpcap一致的更强大的高级捕获原语。这些功能使数据包捕获以一种独立于网络硬件和操作系统的方式进行。

例子

获取网卡接口。在普通的SOCKET编程中,不可能对双网卡进行编程。当主机是双网卡时,这个程序可以分别获取两个网卡的描述结构和地址,然后分别进行操作。返回的alldevs队列头是逻辑网卡,一般不操作。

获取网卡接口

# include & # 8220pcap.h & # 8221
void main()
{
pcap _ if _ t * all devs;
/* struct pcap _ if _ t {
pcap _ if _ t * next;
char * name;
char *描述;
pcap _ addr *地址;
U _ int falgs;
}
*/
pcap _ if _ t * d;
int I = 0;
char ERRBUF[PCAP _ ERRBUF _ SIZE];
/*检索设备列表*/
if(pcap _ findallddevs(& amp;Alldevs,errbuf)=-1)//返回网卡列表,alldevs指向表头
{
fprintf (stderr,& # 8221;pcap _ findalldevs中的错误:% s \ n & # 8221,errbuf);
退出(1);
}
/*打印列表*/
(d = all devs;d .d=d->。next)
{
printf(& # 8220;% d. % s & # 8221,++i,d->;姓名);
if(d->;描述)
printf(& # 8221;(% s)\ n & # 8221;,d->;描述);
else printf(& # 8221;(无描述)\ n & # 8221);
}
if(I = = 0)
{
printf(& # 8220;\ n找不到接口!请确保安装了WinPcap。\ n & # 8221);
返回;
}
/*我们不& # 8217;我不再需要设备列表了。免费它*/
pcap _ freeall devs(all devs);
}

——————————————————————————–

拿个包

这个程序在局域网中捕获UDP消息。
# include & # 8220;pcap.h & # 8221
/* 4字节IP地址*/
typedef struct IP _ address {
u _ char byte 1;
u_char字节2;
u_char字节3;
u_char字节4;
} IP _ address;
/* IPv4标头*/
typedef struct IP _ header {
u _ char ver _ IHL;//版本(4位)+互联网头长(4位)
u _ char tos;//服务类型
u _ short tlen;//总长度
u_short标识;//标识
u _ short flags _ fo;//标志(3位)+片段偏移量(13位)
u _ char TTL;//生存时间
u _ char proto;//Protocol
u _ short CRC;//报头校验和
IP _ address saddr;//源地址
IP _ address daddr;//目的地址
u _ int op _ pad;//Option+Padding
} IP _ header;
/* UDP header */
typedef struct UDP _ header {
u _ short sport;//源端口
u _ short d port;//目的端口
u _ short len;//数据报长度
u _ short CRC;//校验和
} UDP _ header;
/*数据包处理程序的原型*/
void packet _ handler(u _ char * param,const struct pcap_pkthdr *header,const u _ char * PKT _ data);
main()
{
pcap _ if _ t * all devs;
pcap _ if _ t * d;
int inum;
int I = 0;
pcap _ t * adhandle;
char ERRBUF[PCAP _ ERRBUF _ SIZE];
u _ int net mask;
char packet _ filter[]= & # 8220;ip和udp & # 8221;
struct bpf _ program fcode;
/*检索设备列表*/
if(pcap _ findallddevs(& amp;alldevs,errbuf)= =-1)
{
fprintf(stderr,& # 8221;pcap _ findalldevs中的错误:% s \ n & # 8221,errbuf);
退出(1);
}
/*打印列表*/
(d = all devs;d .d=d->。next)
{
printf(& # 8220;% d. % s & # 8221,++i,d->;姓名);
if(d->;描述)
printf(& # 8221;(% s)\ n & # 8221;,d->;描述);
else
printf(& # 8221;(无描述)\ n & # 8221);
}
if(I = = 0)
{
printf(& # 8220;\ n找不到接口!请确保安装了WinPcap。\ n & # 8221);
return-1;
}
printf(& # 8220;输入接口号(1-% d):& # 8221;,I);
scanf(& # 8220;% d & # 8221,& ampinum);
if(inum & lt;1分钟。I)
{
printf(& # 8220;\ n接口号超出范围。\ n & # 8221);
/*释放设备列表*/
pcap _ freeall devs(all devs);
return-1;
}
/*跳转到所选适配器*/
(d = all devs,I = 0;i<。inum-1;d=d->。接下来,i++);
/*打开适配器*/
if((ad handle e = pcap _ Open _ live(d->;名称,//设备名称
65536,//要捕获的数据包部分。
// 65536授权将在所有MAc上捕获整个数据包。
1,//混杂模式
1000,//读取超时
errbuf//error buffer
)= = NULL)
{
fprintf(stderr,& # 8221;\ n无法打开适配器。WinPcap不支持\ n & # 8221);
/*释放设备列表*/
pcap _ freeall devs(all devs);
return-1;
}
/*检查链路层。为了简单起见,我们只支持以太网。*/
if(pcap _ data link(ad handle)!= DLT _ INVERSMB)
{
fprintf(stderr,& # 8221;\ n该程序仅在以太网上工作。\ n & # 8221);
/*释放设备列表*/
pcap _ freeall devs(all devs);
return-1;
}
if(d->;地址!= NULL)
/*检索接口第一个地址的掩码*/
网络掩码=((struct sockaddr _ in *)(d-& gt;地址->;网络掩码))->;sin_addr。S_un。S _ addr
else
/*如果接口没有地址,我们假设在一个C类网络中*/
网络掩码= 0xffffff
//编译筛选器
if(pcap_compile(adhandle,& ampfcode,packet_filter,1,net mask )& lt;0 ){
fprintf(stderr,& # 8221;\ n无法编译数据包筛选器。检查语法。\ n & # 8221);
/*释放设备列表*/
pcap _ freeall devs(all devs);
return-1;
}
//设置过滤器
if(pcap _ set filter(ad handle,& ampfcode)和lt。0){
fprintf(stderr,& # 8221;\ n设置筛选器时出错。\ n & # 8221);
/*释放设备列表*/
pcap _ freeall devs(all devs);
return-1;
}
printf(& # 8220;\ n在% s & # 8230\ n & # 8221,d->;描述);
/*此时,我们不& # 8217;我不再需要设备列表了。免费它*/
pcap _ freeall devs(all devs);
/*启动捕获*/
pcap_loop(adhandle,0,packet_handler,NULL);
返回0;
}
/*回调函数由pcap为每个传入数据包调用*/
void packet _ handler(u _ char * param,const struct pcap_pkthdr *header,const u _ char * PKT _ data)
{
struct TM * ltime;
char timetr;
IP _ header * ih;
UDP _ header * uh;
u _ int IP _ len;
/*将时间戳转换为可读格式*/
ltime = local time(& amp;标题->;v _ sec);
str time(timestr,sizeof timestr,& # 8220;% H:% M:% S & # 8221;,ltime);
/*打印数据包的时间戳和长度*/
/*撤销ip报头的位置*/
ih =(IP _ header *)(PKT _ data+
;//以太网报头的长度
/*删除udp报头的位置*/
ip_len = (ih->;ver_ihl &。0xf)* 4;
uh =(UDP _ header *)((u _ char *)ih+IP _ len);
/*从网络字节顺序转换为主机字节顺序*/
printf(& # 8220;% s . % 6d len:% d & # 8220;,timestr,header->;_usec,header->;len);
/*打印ip地址*/
printf(& # 8220;%d.%d.%d.%d ->。% d. % d. % d. % d \ n & # 8221,
ih->saddr.byte1,
ih->saddr.byte2,
ih->saddr.byte3,
ih->saddr.byte4,
ih->daddr.byte1,
ih->daddr.byte2,
ih->daddr.byte3,
ih->daddr . byte 4
);
}

——————————————————————————–

奖品

要在命令行运行,请给出参数:网卡描述符。或者添加代码findalldevs(),应该方便。
#include <。stdlib.h>。
#include <。stdio.h>。
# include & # 8220;pcap.h & # 8221
void usage();
void main(int argc,char * * argv){
pcap _ t * FP;
字符错误[PCAP _ ERRBUCF _ SIZE];
u_char数据包[100];
int I;
/*检查命令行的有效性*/
if (argc!= 2)
{
printf(& # 8220;用法:% s inerface & # 8221,argv[0]);
返回;
}
/*打开输出适配器*/
if((FP = pcap _ Open _ live(argv,100,1,1000,error))= = NULL)
{
fprintf(stderr,& # 8221;\n打开适配器时出错:% s \ n & # 8221,错误);
返回;
}
/*假设在以太网上,将mac目的地设置为1:1:1:1:1:1 */
packet[0]= 1;
packet = 1;
packet = 1;
packet = 1;
packet = 1;
packet = 1;
/*将mac source设置为2:2:2:2:2:2 */
packet = 2;
packet = 2;
packet = 2;
packet = 2;
数据包[10]= 2;
packet = 2;
/*填充数据包的剩余部分*/
(I = 12;i<。100;i++){
packet = I % 256;
}
/*发送数据包*/
pcap_sendpacket(fp,
数据包,

返回;
}

卸载问题

winpcap不整洁卸载解决方案

当winpcap卸载干净时,只需删除windows下的一些文件,并删除以下文件:

c:\windows\system32\Packet.dll

c:\ windows \ system32 \ drivers/NPF . sys

c:\ windows \ system32 \ WanPacket . dll

c:\windows\system32\wpcap.dll

c:\ windows \ system32 \ Pthreadvc . dll

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » winpcap是什么

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情