WinpCap 编写抓包程序
使用winpcap的主要流程

使用winpcap的主要流程1. 安装winpcap
•下载winpcap安装包
•运行安装程序
•按照提示完成安装过程
2. 创建WinPcap的应用程序
•引用WinPcap的头文件
•在应用程序中初始化WinPcap
•打开网络适配器
•设置过滤器条件
3. 捕获网络数据包
•创建一个数据包捕获句柄
•设置过滤器条件(可选)
•进入捕获循环
–清空数据包缓冲区
–捕获一个数据包
–处理捕获到的数据包
4. 处理捕获到的数据包
•解析数据包的头部信息
•进行数据包的分析和处理
•可选地将数据包写入文件或发送数据包5. 关闭数据包捕获
•关闭数据包捕获句柄
•释放资源
•结束应用程序
6. WinPcap的高级用法
•配置超时和非阻塞模式
•对多个适配器进行操作
•同时捕获多个数据流
•进行软件过滤器和内核过滤器
•设置数据包缓冲区大小
•错误处理和异常情况处理
7. 示例代码
下面是一个使用WinPcap进行数据包捕获的示例代码:
```c #include <stdio.h> #include <pcap.h>
int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t handle; const u_char packet; struct pcap_pkthdr header;
// 打开网络适配器
handle = pcap_open_live(\。
使用WinPcap编写Sniffer程序

typedef struct pcap_if pcap_if_t struct pcap_if {
struct pcap_if *next; char *name; char *description; struct pcap_addr *addresses; bpf_u_int32 flags; /* PCAP_IF_ interface flags */ }; struct pcap_addr { struct pcap_addr *next; struct sockaddr *addr; struct sockaddr *netmask; struct sockaddr *broadaddr; struct sockaddr *dstaddr; };
pcap_compile() 编译一种包过滤器。将一种高级旳、布尔形式表 示旳字符串转换成低档旳、二进制过滤语句,以便被包驱动使用。 pcap_setfilter() 在关键驱动中将过滤器和捕获过程结合在一起。从 这一时刻起,全部网络旳数据包都要经过过滤,经过过滤旳数据 包将被传入应用程序。
过滤设置举例
设备标识 (字符串)
抓包长度
混杂模式
超时时间
捕获数据包(回调机制)
int pcap_loop ( pcap_t * p,
int cnt,
pcap_handler callback,
例如:
u_char * user )
pcap_loop(adhandle, 0, packet_handler, NULL);
打开一种适配器开始捕获数据包
pcap_t * pcap_open_live ( const char * device, int snaplen, int promisc, int to_ms, char * ebuf )
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的网络抓包系统

术、多线程技术 、S C E O K T技术的应用 ,在 C/s模式中有效地 进行 计算 机的监控 。 客户端进行信息的收集 , 并将信息发送给 服务端,在完整的呈现给管理人员 , 整个过程都在监控系统 的 进行下有序 良好的进行 , 使管理人员在局域 网内能够实现正常 的管理和监测 ,进而促使 了计算机管理 的准确性和 高效性 。
dm f l = c p dm u p i ep a up
— — —
(n i n d c a 木 d m f l ) u s g e h r ) u p ie :
回调函数 ,用来处理数据包 木 /
v i a k t h n l r u c a * u p i e odpce l ade ( h r d m f ,
—
_
1 3 1 9 0端 口的数据 识别为 H T 17 、10 T P协议 。还有一种方法是 基 于正则表达式识别 , 通过大量 的统计分析 , 得到某种应用层 协议 的特 征表达式 ,然后利用正则表达式 匹配 引擎进行 识别。 它们 两者 各有 优缺点,基于端 口号的识别虽然效率 比较高 , 但 是对 于一些不常见的协议不容易识别 出来 。 而基于正则表达式 的识 别对 应用 层协议的识别范围 比较广 。 我们 的系 统结合了上述 这两种方法,利用各 自的优点 。 我 们 自己研 究出来一些协议的正则表达式 。 其对 D S的识别率 尤 N
… 刘海林, 陈世欣, 龚仕华. 于 HO K技术 的计算机监控 基 O
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里面包含库文件,头文件,文档文件和一些例子。
pcap 抓包原理

pcap 抓包原理PCAP 抓包原理PCAP(Packet Capture)是一种网络数据包捕获工具,它可以在网络上截取数据包并进行分析。
在网络安全领域中,PCAP 抓包是一项重要的技术,可以用于网络流量分析、入侵检测、漏洞挖掘等方面。
一、PCAP 抓包的基本原理1. 网络数据传输的基本方式在计算机网络中,数据传输是通过“分组交换”方式实现的。
当一台计算机向另一台计算机发送数据时,数据会被分成多个小块(称为“数据包”或“报文”),每个小块都会被打上目标地址和源地址等信息,并通过网络传输到目标主机。
2. PCAP 抓包的工作流程PCAP 抓包工具可以通过“混杂模式”或“非混杂模式”来截取网络数据包。
其中,“混杂模式”是指抓取所有经过网卡的数据包,“非混杂模式”则只抓取与本机有关的数据包。
具体地说,PCAP 抓包工具需要执行以下步骤:(1)打开网卡:首先需要打开一个网卡接口,以便能够接收和发送网络数据。
(2)设置过滤规则:为了避免大量无用的数据包干扰分析,需要设置过滤规则,只抓取符合条件的数据包。
(3)开始捕获:启动 PCAP 抓包程序后,开始捕获网络数据包。
(4)停止捕获:当需要停止抓包时,可以使用命令或者手动操作停止数据捕获。
(5)保存数据:将捕获到的数据保存到文件中,以便后续进行分析和处理。
二、PCAP 抓包的技术原理1. 网卡工作原理网卡是计算机与网络之间的接口设备,它负责将计算机发送出去的数据转换成网络可识别的格式,并将接收到的网络数据转换成计算机可识别的格式。
网卡通过硬件电路实现了对网络数据包的截取和传输功能。
2. 数据链路层协议在 OSI 模型中,第二层是“数据链路层”,它负责在物理层上建立逻辑连接,并通过 MAC 地址来识别不同主机之间的通信。
PCAP 抓包工具利用了这一特性,在数据链路层上截取和分析网络数据包。
3. WinPcap 和 Libpcap 库WinPcap 是一个基于 Windows 平台开发的 PCAP 抓包库,它提供了一套 API 接口,可以用于捕获和分析网络数据包。
实验一基于WinPcap的网络嗅探器设计
实验一、基于WinPcap的网络嗅探器设计1、目的与要求◆掌握基于WinPcap的网络编程模式。
◆理解并能应用WinPcap设计并实现网络数据包的捕获、解析。
2、实验设备与环境连网PC机(至少一台)。
计算机硬件要求:Intel Pentium5 处理器、256MB以上内存,Ethernet网卡,网线若干。
计算机软件要求:MS Windows 9x/2000/XP操作系统,TCP/IP协议,WinPcap430,Visual c++6.0/.net系统。
3、实验内容与步骤:在程序设计之前,请参照提供的软件安装WinPcap。
之后,按照如下步骤操作:步骤1:在VC++ 6.0下创建一个DOS命令行程序,工程名:201200824302步骤2:打开main()函数,在主程序中增加如下头文件和常量定义:头文件添加如下:#include <pcap.h>#define LINE_LEN 16代码内容如下:pcap_if_t *alldevs, *d;pcap_t *fp;u_int inum, i=0;char errbuf[PCAP_ERRBUF_SIZE];int res;struct pcap_pkthdr *header;const u_char *pkt_data;printf("pktdump_ex: prints the packets of the network using WinPcap.\n");printf("Usage: pktdump_ex [-s source]\n\n"" Examples:\n"“pktdump_ex -s file.acp\n""pktdump_ex \\Device\\NPF_{C8736017-F3C3-4373-94AC-9A34B7DAD998}\n\n"); if(argc < 3){printf("\nNo adapter selected: printing the device list:\n");// The user didn't provide a packet source: Retrieve the local device listif(pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);exit(1);}/* Print the list */for(d=alldevs; d; d=d->next){printf("%d. %s\n ", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i==0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}printf("Enter the interface number (1-%d):",i);scanf("%d", &inum);if (inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* Free the device list */pcap_freealldevs(alldevs);return -1;}/* Jump to the selected adapter */if ((fp = pcap_open_live(argv[2], // name of the device65536, // portion of the packet to capture. // 65536 grants that the whole packet will be captured on all the MACs. // promiscuous mode (nonzero means promiscuous)1000, // read timeouerrbuf // error buffer)) == NULL){fprintf(stderr,"\nError opening adapter\n");return -1;}}/* Read the packets */while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0){if(res == 0)/* Timeout elapsed */continue;/* print pkt timestamp and pkt len */printf("%ld:%ld (%ld)\n", header->_sec, header->_usec, header->len);/* Print the packet */for (i=1; (i < header->caplen + 1 ) ; i++){printf("%.2x ", pkt_data[i-1]);if ( (i % LINE_LEN) == 0) printf("\n");}printf("\n\n"); }if(res == -1){printf("Error reading the packets: %s\n", pcap_geterr(fp));return -1;}pcap_close(fp);return 0;步骤3:为编译器指定包含文件和库文件搜索目录。
WINPCAP编程环境设置
因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。
以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。
对于初学者来说,不太好做的可能是编译程序之前应该做什么事。
我就大体说一下我的过程。
首先先大体介绍下Winpcap。
winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3> 在网络上发送原始的数据包;4> 收集网络通信过程中的统计信息。
具体介绍参见/view/696423.htm这里有Winpcap的详细介绍。
下面说一下你在编译Winpcap之前要做的事情。
1 下载Winpcap安装包,地址/install/default.htm。
2 然后到/devel.htm下载WinPcap developer's pack包,解压,里面有配置好的例子和include library。
3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。
然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。
首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。
在里面填写如下代码:#include <pcap.h>main( )pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];if (pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1);}for(d= alldevs; d != NULL; d= d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}pcap_freealldevs(alldevs);return 0;}运行之前我们要手动给它添加一个动态链接库wpcap.lib,方法是在菜单Project中点Settings,然后在选项中选Link,在library modules 后面填上wpcap.lib,注意和前面的要有空格隔开。
抓包操作流程
抓包操作流程抓包操作流程是网络分析和网络故障排查中必不可少的一环,在网络管理员、网络安全专业人员、开发人员等领域具有广泛的应用。
本文将从以下三个方面介绍抓包操作流程——第一、准备工作1.1、安装抓包软件:需要安装类似Wireshark、tcpdump、Fiddler等抓包软件,这些软件都是开源、免费的。
1.2、了解所监控的网络环境,包括网络拓扑、网络设备的配置等信息,这可以帮助我们更好的分析和理解网络流量。
1.3、根据需要,配置好抓包软件的过滤器,过滤掉那些不需要的数据包,提高流量质量。
第二、开始抓包2.1、启动抓包软件,并开始进行抓包操作。
一般情况下,我们都需要知道所关注的设备或IP地址,以及设备或IP地址与其他设备或IP地址之间的通信流程。
为了实现这一目标,我们可以通过设置过滤器,只抓取满足条件的数据包,如以下三个过滤器:tcp.port == 80:仅抓取TCP协议下端口为80的数据包,一般情况下它是用来传输HTTP协议的数据。
ip.src == 10.0.0.1:仅抓取来源IP地址为10.0.0.1的数据包,通过这个过滤器可以查看该IP地址与其他设备之间的通信流程。
2.2、停止抓包并保存数据。
在已经完成了必要的抓包操作后,我们需要停止抓包,并将抓取下来的数据保存到本地,以便我们后期的分析和处理。
第三、数据分析3.1、打开抓包软件中已经保存的数据文件,进入数据分析模式。
3.2、清晰地展示数据包的详细信息,如协议、源地址、目的地址、源端口、目标端口、数据长度等信息,以便我们在学习分析时进行参考。
3.3、跟踪数据包的传输流程,在网络环境中分析数据的各种代表性事件,如连接、请求、回复、响应等事件,以便我们更好地理解和分析故障原因。
3.4、综合分析,利用各种分析工具对数据进行统计和分析,以便我们更好地分析数据的其他特征,如分析三次握手流程、分析传输性能等等。
3.5、通过分析得到的数据,我们可以更好地了解网络端到端性能,以便监控和诊断网络故障。
windows写程序抓数据链路层报文
windows写程序抓数据链路层报文以Windows写程序抓取数据链路层报文数据链路层报文是在计算机网络中传输的一种数据格式,它承载了网络层数据并通过物理链路进行传输。
在Windows操作系统中,我们可以编写程序来抓取数据链路层报文,以便进行网络分析和故障排查。
本文将介绍如何使用Windows平台上的工具和编程语言来实现这一目标。
一、使用Wireshark进行数据链路层报文抓取Wireshark是一个开源的网络协议分析工具,它可以在Windows 平台上运行,并能够捕获和分析网络数据包。
以下是使用Wireshark进行数据链路层报文抓取的步骤:1. 下载并安装Wireshark软件;2. 打开Wireshark,并选择要抓取数据链路层报文的网络接口;3. 设置过滤器,以便只捕获数据链路层报文;4. 开始抓取数据链路层报文;5. 停止抓取,并分析捕获到的数据链路层报文。
二、使用WinPcap库进行数据链路层报文抓取WinPcap是Windows平台上的一个网络数据包捕获库,它提供了一组API接口,可以用于编写程序来抓取数据链路层报文。
以下是使用WinPcap进行数据链路层报文抓取的步骤:1. 下载并安装WinPcap库;2. 创建一个新的WinPcap项目;3. 初始化WinPcap库,并打开要抓取数据链路层报文的网络接口;4. 设置过滤器,以便只捕获数据链路层报文;5. 开始抓取数据链路层报文;6. 停止抓取,并分析捕获到的数据链路层报文。
三、使用C#编程语言进行数据链路层报文抓取在Windows平台上,我们可以使用C#编程语言来编写程序来抓取数据链路层报文。
以下是使用C#编程语言进行数据链路层报文抓取的步骤:1. 创建一个新的C#控制台应用程序项目;2. 导入相关的命名空间,如workInformation;3. 获取系统上的所有网络接口;4. 选择要抓取数据链路层报文的网络接口;5. 设置过滤器,以便只捕获数据链路层报文;6. 创建一个新的网络监听器,并注册数据接收事件;7. 开始监听网络接口,并捕获数据链路层报文;8. 停止监听,并分析捕获到的数据链路层报文。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用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);
else
printf(" (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参数是对应的,用于在函数间传递数据。
WinpCap每收
到一个包就自动调用packet_handler函数,将包的内容作为data参数,我们对data作强制类型转化就可以得到数据包各部分的内容。
事实上,WinpCap开发包除了可以用回调函数抓包外,还可以用非回调的方法。
在得到adhandle后不调用pcap_loop,而用下面的方法:while(1)
{
res = pcap_next_ex(adhandle,&header,&data);
if(res==0)
{
Sleep(100);
continue;
}
}
用pcap_next_ex读取数据包内容,至于if(res==0)这一段是为了防止没数据包到达时重复循环。
不多讲了全部源程序可看附件。
附件中有两个抓包程序,一个是GUI的,一个是CUI的。
CUI程序的运行结果如下:
附件下载:
WinpCap开发包:
WinPcap_4_0_beta3.rar
CUI抓包源程序:
CapPack.rar
GUI抓包源程序(MFC):
MFCCapPack.rar。