利用Winpcap捕获发送数据包
WinPcap编程

Packet.dll应用步骤
2) 打开指定的网卡 lpAdapter = PacketOpenAdapter(AdapterList [0 ]) ; if ( ! lpAdapter | | (lpAdapter - > hFile = = INVALID_HANDLE_VALUE) ) { dwErrorCode = GetLastError() ; sprintf ( szErr ,″Unable to open the adapter ,error code : %lx″, dwErrorCode) ; AfxMessageBox(szErr) ; return FALSE; }
1> LPPACKET PacketAllocatePacket(void) 如果运行成功,返回一个_PACKET结构的指针, 否则返回NULL。成功返回的结果将会传送到 PacketReceivePacket()函数,接收来自驱动的网络 数据报。 2> VOID PacketFreePacket(LPPACKET lpPacket) 释放参数提供的_PACKET结构。 3> VOID PacketCloseAdapter(LPADAPTER lpAdapter) 关闭参数中提供的网络适配器,释放相关的 ADAPTER结构。
WinPcap
WinPcap包括三个部分 第一个模块:内核级的包过滤驱动程序
NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件, 是架构的核心(在Win95/98 中是一个VXD文件,在NT/2000 中是 一个SYS 文件) ,它的主要功能是过滤数据包,在包上附加时间戳、 数据包长度等信息。
第二个模块:低级动态链接库packet.dll,在Win32 平台 上提供了与NPF 的一个通用接口。 packet.dll数据包驱 动程序库是与libpcap 相兼容的一组用户级的函数库。 第三个模块:用户级的Wpcap.dll。通过调用packet.dll 提供的函数生成,它包括了过滤器生成等一系列可以被 用户级调用的高级函数,另外还有诸如数据包统计及发 送功能。
基于WinPcap包捕获算法的实现

基于winpcap的网络抓包系统

术、多线程技术 、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的简介winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3> 在网络上发送原始的数据报;4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据报。
也就是说,winpcap 不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。
因此,它不能用于QoS调度程序或个人防火墙。
目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且微软也已经放弃了对win9x 的开发。
因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。
WinPcap的安装和例程调试By 曹佳caojia@1.DownLoad2.安装解压得三文件:WinPcap_4_0_1_drivel.exe,WpcapSrc_4_0_1_Source_code.zip和WpdPack_4_0_1_Include_Lib.zip,第一个是驱动的安装程序,第二个是驱动的源代码,第三个是使用Winpcap所要用到的所有.h文件和.lib文件。
1)安装驱动(WinPcap_4_0_1_drivel.exe)2)WpdPack_4_0_1_Include_Lib.zip解压到一个“正式的”位置(用来配置编程环境)3)配置VC6.0环境在Tools->options->Directories里面加入解压以后的include文件夹,在Tools->options->Directories的lib里面加入解压以后的lib文件夹。
基于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对数据包进行拦截一上一篇讲到了对所有的网络数据包进行侦听,并过滤,得到自己想要分析的数据包。
数据包被侦听到了,但仍旧发送给了远程的服务器,若我们希望截获这些数据包,但不希望把这些数据被发送给远程服务器,那该如何解决呢?防火墙!对,我也想到了使用防火墙。
windows下的防火墙,大多使用NIDS(Network Driver Interface Specification)对中间层驱动(Intermediate drivers)进行操作。
NIDS就是把IP包拦截在中间驱动层,使这些不能通过网卡发送。
但是这样做的话,上一篇的模拟sniffer程序也侦听不到被NIDS所拦截的IP包。
因此,防火墙行不通。
使用网卡的混杂模式,通过伪造TCP握手信号,赶在本机与远程端握手连通之前,把本机的手牵到自己这里来,不是也可以实现吗?这正是我所要讲的重点。
没错,我的实现思路也是这样的。
sendto函数只在windows server 2003下支持,在windows XP系统下,为了保证网络安全,已经不再被支持。
有网友说可以用Wsasend()可以替代sendto,为了节约时间,我没有尝试去用Wsasend()函数。
使用Winpcap(windows packet capture)可以完成所需要的功能。
winpcap独立于主机协议(如TCP-IP)而发送和接收原始数据包。
Winpcap为数据包捕获提供了windows下的一个平台,它是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows操作平台上来实现对底层包的截取过滤,它的体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库packet.dll和一个高层的独立于系统的函数库libpcap组成。
调用winpcap函数的程序,需要安装winpcap程序,使之能与驱动挂上钩。
还需要下载winpcap的头文件和相应的库文件。
这样程序才能够跑得起来。
pcap原理

pcap原理
PCAP(Packet Capture)是一种捕获代理网络数据包的技术。
它是网络编程中非常重要的一种技术,可以帮助开发人员分析、调试和研究网络协议。
PCAP通常用于抓取广域网(WAN)或局域网(LAN)上的数据包,以帮助管理员、开发人员进行网络故障诊断与分析。
在计算机网络中,数据是以数据包的形式传输的。
当一个计算机从网络上接收到数据包时,它会把数据包交给操作系统,而操作系统需要将数据包传递给应用程序,以便进行二次开发或分析。
在这个过程中,操作系统需要使用一定的技术来对数据包进行捕获和处理。
而PCAP就是一种捕获和处理网络数据包的技术。
PCAP技术基于操作系统内核层的实现来进行数据包的捕获。
在Linux中,内核中实现了一个Packet Socket接口,用于向用户程序提供数据包的捕获和发送功能。
Windows中则是使用WinPcap或Npcap等第三方库来实现PCAP功能。
PCAP技术可以捕获数据包并进行多种操作,例如过滤、深度分析等。
通过PCAP 技术,开发人员或管理员可以对数据包进行捕获和分析,以便定位网络问题,或优化网络性能。
常见的分析工具包括Wireshark等,通过这些工具的分析,可以有效的发现网络问题,快速解决故障。
总的来说,PCAP技术已经成为了一个网络开发人员不可缺少的技能。
掌握PCAP 技术可以帮助开发人员更全面地了解网络协议和通信机制,定位网络问题,提高
网络性能,同时可以提升工作效率和开发速度。
winpcap使用

Winpcap的安装使用方法winpcap的安装包,然后到2.执行安装包,这样你的机子就能运行winpcap 程序了。
3.解压开发包,在VC6.0的Tools-->Option-->Directories的Include fils 和library files加入winpcap的include和lib目录。
4.开始编写wpcap程序。
vs2005:第一步:下载WinPcap的安装包;有不同操作系统环境下的包,我下的是win32版本的。
下载地址:高的版本一般是Beta的。
这个安装包主要是注册一个wpcap.dll的库到操作系统中。
必须安装,如果不安装,在运行例子的时候会弹出窗口提示,找不到wpcap.dll文件;第二步:到上面的网站下载它的开发包,包括一些头文件和库文件;解压到自己指定的目录中;目录中还有HTML格式的说明文档,用于自己学习比较方便;第三步:设置VS2005;1)设置环境目录;在菜单:工具->选项;弹出的选项窗体左边点击:项目和解决方案->VC++目录;在右边:“显示以下内容的目录”标签下面的下拉框中找到“包含文件”,然后对应到第二步下载开发包的Include目录;在同一下拉框中找到“库文件”,然后对应到第二步下载开发包的lib目录;2)设置编译条件;在项目属性页中:配置属性->C/C++->预处理器->预处理器定义,增加;WPCAP;HAVE_REMOTE;每一个预定义符用";"隔开;在项目属性页中:配置属性->链接器->命令行->附加选项对应的文本框中增加:“wpcap.libws2_32.lib”;第四步:非必要步骤;有的时候可能会有些意外错误;比如找不到u_char类型等;我的解决办法是加上#ifndef WIN32#include <sys/socket.h>#include <netinet/in.h>#else#include <winsock.h>#endif============================================= ====================================winpcap开发包使用中的问题总结这里主要讨论一下winpcap开发中可能遇到的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用winpcap捕获数据包、发送数据包 在上一章里面,我们学会了如何获取适配器的相关配置信息,在这一章里面,我们将继续更有意义的内容,就是捕获和发送数据包。
3.1 winpcap捕获数据包流程与相关函数 计算机是通过网卡和网络中其他的主机进行通信的,网卡相当于数据包进出的大门,我们平时讲的数据包的捕获相当于大门的门卫在检查进出的行人一样。在网络基础我们学习过,数据包的发送是一个封装的过程,而数据包的接收则是解封装的过程,但是封装和解封装都是在OS内核来完成的,一般的应用程序没办法获取数据包原始的内容,而Winpcap却能提供这样的功能,在数据链路层捕获数据包,提供最原始的信息。其中Winpcap捕获数据的原理在第一章已经介绍过了,大家可以回顾下。 另外,数据捕获只能捕获通过本主机网卡的数据,没法捕获其他主机上网卡的数据。 下面先看看Winpcap捕获数据时的工作流程。
选择捕获数据的网卡
打开该网卡开始捕获结束 数据捕获的流程 1. 发现网络设备的函数(find_dev_ex)以前已经介绍过了。 2.打开网卡的函数 打开设备的函数是 pcap_open()。下面是参数 snaplen, flags 和 to_ms 的解释说明 pcap_t* pcap_open ( const char * source, // 指定的网卡的名称 int snaplen, // 帧的长度 int flags, // 网卡捕获的模式 int read_timeout, // 超时 struct pcap_rmtauth * auth, // 是否要求认证 char * errbuf // 错误信息存储 ) snaplen 制定要捕获数据包中的哪些部分。 在一些操作系统中 (比如 xBSD 和 Win32), 驱动可以被配置成只捕获数据包的初始化部分: 这样可以减少应用程序间复制数据的量,从而提高捕获效率。本例中,我们将值定为65535,它比我们能遇到的最大的MTU还要大。因此,我们确信我们总能收到完整的数据包。 flags: 最最重要的flag是用来指示适配器是否要被设置成混杂模式。 一般情况下,适配器只接收发给它自己的数据包, 而那些在其他机器之间通讯的数据包,将会被丢弃。 相反,如果适配器是混杂模式,那么不管这个数据包是不是发给我的,我都会去捕获。也就是说,我会去捕获所有的数据包。 这意味着在一个共享媒介(比如总线型以太网),WinPcap能捕获其他主机的所有的数据包。 大多数用于数据捕获的应用程序都会将适配器设置成混杂模式,所以,我们也会在下面的范例中,使用混杂模式。 to_ms 指定读取数据的超时时间,以毫秒计(1s=1000ms)。在适配器上进行读取操作(比如用 pcap_dispatch() 或 pcap_next_ex()) 都会在 to_ms 毫秒时间内响应,即使在网络上没有可用的数据包。 在统计模式下,to_ms 还可以用来定义统计的时间间隔。 将 to_ms 设置为0意味着没有超时,那么如果没有数据包到达的话,读操作将永远不会返回。 如果设置成-1,则情况恰好相反,无论有没有数据包到达,读操作都会立即返回。 3.通过回调方式捕获数据的函数 程序功能:打开指定的网卡捕获数据帧,输出数据帧的捕获时间和数据帧的大小等信息。 程序运行结果如下图所示:
代码如下: //@filename: PacketCap1.cpp //程序功能:在指定的网卡上捕获数据帧,并输出数据帧的长度和捕获时间 #include "pcap.h" #include "remote-ext.h" #pragma comment(lib, "wpcap") // 包处理函数 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); // 主函数 int main() { pcap_if_t *alldevs; // 设备列表 pcap_if_t *d; // 网卡节点指针 int inum; int i=0; pcap_t *adhandle; // 要打开的网卡句柄 char errbuf[PCAP_ERRBUF_SIZE]; // 错误消息 // 获取本机设备列表 if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &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 -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); return -1; } // 跳转到选中的适配器 for(d=alldevs, i=0; i< inum-1; d=d->next, i++); // 打开设备 if ( (adhandle = pcap_open(d->name, // 设备名 65536, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 0, // 0表示普通模式,1表示混杂模式 1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误信息缓存 )) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); // 释放设备列表 pcap_freealldevs(alldevs); return -1; } printf("\nlistening on %s...\n", d->description); // 释放设备列表 pcap_freealldevs(alldevs); // 开始捕获 pcap_loop(adhandle, 0, packet_handler, NULL); return 0; } // 每次捕获到数据包时,libpcap都会自动调用这个回调函数 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { struct tm *ltime; char timestr[16]; time_t local_tv_sec; // 将时间戳转换成可识别的格式 local_tv_sec = header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime(timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len); }
函数pcap_loop用户捕获数据,有一个回调 参数, packet_handler指向一个可以接收数据包的函数。这个函数会在收到每个新的数据包并收到一个通用状态时被libpcap所调用 ( 与函数 pcap_loop() 和 pcap_dispatch() 中的 user 参数相似),数据包的首部一般有一些诸如时间戳,数据包长度的信息,还有包含了协议首部的实际数据。 注意:冗余校验码CRC不再支持,因为帧到达适配器,并经过校验确认以后,适配器就会将CRC删除,与此同时,大部分适配器会直接丢弃CRC错误
原始帧-ts : struct timeval-caplen : bpf_u_int32-len : bpf_u_int32
pcap_pkthdr
原始帧头部
图1 Winpcap捕获数据帧时的过程 其中pcap_pkthdr为Winpcap添加上的头部,在pcap.h头文件中定义,其定义如下: Struct pcap_pkthdr { struct timeval ts; // 时间 bpf_u_int32 caplen; // 长度 bpf_u_int32 len; // 帧长度 }; 其中timeval的结构如下: struct timeval { long tv_sec; /* seconds */