使用Winpcap示例程序的时候解疑
- 格式:doc
- 大小:180.50 KB
- 文档页数:6
使用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之(序言)——分析WinPcap源代码的缘由过去我一直在开发软件,包括Windows操作系统的应用软件,Linux操作系统的应用软件与驱动程序,也开发过一些嵌入式软件,并在后来的工作中逐渐专注于对软件的测试工作,主要从事软件测试技术与测试方法、软件工程的研究。
在此过程中与其他开发人员、测试人员一同工作,帮助他们构建达到工业级标准的软件,或者指导他们提高软件开发或测试的技术水平。
随着不断的遇见问题、解决问题,我也在思考一个问题:那就是软件开发人员与软件测试人员除了对应用程序需要清晰的理解之外,是否还需要对支撑应用软件运行的操作系统,共享库等有深入的了解?下面通过我亲身经历的两个案例来考虑该问题:案例1:嗅探软件掉包问题某自行开发的网络数据包嗅探软件,在对被测试设备进行数据包分析时,发现有掉包现象,但待测设备运行正常。
经过仔细分析,发现该嗅探软件设计有如下问题:针对高速网络流量,从软件架构上就没考虑到如何防止掉包的问题。
软件开发人员对该嗅探软件进行各种优化,比如增加缓冲区的大小,降低显示的复杂度、分析代码性能瓶颈,但都改善不大。
通过对所调用WinPcap库的仔细分析,获得下列解决方案:让WinPcap的内核驱动程序NPF实现协议过滤,而不是通过嗅探软件进行过滤,同时就在内核实现数据包的存储,而不导入应用层后进行存储。
该案例提醒我们,在测试人员开发测试工具时,需要对所用的支撑软件有深入的了解,才能更好的解决所遇到的实际问题。
内核层的过滤与转储功能是WinPcap的NPF驱动程序提供的优化功能,就是解决高速网络流量掉包问题的。
案例2:AD数据采集系统掉点问题某AD数据采集系统,基于嵌入式Linux系统实现,对所采集的数据进行分析,出现掉点现象。
经过仔细调试发现采样率还不到所要求一半时就开始出现掉点现象,采样率越高掉点现象越严重。
项目组相关人员对Linux驱动程序的机制了解不够深入,应用层软件开发人员对软件进行各种调优,收效甚微,曾一度怀疑是文件系统存储速度慢或硬件问题导致,项目陷入困境。
深度剖析WinPcap之WinPcap简介WinPcap是Windows平台下访问网络数据链路层的开源库,该库已达到工业标准的应用要求。
WinPcap允许应用程序绕开网络协议栈来捕获与传递网络数据包,并具有额外的有用特性,包括内核层的数据包过滤、一个网络统计引擎与支持远程数据包捕获。
1.1. 什么是WinPcap大多数网络应用程序通过被广泛使用的操作系统原语来访问网络,诸如sockets。
操作系统已经处理了底层的细节问题(如协议处理,数据包的封装等),并提供与读写文件类似的、熟悉的接口,这使得用该方法可以很容易的访问网络中的数据。
然而有些时候,这种“简单的方式”并不能满足任务要求,因为有些应用程序需要直接访问网络中的数据包。
也就是说,应用程序需要访问网络中的“原始”数据包,即没有被操作系统使用网络协议进行处理过的数据包。
WinPcap的目的就是为Win32应用程序提供这种访问方式。
WinPcap提供下列功能:•捕获原始数据包,无论是发送到运行WinPcap机器上的数据包,还是在其它主机(共享介质)上进行交换的数据包•在数据包分派给应用程序前,根据用户指定的规则过滤数据包•将原始数据包发送到网络•收集网络流量的统计信息1.2. WinPcap的优点自由 WinPcap遵循BSD open source licence发布。
这意味着你的应用程序拥有全部自由来修改与使用它,即使应用程序是商业化的。
高性能WinPcap实现了有关数据包捕获文献中描述的所有典型的优化方法(比如内核级的过滤与缓冲,减少上下文交换,数据包部分内容复制),加上一些原创的优化方法,如JIT过滤器编辑(JIT filter compilation)与内核级的统计过程。
因为这些原因,WinPcap胜过其它可比的方法。
普及WinPcap被许多工具作为网络接口使用——无论是自由软件还是商业软件。
包括网络协议分析器、网络监视器、网络入侵检测系统、网络嗅探器、网络流量生成器、网络测试器等等。
sniffer技术原理及应用,包括编程方法和工具使用 2005-8-3 来源:warton很久没有更新专栏了,关键是写不出什么好东西,也怕大家见笑!虽然我还没被人骂过,但我见过别人被人骂,哎。
不是说,这在csdn好像很正常哈!今天把这个贴子整理一下,这本是专题开发版的一个专题讨论贴:/Expert/topic/2333/2333459.xml?temp=.3382532,其实这个贴子也没有挖出更深入的东西,关键是专题版目前人气不太好吧。
我发这个贴是希望更多的人能到专题版,参与和组织讨论,但结果并不是太理想。
kingzai:sniffer中文翻译过来就是嗅探器,在当前网络技术中使用得非常得广泛。
sniffer既可以做为网络故障的诊断工具,也可以作为黑客嗅探和监听的工具。
最近两年,网络监听(sniffer)技术出现了新的重要特征。
传统的sniffer技术是被动地监听网络通信、用户名和口令。
而新的sniffer技术出现了主动地控制通信数据的特点,把sniffer技术扩展到了一个新的领域。
Sniffer 技术除了目前在传统的网络侦测管理外,也开始被应用在资讯保全的领域。
可以这样说,sniffer技术是一把双刃剑,如何更好的利用它,了解它的一些特性,将能使这项技术更好的为我们带来便利。
sniffer的编程方法比较通用的有以下几种,1.winpcap 这是一个比较通用的库,相信做过抓包的工具大多数人都不会太陌生 2.raw socket 在2000以后的版本都支持此项功能,2000 server有个网络监视器就是基于raw socket 3.tdi,ndis,spi,hook socket技术,这种技术比较大的不同是,可以将包截取而不是仅仅获得包的一份拷贝。
总的说来,一般以前两者居多。
我这里提的都还比较片面,更多的需要大家来补充。
我办这个专题的目的是希望大家共同来了解,讨论sniffer技术,让更多的人参与进来,让大家知道,这个板块能够给大家带来真正想要的东西warton:libpcap是个好东西,linux,windows下都能用,很多入侵检测之类的安全系统都是以这为核心。
实验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的网络数据包捕获与分析一、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)、一个底层的动态连接库()和一个高层的不依赖于操作系统的静态库()共三个部分构成。
这里,NPF在操作系统的内核级,、在用户级。
1)数据包监听设备驱动程序Array技术实现上,为了实现抓包,系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包(rawpacket)。
这就要求WinPcap的一部分运行在操作系统核心内部,直接与网络接口驱动交互。
由于这个部分是系统依赖(system dependent)的,在Winpcap的解决方案中它被视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。
图1.1 WinPcap的组成和结构2)底层的动态连接库()和高层静态库()为了方便编程,WinPcap必须提供一个编程接口(API),这就是WinPcap的底层的动态连接库()和高层静态库()。
Winpcap使用介绍Winpcap使用介绍Winpcap简介Winpcap(windowspacketcapture)是在Win32平台上的强大的、有较好扩展性的底层网络分析体系结构,是Unix下的lipbcap移植到windows下的产物,是Win32环境下数据包捕获的开放代码函数库。
Winpcap是第一个Win32开放式的捕获包的体系结构,能够支持大多数应用程序的需要。
如图A-1所示,Winpcap包含了一个内核级的数据包过滤器——NPF(NetgroupPacketFilter)、一个底层动态链接库(Packet.dll)和一个高层的独立于系统的库(Wpcap.dll)。
这三个模块中,NPF属于内核级,其他两模块属于用户级。
图A-1Winpcap的结构图NPF模块过滤数据包,将数据包不做任何改动的传递给用户,它还包含了一些操作系统专用代码(如:时间戳管理)。
Packet.dll模块提供了Win32平台下的捕获包的驱动接口。
实际上,不同版本的Windows都提供了不同的内核模块和应用程序之间的接口函数,Packet.dll有一套独立于系统的API来处理这些差异。
基于Packet.dll编写的程序可以不经过重新编译就在各种Win32平台下实现捕获数据包。
Packet.dll还包含了其他一些函数。
它可以进行一些底层的操作,Packet.dll和NPF都依赖于操作系统,并且由于Windows95/98和WindowsNT/2000之间操作系统结构的不同而在不同版本的操作系统上有所不同。
Wpcap.dll库不依赖于操作系统,并且它包含了一些其它高层的函数,比如:过滤器生成器、用户定义的缓冲区和高层特性(数据统计和构造数据包)。
Winpcap提供的功能包括四个方面:捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;在网络上发送原始的数据包;收集网络通信过程中的流量信息。
客户端常见问题的解决方法简要目录1.安装首次使用错误2.日常维护错误3.常见客户端错误提示代码表4.兼容性问题5.关于PPOE插件程序被Vista系统相关软件阻止的说明1.安装首次使用错误为了确保客户端软件的正确安装,安装之前最好禁用杀毒软件和防火墙,待安装结束后再重新打开!!!●安装过程中没有提示错误,但是双击打开客户端登陆软件程序报“无法启动此程序,因为系统中packet.dll (或者WanPacket.dll、NPPTooLs.dll) 文件已丢失”错误截图如下:该故障是由于Drcom客户端需要调用wincap控件进行运行,而用户PC电脑之前其他程序也安装了wincap控件(有些软件集成了wincap模块,没有写入反安装或者卸载程序信息),解决办法是找到原有安装信息,先卸载wincap旧版本后,在客户端软件安装目录底下的winpcap文件夹找到wincap的新版本安装程序,重新安装一次就可以解决该问题。
●VISTA安装时候的问题:安装成功后,点击运行Drcom客户端程序出现下图报错:该报错是正常的,因为VISTA操作系统对用户的权限检测极为严格,安装后直接运行客户端,由于没有获得相应的(管理员权限)就会提示该错误,退出后,再运行Drcom客户端程序,或者重启电脑后再运行Drcom客户端程序(权限已经提升)就没有这个问题了。
2.日常维护错误当出现无法正常上网时,请先检查客户端安装目录下的“drcomdll.log”文件,在当前时间内对应的内容如下示例时才可正常上网:15:28:17 4.0.0.104015:28:17 Intel(R) PRO/100 VE Network Connection - 数据包计划程序微型端口如果有其他提示,请按提示检查:21:50:14 proxy service SharedAccess found!21:50:14 proxy service Ipnat found!21:50:16 proxy service SharedAccess found!21:50:16 proxy service Ipnat found!21:50:16 发现Windows NAT代理软件!如有上述提示,客户端自动掉线,经过排查,系统确实没有使用代理软件,有可能是误报.因此,经过研发检查,有可能跟以下因素有关:●Window系统自带的防火墙,一般使用客户端后建议用户都把windows系统自带的防火墙停用,让杀毒软件来进行监控;●实际上windows服务也会导致误报,一般来讲都建议关闭该服务(改成手工运行)建议关闭的服务如下图所示:该服务是微软的互联网共享服务,不同系统会少许差异一般都建议关闭该服务!避免引起客户端误判。
实验四编写协议解析器程序一、实验要求及目的使用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。
创建一个使用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是一种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的优势在于其能够让用户获得更加细致的网络数据,通过协议分析和安全检测等手段更好地保障网络安全。
同时,由于其跨平台特性,可应用于多种不同的通信工程场景中。
实验一 wireshark抓包工具使用[实验目的]学习wireshark抓包工具的使用了解wireshark抓包工具的功能通过学习,进一步理解协议及网络体系结构思想[实验原理]Wireshark是网络包分析工具。
网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。
主要应用:网络管理员用来解决网络问题网络安全工程师用来检测安全隐患开发人员用来测试协议执行情况用来学习网络协议[实验内容]下载WIRESHARK,学习工具的使用和功能。
[习题与思考题]1、网络工程师能通过WIRESHARK做哪些工作?书名2实验二 WINPCWP编程[实验目的]了解WINPCAP的架构学习WINPCAP编程[实验原理]WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。
这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。
然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。
也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。
WinPcap产生的目的,就是为Win32应用程序提供这种访问方式;WinPcap提供了以下功能1.捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的2.在数据包发送给某应用程序前,根据用户指定的规则过滤数据包3.将原始数据包通过网络发送出去4.收集并统计网络流量信息章名3以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。
所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。
这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。
Winpcap使⽤前⾔随着⽹络⼊侵的不断发展,⽹络安全变得越来越重要,于是⽹络⼊侵取证系统的研究也变得⽇益重要。
在⽹络⼊侵取证系统中,对⽹络上传送的数据包进⾏有效的监听即捕获包是⽬前取证的关键技术,只有进⾏⾼效的数据包捕获,⽹络管理员才能对所捕获的数据进⾏⼀系列的分析,从⽽进⾏可靠的⽹络安全管理。
1winpcap简介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-API的不同的功能,它作为一个使用指南被划分为一系列的课时来带领读者循序渐进的体会PCAP的程序设计的魅力:从简单的基本功能(如获取网卡的列表,数据包的捕获等)到统计和收集网络流量等高级功能。
在这里将提供一些简单但完整的代码作为参考:所有的这些原代码都有和它相关的详细信息的连接以便单击这些功能和数据结构时能够即使跳转到相关的文献。
这些例子是用C语言写的,所以在学习之前首先要有一定的C语言的基础,当然PCAP作为一个网络底层的驱动,要想学好它也必须具备一定的网络方面的知识。
(一)得到网络驱动列表用PCAP写应用程序的第一件事往往就是要获得本地的网卡列表。
PCAP提供了pcap_findalldevs()这个函数来实现此功能,这个API返回一个pcap_if结构的链表,链表的每项内容都含有全面的网卡信息:尤其是字段名字和含有名字的描述以及有关驱动器的易读信息。
得到网络驱动列表的程序如下:#include "pcap.h"main() {pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];/* 这个API用来获得网卡的列表*/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(i==0) {printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return;}/* We don't need any more the device list. Free it */pcap_freealldevs(alldevs);}有关这段程序的一些说明:首先pcap_findalldevs()同其他的libpca函数一样有一个errbuf参数,当有异常情况发生时,这个参数会被PCAP填充为某个特定的错误字串。
循序渐进学习使用WINPCAP(八)尽管WinPcap从名字上来看表明它的主要目的是捕获数据包,但是它还为原始网络提供了一些其它的功能,其中之一就是用户可以发送数据包,这也就是本节的主要内容。
需要指出的是原来的libpcap并不提供数据包的发送功能,这里所说的功能都是WinPcap的扩展功能,所以并不能够工作在UNIX下。
用pcap_sendpacket来发送一个数据包下面的代码是一个最简单的发送数据的方法。
打开一个适配器后就可以用pcap_sendpacket()来手工发送一个数据包了。
这个函数需要的参数:一个装有要发送数据的缓冲区,要发送的长度,和一个适配器。
注意缓冲区中的数据将不被内核协议处理,只是作为最原始的数据流被发送,所以我门必须填充好正确的协议头以便正确的将数据发送。
#include "pcap.h"int main(int argc, char **argv){pcap_t *fp;char error[PCAP_ERRBUF_SIZE];u_char packet[100];int i=0,inum;pcap_if_t *alldevs,*d;/* 获得网卡的列表*/if (pcap_findalldevs(&alldevs, error) == -1){ fprintf(stderr,"Error in pcap_findalldevs: %s\n", error);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(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");pcap_freealldevs(alldevs); /* Free the device list */return -1;}/* 找到要选择的网卡结构*/for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);/* 打开选择的网卡*/if((fp = pcap_open_live(d->name, 100, 1, 1000, error) ) == NULL){fprintf(stderr,"\nError opening adapter: %s\n", error);return -1;}/* 假设网络环境为ethernet,我门把目的MAC设为1:1:1:1:1:1*/packet[0]=1; packet[1]=1; packet[2]=1;packet[3]=1; packet[4]=1; packet[5]=1;/* 假设源MAC为2:2:2:2:2:2 */packet[6]=2; packet[7]=2; packet[8]=2;packet[9]=2; packet[10]=2; packet[11]=2;/* 填充发送包的剩余部分*/for(i=12;i<100;i++){ packet[i]=i%256;}/* 发送包*/pcap_sendpacket(fp,packet, 100);return 0;}发送队列:pcap_sendpacket()只是提供一个简单的直接的发送数据的方法,而发送队列提供一个高级的强大的和最优的机制来发送一组数据包,队列实际上是一个装有要发送数据的一个容器,它有一个最大值来表明它所能够容纳的最大比特数。
TCP/IP协议的安全隐患造成操作系统漏洞的一个重要原因,就是协议本身的缺陷给系统带来的攻击点。
网络协议是计算机之间为了互联共同遵守的规则。
目前的互联网络所采用的主流协议TCP/IP,由于在其设计初期人们过分强调其开发性和便利性,没有仔细考虑其安全性,因此很多的网络协议都存在严重的安全漏洞,给Internet留下了许多安全隐患。
另外,有些网络协议缺陷造成的安全漏洞还会被黑客直接用来攻击受害者系统。
本文就TCP/IP协议自身所存在的安全问题和协议守护进程进行了详细讨论,指出针对这些安全隐患的攻击。
TCP协议的安全问题TCP使用三次握手机制来建立一条连接,握手的第一个报文为SYN包;第二个报文为SYN/ACK 包,表明它应答第一个SYN包同时继续握手的过程;第三个报文仅仅是一个应答,表示为ACK包。
若A放为连接方,B为响应方,其间可能的威胁有:1. 攻击者监听B方发出的SYN/ACK报文。
2. 攻击者向B方发送RST包,接着发送SYN包,假冒A方发起新的连接。
3. B方响应新连接,并发送连接响应报文SYN/ACK。
4. 攻击者再假冒A方对B方发送ACK包。
这样攻击者便达到了破坏连接的作用,若攻击者再趁机插入有害数据包,则后果更严重。
TCP协议把通过连接而传输的数据看成是字节流,用一个32位整数对传送的字节编号。
初始序列号(ISN)在TCP握手时产生,产生机制与协议实现有关。
攻击者只要向目标主机发送一个连接请求,即可获得上次连接的ISN,再通过多次测量来回传输路径,得到进攻主机到目标主机之间数据包传送的来回时间RTT。
已知上次连接的ISN和RTT,很容易就能预测下一次连接的ISN。
若攻击者假冒信任主机向目标主机发出TCP连接,并预测到目标主机的TCP序列号,攻击者就能伪造有害数据包,使之被目标主机接受。
IP协议的安全问题IP协议在互连网络之间提供无连接的数据包传输。
IP协议根据IP头中的目的地址项来发送IP数据包。
使用Winpcap示例程序的时候,会出现很多错误(转)WINPCAP编程环境设置2008-05-19 12:41一、WINPCAP编程环境设置在正式WinPcap编程之前,要配置运行环境。
1、运行环境设置Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:wpcap.dll Packet.dll WanPacket.dll pthreadVC.dll这四个动态链接库在WinPcap驱动程序里。
如果没有这个驱动程序,需要到WinPcap官方网站上下载,下载地址为: 如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。
也可以不安装WinPcap驱动程序。
但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下。
(似乎有些问题)2、配置编程环境。
1> 从上下载WINPCAP SDK -WpdPack,WinPcap SDk里面包含库文件,头文件,文档文件和一些例子。
解压到一个指定的目录。
解压缩后把Include目录添加到IDE的包含文件中(VC6.0 Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录); lib目录添加为新的库文件目录(VC6.0Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录)如下图所示。
2> 如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加pcap.h包含文件(或者在引用的文件中),即#include “pcap.h”也许会出现下面的错误:fatal error C1083: 无法打开包括文件:“pcap.h”: No such file or directory这个错误表明找不到pcap.h文件,这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件,所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK,并按步骤1添加到项目中。
3> 在程序中添加wpcap.lib。
如果出现下面错误error LNK2019: 无法解析的外部符号_pcap_findalldevs_ex,该符号在函数XXX 中被引用,如果发生上面的错误就表明缺少库文件,需要添加wpcap.lib到工程中(VC6.0 Project->Settings->Link->Object/library modules; VS 2003/2005 项目->添加现有项->所有文件)如下图所示:4> 新的版本里WinPcap支持远程数据包获取,所以还应当添加一个头文件remote-ext.h ,即#include "remote-ext.h"(记住这条语句要放在#include “pcap.h”之后,否则会出错!)否则会发生下面的错误error C2065: “PCAP_SRC_IF_STRING”: 未声明的标识符error C3861: “pcap_findalldevs_ex”: 找不到标识符error C2065: “PCAP_OPENFLAG_PROMISCUOUS”: 未声明的标识符error C3861: “pcap_open”: 找不到标识符5> 或者不用添加#include "remote-ext.h".在提供的IDE环境中,可以通过执行“项目”菜单中的的“属性”进入该项目的属性配置页,通过选择“配置属性”树中的“C/C++预处理哭”选项就增加’WPCAP’和’HAVE_REMOTE’两个标号。
如下图所示:6> 如果还有问题,可以到WinPcaP官方网站上找FAQ。
二、WINPCAP编程入门利用WINPCAP捕获数据包一般要经过以下几个步骤1、获取网络接口列表通常, 一个基于WinPcap的应用程序所要做的第一件事, 就是获得适合的网络接口的列表.pcap_findalldevs()(或者pcap_findalldevs_ex())函数就是干这活的: 这个函数返回一个pcap_if结构的列表, 每个元素都记录了一个接口的信息. 其中, name和description以人类可以阅读的形式, 记录了设备的信息.2、获取设备的高级信息WinPcap 也可以为我们提供关于接口的更多信息. 由pcap_findalldevs() 函数返回的pcap_if 结构也包含了一个pcap_addr 结构的列表, 它记录了以下信息:1. 接口的地址列表2. 接口的掩码列表(与地址列表一一对应)3. 接口的广播地址列表(与地址列表一一对应)4. 目标地址列表(与地址列表一一对应)3、打开一个接口并捕捉流量现在我们已经知道如何获取一个接口的有关信息了, 我们可以来点真家伙了-- 打开一个接口并捕捉流量. 接下来我们会编译一个程序, 它将捕捉网络中所有的数据包并输出他们的一些相关信息。
我们使用函数pcap_open_live() 来打开一个捕捉设备. 这里, 我们需要解释一下snaplen, promisc 和to_ms 参数.函数原型: pcap_t * pcap_open_live (char *device, int snaplen, int promisc, int to_ms, char*ebuf)"snaplen" 参数指定了要捕捉的数据包的部分. 在某些操作系统中(如xBSD 和Win32), 驱动程序提供了只捕捉每个数据包其中一部分的可能性: 这样就降低了要处理的数据的量, 从而提高了捕捉程序的效率. 在例子中, 我们使用一个高出MTU 最大值的值(65536) 以确保可以捕捉到成个数据包."promisc" =1表明接口将会被设置为混杂模式. 一般情况下, 接口只处理目标地址为自己的数据; 到其他主机的数据包将会被忽略. 然而当一个接口处于混杂模式时, 它将会处理全部的流量: 也就是说, 在共享媒介, 例如非交换型以太网(比如基于集线器的网络)中, WinPcap 可以捕捉到所有主机的数据包. 混在模式是多数捕捉程序的默认模式, 所以我们在例子中也采用这种模式."to_ms" 用以设置超时, 单位是毫秒. 一个从接口读取( Y- 捕捉) 的操作, (例如pcap_dispatch() 或者pcap_next_ex()), 如果没有捕捉到数据包, 那么在超过指定的时间以后就会返回. 进一步说, 如果接口处在静态模式中, to_ms 也定义了静态报告的间隔时间(参阅"Gathering Statistics on the network traffic " 以获取更多信息). 设置to_ms 为0, 则说明永远不会超时, 如果没有数据包到达, 那么捕捉操作将会永远不会返回, 而将其值设置为-1 则会立刻返回.以上取与网络中的环境配置。
事实上还有许多错误,需要解决。
如:错误 3 error C3163: “_vsnprintf”: 属性与以前的声明不一致d:\program files\microsoft visual studio 9.0\vc\include\stdio.h 358 iflist有人说解决办法是这个:"VC9 CRT 的vsnprintf 与其他第3方定义的冲突,导致VS2008 编译错误"error C3163: '_vsnprintf': attributes inconsistent with previous declaration比如wpdpack\include\pcap-stdinc.h定义了,要注释掉//#define vsnprintf _vsnprintf或#if _MSC_VER < 1500#define snprintf _snprintf#define vsnprintf _vsnprintf#endif但是并没有发现可以解决问题。
最后解决办法是这个:没这么麻烦!既然PCAP.h包的stdio.h的头文件有问题,就先把stdio.h包进来。
就这样:#include <stdio.h>#include <pcap.h>不是头文件有问题,只是winpcap对系统的stdio.h进行了重定议,两个版本间出现了一点小小的磨擦.4、有时即便是按上面的方法都做了也解决不了,比如我这次就是还出现下面的问题:错误 3 error LNK2019: 无法解析的外部符号_pcap_loop,该符号在函数_wmain 中被引用……错误8 error LNK2019: 无法解析的外部符号_pcap_freealldevs,该符号在函数_wmain 中被引用但是我用了下面的语句即可解决了:#pragma comment(lib, "wpcap.lib")5、如果出现下面的问题:错误 3 error LNK2019: 无法解析的外部符号 __imp__ntohs@4,该符号在函数"void __cdecl packet_handler(unsigned char *,struct pcap_pkthdr const *,unsigned char const *)"(?packet_handler@@YAXPAEPBUpcap_pkthdr@@PBE@Z) 中被引用用下面的语句即可解决了:#pragma comment(lib, "ws2_32.lib")。