- 浏览: 16864 次
最新评论
数据包到达网络接口时,链路层的设备驱动程序通常是将数据包直接传送给协议栈进行处理。当NPF以一个协议驱动程序注册后,也类似于一个协议栈。链路层驱动程序在将数据包传送给协议栈时也会传递给NPF。NPF负责将此数据包指针传递至内核过滤器(可能有多个),过滤器决定数据包是否被接收以及数据包中的哪些内容将被接收。对于每一个决定接受数据包的过滤器,NPF才执行数据复制工作,将所需的数据复制到与过滤器相关的缓存中,以供用户进程读取。
NPF独立于诸如TCP-IP协议的主机协议来捕获网络数据包。这意味着WinPcap不能阻塞、过滤或操纵同一机器上其它应用程序的通信,它只是简单地"嗅探"网络上所传输的数据包。
注意到NPF是先对数据包进行过滤再缓冲,避免先缓冲每个数据包直到用户读数据时再进行过滤所造成的效率问题。
Winpcap的过滤表达式是一个ASCI字符串形式的高层布尔表达式(与libpcap、Tcpdump和 WinDump的相同),原语(primitive)是其基本组成单元。一个表达式由一个或多个原语组成,原语之间通过and、or和not连接。基本语法结构是:
[not] 原语[and|or[not] 原语...]
包过滤机制实际上是针对数据包的布尔值操作函数,如果函数最终返回 true,则通过过滤,反之则被丢弃。形式上包过滤由一个或多个谓词判断的并操作(AND)和或操作(OR)构成。每一个谓词判断基本上对应数据包的协议类型或某个特定值,例如,只需要 TCP 类型且端口为 110 的数据包或 ARP 类型的数据包。
过滤过程从一个用户所定义的过滤表达式(比如,捕获起所有UDP数据包)开始,由wpcap.dll中的pcap_compile函数把过滤表达式编译成虚拟机指令(比如,如果数据包是IP协议的,并且协议类型字段为17,那么返回true),编译后的指令由wpcap.dll中的pcap_setfilte函数将其应用到某个已打开的网络捕获设备(网卡)上。其转换过程如图10-6所示。
图10-6 过滤表达式转换为底层代码
内核模块必须能够执行这些指令,因此对所有进入的数据包它必须有一个类似的"BPF虚拟机"来执行指令。该内核中与BPF兼容的过滤机("NPF虚拟机")是获得高性能的一个关键点。
过滤时,NPF会检查每个网络数据包首部相应字段的值,检查范围包括数据链路层首部(如以太帧的源/目的MAC地址和Type字段)、网络层首部(如源/目的IP地址和协议字段等)、传输层首部(如源/目的端口号字段等),所有的符合要求的数据包(即与过滤条件比较后,布尔表达式为真的包)将会被WinPcap继续传递。
WinPcap 使用了gencode.c、optimize.c、grammar.c、scanner.c源文件与tokdefs.h头文件完成编译操作。其中scanner.c、grammar.c与 tokdefs.h文件由flex 和 bison 生成。
在WinPcap中wpcap\libpcap\目录下的scanner.l与grammar.y就分别对应于flex与bison的源程序。通过下列指令生成对应的scanner.c、grammar.c与tokdefs.h文件。
应用程序编译过滤表达式调用getcode.c文件中的pcap_compile()函数,通过该函数生成所需的字节码。
当使用完该过滤程器后,需要调用配对的pcap_freecode函数,来释放存储字节代码的结构体bpf_program所用的内存空间。
应用程序调用pcap_setfilter()函数将一个过滤器与一个捕获实例关联,把过滤器的字节代码传递给内核的NPF驱动程序中,当进行数据捕获时,驱动程序执行该过滤器对来自网络的所有数据包进行过滤,所有符合要求的数据包,将会复制给应用程序,否则丢弃该数据包。详细的处理过程践后续章节的分析。
发表评论
-
如何高效地进行远程大规模字符串比较问题
2012-07-06 09:52 683关键字 (keywords):大规模 字符串 匹配 远程 ... -
java 使用正则来过滤字符串中的特殊字符
2012-07-06 09:45 992Pattern pattern1 = Pattern.co ... -
正则表达式(初识笔记)
2012-07-06 09:38 654............................. ... -
ps画个矩形框,如何设置线宽
2012-07-06 09:30 1881i am now in university(HIT@We ... -
父页面iframe自适应子页面高度
2012-07-05 20:45 1369父页面有table,有tr,td。td中有iframe。页 ... -
ADF中组件无法显示问题
2012-07-03 13:44 806在ADF开发过程中,偶尔会遇到一些组件甚至页面无法显示到问 ... -
Flex 4 设置背景图片 Canvas backgroundImage BitmapFill fillMode
2012-07-02 12:45 974Flex 3中Canvas是可以设置backgroundI ... -
Flex中,跨List实现SHIFT多选的例子
2012-07-02 12:45 622最近工作中遇到的问题,客户要求做这么个东西。还是稍微 ... -
Flex中本地图片上传前的预览
2012-07-02 12:45 784height="345" h ... -
Flex Panel 拖动效果例子
2012-07-02 12:45 6282010-08-06 今天在flex下尝试了下panel ... -
Ext 4 概述(六)之Grid
2012-07-01 10:07 577这次升级Ext 4全部 ... -
也谈jQuery之学习
2012-07-01 10:07 675由于之前一直是做 ... -
Firefox/Chrome下flash的wmode参数设为opaque或transparent时输入文本框中无法输入中文汉字的解决方法
2012-07-01 10:07 783这段时间做个项目 ... -
Flash Builder 4-找不到所需的 Adobe Flash Player
2012-07-01 10:07 663比较懒,比较少上csdn的,如果发现留言给我没有回复,望见 ... -
Flex组件:Style的使用
2012-06-30 16:32 704Flex组件:Style的使用 2010 ... -
Flex中Bindable的原理
2012-06-30 16:32 596Flex中Bindable的原理 2011年11月01日 ... -
Flex AIR)创建“不规则形状”的Air透明窗体
2012-06-30 16:32 890Flex AIR)创建“不规则形状”的Air透明窗体 201 ... -
如何在flex当中使用swc
2012-06-30 16:32 769如何在flex当中使用swc 2 ... -
FLEX和Actionscript开发FLASH游戏7-3
2012-06-30 16:32 416FLEX和Actionscript开发FLASH游戏7-3 ...
相关推荐
深度剖析WinPcap,对Winpcap进行了详细的分析,如packet.dll, wpcap.dll, npf分析等,同时包含了一些例子。
如果你学了Socket网络编程,那么本资料是你网络编程进阶的得力助手,深度剖析WinPcap。
对winpcap技术文档中的分析数据包的源代码进行了详解
winpcap截取指定ip网络数据包并保存 winpcap截取指定ip网络数据包并保存 winpcap截取指定ip网络数据包并保存
利用c++编程,捕获局域网的arp数据包
Winpcap中的数据过滤方法.pdf 基于WinPcap包捕获算法的实现.pdf 基于Winpcap的数据包捕获和协议分析系统的设计与实现.pdf 基于WinPcap的网络数据解析及其实现.pdf 使用Winpcap开发网络数据包分析器.pdf 以太网数据包...
一个基于winpcap的数据包回放程序,c++编写,要求从本地打开pcap文件并且发送出去,同时捕获发送出去的数据并且打印出来 同一台主机收发 以太网数据,ARP协议 还有就是直接用mac地址收发 Win32控制台,就显示目的地址...
打开本地网卡,捕获流经本地的数据包;通过以太网类型确定上层协议、源以太网地址和目的以太网地址,分析上层IP协议和TCP协议,并在控制台输出详细信息。
基于WinPcap的网络数据包捕获与分析
利用winpcap发送数据包.比较实用
VC_实现基于Winpcap的网络数据包捕获与分析
深入剖析WINPCAP. WinPcap 本身带有内核的协议驱动程序NPF、用户层的库packet.dll与wpcap.dll,常用的嗅探软件Wireshark在Windows平台下是基于WinPcap库实现的。通过对WinPcap与Wireshark源代码的分析,至少可带来...
winpcap发送数据包的例子.....................
基于WinPcap的网络数据包捕获与分析源码C++源码,包括文档详细解释
winpcap抓报例子 winpcap获取网络数据包,需要安装WinPcap_4.0
使用winpcap截获ipv4和ipv6数据包
vc++开发 winpcap获取网络数据包,winpcap 信息截获是基于windows的网络编程,需要安装wincap4.0
其中包括WinPcap内核驱动,编译与使用,数据包的捕获、发送、内核过滤与接收,以及网络流量的统计与网络状态的分析等重要内容,而且作者还通过修改内核级的源代码解决了开源代码本身尚未完成的一个重要功能――...
通过winpcap抓取数据包,并且分析数据报的内容