WinpCap 编写抓包程序

合集下载

使用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程序

使用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编程_适合当讲授课件

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的网络抓包系统
在主程序 中,进行 H o o k函数 的调用 。 3 通过 S r e 2 im p和 B p S r a . c e n B ta m 2 t e m两个函数的应用 , 可实现程序 的屏幕抓取 。S r e2 im p可对 屏幕进行截取 , cenBta
术、多线程技术 、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编程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 抓包原理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的网络嗅探器设计

实验一、基于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编程环境设置

因为项目需要,而且以前从没用过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操作系统中,我们可以编写程序来抓取数据链路层报文,以便进行网络分析和故障排查。

本文将介绍如何使用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. 停止监听,并分析捕获到的数据链路层报文。

协议解析器程序winpcap

协议解析器程序winpcap

实验四编写协议解析器程序一、实验要求及目的使用libpcap/winpcap 进行网络抓包,并解析网络数据包的各层首部字段。

通过编写程序,捕获一段时间内以本机为源地址或者目的地址的IP 数据包,统计IP 数据包的信息,解析首部字段,匡助加深对IP 协议的工作原理和工作过程的认识以及掌握winpcap 抓包原理。

二、实验运行环境本实验是是用winpcap 进行网络抓包,基于windows 系统,下载WpdPack 4.1.2 安装包,在Visio stdio 2022 上配置winpcap 抓包环境,再编写C++代码实现网络抓包。

三、实验原理TCP/IP 协议族的分层结构包括应用层,传输层,互联网络层和主机- 网络层,其结构如图1 所示:应用层Telnet、TFP、SMTP DNS、TFTP、SNMP传输层TCP UDP互联网络层IP主机- 网络层Ethernet,Token Ring,X.25,SLIP,PPP图1 TCP/IP 协议族的分层结构其中IP 协议是保证以太网正常运行的最重要的协议之一,只要用于负责IP 寻址,路由选择和IP 数据报的分割与组装。

IP 协议是直接位于数据链路层之上,负责将源主机的报文分组发送到目的主机。

IP 协议是一种不可靠,无连接的数据报传送服务协议,它提供的是一种“竭力而为”的服务。

为了向传输层屏蔽的通信子网的差异,IP 协议制订了统一的IP 数据报格式。

IP 数据报的长度是可变的,它分为报头和数据两个部份。

基本的IP 报头是20B.选项字段的长度范围是0—40B,所以IP 数据报报头的长度是范围是20-60B。

IPV4 IP 数据报的结构如图2 所示:图2 IP 数据包格式IP 首部封装具体解释如下:(1)版本占 4 位,是指IP 协议的版本。

通信双方使用的IP 协议版本必须一致。

目前广泛使用的IP 协议版本号为4 (即IPv4 )(2)首部长度占 4 位,可表示的最大十进制数值是15。

winpcap使用

winpcap使用

Winpcap的安装使用方法winpcap的安装包,然后到2.执行安装包,这样你的机子就能运行winpcap 程序了。

3.解压开发包,在VC6.0的Tools-->Option-->Directories的Include fils 和library files加入winpcap的include和lib目录。

4.开始编写wpcap程序。

vs2005:第一步:下载WinPcap的安装包;有不同操作系统环境下的包,我下的是win32版本的。

下载地址:高的版本一般是Beta的。

这个安装包主要是注册一个wpcap.dll的库到操作系统中。

必须安装,如果不安装,在运行例子的时候会弹出窗口提示,找不到wpcap.dll文件;第二步:到上面的网站下载它的开发包,包括一些头文件和库文件;解压到自己指定的目录中;目录中还有HTML格式的说明文档,用于自己学习比较方便;第三步:设置VS2005;1)设置环境目录;在菜单:工具->选项;弹出的选项窗体左边点击:项目和解决方案->VC++目录;在右边:“显示以下内容的目录”标签下面的下拉框中找到“包含文件”,然后对应到第二步下载开发包的Include目录;在同一下拉框中找到“库文件”,然后对应到第二步下载开发包的lib目录;2)设置编译条件;在项目属性页中:配置属性->C/C++->预处理器->预处理器定义,增加;WPCAP;HAVE_REMOTE;每一个预定义符用";"隔开;在项目属性页中:配置属性->链接器->命令行->附加选项对应的文本框中增加:“wpcap.libws2_32.lib”;第四步:非必要步骤;有的时候可能会有些意外错误;比如找不到u_char类型等;我的解决办法是加上#ifndef WIN32#include <sys/socket.h>#include <netinet/in.h>#else#include <winsock.h>#endif============================================= ====================================winpcap开发包使用中的问题总结这里主要讨论一下winpcap开发中可能遇到的问题。

WinPcap编程

WinPcap编程

WinPcap编程WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。

它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。

WinPcap由两部分组成:1. 驱动程序: 扩展操作系统功能提供低层次的网络访问2. 动态链接库:运行在Win32平台上的应用程序可以非常方便地访问网络低层次的数据。

Ethereal是大名鼎鼎的捕获数据包专业软件,它的运行是在WinPcap的支持之下的,如果没有安装WinPcap,Ethereal也无法正常捕获数据包。

在正式WinPcap编程之前,要配置运行环境。

Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:wpcap.dllPacket.dllWanPacket.dllpthreadVC.dll这四个动态链接库在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里面包含库文件,头文件,文档文件和一些例子。

解压缩后把Include目录添加到IDE的包含文件中(VC6.0 Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录)error LNK2019: 无法解析的外部符号_pcap_findalldevs_ex,该符号在函数XXX 中被引用如果发生上面的错误就表明缺少库文件,需要添加wpcap.lib到工程中(VC6.0 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支持远程数据包获取,发生上面的错误很有可能是新的版本导致不兼容的问题,所以还应当添加一个头文件remote-ext.h ,即#include "remote-ext.h"如果还有问题,可以到WinPcaP官方网站上找FAQ。

Winpcap抓包-实现

Winpcap抓包-实现

Winpcap实现一配置项目→属性→配置属性→C/C++→在右边的包含目录里添加你winpcap文件夹里include文件夹所在的位置;项目→属性→配置属性→在点击链接器选项,在右边的附加库目录里添加lib 文件夹所在的位置;项目→属性→配置属性→C/C++→预处理定义,WPCAP;HAVE_REMOTE; 项目→属性→配置属性→链接器→输入,在右边附加依赖项里添加上:? 。

1 获取适配器列表#include <>int _tmain(int argc, _TCHAR* argv[]){pcap_if_t * allAdapters;n" );return 0;}int crtAdapter = 0;for( adapter = allAdapters; adapter != NULL; adapter = adapter->next){s ", ++crtAdapter, adapter->name );printf( "-- %s\n", adapter->description );}printf( "\n" );pcap_freealldevs( allAdapters );n" );return 0;}int crtAdapter = 0;for( adapter = allAdapters; adapter != NULL; adapter = adapter->next){s ", ++crtAdapter, adapter->name );printf( "-- %s\n", adapter->description );}printf( "\n" );n" );n" );return 0;}int crtAdapter = 0;for( adapter = allAdapters; adapter != NULL; adapter = adapter->next){s ", ++crtAdapter, adapter->name );printf( "-- %s\n", adapter->description );}printf( "\n" );n" );// 释放适配器列表pcap_freealldevs( allAdapters );return -1;}adapter = allAdapters;for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ )adapter = adapter->next;// 打开指定适配器adapterHandle = pcap_open( adapter->name, // name of the adapter65536, // portion of the packet to capture // 65536 guarantees that the whole // packet will be capturedPCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode1000, // read timeout - 1 millisecondNULL, // authentication on the remote machine errorBuffer // error buffer);if( adapterHandle == NULL ){//指定适配器打开失败fprintf( stderr, "\nUnable to open the adapter\n", adapter->name );// 释放适配器列表pcap_freealldevs( allAdapters );return -1;}pcap_freealldevs( allAdapters );//释放适配器列表//创建数据封包// 设置目标的MAC地址为01 : 01 : 01 : 01 : 01 : 01packet[0] = 0x01;packet[1] = 0x01;packet[2] = 0x01;packet[3] = 0x01;packet[4] = 0x01;packet[5] = 0x01;// 设置源的MAC地址为02 : 02 : 02 : 02 : 02 : 02packet[6] = 0x02;packet[7] = 0x02;packet[8] = 0x02;packet[9] = 0x02;packet[10] = 0x02;packet[11] = 0x02;// 设置封包其他部分内容for( int index = 12; index < 20; index++ ){packet[index] = 0xC4;}//发送数据封包if( pcap_sendpacket( adapterHandle, // the adapter handle packet, // the packet20 // the length of the packet) != 0 ){fprintf( stderr,"\nError sending the packet: \n", pcap_geterr( adapterHandle ) );return -1;}system( "PAUSE" );return 0;}运行结果#define _CRT_SECURE_NO_WARNINGS#include ""void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data); int main(){pcap_t *cap_ins_des;pcap_if_t *alldevs;pcap_if_t *d;char source[PCAP_BUF_SIZE];char errbuf[PCAP_ERRBUF_SIZE];int i;u_int netmask;char packet_filter[] = "ip and udp"; // the filterstruct bpf_program fcode; // used in pcap_compile()/* set the source */if (pcap_createsrcstr(source, PCAP_SRC_IFLOCAL, NULL, NULL, NULL, errbuf) == -1) {printf("%s\n", errbuf);exit(-1);}printf("source: %s\n", source);/* find all devices */if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1){printf("%s\n", errbuf);exit(-1);}/* choose one devices */d = alldevs;while (d != NULL){printf("%s, %s\n", d->name, d->description);d = d->next;}scanf("%d", &i);d = alldevs;while (--i) d = d->next;printf("selected device: %s\n", d->name);/* open one device */cap_ins_des = pcap_open(d->name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf);if (cap_ins_des == NULL){printf("%s\n", errbuf);pcap_freealldevs(alldevs);exit(-1);}/* get the netmask, used at compiling the filter */if (d->addresses != NULL)netmask = ((struct sockaddr_in *)(d->addresses->netmask))->/*@#$%^&*!*/else netmask = 0xffffff;/* */// netmask = 0;/* compile the filter */if (pcap_compile(cap_ins_des, &fcode, packet_filter, 1, netmask) < 0){printf("Error\n");pcap_freealldevs(alldevs);exit(-1);}/* set the filter */if (pcap_setfilter(cap_ins_des, &fcode) < 0){printf("Error\n");pcap_freealldevs(alldevs);exit(-1);}pcap_freealldevs(alldevs);/* start the capture */pcap_loop(cap_ins_des, 30, packet_handler, NULL);return 0;}void packet_handler(u_char *user, const struct pcap_pkthdr *pkt_header, constu_char *pkt_data) {printf("in packet handler\n"); return;}运行结果。

winpcap捕捉网络数据包

winpcap捕捉网络数据包

winpcap捕捉⽹络数据包利⽤WIPCAP捕捉IP数据包分析局域⽹流量1、背景知识1.1、IP协议IP(Internet Protocol,互联⽹协议)协议是TCP/IP协议族中最为核⼼的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP 数据报格式传输。

IP协议把传输层送来的消息封装成IP数据包,并把IP数据包传递给数据链路层。

IP协议制定了统⼀的IP数据报格式,向传输层屏蔽了通信⼦⽹的差异,从⽽为消息的收发双⽅提供了⼀条透明的传输通道。

IP数据包结构如图1-1:图1-1 IP包结构1.版本IP数据报的第⼀个域是版本域,其长度为4bit,表⽰所使⽤的IP协议的版本。

通信双⽅使⽤的IP协议的版本必须⼀致。

版本域值为4则表⽰IPv4;版本域值为6则表⽰IPv6。

当前的版本为IPv4。

2.报头长度报头长度域长度为4bit,它以4个字节为计算单位表⽰报头的长度,该长度不包含数据部分。

报头中除了IP选项域与填充域之外,其他各项是定长的。

因为很少使⽤IP选项功能,所以,该域的值⼀般为5,意味着报头的长度是5个4字节,也就是20个字节。

协议规定:IP数据报的报头长度必须是4字节的整数倍。

当IP报头长度不是4字节的整数倍时,必须利⽤最后⼀个填充域“添0”来加以填充。

3.服务类型如图1-2所⽰,该字段占8bit,包括3bit的优先级字段,4bit的服务类型(type of service,TOS)字段和1bit的保留位,保留位必须置0。

该字段⽤于指⽰路由器如何处理该数据报。

图1-2 服务类型字段结构3bit的优先级表⽰数据报的重要性,共分8级,数值越⼤等级越⾼,优先级越⾼则表⽰数据报越重要(该字段值现在已被忽略)。

4bit的TOS字段分别表⽰:最⼩时延(D)、最⼤吞吐量(T)、最⾼可靠性(R)和最⼩费⽤(C)。

每个位都有0或1两个值,但4bit中最多只能有⼀个位的值为1。

如果所有4 bit均为0,那么就意味着是⼀般服务。

利用Winpcap捕获发送数据包

利用Winpcap捕获发送数据包

利用winpcap捕获数据包、发送数据包在上一章里面,我们学会了如何获取适配器的相关配置信息,在这一章里面,我们将继续更有意义的内容,就是捕获和发送数据包。

3.1 winpcap捕获数据包流程与相关函数计算机是通过网卡和网络中其他的主机进行通信的,网卡相当于数据包进出的大门,我们平时讲的数据包的捕获相当于大门的门卫在检查进出的行人一样。

在网络基础我们学习过,数据包的发送是一个封装的过程,而数据包的接收则是解封装的过程,但是封装和解封装都是在OS内核来完成的,一般的应用程序没办法获取数据包原始的内容,而Winpcap却能提供这样的功能,在数据链路层捕获数据包,提供最原始的信息。

其中Winpcap捕获数据的原理在第一章已经介绍过了,大家可以回顾下。

另外,数据捕获只能捕获通过本主机网卡的数据,没法捕获其他主机上网卡的数据。

下面先看看Winpcap捕获数据时的工作流程。

数据捕获的流程1. 发现网络设备的函数(find_dev_ex)以前已经介绍过了。

2.打开网卡的函数打开设备的函数是pcap_open()。

下面是参数snaplen, flags 和to_ms 的解释说明pcap_t* pcap_open ( const char * source, // 指定的网卡的名称int snaplen, // 帧的长度int flags, // 网卡捕获的模式int read_timeout, // 超时struct pcap_rmtauth * auth, // 是否要求认证char * errbuf // 错误信息存储)snaplen 制定要捕获数据包中的哪些部分。

在一些操作系统中(比如xBSD 和Win32),驱动可以被配置成只捕获数据包的初始化部分:这样可以减少应用程序间复制数据的量,从而提高捕获效率。

本例中,我们将值定为65535,它比我们能遇到的最大的MTU还要大。

因此,我们确信我们总能收到完整的数据包。

实验6利用WinPcap技术捕获数据包

实验6利用WinPcap技术捕获数据包

实验6 利用WinPcap技术捕获数据包实验目的:通过掌握WinPcap函数库的结构和功能,实现在windows环境下对网卡进行编程,进行网络数据包的捕获。

实验准备:(1)winpcap简介WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。

WinPcap 为用户级的数据包提供了Windows 下的一个平台。

WinPcap 是 BPF 模型和 Libpcap 函数库在Windows 平台下网络数据包捕获和网络状态分析的一种体系结构,这个体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库 Packet.dll 和一个高层的独立于系统的函数库 Libpcap 组成。

底层的包捕获驱动程序实际为一个协议网络驱动程序,通过对 NDIS 中函数的调用为 Win95、Win98、WinNT、和 Win2000 提供一类似于 UNIX 系统下 Berkeley Packet Filter 的捕获和发送原始数据包的能力。

Packet.dll 是对这个 BPF 驱动程序进行访问的 API 接口,同时它有一套符合 Libpcap 接口(UNIX 下的捕获函数库)的函数库。

WinPcap的结构图如图1。

WinPcap 包括三个部分:第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。

它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码。

第二个模块packet.dll为win32平台提供了一个公共的接口。

不同版本的Windows系统都有自己的内核模块和用户层模块。

Packet.dll用于解决这些不同。

调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译。

第三个模块 Wpcap.dll是不依赖于操作系统的。

它提供了更加高层、抽象的函数。

windows dumpcap 用法

windows dumpcap 用法

windows dumpcap 用法
Windows Dumpcap 用法
Dumpcap 是 Wireshark 的一个命令行工具,它可以在 Windows 操作系统上运行。

它可以捕获网络数据包并将其保存到文件中,以便后续分析。

以下是 Windows Dumpcap 的用法:
1. 打开命令提示符窗口
在 Windows 操作系统上,按下 Win+R 键打开“运行”对话框。

输入 cmd 并按下 Enter 键打开命令提示符窗口。

2. 进入 Dumpcap 目录
在命令提示符窗口中输入 cd C:\Program Files\Wireshark,并按下Enter 键进入 Dumpcap 目录。

如果你的 Wireshark 安装在其他目录中,请相应地更改路径。

3. 运行 Dumpcap 命令
在命令提示符窗口中输入以下命令:
dumpcap -i 1 -w C:\capture.pcap
其中,“-i”参数指定要捕获的网络接口的编号,“-w”参数指定要保存数据包的文件名和路径。

这个例子中,我们将捕获编号为 1 的网络接口上的数据包,并将它们保存到 C:\capture.pcap 文件中。

4. 查看捕获的数据包
打开 Wireshark 软件,并导入刚才保存的 .pcap 文件。

你可以使用Wireshark 来查看和分析捕获的数据包。

总结
Windows Dumpcap 是一个强大而实用的命令行工具,它可以帮助你捕获网络数据包并将其保存到文件中。

通过使用 Dumpcap,你可以更好地了解网络通信过程,并找出其中的问题。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档