深度剖析WinPcap之(八)——打开与关闭适配器(3)
- 格式:doc
- 大小:50.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之(三)——所涉及的Windows驱动基础知识1.1 Windows驱动的基础知识本节主要描述在WinPcap的NPF中经常使用一些编写Windows驱动程序所需掌握的部分基础知识,以便于后面的理解。
1.1.1 驱动对象(DRIVER_OBJECT)每个驱动程序都有唯一的驱动对象与之对应,该驱动对象在驱动程序被加载时由内核的对象管理程序所创建。
驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动程序的一个实例被内核加载,对一个驱动程序内核I/O管理器只加载一个实例。
驱动对象数据结构在wdm.h文件中的定义如下。
typedef struct _DRIVER_OBJECT {CSHORT Type;CSHORT Size;/**DeviceObject为每个驱动程序所创建的一个或多个设备对象链表,*Flags提供一个扩展的标识定位驱动对象*/PDEVICE_OBJECT DeviceObject;ULONG Flags;/*下列各成员字段描述驱动程序从哪儿被加载*/PVOID DriverStart;ULONG DriverSize;PVOID DriverSection;PDRIVER_EXTENSION DriverExtension;/**DriverName成员被错误日志线程用来*确定一个I/O请求越界的驱动名称*/UNICODE_STRING DriverName;/*指向注册表中硬件信息的路径*/PUNICODE_STRING HardwareDatabase;/**如果驱动支持“fast I/O”,*就指向一个“fast I/O”的派遣函数数组*/PFAST_IO_DISPATCH FastIoDispatch;/**描述该特定驱动的入口点。
*主函数(major function)派遣函数表必须是对象最后的成员,*因此它仍然是可扩展的*/PDRIVER_INITIALIZE DriverInit;PDRIVER_STARTIO DriverStartIo;PDRIVER_UNLOAD DriverUnload;PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];} DRIVER_OBJECT;typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;下面分别描述驱动对象中驱动程序可访问的成员。
深度剖析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被许多工具作为网络接口使用——无论是自由软件还是商业软件。
包括网络协议分析器、网络监视器、网络入侵检测系统、网络嗅探器、网络流量生成器、网络测试器等等。
深度剖析(8)版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
http://es lxf.b lo g.51cto.co m/918801/2064201.5.2.1.1PacketOpenAdapterNPF函数函数PacketOpenAdapterNPF()的作用是打开一个使用NPF设备驱动的适配器。
该函数被PacketOpenAdapter()与AddAdapter()作为内部函数调用。
函数原型如下:LPADAPTER PacketOpenAdapterNPF(PCHAR AdapterNameA);参数AdapterNameA字符串包含待打开设备的名称。
函数如果成功,返回一个已经正确初始化的ADAPTER对象的指针。
否则返回NULL。
函数的主要代码如下:LPADAPTER PacketOpenAdapterNPF(PCHAR AdapterNameA){LPADAPTER lpAdapter;…CHAR SymbolicLinkA[MAX_PATH];//NPF_DRIVER_NAME定义为"NPF"CHAR NpfDriverName[MAX_WINPCAP_KEY_CHARS] = NPF_DRIVER_NAM E;CHAR NpfServiceLocation[MAX_WINPCAP_KEY_CHARS];/*连接到服务控制管理器*/scmHandle = OpenSCManager(NULL, NULL, GENERIC_READ);if(scmHandle == NULL){//连接到服务控制管理器失败error = GetLastError();}else{/**检查NPF服务是否已经存在,*如果存在则接下来可以分配并初始化ADAPTER对象*///设置NPF服务的注册表位置StringCchPrintfA(NpfServiceLocation, sizeof(NpfServiceLoc ation),"SYSTEM\\CurrentControlSet\\Services\\%s", NpfDriv erName);//检查NPF注册表的键值是已否存在,如果已经存在,//这意味着驱动已经安装,//我们不再需要调用PacketInstallDriver()函数安装驱动程序KeyRes=RegOpenKeyExA(HKEY_LOCAL_MACHINE,NpfServiceLocation,0,KEY_READ,&PathKey);if(KeyRes != ERROR_SUCCESS){//NPF注册表的键值不存在,调用PacketInstallDriver()函数Result = PacketInstallDriver();}else{//NPF注册表的键值已经存在,驱动已经安装Result = TRUE;RegCloseKey(PathKey);}if (Result){ //驱动已经存在,检查NPF服务是否正在运行//打开NPF服务svcHandle = OpenServiceA(scmHandle, NpfDriverName,SERVICE_START | SERVICE_QUERY_STATUS );if (svcHandle != NULL){ //获得服务状态QuerySStat = QueryServiceStatus(svcHandle, &SSta t);if(!QuerySStat || SStat.dwCurrentState != SERVICE_ RUNNING){//获得服务状态失败或驱动NPF没有运行,启动NPF服务if (StartService(svcHandle, 0, NULL)==0){ //如果不是服务正在运行或服务已经存在的状态,//就处理错误,函数返回NULLerror = GetLastError();if(error!=ERROR_SERVICE_ALREADY_RUNNING &&error!=ERROR_ALREADY_EXISTS){//处理错误,函数返回NULL…return NULL;}}}//驱动NPF已正常运行,关闭服务控制管理器的句柄CloseServiceHandle( svcHandle );svcHandle = NULL;}else{//打开NPF服务失败error = GetLastError();SetLastError(error);}}else{if(KeyRes != ERROR_SUCCESS){ //第一次安装驱动程序失败,并且NPF注册表的键值不存在//再次安装驱动Result = PacketInstallDriver();}elseResult = TRUE;if (Result) {//NPF的驱动程序已存在//打开NPF服务svcHandle = OpenServiceA(scmHandle,NpfDriverName,SERVICE_START);if (svcHandle != NULL){//打开NPF服务成功,获取NPF服务的状态QuerySStat = QueryServiceStatus(svcHandle, &SSt at);if(!QuerySStat ||SStat.dwCurrentState != SERVICE_RUNNING){//获得服务状态失败或驱动NPF没有运行,启动N PF服务if (StartService(svcHandle, 0, NULL)==0){//如果不是服务正在运行或服务已经存在的状态,//就处理错误,函数返回NULLif(error!=ERROR_SERVICE_ALREADY_RUNNING &&error!=ERROR_ALREADY_EXISTS){…return NULL;}}}//驱动NPF已正常运行,关闭服务控制管理器的句柄CloseServiceHandle( svcHandle );svcHandle = NULL;}else{//打开NPF服务失败,设置错误状态error = GetLastError();SetLastError(error);}}}}if (scmHandle != NULL) //关闭服务控制管理器的句柄CloseServiceHandle(scmHandle);/*分配ADAPTER结构体的的内存空间 */lpAdapter=(LPADAPTER)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZERO INIT,sizeof(ADAPTER));if (lpAdapter==NULL){//分配失败,函数返回NULL;…return NULL;}//设置单个数据包发送的次数为一次lpAdapter->NumWrites=1;//从原始的设备名创建NPF设备的名称#define DEVICE_PREFIX "\\Device\\"if (LOWORD(GetVersion()) == 4){//操作系统为Windows NT 4.0、Windows 95、Windows 98、或 Wi ndows Me的处理…}else{if (strlen(AdapterNameA) > strlen(DEVICE_PREFIX)){StringCchPrintfA(SymbolicLinkA, MAX_PATH,"\\\\.\\Global\\%s", AdapterNameA + strlen(DEVICE_ PREFIX));}else{ZeroMemory(SymbolicLinkA, sizeof(SymbolicLinkA));}}---------------待续---------------------------------本文出自“千江月” 博客,请务必保留此出处/918801/ 206420。
实验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,当时翻译了一点,现在打算把这个工作完成了。
我的水平比较差,翻译的很不到位,不过对于初次接触winpcap的人应该还是有点帮助吧。
不过不知道我这样来翻译是不是侵犯了人家的版权?如果有这个嫌疑,请大家告诉我,我对这方面的法律不是很了解。
建议对这方面有兴趣的人还是去下载文档和资料看。
下面开始吧:WinPcap tutorial: a step by step guide to using WinPcap详细说明这部分展示了怎样使用WinPcap API。
这个教程通过一系列的课程,从基本的函数(取得网卡列表,开始抓包,等等)到最高级的应用(处理数据包包发送队列和统计网络流量),一步一步地教会读者如何用WinPcap来编程。
这里提供了几个虽然简单但却完整的程序段作为参考:所有的源代码都有其余部分的链接,只需要点击一下函数和数据结构就可以跳转到相应的文档。
这些例子都是使用c语言写的,所以在读本教程前要了解一些基本的c语言的知识。
而且,这是一个关于处理原始网络包的库的教程,所以假定读者具有良好的网络和网络协议方面的知识。
WinPcap tutorial: a step by step guide to using WinPcap(1)获取网络设备列表基本上所有基于Winpcap的应用程序所做的第一件事情都是获取一个已经绑定的网卡列表。
为此,libcap和winpcap都提供了pcap_findalldevs_ex()函数:这个函数返回一个指向pcap_if结构的链表,其中的每一项都包含了一个已经绑定的适配器的全部信息。
其中name 和description这两项分别包含了相应设备的名称和描述。
下面的代码取得适配器列表并在屏幕上显示出来,如果适配器没有被发现就把显示错误。
#i nclude "pcap.h"main(){pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];/* 取得本机的网络设备列表*/if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* 这个参数在这里不需要*/, &alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);exit(1);}/* 显示列表*/for(d= alldevs; d != NULL; d= d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return;}/* We don't need any m ore the device list. Free it */pcap_freealldevs(alldevs);}关于这段代码的说明。
pcap原理
PCAP(Packet Capture)是一种捕获代理网络数据包的技术。
它是网络编程中非常重要的一种技术,可以帮助开发人员分析、调试和研究网络协议。
PCAP通常用于抓取广域网(WAN)或局域网(LAN)上的数据包,以帮助管理员、开发人员进行网络故障诊断与分析。
在计算机网络中,数据是以数据包的形式传输的。
当一个计算机从网络上接收到数据包时,它会把数据包交给操作系统,而操作系统需要将数据包传递给应用程序,以便进行二次开发或分析。
在这个过程中,操作系统需要使用一定的技术来对数据包进行捕获和处理。
而PCAP就是一种捕获和处理网络数据包的技术。
PCAP技术基于操作系统内核层的实现来进行数据包的捕获。
在Linux中,内核中实现了一个Packet Socket接口,用于向用户程序提供数据包的捕获和发送功能。
Windows中则是使用WinPcap或Npcap等第三方库来实现PCAP功能。
PCAP技术可以捕获数据包并进行多种操作,例如过滤、深度分析等。
通过PCAP 技术,开发人员或管理员可以对数据包进行捕获和分析,以便定位网络问题,或优化网络性能。
常见的分析工具包括Wireshark等,通过这些工具的分析,可以有效的发现网络问题,快速解决故障。
总的来说,PCAP技术已经成为了一个网络开发人员不可缺少的技能。
掌握PCAP 技术可以帮助开发人员更全面地了解网络协议和通信机制,定位网络问题,提高
网络性能,同时可以提升工作效率和开发速度。
WinPcap 原理技术winpcap是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
1、网络及协议分析2、网络监控3、通信日志记录4、traffic generators5、用户级别的桥路和路由6、网络入侵检测系统(NIDS)7、网络扫描8、安全工具WinPcap导入WinPcap是一个开源的专业网络数据捕获开发包,其实,WinPcap的强大功能并不仅限于数据包的获取,主要功能:捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;在网络上发送原始的数据包;收集网络通信过程中的统计信息。
Sniffer 嗅探原理Winpcap是针对Win32平台上的抓包和网络分析的一个架构。
它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)Packet.dll提供更方便更易用的编程接口,wpcap.dll中的接口函数Sniffer嗅探器,是一种基于被动侦听原理的网络分析方式。
使用这种技术方式,可以监视网络的状态、数据流动情况以及网络上传输的信息。
当信息以明文的形式在网络上传输时,便可以使用网络监听的方式来进行攻击。
将网络接口设置在监听模式,便可以将网上传输的源源不断的信息截获。
Sniffer技术常常用于网络故障诊断、协议分析、应用性能分析和网络安全保障等各个领域。
实现Sniffer 功能函数序列第一步:获取网络设备指针pcap_findalldevs_ex()第二步:打开网卡pcap_open()第三步:检查链路层pcap_datalink()第四步:编译BPF过滤规则pcap_compile第五步:设置过滤规则pcap_setfilter第六步:注册回调函数,循环捕获数据包pcap_loop()第七步:释放网络设备列表pcap_freealldevs()第八步:关闭WinPcap会话句柄pcap_close()获取网络设备指针(查找机器的所有网络设备接口,并使用链表结构返回)打开网络设备(打开一个用来捕获或发送流量的通用源(网卡))检查链路3层类型(检查链路层类型)编译BFP过滤规则(编译数据包过滤器,将程序中高级的过滤表达式(即过滤规则字符串)转换为能被内核级的过滤引擎所处理的内容)执行过滤规则(把一个过滤器绑定到WinPcap会话句柄)注册回调函数,循环捕获数据包(循环捕获数据包并分析)释放网络设备列表(释放链表空间)关闭WinPcap会话句柄(关闭一个和p关联的文件,并释放资源)数据包分析1.数据包的分析内容数据包(Packet)是TCP/IP协议通信传输中的数据单位,TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。
说明:本系列文章是我阅读winpcap手册后整理的一个学习笔记。
文章中出现的所有代码是我根据winpcap手册中的示例代码进行了学习,并调试通过,其中对部分代码作了修改,关于代码的版权我尊重winpcap手册中的版权说明,如果你使用了本系列文章中的代码而引起任何的版权或造成安全威胁等问题,我将不负任何责任。
下载好了WpdPack_3_2_alpha1.zip(下载地址:/install/bin/WpdPack_3_2_alpha1.zip),解压后除了有文档,例子外还有Include和lib,于是想用TC2来做开发环境,但是编译的时候老是出问题,于是放弃。
后来阅读了Winpcap手册后才知道因为是在windows上开发,所以它推荐用VC++6.0,于是改用VC。
第一个试验是:#include#includeint main() {pcap_if_t *alldevs;pcap_if_t *d;int i = 0;char errbuf[PCAP_ERRBUF_SIZE];/* Retrieve the device list from the local machine*/if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1){printf("Error in pcap_findalldevs_ex: %s\n", errbuf);exit(1);}/* Print the list */for (d = alldevs; d != NULL; d = d->next){/* Print the device’s name */printf("%d. %s", ++ i, d->name);/* Print the device’s dscription */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 0;}/* We don’t need any more the device list. Free it */pcap_freealldevs(alldevs);return 1;}编译的时候又遇到问题——“无法打开pcap.h”。
【winpcap 驱动简介】winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3> 在网络上发送原始的数据包;4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据包。
也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。
因此,它不能用于QoS调度程序或个人防火墙。
目前,wi npcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且M$也已经放弃了对win9x的开发。
因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。
其实winpcap中的面向9x 系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持AN SI编码,而NT系统则提倡使用Unicode编码。
有个软件叫sniffer pro.可以作网管软件用,有很多功能,可监视网络运行情况,每台网内机器的数据流量,实时反映每台机器所访问IP以及它们之间的数据流通情况,可以抓包,可对过滤器进行设置,以便只抓取想要的包,比如POP3包,smtp包,ftp包等,并可从中找到邮箱用户名和密码,还有ftp用户名和密码.它还可以在使用交换机的网络上监听,不过要在交换机上装它的一个软件.还有一个简单的监听软件叫Passwordsniffer,可截获邮箱用户名和密码,还有ftp用户名和密码,它只能用在用HUB网络上著名软件tcpdump及ids snort都是基于libpcap编写的,此外Nma p扫描器也是基于libpcap来捕获目标主机返回的数据包的。
深度剖析版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
http://es lxf.b lo g.51cto.co m/918801/2119691.6.4.1 NPF_CloseBinding函数函数主要释放调用NdisOpenAdapter所建立的绑定与分配的资源。
函数代码实现如下:VOID NPF_CloseBinding(IN POPEN_INSTANCE pOpen){NDIS_EVENT Event;NDIS_STATUS Status;ASSERT(pOpen != NULL);ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);NdisInitializeEvent(&Event);NdisResetEvent(&Event);NdisAcquireSpinLock(&pOpen->AdapterHandleLock);while(pOpen->AdapterHandleUsageCounter > 0){NdisReleaseSpinLock(&pOpen->AdapterHandleLock);NdisWaitEvent(&Event,1);NdisAcquireSpinLock(&pOpen->AdapterHandleLock);}/*现在使用计数为0*/while(pOpen->AdapterBindingStatus == ADAPTER_UNBINDING) {NdisReleaseSpinLock(&pOpen->AdapterHandleLock);NdisWaitEvent(&Event,1);NdisAcquireSpinLock(&pOpen->AdapterHandleLock);}/*现在绑定状态可能为绑定也可能为未绑定*/if (pOpen->AdapterBindingStatus == ADAPTER_UNBOUND) {NdisReleaseSpinLock(&pOpen->AdapterHandleLock);return;}ASSERT(pOpen->AdapterBindingStatus == ADAPTER_BOUND);pOpen->AdapterBindingStatus = ADAPTER_UNBINDING; NdisReleaseSpinLock(&pOpen->AdapterHandleLock);/*执行释放过程*/NdisResetEvent(&pOpen->NdisOpenCloseCompleteEvent);//释放调用NdisOpenAdapter所建立的绑定与分配的资源NdisCloseAdapter(&Status,pOpen->AdapterHandle);//检测是否为挂起状态if (Status == NDIS_STATUS_PENDING){ //挂起,等待NdisOpenCloseCompleteEvent事件,//在完成函数NPF_CloseAdapterComplete中设置该事件NdisWaitEvent(&pOpen->NdisOpenCloseCompleteEvent, 0);}else{;}/*设置绑定状态为未绑定*/NdisAcquireSpinLock(&pOpen->AdapterHandleLock);pOpen->AdapterBindingStatus = ADAPTER_UNBOUND;NdisReleaseSpinLock(&pOpen->AdapterHandleLock);}1.6.4.2 NPF_CloseAdapterComplete函数结束适配器的关闭,为NDIS函数NdisCloseAdapter关联的回调函数,当NIC驱动程序完成一个关闭操作(在NPF_CloseBinding中调用Ndi sCloseAdapter启动关闭操作)后被NDIS调用。
浅谈WinPCap和计算机网络协议来源:dnf连发对于一些协议分析,我们可以借助一些软件的力量。
这里我们就将要为大家讲解一下WinPCap以及计算机网络协议等相关的内容。
那么就让我们先来看看具体的WinPCap的工作原理:系统的开发和应用WinPcap支持Win32平台上信息包的捕获和网络分析,它的主要思想来源于Unix系统中最着名的包截获架构,目前已在许多领域得到了应用,如网络监控、电子监考等㈡103.WinPcap的基本结构由3个模块所组成.(1)内核级的网络组包过滤器(Netgroup PacketFilter,NPF).运行于操作系统内核中的驱动程序,直接与网卡驱动程序进行交互.它的主要功能是过滤数据包,在包上附加时间戳、数据包长度等信息.它直接从数据链路层取得数据包,不加修改地传给运行在用户层的应用程序,也允许用户发送原始数据包.(2)低级动态链接库(Packet.d11).用于在Win32平台上为数据包驱动程序提供一个公共接口,把应用程序和数据包监听设备驱动程序隔离开来,使得程序可以不加修改地在不同Windows系统上运行.(3)高级系统无关库(Wpcap.d11).工作在用户级,和应用程序编译在一起,并使用Packet.dll提供的模块,向应用程序提供完善的监听接口.Wpcap.dll模块与Unix系统下的BSD截获架构提供的Libpeap 库完全兼容,提供了一组功能强大而且跨平台的函数,利用这些函数,可以不去关心适配器和操作系统类型.系统的开发和应用WinPCap向上层的应用程序提供了网络监听的接口,通过这些接口,应用程序可以捕获网络通信中发送或接收的数据包.因此,网络协议实验系统可以利用WinPCap捕获在实际的网络通信中产生的数据包,并以一定的方式展示出来.实验系统的主要目的是要方便对计算机网络协议的理解,因此针对计算机网络的原理和协议,系统在以下2方面着重进行表现.(1)协议分层.目前实际应用的计算机网络都是基于TCPIP体系结构,整个网络协议分为4个层次,从下到上依次为接口层、网际层、传输层和应用层,每层又有若干协议.因此在捕获数据包后按协议进行拆分,把不同的协议数据归于相应的协议分层结构中,并把协议分层以层级的方式表示,从而把网络体系结构原理通过形象和具体的方式表示出来.(2)协议格式.实验系统的主要任务是将数据包中每层协议的数据提取出来,准确界定每个协议的起始和结束,把每个协议的数据标示出来,系统可以根据通信数据,自动分析各协议中每个字段的含义,必须根据具体的通信数据,利用所学的相应网络协议知识进行分析.为了了解协议分层结构的具体实现,本系统在开发时,采用整个数据包的数据完整连续显示,各协议的数据用突出颜色着重显示,通过观察不同协议的数据,可以了解计算机通信中,如何通过多层协议组装成完整的通信数据包.系统对通信数据的处理过程如图2所示.首先利用WinPCap的pcap—findalldevs函数获取计算机的网卡,并把可用的网卡(有的计算机可能有多个网卡)列表显示出来供用户选择.系统提供操作界面让用户选择网卡并设置通信数据包的过滤条件,系统根据用户的设置用WinPCap的pcap—open—live函数打开相应网卡接口,利用pcap—setfilter函数设置过滤条件,然后用pcap—dispatch或pcap—next —ex函数捕获通信数据包,并把数据包列表显示供用户选择.若用户选择某一数据包,系统对该数据包进行拆分,按协议分层的层次,以及各层协议的格式,界定并显示不同协议的数据.系统提供实验报告的一些辅助功能,如生成实验报告的模板,根据选择的计算机网络协议的数据,填人各字段的含义,生成并打印实验报告.实验系统的主界面如图3所示.界面主要包括:①网卡(网络适配器)列表,在上部显示;②捕获的数据包列表,在界面的中间部分显示,列表中显示了数据包的部分关键信息;③各协议及其数据,在最下部显示,这又包括2部分,左边部分显示协议名称,按协议分层的要求进行显示,右部是以十六进制表示的数据包数据,当在左边部分选择协议名称时,右部相应协议的首部数据以红色突出显示.该系统所占资源很少,因此可以在配置不高的计算机上正常运行,唯一的要求是计算机能够连入计算机网络,即使不连入Intemet,在局域网环境中也能方便地开展实验.实验时不需要专门的服务器'也不需要对计算机之间通信作特别设置,安装并运行该系统,只需要正常使用计算机进行适当的网络操作,例如用浏览器浏览学校主页,从而产生一定的网络通信数据包,系统自动捕获这些数据包并进行分析.系统的操作过程很简单,容易掌握,非常适于非计算机专业的使用,该系统已经在我校工业工程专业的"计算机网络技术"课程的实验中使用,效果良好.结语针对高校计算机网络课程的实验,开发了网络协议分析实验系统,以解决网络设备昂贵、更新换代快,教学单位无法拿出足够资金配置专门网络实验室,造成学生实验不足甚至无法实验,从而严重影响到教学质量的问题.利用该系统可以使学生了解计算机网络协议分层及其实现,并开展以太网帧格式分析、IP(目前主要是IPv4)数据包格式分析、IP控制管理协议一ICMP报文格式分析、TCP和UDP数据包分析、Hrll'P协议分析等实验教学内容.在计算机网络课程的教学和实验过程中使用网络协议实验软件系统,可以弥补网络原理教学过程抽象、枯燥的缺点,可以形象化地展示真实网络工作的过程,使学生更深入地理解计算机网络和互联网.。
Winpcap使用介绍1. Winpcap简介Winpcap(windows packet capture)是在Win32平台上的强大的、有较好扩展性的底层网络分析体系结构,是Unix下的lipbcap移植到windows下的产物,是Win32环境下数据包捕获的开放代码函数库。
Winpcap是第一个Win32开放式的捕获包的体系结构,能够支持大多数应用程序的需要。
如图A-1所示,Winpcap包含了一个内核级的数据包过滤器——NPF (Netgroup Packet Filter)、一个底层动态链接库(Packet.dll)和一个高层的独立于系统的库(Wpcap.dll)。
这三个模块中,NPF属于内核级,其他两模块属于用户级。
图A-1 Winpcap的结构图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)收集网络通信过程中的流量信息。
WinpCap的详解(一)首先来百科一下Winpcap是一个什么东东。
Winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
它有如下几个功能:1、捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据;2、在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3、在网络上发送原始的数据包;4、收集网络通信过程中的统计信息。
从上面的功能来看,这个库文件提供了许多的API函数,可以让我们捕获网络上的数据包以及统计网络通信的信息。
为了更直观的反应这个库文件的作用,我们来看看利用这个库文件写出来的一个应用软件,wireshark。
界面如下图所示,这个界面只是捕获数据的一个小界面,里面有很多的设置,有兴趣可以下载一个试试。
他能统计在一个局域网的所有网络信息。
这里面重要一点,需要提醒的是:winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据包。
也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。
也就是说,WinpCap主要功能不能截取网络中的数据,他只能监听里面的数据。
对于WinpCap的结构以及原理,我们自然可以不用理会啦,我们只需要知道他的用途就行啦!一、安装WinpCap1、首先我们来看看如何安装WinpCap这个库,首先是下载WinpCap安装文件,这里有许多的版本,可以在官网上下载,,这里重点提醒一下,特别需要注意一下版本,如果你的版本是4.02,那么你的安装包也必须下载对应的版本,这里特别注意下,你可以下载当前比较稳定的版本。
下载之后安装就ok啦!这里我用的是WinpCap4.02.2、下载WinpCap Develop's Packs,这里我也提供相同的版本WpdPack4.02.3、解压后会得一个目录WpdPack四个子目录:docsExamples-pcapExamples-remoteIncludeLib然后配置VC++tools --> options --> Projects and Solutions --> VC++ Directories :Include files :WpdPackPath\includeLibrary files:WpdPackPath\lib4、经过上面的步骤之后,你的WinpCap应该就安装成功啦,之后就是运行一下里面提供的例程啦,如果有什么问题,就对应的把问题在网上查一查,总体来说有以下几个问题:第一个就是需要在工程的链接库上添加wpcap.lib链接库;第二个就是你的SDK太老了,需要添加更新你的SDK,相应的到官方网站上下载适合你电脑的SDK。
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是不依赖于操作系统的。
深度剖析(5)版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
http://es lxf.b lo g.51cto.co m/918801/2050381.4.2.3pcap_activate_win32函数在函数pcap_create()中把p->activate_op操作句柄设为 pcap_activ ate_win32()函数。
函数pcap_activate_win32()为激活捕捉实例做各种准备工作。
函数的主要代码如下:static int pcap_activate_win32(pcap_t *p){NetType type;/* 初始化WinSock*/wsockinit();/*调用packet.dll的函数PacketOpenAdapter()打开适配器*/p->adapter = PacketOpenAdapter(p->opt.source);if (p->adapter == NULL){//错误,函数返回…}/*调用packet.dll的函数PacketGetNetType()获取网络类型*/if(PacketGetNetType (p->adapter,&type) == FALSE){//错误,函数返回…}/*设置链路类型*/switch (type.LinkType){case NdisMediumWan:p->linktype = DLT_EN10MB;break;case NdisMedium802_3:p->linktype = DLT_EN10MB;/** 这大概是一个真正的以太网捕获;给它数据链路层类型链表设置为DLT_EN10MB与 DLT_DOCSIS,因此一个应用程序可以让你选择它的类型,以防万一正在捕获DOCSIS网络数据包,是由一个Cisco网线调制器终端系统发送到以太网上的(它不发送一个以太网协议头到线上,而是发送原始的DOCSIS数据帧到线上)。
深度剖析(3)
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
http://es lxf.b lo g.51cto.co m/918801/204274
1.4wpcap.dll中相应函数接口的实现
下面对各函数在wpcap.dll中的实现进行详细分析。
1.4.1pcap_open函数
函数首先确认参数source的长度不超过PCAP_BUF_SIZE,然后调用pc ap_parsesrcstr()函数分析源的种类,是文件,本地主机接口还是远程主机接口,并依据不同的源类型作不同的处理。
如果是文件类型,直接调用pcap_open_offline函数处理。
如果是远程主机接口类型,调用pcap_create()创建一个pcap_t结构体,然后调用函数pcap_opensource_remote()通过打开一个远程主机的适配器,最后给pcap_t结构体几个重要成员设置合适的值,包括捕获数据包长度、读取超时,与pcap_startcapture()需要使用的标识。
如果是本地主机接口类型,直接调用pcap_open_live()函数,然后给N PF驱动设置几个标识。
根据需要,可设置禁止回环数据包捕获,还可设置一次读操作所需获得的最小数据长度(字节为单位)。
最后函数返回一个pcap_t结构体指针,供后面的调用使用。
函数主要代码如下:
pcap_t *pcap_open(const char *source,
int snaplen, int flags, int read_timeout,
struct pcap_rmtauth *auth, char *errbuf)
{
char host[PCAP_BUF_SIZE], port[PCAP_BUF_SIZE], name[PCAP_BUF_SIZ E];
int type;
pcap_t *fp;
int result;
/*确认source的长度不超过PCAP_BUF_SIZE*/
if (strlen(source) > PCAP_BUF_SIZE)
{//错误,函数返回
…
}
/*分析源的种类,文件,本地主机接口还是远程主机接口)*/
if (pcap_parsesrcstr(source, &type, host, port, name, errbuf) == -1)
return NULL;
/*依据不同的源类型作不同的处理*/
switch (type)
{
//文件类型,直接调用pcap_open_offline函数处理
case PCAP_SRC_FILE:
fp = pcap_open_offline(name, errbuf);
break;
//远程主机接口类型,打开远程主机的适配器,设置几个重要标识的值。
case PCAP_SRC_IFREMOTE:
//创建pcap_t结构体
fp= pcap_create(source, errbuf);
if (fp == NULL)
{
return NULL;
}
//打开一个远程主机的适配器
result= pcap_opensource_remote(fp, auth);
if (result != 0)
{
pcap_close(fp);
return NULL;
}
//设置捕获数据包长度、读取超时,
//与pcap_startcapture()需要使用的标识。
fp->snapshot= snaplen;
fp->md.timeout= read_timeout;
fp->rmt_flags= flags;
break;
//本地主机接口类型,直接调用pcap_open_live()函数,
//然后给NPF驱动设置几个标识。
case PCAP_SRC_IFLOCAL:
fp = pcap_open_live(name, snaplen, (flags &
PCAP_OPENFLAG_PROMISCUOUS), read_timeout, errbu f);
#ifdef WIN32
//这些标识仅被Windows支持
if (fp != NULL && fp->adapter != NULL)
{
/* 如果需要,禁止回环数据包捕获*/
if(flags & PCAP_OPENFLAG_NOCAPTURE_LOCAL)
{
if(!PacketSetLoopbackBehavior(fp->adapter,
NPF_DISABLE_LOOPBACK))
{ //设置失败,函数返回
…
}
}
/*如果需要,设置一次读操作所需获得的最小数据长度(字节为单位)*/
if(flags & PCAP_OPENFLAG_MAX_RESPONSIVENESS)
{
if(!PacketSetMinToCopy(fp->adapter, 0))
{//设置失败,函数返回
…
}
}
}
#endif//WIN32
break;
default:
//不支持的源类型
strcpy(errbuf, "Source type not supported");
return NULL;
}
return fp;
}
其中函数pcap_parsesrcstr()通过解析一个源字符串,来分析源的种类,是文件,本地主机接口还是远程主机接口)并返回分离出来的内容(ty pe,host,port,name)。
函数原型如下:
int pcap_parsesrcstr(const char*source, int *type,
char *host, char*port, char*nam e, char*errbuf) 参数source为要分析的源名称。
参数host、port与name分别返回源的主机、端口与名称,针对不同的源类型,该三个参数可能为空值。
参数errbuf保存函数的错误信息。
其中参数type返回源的类型,WinPcap内部用来表示源的类型的各标识如下:
PCAP_SRC_FILE指明为一个文件,用户希望从一个本地文件获得数据包。
PCAP_SRC_IFLOCAL指明为一个本机接口,比如用户希望从一个本地主机接口获得数据包。
不采用RPCAP协议。
PCAP_SRC_IFREMOTE指明为一个远程接口,比如用户希望从一个远程主机接口获得数据包。
需要采用RPCAP协议。
其中函数pcap_opensource_remote()通过打开一个RPCAP连接等方式,打开一个远程主机的适配器。
函数原型如下:
int pcap_opensource_remote(pcap_t *fp, struct pcap_rmtauth *aut h)
参数fp是一个指向pcap_t结构体的指针,该结构体在前面由pcap_cr eate()函数所创建。
参数auth是认证权限。
如果函数成功,返回0值,fp指针能够被用来作为后续调用的参数(如pcap_compile()等等)。
如果函数失败,返回-1值,fp->errbuf中存储错误信息。
该函数为一个远程接口完成与pcap_open_live()基本类似的功能。
不同的是,此处,在调用pcap_startcapture_remote()之前,捕获线程并不启动。
因为,在远程捕获时,我们不能在“open adapter”命令一发送出去就开始捕获数据。
考虑远程适配器已经负载很重的时候,如果我们开始一个捕获(其默认情况下,具有一个NULL过滤器),新的网络流量将使网
络饱和。
作为替代方案,我们想先"open"适配器,接着仅当在我们准备好开始捕获时发送一个"start capture"的命令。
该函数作了这样的工作:它发送一个“open adapter”命令(根据RPCAP协议),但是它不开始捕获。
既然其它的libpcap函数并不一定共享该工作方式,我们不得不做一些并不优雅的事情,使得每件事情都能妥善的解决。
注意:万一在捕获还没有开始时,就调用了pcap_compile()函数,过滤器将被存储到pcap_t结构体中,稍后它将被发送到另一个主机(当pca p_startcapture_remote()被调用时)。
本文出自“千江月” 博客,请务必保留此出处/918801/ 204274。