WinPcap编程
基于libcap、winpcap的网络编程

第五章基于libpcap的网络编程技术5. 1常见的包捕获机制简介包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。
包捕获的机制大致可以分为两类:一类是由操作系统内核提供的捕获机制。
另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制。
常见的包捕获机制如表5-1所示。
其中最主要的是下列4种:BPF ( Berkeley Packet Filter )DLPI ( Data Link Provider In terface )NIT ( Network In terface Tap ) SOCK-PACKET 类型套接口。
BPF由基于BSD的Unix系统内核所实现。
DLPI是Solaris (和其他System V UNIX ) 系统的内嵌子系统。
NIT是SUN OS4 系统的一部分,但在Solaris /SUN OS5 中被DLPI 所取代。
Linux核心则实现了SOCK-PACKET 的包捕获机制。
从性能上看,BPF比DLPI 和NIT 好得多,SOCK-PACKET 最弱。
表5-1常用的包捕获机制由于现在很多局域网为NT网,其网络传输方式大多采用以太网标准,所以涉及的编程也是在Windows 环境下实现的。
Windows 操作系统没有提供包捕获机制,只提供了数量很少并且功能有限的API调用。
在Windows 环境下由于其自身的封装性,很难对其底层进行编程。
本章将对BSD系列的libpcap进行深入地介绍。
5.2 Libpcap 与 BPF(1) libpcap 概述libpcap(Packet Capturelibrary),即数据包捕获函数库。
该库提供的 C 函数接口可用于捕获经过网络接口 (只要经过该接口,目标地址不一定为本机)的数据包。
它是由洛仑兹 伯克利试验室的研究人员 Steven McCanne 和Van Jacobson 于1993 年在Usenix'93 会议上正式提出的一种用于 Unix 内核数据包过滤体制。
WinPcap开发-零基础知识入门基础

WinPcap开发(一):零基础入门*原创作者:追影人0×00 前言网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。
而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。
0×01 winpcap是什么?winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。
著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。
有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。
需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。
所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。
0×02 你需要准备些什么?本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。
在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。
但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpc ap开发库支持的编程语言,自己能动手实践编写一些例子。
Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。
WinPcap编程

Packet.dll应用步骤
2) 打开指定的网卡 lpAdapter = PacketOpenAdapter(AdapterList [0 ]) ; if ( ! lpAdapter | | (lpAdapter - > hFile = = INVALID_HANDLE_VALUE) ) { dwErrorCode = GetLastError() ; sprintf ( szErr ,″Unable to open the adapter ,error code : %lx″, dwErrorCode) ; AfxMessageBox(szErr) ; return FALSE; }
1> LPPACKET PacketAllocatePacket(void) 如果运行成功,返回一个_PACKET结构的指针, 否则返回NULL。成功返回的结果将会传送到 PacketReceivePacket()函数,接收来自驱动的网络 数据报。 2> VOID PacketFreePacket(LPPACKET lpPacket) 释放参数提供的_PACKET结构。 3> VOID PacketCloseAdapter(LPADAPTER lpAdapter) 关闭参数中提供的网络适配器,释放相关的 ADAPTER结构。
WinPcap
WinPcap包括三个部分 第一个模块:内核级的包过滤驱动程序
NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件, 是架构的核心(在Win95/98 中是一个VXD文件,在NT/2000 中是 一个SYS 文件) ,它的主要功能是过滤数据包,在包上附加时间戳、 数据包长度等信息。
第二个模块:低级动态链接库packet.dll,在Win32 平台 上提供了与NPF 的一个通用接口。 packet.dll数据包驱 动程序库是与libpcap 相兼容的一组用户级的函数库。 第三个模块:用户级的Wpcap.dll。通过调用packet.dll 提供的函数生成,它包括了过滤器生成等一系列可以被 用户级调用的高级函数,另外还有诸如数据包统计及发 送功能。
网络流量监测实验二利用WINPCAP编程实验报告

姓名:班级:班内序号:学号:----------------------------------本次实验的内容是分析Winpcap程序,Winpcap程序包含在winpcap_class.zip中,解压缩后有四个程序:(1)Opening an adapter and capturing packets(2)Handling offline dump files(3)Sending Packets(4)Gathering Statistics on the network traffic分别进入相关目录下,双击*.dsw,即可编译运行相关程序。
为了能让程序正常编译、运行,需要●解压程序员开发包(WpdPack.rar)●在tool的option的include和lib中加入WpdPack的include目录和lib目录。
本次实验所有同学必须提交实验报告电子版一份,上交时注意要修改文档名。
实验报告内容是:分别写出给定的四个程序(第一个已经给出,其他三个按照第一个写)的流程,关键函数接口及其作用,运行并截取运行结果(截图)。
程序一:Opening an adapter and capturing packets1.程序流程1)获得本机网络接口列表(如果出错,输出错误并退出)2)打印列表信息(如果接口数量为0,输出错误并退出)3)输入要捕获的网络接口序号(如果输入错误,释放列表,退出)4)跳转到相应的网络接口5)打开网络接口,建立捕获实例(如果出错,释放列表,退出)6)释放网络接口列表7)开始循环捕获数据包,不限制包数上限(如果出错则退出)8)将捕获到的数据包信息(捕获时间、长度)打印出来9)反复执行8)2.关键函数及其作用:1)pcap_findalldevs_ex:获得适合的网络接口的列表。
列表中每个元素都记录了一个接口的信息。
2)pcap_freealldevs:释放网络接口的列表。
3)pcap_open:打开一个指定网络接口,可以通过这个接口来捕获或者发送数据包。
winpcap编程_适合当讲授课件

要向VC++6.0中添加一个新的包含文件所在的路径,你必 须打开Tool菜单,选择Options,然后选择Directories选项卡, 在Show directories下拉框中选择Include files,并且将新的 路径添加到Directories中去 。
二、获得设备列表
通常,编写基于WinPcap应用程序的第一件事情,就是获得已 连接的网络适配器列表。WinPcap提供了 pcap_findalldevs_ex( ) 函数来实现这个功能:
由 pcap_findalldevs_ex()返回的每一个 pcap_if 结构体, 都包含一个 pcap_addr 结构体,这个结构体由如下元素组成:
通过返回的结构,我们可以得到探测到的网卡设备的更 详尽信息。
例子:
二、打开适配器开始捕获数据包
现在,我们已经知道如何获取适配器的信息了,那我们就开始 一项更具意义的工作,打开适配器并捕获数据包。本节中,我们会 编写一个程序,将每一个通过适配器的数据包打印出来。
Sniffer,中文可以翻译为嗅探器,是一种基于被动侦听原理的网络 分析方式。使用这种技术方式,可以监视网络的状态、数据流动情况 以及网络上传输的信息。当信息以明文的形式在网络上传输时,便可 以使用网络监听的方式来进行攻击。将网络接口设置在监听模式,便 可以将网上传输的源源不断的信息截获。 wireshark(2006年之前称为Ethereal)一是全球相当行流行的开放 源代码的网络协议分析软件,功能强大而且支持平台最多,它可以实 时检测网络通讯数据,也可以检测其抓取的网络通讯数据快照文件;可 以通过图形界面浏览这些数据,可以查看网络通讯数据包中每一层的 详细内容;Wireshark还拥有许多强大的特性:包含有强显示过滤器语 言和查看TCP会话重构流的能力。它可以支持七百多种协议的解析和 多种媒体类型。
WinpCap 编写抓包程序

利用WinpCap 编写抓包程序网友:yeahilly 发布于:2008.05.20 11:12(共有条评论) 查看评论| 我要评论WinpCap是一个公开的免费的抓包驱动加开发包,利用它,可以大大缩短我们的开发周期。
首先,先枚举系统中的所有网卡:/* 获取设备列表*/if (pcap_findalldevs(&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 ( (adhandle= pcap_open_live(d->name, //设备名65536, // 捕捉完整的数据包1 , // 混在模式1, // 读入超时errbuf // 错误缓冲) ) == NULL){printf("Unable to open the adapter");pcap_freealldevs(alldevs);return;}打开设备之后,我们就可以利用adhandle句柄来正式抓包了,先新建一个回调函数,形如void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data){}然后调用pcap_loop(adhandle, 0, packet_handler,NULL);pcap_loop的最后一个参数和packet_handler的packets参数是对应的,用于在函数间传递数据。
第7章 Winpcap编程技术

PacketSetHwFilter() 设置接收模式(一般设置为混杂模式) 设置接收模式(一般设置为混杂模式) PacketSetBpf() PacketSetBuff() 编辑设置过滤规则 设置核心缓冲区大小
PacketSetReadTimeout() 设置读操作等待时间 PacketAllocatePacket() 设置(分配)用户缓冲区 设置(分配) PacketInitPacket() PacketReceivePacket() 初始化
Winpcap的各个组成部分
6
常州大学信息学院
网络编程
1、NPF驱动
网络数据包过滤器(Netgroup Filter, NPF)是Winpcap的核心部分。它处理网络 上传输的数据包,并且对用户级提供捕获、 发送和分析等功能。 NPF是一个协议驱动,它包括Network Tap和Packet Filter两个主要部件。
30
常州大学信息学院
网络编程
3、接口数据结构
struct pcap_if { struct pcap_if *next; char *name; char *description; struct pcap_addr *addresses; u_int flags; };
31
常州大学信息学院
网络编程
10
常州大学信息学院
网络编程
2、typedef struct _PACKET *LPPACKET
描述一组网络数据包的结构。它包含 了以下几个域: OVERLAPPED OverLapped PVOID Buffer UINT Length PVOID ulBytesReceived BOOLEAN bIoComplete
发送一个或多个数据报的副本。
WinPcap编程

WinPcap编程WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。
它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。
WinPcap由两部分组成:1. 驱动程序: 扩展操作系统功能提供低层次的网络访问2. 动态链接库:运行在Win32平台上的应用程序可以非常方便地访问网络低层次的数据。
Ethereal是大名鼎鼎的捕获数据包专业软件,它的运行是在WinPcap的支持之下的,如果没有安装WinPcap,Ethereal也无法正常捕获数据包。
在正式WinPcap编程之前,要配置运行环境。
Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:wpcap.dllPacket.dllWanPacket.dllpthreadVC.dll这四个动态链接库在WinPcap驱动程序里。
如果没有这个驱动程序,需要到WinPcap官方网站上下载,下载地址为: 如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。
被过滤广告也可以不安装WinPcap驱动程序。
但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下或者接下来配置编程环境。
如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加pcap.h 包含文件(或者在引用的文件中),即#include “pcap.h”也许会出现下面的错误:fatal error C1083: 无法打开包括文件:“pcap.h”: No such file or directory这个错误表明找不到pcap.h文件这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK―WpdPackWinPcap SDk里面包含库文件,头文件,文档文件和一些例子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WinPcap编程WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。
它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。
WinPcap由两部分组成:1. 驱动程序: 扩展操作系统功能提供低层次的网络访问2. 动态链接库:运行在Win32平台上的应用程序可以非常方便地访问网络低层次的数据。
Ethereal是大名鼎鼎的捕获数据包专业软件,它的运行是在WinPcap的支持之下的,如果没有安装WinPcap,Ethereal也无法正常捕获数据包。
在正式WinPcap编程之前,要配置运行环境。
Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:这四个动态链接库在WinPcap驱动程序里。
如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。
被过滤广告也可以不安装WinPcap驱动程序。
但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下或者接下来配置编程环境。
如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加包含文件(或者在引用的文件中),即#include “”也许会出现下面的错误:fatal error C1083: 无法打开包括文件:“”: No such file or directory这个错误表明找不到文件这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK―WpdPackWinPcap SDk里面包含库文件,头文件,文档文件和一些例子。
解压缩后把Include目录添加到IDE的包含文件中( Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录)error LNK2019: 无法解析的外部符号_pcap_findalldevs_ex,该符号在函数XXX 中被引用如果发生上面的错误就表明缺少库文件,需要添加到工程中Project->Settings->Link->Object/library modules; VS 2003/2005 项目->添加现有项->所有文件)error C2065: “PCAP_SRC_IF_STRING”: 未声明的标识符error C3861: “pcap_findalldevs_ex”: 找不到标识符error C2065: “PCAP_OPENFLAG_PROMISCUOUS”: 未声明的标识符error C3861: “pcap_open”: 找不到标识符新的版本里WinPcap支持远程数据包获取,发生上面的错误很有可能是新的版本导致不兼容的问题,所以还应当添加一个头文件,即#include ""如果还有问题,可以到WinPcaP官方网站上找FAQ。
一般情况下应该没有问题了。
接下来,开始动手做抓包分析吧。
Winpcap简介一.Winpcap简介Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个free and open source的项目。
Winpcap工作于驱动(Driver)层,所以能以很高的效率进行网络操作。
Winpcap提供了以下强大的功能:1.捕获原始的数据包2.设置filter,只捕获自己敢兴趣的数据包3.方便的把捕获的数据包输出到文件和从文件输入4.发送原始的数据包5.统计网络流量6.…..(其它还有很多,我不知道了)二.Winpcap的安装使用方法2.执行安装包,这样你的机子就能运行winpcap程序了3.解压开发包,在VC的option的include和lib中加入winpcap的include和lib4. 在你的程序中加入#include <>, #include <>.然后在工程的setting中加入预定义宏:WPCAP,HAVE_REMOTE.导入库5.就可以编写wpcap程序了三.Winpcap的一些基本的功能的实现一)捕获数据包1. 枚举所有的可用的设备[pcap_findalldevs_ex](可选)2. 通过名字打开一个设备[pcap_open()]在这里可以打开一个文件,只是在打开这个文件之前需要通过pcap_createsrcstr创建相应的name string3. 设置Filter[pcap_compile, pcap_setfilter] (可选)4. 捕获数据有几种捕获数据的方法(捕获数据的数据都是最原始的数据包,即包含数据链路层的数据头)a.是以回调的方式[ pcap_loop,pcap_dispatch() ].这两种方法基本相同,底层收集数据包,当满足一定的条件(timeout 或者缓冲区满),就会调用回调函数,把收集到的原始数据包s,交给用户。
他们返回的数据缓冲区包含多个包b. pcap_next_ex()的方式每当一个包到到达以后,pcap_next_ex就会返回,返回的数据缓冲区里只包涵一个包。
二)发送包Winpcap中有发送单个包和发送多个包的方法。
这里只说说发送单个包1.通过名字打开一个设备[pcap_open]2.自己构造一个原始数据包(这个数据包会不经过任何处理就发送出去,所以必须把包中的各个字段设置好。
另外这个数据包是包含数据链路层报头的)3.使用pcap_sendpacket()发送数据包三)统计网络流量1. 通过名字打开一个设备[pcap_open]通过 read_timeout来设置统计的时间间隔2. 设置filter[pcap_compile, pcap_setfilter] (可选)3. 设置设备的为统计模式[ pcap_setmode(MODE_STAT);]4. 开始统计,pcap_loop/pcap_dispatch()5.在回调函数中的参数中就包含了统计信息,如下图:winpcap的一些认识一.Winpcap简介Winpcap是UNIX下的libpcap移植到windows下的产物,他是一个freeandopensource的项目。
Winpcap工作于驱动(Driver)层,所以能以很高的效率进行网络操作。
Winpcap提供了以下强大的功能:1.捕获原始的数据包2.设置filter,只捕获自己敢兴趣的数据包3.方便的把捕获的数据包输出到文件和从文件输入4.发送原始的数据包5.统计网络流量6.…..(其它还有很多,我不知道了)二.Winpcap的安装使用方法2.执行安装包,这样你的机子就能运行winpcap程序了3.解压开发包,在VC的option的include和lib中加入winpcap的include和lib4.在你的程序中加入#include<>,#include<>.然后在工程的setting中加入预定义宏:WPCAP,HAVE_REMOTE.导入库5.就可以编写wpcap程序了三.Winpcap的一些基本的功能的实现一)捕获数据包1. 枚举所有的可用的设备[pcap_findalldevs_ex](可选)2. 通过名字打开一个设备[pcap_open()]在这里可以打开一个文件,只是在打开这个文件之前需要通过pcap_createsrcstr创建相应的namestring3. 设置Filter[pcap_compile,pcap_setfilter](可选)4. 捕获数据有几种捕获数据的方法(捕获数据的数据都是最原始的数据包,即包含数据链路层的数据头)a.是以回调的方式[pcap_loop,pcap_dispatch()].这两种方法基本相同,底层收集数据包,当满足一定的条件(timeout或者缓冲区满),就会调用回调函数,把收集到的原始数据包s,交给用户。
他们返回的数据缓冲区包含多个包b. pcap_next_ex()的方式每当一个包到到达以后,pcap_next_ex就会返回,返回的数据缓冲区里只包涵一个包。
二)发送包Winpcap中有发送单个包和发送多个包的方法。
这里只说说发送单个包1.通过名字打开一个设备[pcap_open]2.自己构造一个原始数据包(这个数据包会不经过任何处理就发送出去,所以必须把包中的各个字段设置好。
另外这个数据包是包含数据链路层报头的)3.使用pcap_sendpacket()发送数据包三)统计网络流量1.通过名字打开一个设备[pcap_open]通过 read_timeout来设置统计的时间间隔2.设置filter[pcap_compile,pcap_setfilter](可选)3. 设置设备的为统计模式[pcap_setmode(MODE_STAT);]4. 开始统计,pcap_loop/pcap_dispatch()5.在回调函数中的参数中就包含了统计信息,如下图:四.总结这些东西都是我在学习winpcap的过程中的一些经验和总结。
由于我学习winpcap的时间很匆忙,只是按照stepbystepguide来学习的,所以我对于winpcap的理解也就只能局限与此,希望能在以后有机会深入学习."<<endl;pcap_freealldevs(alldevs);pcap_setmode(stathandle,MODE_STAT);=0;=0;pcap_loop(stathandle,0,dispatcher_handler,(unsignedchar*)×tamp);pcap_close(stathandle);return0;}4.0.1提供的IDE环境中,可以通过执行“项目”菜单中的的“属性”进入该项目的属性配置页,通过选择“配置属性”树中的“C/C++预处理哭”选项就增加’WPCAP’和’HAVE_REMOTE’两个标号。
如下图所示:6> 如果还有问题,可以到WinPcaP官方网站上找FAQ。
二、WINPCAP编程入门利用WINPCAP捕获数据包一般要经过以下几个步骤1、获取网络接口列表通常, 一个基于WinPcap的应用程序所要做的第一件事, 就是获得适合的网络接口的列表.pcap_findalldevs()(或者pcap_findalldevs_ex())函数就是干这活的: 这个函数返回一个pcap_if结构的列表, 每个元素都记录了一个接口的信息. 其中, name和description以人类可以阅读的形式, 记录了设备的信息.2、获取设备的高级信息WinPcap 也可以为我们提供关于接口的更多信息. 由 pcap_findalldevs() 函数返回的 pcap_if 结构也包含了一个 pcap_addr 结构的列表, 它记录了以下信息:1. 接口的地址列表2. 接口的掩码列表 (与地址列表一一对应)3. 接口的广播地址列表 (与地址列表一一对应)4. 目标地址列表 (与地址列表一一对应)3、打开一个接口并捕捉流量现在我们已经知道如何获取一个接口的有关信息了, 我们可以来点真家伙了 -- 打开一个接口并捕捉流量. 接下来我们会编译一个程序, 它将捕捉网络中所有的数据包并输出他们的一些相关信息。