一种改进的基于WinPcap的快速抓包方法

合集下载

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

用VC_实现基于Winpcap的网络数据包捕获与分析
以太网数据帧由报头和数据区组 成, 在以太网帧的报头中包含目地址端 及源地址, 各 6 个字节, 帧的报文部分包 含的是数据种类, 2 个字节。最后放置的 是错去校验和修正码, 通常抓到的数据 包已经去掉了同步码和桢分界符。报头 部分的定义如图 2 所示。
数据
图 3 IP 数据包格式及首部中的各字段 在 具 体 编 程 中 , 给 出 IP 数 据 包 数 据
strData [2] =inet_ntoa (* (in_addr*) &arp- >arp_spa));//得到源 IP 地址
strData [4] =inet_ntoa (* (in_addr*) &arp- >arp_tpa));//得到目 的 IP 地 址
strData[6]=hdr- >bh_datalen); //得 到报文长度 4.4 TCP 数据 报或 UDP 数据 报
关键词: VC++; 数据包捕获; WinPcap
中 图 分 类 号 :T P312
文 献 标 识 码 :A
文章编号:1672- 7800(2007)03- 0104- 02
1 数据包的捕获原理
在正常的情况下, 一个网络接口应该 只响应以下两种数据帧:
( 1) 与自己硬件地址相匹配的数据帧。 ( 2) 发向所有机器的广播数据帧。其 实在一个实际的系统中, 数据的收发由网 卡完成, 网卡接收到传输来的数据帧, 网 卡 内 的 单 片 程 序 接 收 数 据 帧 的 目 的 MAC 地址, 根据计算机上的网卡驱动程序设置 的 接 收 模 式 判 断 是 否 接 收 。而 对 于 合 法 的 网卡来说应该只接收以下数据帧有以下 4 种模式: ①广播方式。②组播方式。③单播 方式。④混杂模式。 数据包捕获作为一种网络通讯程序, 也是通过对网卡的编程来实现网络通讯。 因此, 网络数据包捕获的基本原理是让网 卡接收一切它所能接收的数据。

一种改进的基于WinPcap的快速抓包方法

一种改进的基于WinPcap的快速抓包方法

收稿日期:2004209229;修返日期:2004211222基金项目:国家自然科学基金资助项目(60272091,60373109)一种改进的基于W i nPcap 的快速抓包方法3廖俊云1,范明钰2,王光卫2(1.电子科技大学通信与信息工程学院,四川成都610054;2.电子科技大学计算机科学与工程学院,四川成都610054)摘 要:根据W inPcap 的抓包原理和高速网络环境对网络抓包性能的要求,提出了一种改进的快速抓包方法-FH W 法,并且在VC ++6.0编译器中实现了该方法。

试验结果表明,在高流量网络环境中,与传统的抓包方法相比,FHW 法能显著地提高抓包性能、降低丢包率。

关键词:FHW 法;W inPcap;丢包率中图法分类号:TP393 文献标识码:A 文章编号:100123695(2005)0920235202An I m p r oved Fast 2cap turing Packet Method Based on W inPcapL I A O Jun 2yun 1,F AN M ing 2yu 2,WANG Guang 2wei2(1.School of Co mm unication &Infor m ation Engineering,U niversity of Electronic Science &Technology of China,Chengdu S ichuan 610054,China;2.School of Co m puter Science &Engineering,U niversity of Electronic Science &Technology of China,Chengdu S ichuan 610054,China )Abstract:According t o the p rinci p le of W inPcap and require of cap turing packet efficiency in high traffic net w ork,a i m 2p r oved fast 2cap turing packetmethod (FH W method )is p resented and i m p le mented based on VC ++6.0comp iler .The exper 2i m entati on results indicate that the FH W method described in this paper can significantly i m p r ove the efficiency cap turing packet,es pecially in high traffic net w ork,compared t o the traditi onal cap turing packet method .Key words:FH W Method;W inPcap;Rate of Packet D r oped 近年来,传统的10Mbp s 共享网络迅速被100M bp s 甚至1000Mbp s 的交换网络所取代。

基于WinPcap包捕获算法的实现

基于WinPcap包捕获算法的实现
t t o k if r ai n. r u hep c t ae t hene w r n o m to Th o ght a ke—b s d newor r oc n l ss y a a u et t c t ta s si n o t t or , k p ot ol ay i, ou c n c ptr hedaapa kes rn miso n hene a w k a e h l g li or ai n.I sc d ie t her s ac o t o k f r ns s W i nd g tt ei e a nf m to l ti on ucv O t e e rh fne w r o e i . nPc p i i owsA PIt r i c e st t — c a saW nd o p ovdea c s O heun de y n t o k daai t i owss tm ; ti n r ++ s l i l f i g ne w r t n heW nd yse i s otapu e C out on. trle he u e o c ll a e. i hehep ofne or i eison t s fl a i r s W t t l t o br i h w k p c tc p r rr o i i y h iPc p. i ++ pr g a a ke a t ehb a ypr v dngb t e W n a us u ng c o r mm i g i p e e sda c tc p r n  ̄ tfngag i n m lm nt t pa ke a t ea d a u e i l ort s hm . K e wor s aapa k t y d :d t c e ;W i Pc p;c pt r ; le n a a u e f tr i

基于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抓包方法的改进

务器 ( 中转 节 点 )对数 据 的处 理方 法及 结 果上 。线 路损 失
但 随着
方 面大 都受 运 营商 即公 网线 路控 制 ,而 后者 则 在于 受服 务 节 点 处理 的影 响 。其 中有 两个 最 主 要 的原 因 : ( 1 )缺 乏 C P U处理 时 间 。当 网络 数据 流量 很 大 的情况 下 ,数 据 的传 输 能力 甚至 会超 过CP U的处 理 能力 ,这 样在 整 个 网络抓 包 的过程 中系 统 内核 C P U忙于 接 受数 据而 无 暇处 理数 据包 , 从 而长 时 间处 于 中断接 受状 态 。与 此 同时大 量 数据 包 因为 得 不 到及 时响 应而 被 丢 弃 ; ( 2 ) 内核 缓 冲 区 没有 足 够 的 空 间来 容纳 从 网卡 上复 制过 来 的新 的数 据包 。如果 内核 缓 冲 区满 了,新 数据 包就 会被 丢 弃 。适 当增大 内核缓 冲 区的 大 小 ,可 以 降低 丢 包率 。另 外 ,捕 获过 程 中数据 包 从通 信 接 口被 抓取 后经 过 滤器 存入 缓存 最 后到 达 实际应 用 程序 空
应 用程 序
从而 使系 统性 能 降低 。
针 对 这 些 问题 ,Wi n p c a p 在 某些 方ቤተ መጻሕፍቲ ባይዱ面进 行 了优化 ,还 提供 了发送 原始 数据 包 和统 计 网络通 信 过程 中 各种 信息 的 功 能,方 便进行 测试 。

Wp e a p . d t l

P a c k e t . dI l
间所 经 历 的二 次拷 贝和 进程 切换 需 要 占用大 量 系统 资源 ,
人们 享 受着I n t e r n e t 带来 的方 便和 快捷 的 同时 , 网络 安全 的 重 要性 也 日益 突显 出来 。被 称 为 “ 第二 道 防火 墙 ”的入 侵 检测 技术 越来越 受 大家 的重视 】 。

基于WinPcap的数据捕获系统

基于WinPcap的数据捕获系统

0 引言
基 于 网 络 的入 侵 监 测 系 统 , 截获 的数 据 包 信 息 作 为 检 测 分 析 的 以 便 可 收 集 , 要 简 单 接 收 和显 示 从 检 测 模 块 得 到 的 数 据 , 而 减 轻 了 只 从 数 据 来 源 。那 么首 先 就 必 须 把 所有 的 网络 数 据 包 截 获 下 来 。 部 分 的 该 计 算 机 的 负担 。 作 用 是 把数 据捕 获 下 来 。 络数 据 的捕 获 总 在 网 络 安 全 中扮 演 着 重 要 网 ( )akt l动 态 链 接 库模 块 。第 二 个 是 动 态链 接 库 模 块 pck. 2 P ce. l d ae t 的角 色 , 论是 攻 击 者 还 是 防守 者 , 们 所 利 用 的原 理 都 是 相 同 的 。 无 他 本 dl为 wn 2平 台提 供 了一 个 较 低 层 的 编 程 接 口 , 用 它 就 可 以调 用 1, i3 使 章 详 细 分 析 了 WiP  ̄ 的结 构 和 原 理 以及 网 络 数 据 的 格 式 , n cp nc WiP a WiP a n cp函 数 D L L。 提 供 的 常 用 函数 , 后 对 局 域 网数 据 进 行 了 捕 获 , 将 捕 获 结 果 保 存 最 并 pc e. akt u包含 了其他一些 函数 使它 可以进行一些 底层 的操 作 , d 到 一个 文件 中 。 如 : 来 安 装 、 动 和停 止 N F设 备 驱 动 。 N F驱 动 接 收 数 据 包 ; 用 启 P 从 P 通
21 年 01
第 1 期 1
S I N E&T  ̄ O O  ̄ N O MA I N CE C E L G IF R TO
OI 论坛。 T
科技信息

如何用winpcap抓包分析网络协议

如何用winpcap抓包分析网络协议

创建一个使用wpcap.dll的应用程序用 Microsoft Visual C++ 创建一个使用wpcap.dll的应用程序,需要按一下步骤:∙在每一个使用了库的源程序中,将pcap.h头文件包含(include)进来。

∙如果你在程序中使用了WinPcap中提供给Win32平台的特有的函数,记得在预处理中加入WPCAP的定义。

(工程->设置->c/c++->预处理程序定义中添加WPCAP)∙如果你的程序使用了WinPcap的远程捕获功能,那么在预处理定义中加入HAVE_REMOTE。

不要直接把remote-ext.h直接加入到你的源文件中去。

(工程->设置->c/c++->预处理程序定义中添加HAVE_REMOTE)∙设置VC++的链接器(Linker),把wpcap.lib库文件包含进来。

wpcap.lib可以在WinPcap 中找到。

∙设置VC++的链接器(Linker),把ws2_32.lib库文件包含进来。

这个文件分布于C的编译器,并且包含了Windows的一些socket函数。

本教程中的一些范例程序,会需要它。

记住以下几点:∙要添加一个预处理定义,你需要打开Project菜单,选择Settings,然后选择C/C++选项卡,在General类下,你必须在Preprocessor Definitions下的文本框中添加定义。

∙要在一个VC++6.0工程中,添加一,个新的库,你必须打开Project菜单,选择Settings,然后选择Link选项卡,然后把新库的名字添加到Object/Library modules下的文本框中∙要向VC++6.0中添加一个新的库所在的路径,你必须打开Tool菜单,选择Options,然后选择Directories选项卡,在Show directories下拉框中选择Library files,并且将新的路径添加到Directories中去∙要向VC++6.0中添加一个新的包含文件所在的路径,你必须打开Tool菜单,选择Options,然后选择Directories选项卡,在Show directories下拉框中选择Include files,并且将新的路径添加到Directories中去范例程序我们一共了一些范例程序来显示WinPcap API的用法。

基于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抓包-实现

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 编程实现抓包实验

上海电力学院计算机网络安全(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操作 */}。

实验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是不依赖于操作系统的。

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

基于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的快速抓包方法

一种改进的基于WinPcap的快速抓包方法
廖俊云;范明钰;王光卫
【期刊名称】《计算机应用研究》
【年(卷),期】2005(22)9
【摘要】根据WinPcap的抓包原理和高速网络环境对网络抓包性能的要求,提出了一种改进的快速抓包方法-FHW法,并且在VC+ + 6.0编译器中实现了该方法.试验结果表明,在高流量网络环境中,与传统的抓包方法相比,FHW法能显著地提高抓包性能、降低丢包率.
【总页数】3页(P235-236,239)
【作者】廖俊云;范明钰;王光卫
【作者单位】电子科技大学,通信与信息工程学院,四川,成都,610054;电子科技大学,计算机科学与工程学院,四川,成都,610054;电子科技大学,计算机科学与工程学院,四川,成都,610054
【正文语种】中文
【中图分类】TP393
【相关文献】
1.一种基于有限数据集的图像快速生成改进方法 [J], 张家亮;何志鹏;王媛媛;曾兵;沈宜;贾宇
2.一种基于石墨化炭黑过滤吸附处理荧光抑制和改进系统聚类分析的轻质燃油种类拉曼光谱快速识别方法 [J], 喻星辰;管亮;李子存;龚应忠;马骏;许贤
3.一种基于改进快速扫描法的多尺度近地表层析方法 [J], 蔡杰雄; 王静波
4.一种基于改进负荷矩的台区电压快速估算方法 [J], 胡斌; 王绪利; 叶斌; 马静; 叶彬
5.一种基于改进聚合通道特征的快速行人检测方法 [J], 付红杰;刘悦;王青正
因版权原因,仅展示原文概要,查看原文内容请购买。

基于WinPcap包捕获算法的实现

基于WinPcap包捕获算法的实现

基于WinPcap包捕获算法的实现
翟朔
【期刊名称】《电脑知识与技术》
【年(卷),期】2010(006)007
【摘要】网络已经成为人类生活中不可或缺的重要组成部分,网络信息的安全问题也越来越被人们所重视.通过基于网络数据包的协议分析,对网络上传输的数据包进行捕获,可以获取网络上传输的非法信息.对网络取证的研究非常有利.WinPcap是一种提供在Windows系统上进行访问底层网络数据的Windows API;它不是一种纯粹的C++解决方案.它依赖本地库的使用.借助WinPcap提供的网络数据包捕获函数库,利用c++编程实现了数据包捕获和过滤算法.
【总页数】4页(P1588-1591)
【作者】翟朔
【作者单位】中国矿业大学计算机学院,江苏,徐州,221116
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于WinPcap的网络数据包捕获系统设计与实现 [J], 黄培花;宋科
2.基于WinPcap网络数据包捕获实现 [J], 赵建勋
3.基于Winpcap的数据包捕获和协议分析系统的设计与实现 [J], 李延会;岳彩祥;徐金艳;李亚斐
4.用VC<sup>++</sup>实现基于Winpcap的网络数据包捕获与分析 [J], 阳晓
剑;王志刚;汤小康
5.基于WinPcap网络数据包捕获程序的设计与实现 [J], 矫健
因版权原因,仅展示原文概要,查看原文内容请购买。

基于Winpcap的网络数据捕获

基于Winpcap的网络数据捕获

基于Winpcap的网络数据捕获
王春霞;张莉
【期刊名称】《邵阳学院学报(自然科学版)》
【年(卷),期】2014(011)001
【摘要】随着网络技术的不断发展,网站安全问题日益得到关注.文章针对日益突出的网络安全问题,在分析了网络嗅探器的基本工作原理的基础上,描述了Winpcap 捕获数据包的程序流程并做了一个网络数据捕获实验.结果表明,这种嗅探器结构简单、捕获数据快,对网络的安全管理具有重要意义.
【总页数】5页(P37-41)
【作者】王春霞;张莉
【作者单位】福建师范大学闽南科技学院,福建泉州362332;福建师范大学闽南科技学院,福建泉州362332
【正文语种】中文
【中图分类】TP393.08
【相关文献】
1.基于WinPcap的数据捕获系统 [J], 林辉;朱俊平
2.基于动态内存池和WinpCap的高速数据捕获技术 [J], 甘彪;凌小峰;宫新保
3.基于NDIS驱动的网络数据捕获研究 [J], 刘文涛
4.基于Linux的高速网络数据捕获技术 [J], 方亮;喻金科
5.基于PF_RING的高速网络数据捕获方法 [J], 吴克河;王冬冬
因版权原因,仅展示原文概要,查看原文内容请购买。

基于WinPcap的捕包程序设计

基于WinPcap的捕包程序设计

基于WinPcap的捕包程序设计
谢小特;王勇军
【期刊名称】《软件导刊》
【年(卷),期】2007(000)011
【摘要】随着网络入侵的不断发展,网络安全变得越来越重要,利用一种方法对网络数据包进行高效捕获,并进行一系列的分析,从而进行可靠的网络安全管理显得尤为重要。

概述了WinPcap内部结构,简要介绍了WinPcap捕包的实现原理,详细分析了实现WinPcap捕抓数据包的程序流程。

【总页数】3页(P71-73)
【作者】谢小特;王勇军
【作者单位】国防科技大学计算机学院;国防科技大学计算机学院湖南长沙410073;湖南长沙410073
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.基于WinPcap的数据包伪造及发送系统 [J], 胡建龙;马春波;李光辉;王龙超
2.基于WinPcap库的通用程序设计模型 [J], 简清明
3.基于Winpcap的网络嗅探程序设计 [J], 庄春兴;彭奇志
4.基于Winpcap网络数据包的捕获与存储技术研究 [J], 李星;熊列彬;王昌
5.基于Winpcap网络数据包的捕获与存储技术研究 [J], 李星;熊列彬;王昌
因版权原因,仅展示原文概要,查看原文内容请购买。

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

收稿日期:2004209229;修返日期:2004211222基金项目:国家自然科学基金资助项目(60272091,60373109)一种改进的基于W i nPcap 的快速抓包方法3廖俊云1,范明钰2,王光卫2(1.电子科技大学通信与信息工程学院,四川成都610054;2.电子科技大学计算机科学与工程学院,四川成都610054)摘 要:根据W inPcap 的抓包原理和高速网络环境对网络抓包性能的要求,提出了一种改进的快速抓包方法-FH W 法,并且在VC ++6.0编译器中实现了该方法。

试验结果表明,在高流量网络环境中,与传统的抓包方法相比,FHW 法能显著地提高抓包性能、降低丢包率。

关键词:FHW 法;W inPcap;丢包率中图法分类号:TP393 文献标识码:A 文章编号:100123695(2005)0920235202An I m p r oved Fast 2cap turing Packet Method Based on W inPcapL I A O Jun 2yun 1,F AN M ing 2yu 2,WANG Guang 2wei2(1.School of Co mm unication &Infor m ation Engineering,U niversity of Electronic Science &Technology of China,Chengdu S ichuan 610054,China;2.School of Co m puter Science &Engineering,U niversity of Electronic Science &Technology of China,Chengdu S ichuan 610054,China )Abstract:According t o the p rinci p le of W inPcap and require of cap turing packet efficiency in high traffic net w ork,a i m 2p r oved fast 2cap turing packetmethod (FH W method )is p resented and i m p le mented based on VC ++6.0comp iler .The exper 2i m entati on results indicate that the FH W method described in this paper can significantly i m p r ove the efficiency cap turing packet,es pecially in high traffic net w ork,compared t o the traditi onal cap turing packet method .Key words:FH W Method;W inPcap;Rate of Packet D r oped 近年来,传统的10Mbp s 共享网络迅速被100M bp s 甚至1000Mbp s 的交换网络所取代。

在高速网络环境中,传统的网络抓包方法存在严重的丢包问题。

然而,能否收集到充分、准确的网络数据常常是入侵检测等其他网络分析工具成败的关键。

如果抓包环节出现严重的丢包现象,将很可能会因为丢掉一些重要的信息,使得分析的结果与事实不相符合。

为了解决高速网络环境中的丢包问题,现有的大量研究主要集中在设计不同的分布式抓包结构方面[1,2];很少有文献研究抓包方法本身存在的问题。

本文从抓包方法本身出发,针对传统抓包方法在高速网络环境中存在丢包率高的问题,提出了一种改进的快速抓包方法———FH W (Fast Hard disk W rite )方法。

1 W inPcap 的抓包原理W inPcap 是W indows 平台下的优秀抓包开发工具。

它主要包括三个模块(图1),即内核级模块(Netgr oup Packet Filter,NPF )和两个用户级模块(Packet .dll 和Wpcap.dll ),用户级模块以动态链接库的形式提供。

内核模块是核心模块,它主要用于数据包的过滤,将其原样递交给应用层,它还包括特定操作系统的代码(如时间戳的管理)等。

Packet .dll 是一个能用来直接访问NPF 驱动程序的AP I 。

每一个W indows 版本都在内核与应用程序间提供不同的接口:Packet .dll 用于处理这些差异,提供系统无关的AP I 。

这一DLL 同NPF 一样都是系统相关的。

W Pcap.dll 是一个更高层的、系统无关的AP I,它是对Packet .dll 更高层的封装。

它提供了一些更加简单和直接的方式来完成某些功能。

多数用户都是基于此库函数进行开发的。

W inPcap 一般抓包步骤有:①获取网卡设备列表(如果有多块网卡,则从中选择一块),并将其设置为混杂(Pr om is 2cuous )模式;同时设置好过滤器等其他参数。

②把网卡上的数据包复制到内核缓冲区中。

③通过上层的调用,把内核缓冲区中的数据包拷贝到用户缓冲区中。

经过一定的处理,再把数据包存放到硬盘上。

2 传统抓包方法及存在的问题传统的网络抓包方法的流程图如图2所示。

著名的开放源代码入侵检测系统Snort [3]和流行的网络分析工具W indu mp 都是采用图2所示的流程来捕获网络数据包。

Snort 调用的是L ibpcap [4]库函数,而W indu mp 调用的是W inPcap 库函数。

采用此流程设计的抓包方法,在高流量网络环境中存在很高的丢包率(高达60%左右)。

下面对丢包的原因进行分析。

为了节省篇幅,只分析图2中的关键部分。

在图2中,pcap _l oop ()函数是截包的关键环节,它是一个循环截包函数。

分析此函数的源代码可知,其内・532・第9期廖俊云等:一种改进的基于W inPcap 的快速抓包方法 部主要处理过程可归结为如图3(a )所示的流程图。

在pcap _l oop ()的每次循环中,首先通过调用Packet ReceivePacket ()函数,从内核缓冲区中把一组数据包读取到用户缓冲区;然后,根据bpf_hdr 结构提供的该数据包的定位信息,把用户缓冲区的多个数据包逐个提取出来,并依次送入回调函数进行进一步处理(把数据包封装成标准的W indu mp 格式后存放到硬盘上)。

由于用户缓冲区对数据包的处理方式过于复杂,当网络流量比较大时,用户缓冲区处理数据包的速度跟不上内核缓冲区从网卡复制数据的速度,所以新的数据包就会因为内核缓冲区满而被丢弃。

由此可见,只有简化对用户缓冲区内的数据包块的处理方式,才能从根本上改善抓包的性能。

3 FH W 抓包方法的原理及设计311 丢包的原因造成丢包的因素很多,其中有两个最主要的原因:①缺乏CP U 处理时间。

当新数据包到来时,系统底层分接器还在处理前一个数据包,因此新数据包就被丢弃了。

通常,数据包越短分接器处理频率就越高、丢包率就越高。

②内核缓冲区没有足够的空间来容纳从网卡上复制过来的新的数据包。

如果内核缓冲区满了,新数据包就会被丢弃。

适当增大内核缓冲区的大小,可以降低丢包率。

经测试,在笔者的电脑上把内核缓冲区设为4MB (缺省为1MB )时,能获得很高的性能。

但是,内核缓冲区超过4MB 时,对丢包率的影响就很小。

312 FHW 抓包方法的设计根据传统网络抓包方法存在的问题和对丢包原因的分析。

本文提出了一种改进的抓包方法———FH W 法。

图3(b )是FH W 抓包方法关键部分的流程图。

FH W 抓包方法关键部分的处理方式为:首先把pcap _file_header 文件头信息记录到存包文件中;然后调用PacketSet M inT oCopy ()函数,设置Packet 2ReceivePacket ()函数每次从内核缓冲区中拷贝到用户缓冲区中最小数据包块的大小;接着进入循环截包处理过程,调用Packet ReceivePacket ()函数,从内核缓冲区拷贝一组数据包到用户缓冲区中,再把这组数据包不作任何处理直接存放到硬盘上,如此循环直到用户按键终止抓包过程。

经比较可知,改进后的FH W 抓包方法具有如下特点:(1)简化了用户缓冲区中数据包的处理方式。

不再把数据包逐个提取出来送入回调函数处理,而是把一组数据包直接存放到硬盘上。

简化后,用户缓冲区处理数据包的速度显著提高,从而很好地缓解了因为内核缓冲区满而丢弃新数据包的问题。

(2)不再采用回调函数。

因为采用回调函数的设计,用户缓冲区要等待每一个数据包都被提取出来并送入回调函数,而这一过程将因为频繁的函数调用产生大量的系统开销。

(3)增加了对PacketSet M inToCopy ()函数的调用。

把每次从内核缓冲区中至少拷贝用户缓冲区中的数据设置为500K B (缺省为16K B )。

当这个值较大时,内核就会等多个数据包到达时再开始把数据拷贝到用户缓冲区,因此减少了系统调用次数,提高了抓包性能。

FH W 抓包方法是把用户缓存中的一组数据包直接存放到硬盘上,所得到的数据包格式不符合标准的通用W indu mp 文件格式,导致收集的信息无法为其他网络分析工具所使用。

为叙述方便,称非标准的格式为原始格式。

为了解决此问题,本文对两种格式进行了深入分析。

其中,原始格式为pcap _file_header [5]头、bpf_hdr [5]头、网络数据包,接着是填充字节;然后重复bpf_hdr 头、网络数据包、填充字节,一直到文件末尾。

W indu mp 文件格式为pcap _file_header 头、du mp _bpf_hdr [5]头、网络数据包,然后重复du mp_bpf_hdr 头、网络数据包一直到文件末尾。

可见,原始格式多了填充字节;另外原始格式使用的bpf_hdr 结构比W indu mp 格式使用的du mp_bpf_hdr 结构,多了一个4字节的bh_hdrlen 成员,其他部分都一样。

基于上述分析,设计了一个把原始格式转换为通用W indu mp 格式的程序ConvertFor mat,成功地将原始格式转换成通用的W indu mp 格式。

4 实验结果比较与分析按照改进前后的抓包流程(图2和图3),在W indows XP 操作系统下,用VC ++6.0编译器分别编写了两个抓包程序及格式转换程序(ConvertFor mat )。

同时,为了测试方便还编写了一个可控制流量的高效发包程序来向网络上发送大量的数据包。

相关文档
最新文档