基于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,那么就意味着是一般服务。

4.总长度总长度域占16 bit,它以字节为单位具体说明包括报头在内的整个IP数据包的总长度。

基于Winpcap的数据包捕获和协议分析系统的设计与实现

基于Winpcap的数据包捕获和协议分析系统的设计与实现

1、Winpcap概述1.1 Winpcap简介Winpcap(windows packet capture)是由意大利人Fulvio Risso和LorisDegioanni提出并实现的[1]。

它是一个Windows平台下捕包和网络分析的体系架基于Winpcap的数据包捕获和协议分析系统的设计与实现李延会 岳彩祥 徐金艳 李亚斐 长春工业大学研究生院 130012构。

它具有访问底层的能力,提供了捕获原始数据包,按照一定规则过滤数据包,以及发送原是数据包的功能. WinPcap 为用户级的数据包提供了Windows下的一个平台。

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

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

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

WinPcap的主要结构图如图1。

1.2 winpcap构成WinPcap 主要有三个模块构成[2,3]:第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。

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

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

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

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

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

使用Wincap编制一个简单的网络数据包监听与捕获程序

使用Wincap编制一个简单的网络数据包监听与捕获程序
u_char proto; //协议(Protocol)
u_short crc; //首部校验和(Header checksum)
ip_address saddr; //源地址(Source address)
ip_address daddr; //目的地址(Destination address)
u_int op_pad; //选项与填充(Option + Padding)
使用pcap_open()函数打开适配器,将这个函数的snaplen参数设为65535,这比能遇到的最大的MTU还要大,以保证能收到完整的数据包。另一个参数flag设为PCAP_OPENFLAG_PROMISCUOUS,意为混杂模式,不管这个数据包是不是发给本机的,都会去捕获。参数to_ms指定读取数据的超时时间,这里设置为1000ms,在适配器上进行读取操作都会在to_ms毫秒时间内响应。
ih = (ip_header *) (pkt_data +
14); //以太网头部长度
/*打印协议类型*/
int i;
for(i = 0; i < 10; i++){
if(protocol[i].number == ih->proto){
break;
}
}
if(i <= 9)
printf("%5s ", protocol[i].name);
return 0;
}
/*回调函数,当收到每一个数据包时会被libpcap所调用*/
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)

基于WinPcap的数据包捕获及应用

基于WinPcap的数据包捕获及应用

-1649-0引言Internet 的飞速发展使网络用户及规模骤然增大,对网络管理和网络安全提出了更大的挑战,因此对网络分析需求越来越迫切。

网络分析程序依赖于一套捕获数据包的原函数,这就是所谓的包捕获软件,许多单位或组织都投人了对捕获技术的研究,并推出了各自的成果。

1993年初,S.McCanne and V.Jacobson 等人推出了著名的BSD 包过滤器(BPF ),它可以免费获得,目前己被许多版本的Unix 系统所采用,另外在Win-dows 平台上,近几年也陆续有多种捕获工具面世,如Netmon API ,PCAUSA 等,与BPF 不同的是,这些产品是商业性质的。

而WinPcap (作者也称之为NPF )则是Windows 平台上为数不多的功能强大且可免费获得的包捕获接口软件之一,它是由意大利人Fulvio Risso 和Loris Degioanni 等人提出并实现的[1],它对于广大的Windows 平台下的网络分析程序开发人员提供了一条便捷的途径。

1网络数据包捕获原理以太网具有共享介质的特征,信息是以明文的形式在以太网络上传输的,当网卡被设置为混杂模式时,可以捕获任何一个在同一冲突域上传输的数据包。

运用这一原理使网络数据包捕获系统能够拦截到我们所要的信息,这是捕获数据包的物理基础。

网卡具有4种工作模式:广播模式,多播传送模式,直接模式,混杂模式[2]。

网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。

如果采用混杂模式,网卡将接受同一网络内所有主机所发送的数据包,这样就可以到达对所有数据包进行捕获的目的。

2Windows 平台下数据包捕获机制(1)Winsock2提供了一种机制,允许用户编写服务提供者接口程序SPI (service provider interface )。

Winsock2的运行需要SPI 的支持,所有对Winsock2的请求都会先发送到SPI 程序中,利用SPI 找到相应的服务提供者完成网络通信。

基于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

计算机网络技术与实验——数据包的捕获与分析

计算机网络技术与实验——数据包的捕获与分析

计算机⽹络技术与实验——数据包的捕获与分析计算机⽹络技术与实验——数据包的捕获与分析1. 实验介绍本次实验的⽬的在于学习WinPcap的使⽤⽅法,利⽤它捕获以太⽹中的数据包并进⾏简单的解析,最终使⽤MFC画界⾯,展⽰捕获后解析出来的信息。

2. 使⽤WinPcap + MFC进⾏数据包的捕获与分析2.1 WinPcap简单介绍WinPcap是⼀个开源的数据包捕获体系结构,它的主要功能是进⾏数据包捕获和⽹络分析。

它包括了内核级别的包过滤、低层次的动态链接库(packet.dll)、⾼级别系统⽆关的函数库(wpcap.dll)等。

在编写程序之前我们先按以下步骤配置好WinPcap的开发环境。

下载WinPcap并安装打开VS2015,新建->项⽬->MFC应⽤程序(基于对话框,经典菜单)在项⽬上,右键->属性⼯具->属性->项⽬和解决⽅案-> VC++⽬录->包含⽂件->添加WinPcap开发包中的Include⽬录⼯具->属性->项⽬和解决⽅案-> VC++⽬录->库⽂件->添加WinPcap开发包中的lib⽬录项⽬->项⽬属性->配置属性->预处理定义->添加WPCAP和HAVE_REMOTE项⽬->项⽬属性->配置属性->连接器->命令⾏->附加选项框中加⼊wpcap.lib在程序中要加⼊pcap.h头⽂件#include pcap.h2.2 WinPcap程序设计思路使⽤WinPcap捕获数据包⼀般有三个步骤:获取设备列表打开⽹络适配器在打开的⽹络适配器上捕获⽹络数据包2.2.1 获取设备列表在开发以WinPcap为基础的应⽤程序时,第⼀步要求的就是获取⽹络接⼝设备(⽹卡)列表。

这可以调⽤WinPcap提供的pcap_findalldevs_ex()函数,该函数原型如下:int pcap_findalldevs_ex(char * source; //指定从哪⼉获取⽹络接⼝列表struct pcap_rmauth auth; //⽤于验证,由于是本机,置为NULLpcap_if_t ** alldevs; //当该函数成功返回时,alldevs指向获取的列表数组的第⼀个//列表中每⼀个元素都是⼀个pcap_if_t结构char * errbuf //错误信息缓冲区);在上⾯注释中提到的pcap_if_t结构定义如下:struct pcap_if{struct pcap_if *next; //指向链表中下⼀个元素char *name; //代表WinPcap为该⽹络接⼝卡分配的名字char *description; //代表WinPcap对该⽹络接⼝卡的描述struct pcap_addr* addresses; //addresses指向的链表中包含了这块⽹卡的所有IP地址u_int flags; //标识这块⽹卡是不是回送⽹卡}2.2.2 打开⽹卡在获取设备列表之后,可以选择感兴趣的⽹卡打开并对其上的⽹络流量进⾏监听。

实验3:WinPcap技术的使用

实验3:WinPcap技术的使用

实验3:WinPcap技术的使用1实验目的和要求学习使用WinPcap开发包实现网络数据包的捕获、过滤和分析的功能,具体要求如下:1)WinPcap开发包的下载和安装;2)使用WinPcap获取与网络适配器绑定的设备列表;3)使用WinPcap获取网络适配器的高级属性信息;4)使用WinPcap打开网络适配器并实现抓包功能5)使用WinPcap过滤数据包、分析数据包。

2实验设备及材料1)Windows主机2)Visual Studio 2005或Visual Studio 20083实验内容本实验学习WinPcap开发包的使用,利用WinPcap实现网络数据包捕获、过滤和分析的功能,实验内容如下。

3.1 WinPcap开发包的下载和安装下载并安装WinPcap开发包,下载地址:/archive/。

1)4.1.1-WinPcap.exe的安装;2)4.1.1-WpdPack.zip的下载和使用。

3.2获取与网络适配器绑定的设备列表信息pcap_findalldevs_ex()函数的使用。

调用pcap_findalldevs_ex()函数,获取的网络设备信息将存储在结构体pcap_if_t中,然后打印网卡设备列表信息,包括网络适配器名称和描述。

3.3获取网络适配器的高级属性信息在3.2的基础上,除打印本地主机所有网络适配器的名称、描述外,还打印是否回环地址、协议簇类型、协议簇名称、IP地址、子网掩码、广播地址和目标地址等信息。

3.4打开网络适配器并通过事件处理器来捕获数据包pcap_open()函数和pcap_loop()函数的使用。

程序的运行过程如下:1)调用pcap_findalldevs_ex()函数获取并打印本机的网络设备列表。

2)要求用户选择用于捕获数据包的网络设备。

3)使用for语句跳转到选中的网络设备,以便在后面的程序中打开该设备,并在该设备上捕获数据。

4)调用pcap_open()函数打开选择的网络设备。

基于WINPCAP的GOOSE报文捕获分析工具开发

基于WINPCAP的GOOSE报文捕获分析工具开发

WINPCAP网络开发包是一个免费、基于Windows平台、访问网络链路层的工具,它允许各种应用程序绕过协议栈捕捉并传送网络数据包,同时还包括一些其他功能,如包过滤、网络流量统计以及远程捕获等。

基于这一开发包,可以方便地开发出面向通用对象的变电站事件(GOOSE)报文的捕捉工具,进而根据ASN.1/BER对报文进行解码并分析。

文中介绍了如何基于WINPCAP开发包开发一个完整的GOOSE报文捕获工具,以及整个的设计思路和实现过程,并提出了一些可能的应用。

0 引言当前,国内厂商对IEC 61850的开发工作已经从以制造报文规范(MMS)为核心的客户/服务器(C/S)服务实现转到面向通用对象的变电站事件(GOOSE)和IEC 61850-9-1/2的实现上来。

GOOSE通信及其应用是IEC 61850的一个亮点,其出发点是功能的分布式实现口],GOOSE应用的建立需要多方面配合,同时也是一个较为烦琐的工程。

在工程的调试过程中,对GOOSE报文的分析是一个必不可少的步骤,即检查数据发送是否正确及其时间特性。

因此,如果有一个简捷的工具来捕捉与分析IEC 61850报文,将会有助于工程调试的顺利进行。

WINPCAP(Windows packet capture)网络开发包是一个免费、基于Windows 平台、访问网络链路层的工业标准工具,它允许各种应用程序绕过协议栈捕捉并传送网络数据包,同时还包括一些其他功能,如包过滤、网络流量统计以及远程捕获等。

基于这一开发包,可以方便地开发出GOOSE报文的捕捉工具,进而根据ASN.1/BER对报文进行解码并分析。

本文介绍了如何基于WINPCAP开发包开发一个完整的GOOSE报文捕获工具,以及整个设计思路和实现过程,并提出了一些可能的应用。

希望能够为IEC 61850标准在中国的推广做出一些贡献。

1 WINPCAP简介1.1 内部结构WINPCAP是一个Win32平台下用于抓包和分析的系统,其基本构成如图1所示。

基于WinPcap的以太网协议捕获和分析技术的研究

基于WinPcap的以太网协议捕获和分析技术的研究

第 一 部 分 是 内 核 层 的 数 据 包 过 滤 模 块 : P ( e ru ak t N F N t o pP ce g
Fle ) N F 的结 构 来 源 于 B F B rl a k t i e ) B F是 用 于 i r。 P h P ( eke P c e Fl r , P y t
( 南计算技术研究所 , 苏 无锡 248 ) 江 江 10 3
摘 要 : iP a W n cp作 为一 个 在 W i3 n 2环 境 下 可 以 实现 高效 率 数 据 包 的 开发 包 , 供 了完 善 的 编 程接 1 能 够很 好 的 实现 以 太 网协 议 的 提 : 2, 捕 获 和 分 析 , 于深 入 研 究 以太 网协 议 和 解 决 以太 网协 议在 应 用 中 的新 问题 具 有 实 际 意 义 。 对 关 键 词 : iP a ; 太 网协 议 ; W n cp 以 包捕 获 : 协议 分析 中图 分 类 号 : P 9 T 33 文献 标 识 码 : A 文 章 编 号 :0 9 3 4 (0 1 1 — 5 8 0 1 0 — 0 42 1)9 4 4 — 2
随 着 以 太 网技 术 的 日新 月 异 , 网络 安 全 问 题 已 日趋 严 峻 。以太 网协 议 具 有 在 同一 回路 向所 有 主 机 发送 数 据 包 信 息 的 特 征 , 据 数
包 头 包 含 有 目标 主机 的正 确 地 址 , 般 情 况 下 只 有 具 有该 地 址 的主 机 会 接 受 这 个 数据 包 。如 果 一 台 主 机 能够 接 收 所 有 数 据 包 , 不 一 而
基 于 其 高性 能 开源 A I 装 库 ,很 多 市 面 上 的 网 络 分 析 软 件 都 采 用 P封 了它 作 为 底层 的架 构 , 比较 著名 的如 : rsak Eh r l Wi hr 、te a。 e e

基于WinPcap的网络数据包捕获与分析

基于WinPcap的网络数据包捕获与分析

基于WinPcap的网络数据包捕获与分析一、WinPcap介绍1.WinPcap简介WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。

大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。

这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。

然而,有时候“简便方法”并不能满足实际需要。

有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。

基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。

基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。

2.WinPcap的组成与结构如图,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库()和一个高层的不依赖于操作系统的静态库()共三个部分构成。

这里,NPF在操作系统的内核级,、在用户级。

1)数据包监听设备驱动程序Array技术实现上,为了实现抓包,系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包(rawpacket)。

这就要求WinPcap的一部分运行在操作系统核心内部,直接与网络接口驱动交互。

由于这个部分是系统依赖(system dependent)的,在Winpcap的解决方案中它被视为是一个设备驱动,称作NPF(Netgroup Packet图 WinPcap的组成和结构Filter)。

2)底层的动态连接库()和高层静态库()为了方便编程,WinPcap必须提供一个编程接口(API),这就是WinPcap的底层的动态连接库()和高层静态库()。

使用Winpcap开发网络数据包分析器

使用Winpcap开发网络数据包分析器




















I…

实用第一 智慧密集
使 用 Wip a n cp开发 网络数据包分析器
江 洪
摘 要 :使 用 W ip a n cp开 发 包 实现 了一 个 网 络 数 据 包 分 析 器 。 该 分 析 器 可 以 捕 获 UDP或 T P数 C
据 包,并对数 据 包头进 行 分析。
表 3 I 头 结构 表 P
名称 版本 号 长度 4位 4表 示这 是 IV4 . P 说明
表 4和表 5所 示 。
协议 。数 据包 是 进 行 网 络数 据 通 信 的基 本 单 位 。每块 数据 都 包
含 在 数 据 包 中 。 数 据包 中 ,除 了 数据 本 身外 , 还有 数 据 包 头 。
表 2 PPP OE 结 构 表
名 称 版本 号 类型 代 码 长 度 4位 4位 8位 设为 1 设为 I 设为0 说 明
目的 端 u
U DP长度 U DP校验 和
表 5 TCP 结构 表
名称 源端 L J 长度 J 6位 说明 表示数 据 包m哪 个端 u发 出
表 1 以 太 头 结 构 表
名称 长度 说 明 k 层 议 I P校验 和 源 l 址 P地 8位 1 6位 3 2位
l ,如 该值降 为 0就 会破 抛弃
本 文H涉 及 0 H T P和 1H. P这 两种 6.C I UD 校验 I 数据 是 正确 P头 表 示数据 包是 f 哪 个 I j = { P地址 发 出的 表 示数据 包磷 发给 哪个 l 址 P地

基于WinPcap的网络分析研究与实现

基于WinPcap的网络分析研究与实现

基于WinPcap的网络分析研究与实现摘要近几年,我国经济发展迅速,各个领域的事业都趋于完善。

在网络信息技术的不断发展下,通过对WinPcap的应用,真正实现了Windows下网络数据包的捕获技术,下文将详细阐述IP、Tcp等等协议的解析过程。

网络数据的储存通过msspl来实现,进而建立系统硬件运行环境。

对局域网,通过测试实现了全局监控。

关键词信息技术;网络分析;分析与研究;运行环境;数据包;源代码1 应用环境网络监控系统承载介质中,硬件与软件监控系统共同构成网络监控。

网络监控系统标准功能是对局域网中的违规行为进行记录与监控。

在国外一些发达国家,有两款软件Ethereal与Sniffer,后者主要任务就是给网管及时提供网络监视情况与数据包捕以及故障分析等内容,这样能方便网管对现场进行迅速的故障处理以及诊断能力。

与此同时,还能使用户得到更好的网络管理以及故障分析功能。

前者作为一种可以捕获数据包,并且将这个数据包的信息显示出来,这样的一款网络数据包分析软件,在通用许可证的保障范围内,其数据包分析软件用户能免费得到。

除此之外,还可以得到其源代码,并且也能够根据自身的需要来将其源代码进行修改。

现阶段,Wireshark是全球应用最多的一种网络数据包分析软件[1]。

2 Win Pcap研究抓包的过程,是通过用户级的程序接口来完成的。

在这些接口中,用户程序能够利用内核驱动提供的高级特性。

作为WinPcap所提供的2个库,PACKET 提供一个底层api,应用这个库能够访问驱动的函数。

这些函数能够实现来抓包时,网络硬件与操作系统独立。

NDIS作为一种管理网络适配器的驱动程序和协议驱动之间的规范。

其还是一个可以让协议驱动发生与接收数据包并且不用看特定的适配器或者特定的Win32操作系统的封装。

捕获数据包是通过NPF来实现的。

在进行数据包的捕获时,数据包的监控任务是一个网络接口,进而应用程序才能够完整抹除这部分数据包。

基于WinPcap的网络数据包捕获的研究

基于WinPcap的网络数据包捕获的研究

摘 要 : iP a [ W n cp1 系统 是 一 个 功 能强 大 的 用 于 网络 数据 获取 的 开 发 包 , 为程 序 员提 供 了一 套 标 准 的 网络 数 据 包捕 获 接 口 , 它直 接 作 用
于网 卡 , 获取 数 据 链路 层 的数 据 , 能捕 获数 据 链路 层 的所 有 数据 包 。该 文 概 述 了 W iPa n cp的 内部 结 构 , 简要 介 绍 了 W iPa n cp捕 获 数
ht : w . n sn t n t / ww d z .e . p/ c
T l 8 — 5i 5 9 9 3 5 9 9 4 e: 6 5 一 6 O 6 6 O 6 +
基于 W iP a n c p的 网络数 据 包捕 获 的研 究
蔡 李 豪 ,娜
(. @ I 业 大 学 计 算 机 科 学与 工 程 学 院 , 1 K 吉林 长 春 10 1 ;. 中师 范 大 学 计 算 机 系 ,北 武 汉 4 0 7 ) 30 22华 湖 30 9
l e a k t Th s a e u i e h tm a s u t r f i P a , r f ec it n o e W i P a a k tc p r mpe nai n a d a rp c es y . i p p ro dn s ei e l t cu e o n c p ab e sr i f h n c p p c e a t ei lme tt n t n r W i d po t u o ad ti d a ayi o e raia o f i P a a k t a t r r c s e a e n ls f h e z t n o n c p p c e p u e p o e s l s t l i W c .

用VC_实现基于Winpcap的网络数据包捕获与分析.

用VC_实现基于Winpcap的网络数据包捕获与分析.
1.2GA-BP算法
GA从本质上是一种不依赖具体问题
算法与语言
106
文献标识Байду номын сангаас:A
文章编号:1672-7800(200703-0104-02
图1
WinPcap基本体系结构
算法与语言
104
dapterNames((char*AdapterName,&Ada-
pterLength函数值为TRUE则可以得到网络适配器列表及描述,否则返回为FALSE,意为查找失败。
(2打开适配器,如果调用成功返回一个类型为lpadapter指针的包捕获描述字lpadapter=PacketOpenAdapter(Adapter-List。
结构描述_IP
typedef struct_IP{
union{BYTE Version;//版本
BYTE HdrLen;//IHL
};
BYTE ServiceType;//服务类型
WORD TotalLen;//总长
WORD ID;//标识
union{WORD Flags;//标志
WORD FragOff;//分段偏移
PacketSetBuff(lpadapter,500*1024
//设置捕获数据报的内核级缓冲区大小
PacketInitPacket(pthis->lppacketr, (char*recvbuf,sizeof(recvbuf
//初始化一个LPACKET结构
PacketReceivePacket(pthis->lpada-pter,pthis->lppacketr,TRUE
[6]周正军.网络入侵检测系统的设计与实现
[M ].北京:电子工业出版社,2002.[7]唐正春.精通Visual C ++6.0[M ].北京:电子

基于Winpcap的网络包捕获和分析_通信工程

基于Winpcap的网络包捕获和分析_通信工程

基于Winpcap的网络包捕获和分析_通信工程Winpcap是一种Windows平台下的网络包捕获库,它能够拦截网络传输的数据包,分析其内容并提供给程序使用。

在通信工程领域,Winpcap常用于网络协议分析、网络安全检测等方面。

Winpcap的工作原理是通过抓取操作系统内核与网卡之间的输入/输出数据包,从而捕获并分析网络包。

Winpcap将网络接口抽象成一个数据源(即抓包器),并提供一系列API供应用程序进行操作。

这些API包括:1. pcap_open_live():打开网络接口并设置过滤器。

2. pcap_setfilter():设置抓包过滤规则。

3. pcap_next_ex():从网络接口中捕获下一个数据包。

4. pcap_sendpacket():发送数据包到网络。

5. pcap_stats():返回接口的统计信息。

通过调用上述API,可以在应用程序中达到获取、分析网络包的目的,从而实现网络协议的协议分析、网络安全检测等通信工程任务。

在使用Winpcap时需要注意,由于其需要操作系统内核与网卡之间的数据包,因此在使用时需要获得管理员权限。

在基于Winpcap的网络包捕获和分析中,通常需要进行以下步骤:1. 打开网络接口并设置过滤器,过滤掉不必要的数据包。

2. 捕获数据包。

3. 解析数据包的协议头,分离出数据部分。

4. 对数据部分进行处理,如提取HTTP请求、检测网络攻击等。

5. 将处理结果保存或发送到其他模块进行处理。

Winpcap的优势在于其能够让用户获得更加细致的网络数据,通过协议分析和安全检测等手段更好地保障网络安全。

同时,由于其跨平台特性,可应用于多种不同的通信工程场景中。

基于Winpcap网络数据包的捕获与存储技术研究

基于Winpcap网络数据包的捕获与存储技术研究
能。
App l i c a t i on

计 算 机 网络 通 信 采 用 O S I 七层模型标准 , 只 要 遵 循 这 个 标 准 就 可 以和 位 于 世 界 任 何 地 方 、 同样 也 遵 循 OS I 标 准 的其 它 任 何 系 统 进 行 连 接 。但 实 际 上 完 全 符 合 各 层 协 议
传 输 层
互 联层
Wi n p c a p为 W i n 3 2应 用 程 序 提 供 访 问 网 络 底 层 的 能 力, 底层是基 于 wI NP CAP包 进 行 开 发 。主 要 用 到 的 函 数 包 括 :
( 1 )i n t p c a p
_
数 据 链 路 层 \ 、 网 络 接 口层
的数 据 包 ; ⑥ 统 计 网络 流 量 。
本 文 使 用 MF C应 用 程 序 的 界 面 设 计 编 写 程 序 , 核 心
1 基 于 Wi n p c a p数 据 包 的 捕 获 技 术
1 . 1 网 络 通 信 模 型 及 常 规 通 信 编 程 方 法
开 发 主要 使 用 Wi n p c a p 完 成 。W i n p c a p的组 成 部 分 如 图 2 所示 , 使 用 其 提 供 的 函数 主 要 完 成 网络 数 据 包 的 捕 获 等 功
列表。
( 2 )p c a p t

始套接字 、 调 用 ND I S库 函数 、 使 用 他 人 编 写 的 中 间 层 驱 动、 使用第三方组织提供 的捕获组 件或者库 ( 如 Wi n p c a p )
pc a p

进 行 数据 包 捕 获 。
作者简介 : 李星( 1 9 8 7 一) , 男, 西 南 交通 大 学 电 气 工 程 学 院硕 士 研 究 生 , 研 究 方 向 为 微 机 保 护 与 综 合 自动 化 。

网络数据包的捕获与分析大学学位论文

网络数据包的捕获与分析大学学位论文

网络数据包的捕获与分析王行(陕西理工学院数学与计算机科学学院网络工程专业1101班,陕西汉中 723003)指导教师:贾伟【摘要】网络数据包的捕获对于网络安全有着巨大的作用,为我们更好的分析网络中的数据流提供了帮助。

本论文是基于Windows下开发一个网络监听工具,侧重点在于实现网络数据包的捕获,然后分析并显示捕获到的数据包信息这部分功能的实现,如分析:IP首部协议类型、源IP、目的IP和端口号等。

采用的是Winpcap(Windows Packet Capture)来实现的抓包功能。

通过VC++6.0中MFC编程实现通过一个完整界面来控制调用Winpcap中的函数来实现对网卡信息的捕获和循环捕获数据包,然后通过预先对于IP、TCP、UDP等数据包的定义和TCP/IP等协议来解析其中包含的内容并返回显示捕获到数据包的信息,当然也可以保存捕获到的数据包到指定地点以便进一步分析。

【关键词】Winpcap;数据包;捕获;分析The Capture and Analysis of Network Data PacketsWang Hang(Grade 11,Class 1, Major Network Engineering, Scho ol of Mathematics andComputer Science Dept, Shaanxi University of Technology, Hanzhong 723003, Shaanxi)Tutor: Jia WeiAbstract: The capture of network data packets plays an important part in network security, which is helpful for our better analysis of network data flow.This paper is about a network monitoring tool based on Windows system, which emphasizes particularly on realizing the capture and analysis of network data packets and then displays them. Take analysis as an example, it will check the type of the IP protocol, the source address of IP, the destination address of IP and the port e the Winpcap(Windows Packet Capture)to capture of data packets. In MFC programming of VC++6.0, the capture of network data packets can be realized via the invoking and control of the functions through a full control panel, and then the analysis of IP ,TCP,UDP and TCP/IP will be done before they are displayed. Certainly the information captured can be saved to the appointed destination in order to go through an advanced analysis.Key words:Winpcap;Data Packets;Capture;Analysis目录引言 (1)1概述 (2)1.1课题背景 (2)1.2国内外研究现状 (2)1.3课题研究的意义 (2)1.4课题研究的内容 (2)2相关知识介绍 (3)2.1TCP/IP协议简介 (3)2.1.1什么是 TCP/IP (3)2.1.2TCP/IP整体构架概述 (3)2.1.3TCP/IP中的协议 (3)2.2W IN P CAP开发技术详解 (5)2.2.1Winpcap介绍 (5)2.2.2Winpcap 的组成 (6)2.2.3Winpcap 数据结构 (7)2.2.4Winpcap 函数 (7)3系统设计方案及功能描述 (9)3.1系统设计方案 (9)3.2系统功能描述 (9)4系统编码实现 (11)4.1网络数据包捕获模块的实现 (11)4.1.1网络数据包捕获程序的编写过程 (11)4.1.2在程序中用到的WinPcap内核函数详细介绍 (12)4.1.3网络数据包捕获的应用 (13)4.2网络数据包分析模块的实现 (14)4.2.1网络数据包分析模块主要建立的类 (14)4.2.2IP协议分析类的设计 (14)4.2.3TCP协议分析类的设计 (15)4.2.4UDP协议分析类的设计 (17)4.2.5系统中变量函数的设计 (17)4.3主界面构造 (17)5软件测试 (19)总结 (21)参考文献 (22)致谢 (23)科技外文文献 (24)外文文献翻译 (36)附录A:软件开发源代码 (47)附录B:软件使用说明书 (65)引言随着网络技术的不断发展,通过网络将人与人的距离拉近,因此网络为来自世界各地不同的人、团体、机构构建了一个网络村。

基于Winpcap 编程实现抓包实验

基于Winpcap 编程实现抓包实验

上海电力学院计算机网络安全(1)课程实验报告实验名称:winpcap编程实验基于Winpcap 编程实现抓包实验一. 本设计要达到的目标基于winpcap编程实现对网络数据的捕获,并分析数据类型,对于IP,ICMP,ARP,UDP 等,能够自动识别其协议类型并分析帧的构成。

二.实现步骤(1)需要通过资料来了解winpcap抓包的工作原理,熟悉其运行过程Winpcap的内部结构Wincap有三部分组成:一个数据包监听设备驱动程序,一个低级的动态连接库和一个高级的静态连接库。

底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。

高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。

抓包是WinPcap的基本功能,也是NPF最重要的操作。

在抓包的时候,驱动(例如NIC Driver)使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。

(2)进一步了解winpcap编程所需要的编译环境,下载WpdPack,了解编译环境所需要的库文件.在编译时需要把wpdpack中的include与lib添加进vc的库文件里。

(3)明确整个编程的步骤与具体函数。

刚开始要定义,在主函数中获取设备接口信息,获得网络地址与掩码地址,打开网络接口,还要设置过滤规则。

使用loop函数来回调循环捕获数据包,以便一层一层解析。

(4)还要定义几个以太网,ARP,IP,UDP,TCP,ICMP协议的格式。

需要注意在存储空间中,在存储空间中才能更好的逐层分析,不然很容易出错(5)定义分析协议的函数,定义方式与回调函数相同. 常用的函数有:用于获取本机设备列表的pcap_findalldevs_ex函数用于打开设备的pcap_open函数,可以指定为混杂模式打开用于编译数据包过滤器的pcap_compile 函数用于设置数据包过滤器的pcap_setfilter 函数用于从设备读取数据包的pcap_netx_ex 函数用于关闭设备的pcap_close 函数(参数为pcap_open 返回值)用于释放设备列表的pcap_freealldevs 函数(对应pcap_findalldevs_ex)三.系统流程图主函数以太网协议分析函数分析ARP协议函数分析Ip协议函数分析ICMP协议函数判断下层函数分析TCP协议函数分析UDP协议函数16进制数据四.关键代码及其分析主函数void main(){pcap_t *pcap_handle; /* Winpcap句柄 */char error_content[PCAP_ERRBUF_SIZE]; /* 存储错误信息 */char *net_interface; /* 网络接口 */bpf_program bpf_filter; /* BPF过滤规则 */char bpf_filter_string[] = ""; /* 过滤规则字符串 */ bpf_u_int32 net_mask; /* 掩码 */bpf_u_int32 net_ip; /* 网路地址 */net_interface = pcap_lookupdev(error_content); /* 获得可用的网络接口 */ pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址 */pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);/* 打开网路接口 */pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip); /*编译BPF过滤规则 */pcap_setfilter(pcap_handle, &bpf_filter); /* 设置过滤规则 */对IP协议的定义class ip_header{ public:#if defined(WORDS_BIGENDIAN)u_int8_t ip_version: 4, /* 版本 */ip_header_length: 4; /* 首部长度 */#elseu_int8_t ip_header_length: 4, ip_version: 4;#endifu_int8_t ip_tos; /* 服务质量 */u_int16_t ip_length; /* 长度 */u_int16_t ip_id; /* 标识 */u_int16_t ip_off; /* 偏移 */u_int8_t ip_ttl; /* 生存时间 */u_int8_t ip_protocol; /* 协议类型 */u_int16_t ip_checksum; /* 校验和 */in_addr ip_souce_address; /* 源IP地址 */in_addr ip_destination_address; /* 目的IP地址 */pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */分析UDP协议的函数代码void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){class udp_header *udp_protocol; /* UDP协议变量 */u_short source_port; /* 源端口 */u_short destination_port; /* 目的端口号 */u_short length; //长度udp_protocol = (class udp_header*)(packet_content + 14+20);/* 获得UDP协议内容 */source_port = ntohs(udp_protocol->udp_source_port); /* 获得源端口 */ destination_port = ntohs(udp_protocol->udp_destination_port); /* 获得目的端口 */length = ntohs(udp_protocol->udp_length); /* 获得长度 */cout<<"---------- UDP协议 ----------"<<endl;cout<<"源端口号:"<<dec<<source_port<<endl;cout<<"目的端口号:"<<dec<<destination_port<<endl;switch (destination_port){case 138:cout<<"上层协议为NETBIOS数据报服务"<<endl;break;case 137:cout<<"上层协议为NETBIOS名字服务"<<endl;break;case 139:cout<<"上层协议为NETBIOS会话服务"<<endl;break;case 53:cout<<"上层协议为域名服务"<<endl;break;default:break;}cout<<"长度:"<<length<<endl;cout<<"校验和:"<<setw(4)<<setfill('0')<<hex<<ntohs(udp_protocol->udp_checksum)<<endl;}五.参考文献(1) Winpcap中文文档(2) 网络资料/view/d64047d676eeaeaad1f330c7.html?from=search/winpcap-sniffer.html完整源程序#include "pcap.h"#include <iostream>#include <iomanip>#include<string>using namespace std;/*以下是以太网协议格式的定义*/class ether_header{public:u_int8_t ether_dhost[6]; /* 目的以太网地址 */u_int8_t ether_shost[6]; /* 源以太网地址 */u_int16_t ether_type; /* 以太网类型 */};/* 下面是ARP协议格式的定义*/class arp_header{public:u_int16_t arp_hardware_type; /* 硬件类型 */u_int16_t arp_protocol_type; /* 协议类型 */u_int8_t arp_hardware_length; /* 硬件地址长度 */u_int8_t arp_protocol_length; /* 协议地址长度 */u_int16_t arp_operation_code; /* 操作码 */u_int8_t arp_source_ethernet_address[6]; /* 源以太网地址 */u_int8_t arp_source_ip_address[4]; /* 源IP地址 */u_int8_t arp_destination_ethernet_address[6]; /* 目的以太网地址 */ u_int8_t arp_destination_ip_address[4]; /* 目的IP地址 */};/*下面是IP协议格式的定义 */class ip_header{ public:#if defined(WORDS_BIGENDIAN)u_int8_t ip_version: 4, /* 版本 */ip_header_length: 4; /* 首部长度 */#elseu_int8_t ip_header_length: 4, ip_version: 4;#endifu_int8_t ip_tos; /* 服务质量 */u_int16_t ip_length; /* 长度 */u_int16_t ip_id; /* 标识 */u_int16_t ip_off; /* 偏移 */u_int8_t ip_ttl; /* 生存时间 */u_int8_t ip_protocol; /* 协议类型 */u_int16_t ip_checksum; /* 校验和 */in_addr ip_souce_address; /* 源IP地址 */in_addr ip_destination_address; /* 目的IP地址 */};/*下面是UDP协议格式定义*/class udp_header{ public:u_int16_t udp_source_port; /* 源端口号 */u_int16_t udp_destination_port; /* 目的端口号 */u_int16_t udp_length; /* 长度 */u_int16_t udp_checksum; /* 校验和 */};/* 下面是TCP协议格式的定义*/class tcp_header{ public:u_int16_t tcp_source_port; /* 源端口号 */u_int16_t tcp_destination_port; /* 目的端口号 */u_int32_t tcp_sequence_lliiuuwweennttaaoo; /* 序列号 */u_int32_t tcp_acknowledgement; /* 确认序列号 */#ifdef WORDS_BIGENDIANu_int8_t tcp_offset: 4, /* 偏移 */tcp_reserved: 4; /* 未用 */#elseu_int8_t tcp_reserved: 4, /* 未用 */tcp_offset: 4; /* 偏移 */#endifu_int8_t tcp_flags; /* 标记 */u_int16_t tcp_windows; /* 窗口大小 */u_int16_t tcp_checksum; /* 校验和 */u_int16_t tcp_urgent_pointer; /* 紧急指针 */};/* 下面是ICMP协议格式的定义*/class icmp_header{ public:u_int8_t icmp_type; /* ICMP类型 */u_int8_t icmp_code; /* ICMP代码 */u_int16_t icmp_checksum; /* 校验和 */u_int16_t icmp_id; /* 标识符 */u_int16_t icmp_sequence; /* 序列码 */};/* 下面是分析TCP协议的函数,其定义方式与回调函数相同 */void tcp_protocol_packet_callback(u_char *argument, const pcap_pkthdr*packet_header, const u_char *packet_content){class tcp_header *tcp_protocol;/* TCP协议变量 */u_char flags; /* 标记 */int header_length; /* 长度 */u_short source_port; /* 源端口 */u_short destination_port; /* 目的端口 */u_short windows; /* 窗口大小 */u_short urgent_pointer;/* 紧急指针 */u_int sequence; /* 序列号 */u_int acknowledgement; /* 确认号 */u_int16_t checksum; /* 校验和 */tcp_protocol = ( tcp_header*)(packet_content + 14+20); /* 获得TCP协议内容 */source_port = ntohs(tcp_protocol->tcp_source_port); /* 获得源端口 */ destination_port = ntohs(tcp_protocol->tcp_destination_port); /* 获得目的端口 */header_length = tcp_protocol->tcp_offset *4; /* 长度 */sequence = ntohl(tcp_protocol->tcp_sequence_lliiuuwweennttaaoo); /* 序列码 */acknowledgement = ntohl(tcp_protocol->tcp_acknowledgement); /* 确认序列码 */windows = ntohs(tcp_protocol->tcp_windows); /* 窗口大小 */urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer); /* 紧急指针*/flags = tcp_protocol->tcp_flags; /* 标识 */checksum = ntohs(tcp_protocol->tcp_checksum); /* 校验和 */cout<<" TCP协议 "<<endl;cout<<"源端口号:"<<dec<< source_port<< endl;cout<<"目的端口号:"<<dec<< destination_port<<endl;switch (destination_port){case 80:cout<<"上层协议为HTTP协议:"<<endl;break;case 21:cout<<"上层协议为FTP协议"<<endl;break;case 23:cout<<"上层协议为TELNET协议"<<endl;break;case 25:cout<<"上层协议为SMTP协议"<<endl;break;case 110:cout<<"上层协议为POP3协议"<<endl;break;default:break;}cout<<"序列码"<<sequence<<endl;cout<<"确认号:"<<acknowledgement<<endl;cout<<"首部长度:"<<dec<<header_length<<endl;cout<<"保留:"<< int(tcp_protocol->tcp_reserved)<<endl;cout<<"标记:";if (flags &0x08)cout<<"PSH "<<endl;if (flags &0x10)cout<<"ACK "<<endl;if (flags &0x02)cout<<"SYN "<<endl;if (flags &0x20)cout<<"URG "<<endl;if (flags &0x01)cout<<"FIN "<<endl;if (flags &0x04)cout<<"RST "<<endl;cout<<endl;cout<<"窗口大小:"<<windows<<endl;cout<<"校验和:"<< setw(4) << setfill('0') << hex <<checksum<<endl;cout<<"紧急指针:"<<urgent_pointer<<endl;}/* 下面是实现UDP协议分析的函数,函数类型与回调函数相同 */void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){class udp_header *udp_protocol; /* UDP协议变量 */u_short source_port; /* 源端口 */u_short destination_port; /* 目的端口号 */u_short length; //长度udp_protocol = (class udp_header*)(packet_content + 14+20);/* 获得UDP协议内容 */source_port = ntohs(udp_protocol->udp_source_port); /* 获得源端口 */ destination_port = ntohs(udp_protocol->udp_destination_port); /* 获得目的端口 */length = ntohs(udp_protocol->udp_length); /* 获得长度 */cout<<" UDP协议 "<<endl;cout<<"源端口号:"<<dec<<source_port<<endl;cout<<"目的端口号:"<<dec<<destination_port<<endl;switch (destination_port){case 138:cout<<"上层协议为NETBIOS数据报服务"<<endl;break;case 137:cout<<"上层协议为NETBIOS名字服务"<<endl;break;case 139:cout<<"上层协议为NETBIOS会话服务"<<endl;break;case 53:cout<<"上层协议为域名服务"<<endl;break;default:break;}cout<<"长度:"<<length<<endl;cout<<"校验和:"<<setw(4)<<setfill('0')<<hex<<ntohs(udp_protocol->udp_checksum)<<endl;}/* 下面是实现分析ICMP协议的函数,函数类型与回调函数相同 */void icmp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){class icmp_header *icmp_protocol; /* ICMP协议变量 */icmp_protocol = (icmp_header*)(packet_content + 14+20); /* 获得ICMP协议内容 */cout<<" ICMP协议 "<<endl;cout<<"ICMP类型:"<<icmp_protocol->icmp_type<<endl; /* 获得ICMP类型*/switch (icmp_protocol->icmp_type){case 8:cout<<"ICMP回显请求协议"<<endl;cout<<"ICMP代码:"<<icmp_protocol->icmp_code<<endl;cout<<"标识符:"<<icmp_protocol->icmp_id<<endl;cout<<"序列码:"<<icmp_protocol->icmp_sequence<<endl;break;case 0:cout<<"ICMP回显应答协议"<<endl;cout<<"ICMP代码: "<< icmp_protocol->icmp_code<<endl;cout<<"标识符: "<< setw(4) << setfill('0') << hex<<int(icmp_protocol->icmp_id) << endl;cout<<"序列码: "<< icmp_protocol->icmp_sequence<<endl;break;default:break;}cout<<"ICMP校验和:"<<setw(4) << setfill('0') << hex << ntohs(icmp_protocol->icmp_checksum) << endl; /* 获得ICMP校验和 */ return ;}/*下面是实现ARP协议分析的函数,函数类型与回调函数相同 */void arp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){arp_header *arp_protocol;u_short protocol_type;u_short hardware_type;u_short operation_code;u_char *mac_string;in_addr source_ip_address;in_addr destination_ip_address;u_char hardware_length;u_char protocol_length;cout<<" ARP协议 "<<endl;arp_protocol = (class arp_header*)(packet_content + 14);hardware_type = ntohs(arp_protocol->arp_hardware_type);protocol_type = ntohs(arp_protocol->arp_protocol_type);operation_code = ntohs(arp_protocol->arp_operation_code);hardware_length = arp_protocol->arp_hardware_length;protocol_length = arp_protocol->arp_protocol_length;cout<<"硬件类型: "<<ntohs(arp_protocol->arp_hardware_type)<<endl;cout<<"协议类型: "<< setw(4)<<setfill('0')<<ntohs(arp_protocol->arp_protocol_type)<<endl;cout<<"硬件地址长度: "<< int(arp_protocol->arp_hardware_length)<<endl;cout<<"协议地址长度: "<< int(arp_protocol->arp_protocol_length)<<endl;cout<<"ARP 操作: "<< ntohs(arp_protocol->arp_operation_code)<<endl;switch (operation_code){case 1:cout<<"ARP请求协议"<<endl;break;case 2:cout<<"ARP应答协议"<<endl;break;case 3:cout<<"RARP请求协议"<<endl;break;case 4:cout<<"RARP应答协议"<<endl;break;default:break;}cout<<"源以太网地址: "<<endl;mac_string = arp_protocol->arp_source_ethernet_address;cout<< setw(2) << setfill('0') << hex << int(*mac_string) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 1)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 2)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 3)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 4)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 5)) << endl;memcpy((void*) &source_ip_address, (void*)&arp_protocol->arp_source_ip_address, sizeof( in_addr));cout<<"源IP地址:"<<inet_ntoa(source_ip_address)<<endl;cout<<"目的以太网地址:"<<endl;mac_string = arp_protocol->arp_destination_ethernet_address;cout<< setw(2) << setfill('0') << hex << int(*mac_string) << "." << setw(2)<< setfill('0') << hex << int(*(mac_string + 1)) << "." << setw(2) << setfill('0')<< hex << int(*(mac_string + 2)) << "." << setw(2) << setfill('0') << hex <<int(*(mac_string + 3)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string+ 4)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 5)) << endl;memcpy((void*) &destination_ip_address, (void*)&arp_protocol->arp_destination_ip_address, sizeof( in_addr));cout<<"目的IP地址:"<<inet_ntoa(destination_ip_address)<<endl;}/*下面是实现IP协议分析的函数,其函数类型与回调函数相同 */void ip_protocol_packet_callback(u_char *argument, const pcap_pkthdr*packet_header, const u_char *packet_content){ip_header *ip_protocol; /* IP协议变量 */u_int header_length; /* 长度 */u_int offset; /* 偏移 */u_char tos; /* 服务质量 */u_int16_t checksum; /* 校验和 */ip_protocol = ( ip_header*)(packet_content + 14); /* 获得IP协议内容 */ checksum = ntohs(ip_protocol->ip_checksum); /* 获得校验和 */header_length = ip_protocol->ip_header_length *4; /* 获得长度 */tos = ip_protocol->ip_tos; /* 获得服务质量 */offset = ntohs(ip_protocol->ip_off); /* 获得偏移 */cout<<" IP协议 "<<endl;cout<<"版本号:"<<int(ip_protocol->ip_version)<<endl;cout<<"首部长度: "<< header_length<<endl;cout<<"服务质量: "<< int(ip_protocol->ip_tos) <<endl;cout<<"总长度: "<< ntohs(ip_protocol->ip_length)<<endl;cout<<"标识: "<< setw(4)<<setfill('0')<<hex<<ntohs(ip_protocol->ip_id) << endl;cout<<"偏移: "<< (offset &0x1fff) *8<<endl;cout<<"生存时间: "<< int(ip_protocol->ip_ttl)<<endl;cout<<"协议类型: "<<int( ip_protocol->ip_protocol)<<endl;switch (ip_protocol->ip_protocol){case 6:cout<<"上层协议为TCP协议"<<endl;break;case 17:cout<<"上层协议为UDP协议"<<endl;break;case 1:cout<<"上层协议为ICMP协议ICMP"<<endl;break;default:break;}cout<<"校验和:"<<checksum<<endl;cout<<"源IP地址:"<<inet_ntoa(ip_protocol->ip_souce_address)<<endl; /*获得源IP地址 */cout<<"目的IP地址:"<<inet_ntoa(ip_protocol->ip_destination_address)<<endl; /* 获得目的IP地址 */switch (ip_protocol->ip_protocol) /* 根据IP协议判断上层协议 */{case 6:tcp_protocol_packet_callback(argument, packet_header, packet_content); /* 上层协议是TCP协议,调用分析TCP协议的函数,注意参数的传递 */ break;case 17:udp_protocol_packet_callback(argument, packet_header, packet_content); /* 上层协议是UDP协议,调用分析UDP协议的函数,注意参数的传递 */ break;case 1:icmp_protocol_packet_callback(argument, packet_header, packet_content); /* 上层协议是ICMP协议,调用分析ICMP协议的函数,注意参数的传递 */break;default:break;}}/* 下面是分析以太网协议的函数,也是回调函数 */void ethernet_protocol_packet_callback(u_char *argument, const pcap_pkthdr*packet_header, const u_char *packet_content){u_short ethernet_type; /* 以太网类型 */ether_header *ethernet_protocol; /* 以太网协议变量 */u_char *mac_string; /* 以太网地址 */static int packet_number = 1; /* 数据包个数,静态变量 */cout<<" "<<endl;cout<<"捕获第"<< packet_number<<"个网络数据包"<<endl;cout<<"捕获时间:"<<endl;cout<<ctime((const time_t*) &packet_header->_sec)<<endl; /* 获得捕获数据包的时间 */cout<<"数据包长度:"<<endl;cout<<packet_header->len<<endl;cout<<" 以太网协议 "<<endl;ethernet_protocol = (class ether_header*)packet_content; /* 获得以太网协议内容 */ethernet_type = ntohs(ethernet_protocol->ether_type); /* 获得以太网类型 */cout << "以太网类型:" << setw(4) << setfill('0') << hex << ethernet_type << endl;switch (ethernet_type) /* 根据以太网类型判断 */{case 0x0800:cout<<"上层协议为IP协议"<<endl;break;case 0x0806:cout<<"上层协议为ARP协议"<<endl;break;case 0x8035:cout<<"上层协议为RARP协议"<<endl;break;default:break;}mac_string = ethernet_protocol->ether_shost;//****cout << "mac_string帧源地址:" << setw(2) << setfill('0') << hex <<int(*mac_string) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 1))<< "." << setw(2) << setfill('0') << hex << int(*(mac_string + 2)) << "." << setw(2)<< setfill('0') << hex << int(*(mac_string + 3)) << "." << setw(2) << setfill('0')<< hex << int(*(mac_string + 4)) << "." << setw(2) << setfill('0') << hex <<int(*(mac_string + 5)) << endl;mac_string = ethernet_protocol->ether_dhost;cout << "mac_string帧目的地址:" << setw(2) << setfill('0') << hex <<int(*mac_string) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 1))<< "." << setw(2) << setfill('0') << hex << int(*(mac_string + 2)) << "." << setw(2)<< setfill('0') << hex << int(*(mac_string + 3)) << "." << setw(2) << setfill('0')<< hex << int(*(mac_string + 4)) << "." << setw(2) << setfill('0') << hex <<int(*(mac_string + 5)) << endl;switch (ethernet_type){case 0x0806:arp_protocol_packet_callback(argument, packet_header, packet_content);/* 上层协议为ARP协议,调用分析ARP协议的函数,注意参数的传递 */break;case 0x0800:ip_protocol_packet_callback(argument, packet_header, packet_content);/* 上层协议为IP协议,调用分析IP协议的函数,注意参数的传递 */ break;default:break;}cout<<" "<<endl;packet_number++;}/*主函数 */void main(){pcap_t *pcap_handle; /* Winpcap句柄 */char error_content[PCAP_ERRBUF_SIZE]; /* 存储错误信息 */char *net_interface; /* 网络接口 */bpf_program bpf_filter; /* BPF过滤规则 */char bpf_filter_string[] = ""; /* 过滤规则字符串 */bpf_u_int32 net_mask; /* 掩码 */bpf_u_int32 net_ip; /* 网路地址 */net_interface = pcap_lookupdev(error_content); /* 获得可用的网络接口 */ pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址 */pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);/* 打开网路接口 */pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip); /*编译BPF过滤规则 */pcap_setfilter(pcap_handle, &bpf_filter); /* 设置过滤规则 */if (pcap_datalink(pcap_handle) != DLT_EN10MB)return ;cout<<"请输入抓包数量:"<<endl;int n;cin>>n;pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /*注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */ pcap_close(pcap_handle); /* 关闭Winpcap操作 */}。

基于Winpcap的网络数据捕获

基于Winpcap的网络数据捕获


要: 随着网络技 术的不断发展 , 网站安全 问题 日益得 到 关注. 文章针 对 日益 突 出的
网络 安 全 问题 , 在 分析 了 网络 嗅 探 器 的 基 本 工作 原 理 的 基 础 上 , 描 述 了 Wi n p c a p捕 获 数 据
包的程序流程 并做 了一 个 网络数 据 捕获 实验. 结果 表 明 , 这 种嗅探 器 结构 简单 、 捕 获数 据
Wi n p c a p a n d d o e s a n e t wo r k d a t a c a p t u r e e x p e r i me n t .T h e r e s u l t s h o ws t h a t t h e s n i f f e r i s s i g n i i f c a n t t o s fe a t y ma n a g e me n t o f n e t w o r k,wi t h s i mp l e s t r u c t u r e a n d q u i c k c a p t u r e d a t a .
收 稿 日期 : 2 0 1 3 — 1 2 — 1 5
作 者简 介 : 王春霞 ( 1 9 8 1 一) , 女, 安徽 歙县人 , 硕士 , 研究方 向: 计 算机应用
3 8
邵 阳学院学报 (自然科 学版 )
第1 1卷
以有效 防 止 大部 分 的攻 击 和入 侵 , 对 保 障 网络安全起到重要 的作用 .
Ab s t r a c t :Wi t h t h e d e v e l o p me n t o f n e t w o r k t e c h n o l o g y,n e t wo r k s e c u r i t y i s i n c r e a s i n g a t t e n t i o n .Ai mi n g a t s a f e t y p r o b l e ms o f

实验一TCP数据包捕获及分析2016-1

实验一TCP数据包捕获及分析2016-1

实验一:TCP数据包捕获及分析实验学时:4实验类型:设计实验要求:必做一、实验目的理解网络数据包的捕获原理及一般分析方法。

二、实验内容1. 根据参考程序编写一段基于Winpcap的TCP数据包捕获并分析的程序。

2. 要求再给定程序的基础上完成相关功能:1)提示用户对要嗅探的网卡进行选择,并在所选择的网卡上进行数据包捕获。

2)完成数据输出功能,输入以下内容,但不限于:✓输出数据包到达的时间,数据包大小等信息。

✓输出对数据包的以太网帧头进行解析,输出其源MAC地址、目的MAC地址、上层协议类型等信息。

✓输出IP协议报头的相关内容。

✓输出TCP报头的相关内容。

三、实验原理、方法和手段以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。

IEEE802.3 标准的以太网采用的是持续CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。

运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。

Winpcap是针对Win32平台上的抓包和网络分析的一个架构。

它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。

抓包是NPF最重要的操作。

在抓包的时候,驱动使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。

实验可根据Winpcap提供WinPcap Documentation(参考\WpdPack\doc\目录,或下载Winpcap中文手册)的样例程序进行修改和设计。

四、实验组织运行要求1.安装Winpcap驱动及开发库。

2.实验程序需演示和答辩,并记录期末考查成绩中,同时要求最终完成的TCP 包分析器,有较友好的界面和提示,并且在实验程序中设计者的相关信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于WinPcap的网络数据包捕获与分析一、WinPcap介绍1.WinPcap简介WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。

大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。

这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。

然而,有时候“简便方法”并不能满足实际需要。

有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。

基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。

基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。

2.WinPcap的组成与结构如图 1.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。

这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。

1)数据包监听设备驱动程序Array技术实现上,为了实现抓包,系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包(rawpacket)。

这就要求WinPcap的一部分运行在操作系统核心内部,直接与网络接口驱动交互。

由于这个部分是系统依赖(system dependent)的,在Winpcap的解决方案中它被视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。

图1.1 WinPcap的组成和结构2)底层的动态连接库(packet.dll)和高层静态库(wpcap.dll)为了方便编程,WinPcap必须提供一个编程接口(API),这就是WinPcap的底层的动态连接库(packet.dll)和高层静态库(wpcap.dll)。

这里,packet.dll提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;wpcap.dll导出了一组更强大的与libpcap一致的高层抓包函数库(capture primitives),这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行。

底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。

高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。

3.WinPcap的基本原理抓包是WinPcap的基本功能,也是NPF最重要的操作。

在抓包的时候,驱动(例如NIC Driver)使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。

如图1.4,WinPcap的NPF抓包主要依靠两个组件。

1)数据包过滤器(filter)。

数据包过滤器决定是否接收进来的数据包并把数据包拷贝给监听程序。

数据包过滤器是一个有布尔输出的函数。

如果函数值是true,抓包驱动拷贝数据包给应用程序;如果是false,数据包将被丢弃。

NPF数据包过滤器更复杂一些,因为它不仅决定数据包是否应该被保存,而且还决定要保存的字节数。

被NPF驱动采用的过滤系统来源于BSD Packet Filter(BPF),一个虚拟处理器可以执行伪汇编书写的用户级过滤程序。

应用程序采用用户自定义的过滤器并使用wpcap.dll将它们编译进BPF程序。

然后,应用程序使用BIOCSETF IOCTL写入核心态的过滤器。

这样,对于每一个到来的数据包该程序都将被执行,而满足条件的数据包将被接收。

与传统解决方案不同,NPF不解释(interpret)过滤器,而是执行(execute)它。

由于性能的原因,在使用过滤器前,NPF提供一个JIT编译器将它转化成本地的80x86函数。

当一个数据包被捕获,NPF调用这个本地函数而不是调用过滤器解释器,这使得处理过程相当快。

2)循环缓冲区(Buffer)。

NPF的循环缓冲区用来保存数据包以免丢失(如果一个包符合过滤器的要求,就被复制到循环缓冲区)。

一个保存在缓冲区中的数据包有一个头,它包含了一些主要的信息,例如时间戳和数据包的大小,注意:它不是协议头。

另外,循环缓冲区以队列插入的方式来保存数据包,提高数据的存储效率。

程序员可以以组的方式将数据包从NPF 缓冲区拷贝到应用程序,这样就提高了性能,因为它降低了读的次数。

如果一个数据包到来的时候缓冲区已经满了,那么该数据包将被丢弃,这时就发生了丢包现象。

3)Network Tap 是一个用于探听网络中所有数据流的函数。

4)数据统计如图1.4,为了提高数据处理的速度,WinPcap 将统计和监听功能移到内核中,这样避免了将任何数据都传递给用户。

WinPcap 通过使用从NPF 中得到的过滤器来执行一个内核级的可编统计模块,这使其变成一个强大的分级引擎,而不只是个简单的包过滤器。

应用程序可以构造这个模块来监听网络活动的任意方面(例如:网络负荷、两台主机间的流量、每秒web 请求的次数等等),并在预定的时间间隔内接收内核传来的数据。

统计模式避免了复制数据包并且执行0-copy 机制(当包仍存放在NIC (网络接口卡)驱动的内存中时开始进行统计,随后丢弃这个包)。

而且,环境转换的次数可以保持最低,这是因为结果通过一次系统调用就可以返回给用户。

它不需要缓冲区(内核或用户),因此图1.4 Wincap 的内部结构和原理基于Winpcap 的监控程序 packet.dll wpcap.dll NIC Driver (NDIS3.0或更高) 核心层 网络层 数据包 基于Winpcap 的应用程序1Filter1 Filter2 Filter3 … Buffer1 Buffer2 统计引擎 Network Tap TCP/IP 协议栈 其他协议栈实现 User- Buffer1 User- Buffer2 基于Winpcap的应用程序2 NPF调用packet.dll API 的程序 直接访问 NPF 的程序 用户层当监听开始时不用为它分配内存。

可见,统计模式是一种很有效的网络监听方式,在高速网络中利用libpcap来工作也没任何问题。

WinPcap为程序员提供了一套系统调用和高层函数来进行网络监听,这使得已经知道libpcap API的程序员能很容易使用。

5)构造数据包BPF和NPF都提供了构造包的函数,使用户可以将原始数据包发送到网络中。

然而,Unix程序员一般不用libpcap提供的这些函数,因为在Unix平台上,应用程序可以使用原始套接字来发送伪造的数据包。

在Windows环境下,只有Windows2000提供了原始套接字,而且非常有限。

因此在Windows环境下,WinPcap就成为首选的构造数据包的函数库,它提供了一套标准稳定的函数。

另外,NPF增加了一些新的函数,这些函数可以使数据包通过一次用户和内核模式之间的转换就发送几次。

数据复制到内核中,然后通过调用一次NDIS 将包发送到网络中。

尽管WinPcap提供了一套新的函数来开发这些特性,但它没有提供那些强大的创建数据包的抽象函数,这需要通过其它现有的工具来实现。

程序员可以利用著名的Libnet Packet Assembly Library的Windows版本实现,这个函数库增加了数据包结构层并在WinPcap上构造数据包。

二、基于Winpcap的数据包捕获与分析程序开发流程1.程序分析本课程设计采用VC++,基于应用程序Winpcap来实现数据包的捕获与分析。

界面采用MFC实现一个单文档的程序,用户区分为左右两个视图,左边视图是一个列表,显示捕获数据包的简要信息,右边视图是一个树形图,显示选中数据包的详细信息。

由菜单项中的按钮触发操作,同时改进了程序自带的保存、另存为等图标,成功加上了自己的图标,并与按钮ID相匹配。

这个程序基本实现了预期功能,下面是程序开发的过程。

2.建立工程在VC++ 6.0下创建一个单文档的MFC应用程序,工程名:Sniffer,如图2.1->图2.2->图2.3。

图2.1 建立工程图2.2 选中单文档图2.3 自动生成的类列表到/devel.htm下载WinPcap 4.0.2.zip,然后解压,解压缩就可以看见Include和lib;在"Project->Settings"标签栏中选择"C/C++",在"Preprocessor definitions"的输入框里添加"WPCAP";再选择"Link",在"Object/library modules"的输入框里添加"wpcap.lib "。

然后再设置VC++环境变量:选择Tools->options->Directories的include里面加入下载的winpcap开发包解压以后的include文件夹。

选择Tools->options->Directories的lib里面加入下载的winpcap开发包解压以后的lib文件夹。

3.界面设计工程建好了,下面进行界面的设计:首先,对菜单栏进行修改,去掉原来单文档所自带的“文件”、“编辑”菜单选项,保留“查看”和“帮助”,新建“文件”,下面有“开始抓包(ID_FILE_START)”、“停止抓包(ID_FILE_STOP)”、“退出(ID_APP_EXIT)”三个菜单选项。

再建“适配器”菜单,下面有“选择适配器(ID_ADP_CHOOSE)”选项,并对每个新建的选项进行注释说明。

如图2.4:图2.4 菜单栏然后,打开Sniffer.rc文件,对工具栏进行修改。

自做了一个工具栏图片Toolbar1.bmp来代替原来工程的Toolbar.bmp,然后将多余的复制粘贴等工具按钮信息删除掉,回到界面处,再对每个按钮图标进行ID设置。

如图:,从左向右依次是:开始抓包、停止抓包、选择适配器、帮助图标按钮。

最后,新建一个选择适配器的基本对话框,ID标识为IDD_ADP_DIALOG,双击此对话框新建一个类:CAdpterDlg。

相关文档
最新文档