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 提供的函数生成,它包括了过滤器生成等一系列可以被 用户级调用的高级函数,另外还有诸如数据包统计及发 送功能。
第7章 Winpcap编程技术

PacketSetHwFilter() 设置接收模式(一般设置为混杂模式) 设置接收模式(一般设置为混杂模式) PacketSetBpf() PacketSetBuff() 编辑设置过滤规则 设置核心缓冲区大小
PacketSetReadTimeout() 设置读操作等待时间 PacketAllocatePacket() 设置(分配)用户缓冲区 设置(分配) PacketInitPacket() PacketReceivePacket() 初始化
Winpcap的各个组成部分
6
常州大学信息学院
网络编程
1、NPF驱动
网络数据包过滤器(Netgroup Filter, NPF)是Winpcap的核心部分。它处理网络 上传输的数据包,并且对用户级提供捕获、 发送和分析等功能。 NPF是一个协议驱动,它包括Network Tap和Packet Filter两个主要部件。
30
常州大学信息学院
网络编程
3、接口数据结构
struct pcap_if { struct pcap_if *next; char *name; char *description; struct pcap_addr *addresses; u_int flags; };
31
常州大学信息学院
网络编程
10
常州大学信息学院
网络编程
2、typedef struct _PACKET *LPPACKET
描述一组网络数据包的结构。它包含 了以下几个域: OVERLAPPED OverLapped PVOID Buffer UINT Length PVOID ulBytesReceived BOOLEAN bIoComplete
发送一个或多个数据报的副本。
WinPcap的安装配置与初步使用

WinPcap的安装配置与初步使用配置环境•Windows 10•Visual Studio 2017配置步骤1.安装winpcap2.下载wpdpack3.启动vs20174.新建visual C++空项目5.项目->属性->左侧配置属性->VC++目录,修改包含目录和库目录到wpdpack的include和lib6.项目->属性->C/C++->预处理器->预处理器定义,添加_XKEYCHECK_H; HAVE_REMOTE;WPCAP;WIN327.项目->属性->链接器->输入->附加依赖项,添加Packet.lib;wpcap.lib;ws2_32.lib报错:无法打开源文件sys/time.h和u_int原因:这些都是unix系统的东西,需要在主文件中指明是windows系统解决方法:#define WIN32(若预处理器定义中已有WIN32则不会出现问题)报错:找不到源文件stdafx.h原因:已经再预编译头中定义,不需要多余include报错:const char 与char *不兼容解决方法:属性-> C/C++ -> 语言->符合模式 -> 否报错:一些带有define建议的Unsafe报错,比如建议将strcpy改为strcpy_s或屏蔽报错原因:在新版本的VS中使用了一些比较古老的函数解决方法:在预处理器定义中添加_WINSOCK_DEPRECATED_NO_WARNINGS;_CRT_SECURE_NO_WARNINGSDemo#include "pcap.h"#include "windows.h"#include <iostream>using namespace std;#pragma comment(lib, "wpcap.lib")int 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 /* auth is not needed */, &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");}int a; cin >> a;//卡一下输出if (i == 0){printf("\nNo interfaces found!Make sure WinPcap is installed.\n");return 0;}pcap_freealldevs(alldevs);}参考资料:详细安装配置补充说明1补充说明2。
Winpcap 程序员手册

Winpcap 程序员手册Packet.dll API :程序员手册1.介绍PACKET.DLL 是一个动态连接库。
它提供了一套面向用户的包捕捉驱动程序接口。
这套动态连接库实现了一系列的函数,使得用户与驱动器的通信变得更为简便。
这避免了在用户程序中使用系统调用或控制输入/输出设备驱动模式(IOCTLs)。
而且,这套动态连接库还提供了网络适配器控制函数,对网络上捕获的数据包进行读取/写入函数,在驱动器中设置缓冲区和过滤器函数等等。
目前,有两个版本的PACKET.DLL:第一个适用于Windows95/98,第二个版本适用于WindowsNT/2000。
这两个版本都提供了相同的应用程序接口,这使得编写独立于系统的包捕获应用程序变得更为容易。
通过调用PACKET.DLL API,同一个应用程序可不做任何修改就在Windows95/98/NT/2000环境下运行。
本手册讲述了如何使用PACKET.DLL,并详细讲解这套动态连接库提供的函数和数据结构。
2.PACKET.DLL 与wpcap的比较如果你要编写一个没有特别/底层要求的包捕获应用程序,推荐使用wpcap.dll的函数,这是包捕获库(libpcap)的一个扩展集,而不是本章节中讨论的API。
在wpcap.dll中也使用PACKET.DLL的函数。
但wpcap.dll提供了一个更强大、更直接、更简洁的编程环境。
通过使用wpcap.dll,诸如捕获包、创建一个包过滤器或者在文件中保存dump 这些操作会被准确地执行并使程序变得直观。
Libpcap能够为一个标准的网络监听或嗅探程序提供所有需要的函数。
而且,利用libpcap编写的程序也能在UNIX平台上进行编译,这是因为这个库的Win32版本和UNIX版本有很好的兼容性。
然而,PACKET.DLL API 有一些libpcap没有提供的可能的操作。
Libpcap相对简单,它提供了一套系统无关的捕获包的API。
深度剖析WinPcap之(二)

深度剖析WinPcap之(二)——网络分析与嗅探的基础知识工欲善其事,必先利其器。
为了有利于深入了解WinPcap的内部机制,我们需要对网络分析与嗅探、网络模型与硬件基础作必要了解。
1.1 什么是网络分析与嗅探网络分析(Network analysis) (也称为网络流量分析、协议分析、嗅探、数据包分析、窃听,等等)就是通过捕获网络流量并深入检查,来决定网络中发生了什么情况的过程。
一个网络分析器对通用协议的数据包进行解码,并以可读的格式显示网络流量的内容。
嗅探器(sniffer)是一种监视网络上所传输数据的程序。
未经授权的嗅探器对网络安全构成威胁,因为它们很难被发现并且可在任何地方被插入,这使得它们成为黑客最喜欢使用的一种工具。
网络分析器之间的差别,在于诸如支持能解码的协议数量、用户接口、图形化与统计能力等主要特性的不同。
其它的差别还包括了推理能力(比如,专家分析特性)与数据包解码的质量。
尽管几个不同的网络分析器针对同一个协议进行解码,但在实际环境中可能其中的一些会比另外一些工作得更好。
图2-1为Wireshark网络分析器的显示窗口。
一个典型的网络分析器用三个窗格显示所捕获的网络流量:图2-1 Wireshark网络分析器的显示窗口概要该窗格对所捕获的内容显示一行概要。
包含日期、时间、源地址、目标地址、与最高层协议的名字与信息字段。
详情该窗格提供所捕获数据包所包含的每层细节信息(采用树形结构)。
数据该窗格用十六进制与文本格式显示原始的被捕获数据。
一个网络分析器是由硬件与软件共同组成。
可以是一个带有特定软件的单独硬件设备,或者是安装在台式电脑或膝上电脑之上的一个软件。
尽管每种产品之间具有差别,但都是由下列五个基本部分组成。
硬件多数网络分析器是基于软件的,并工作于标准的操作系统与网卡之上。
然而,一些硬件网络分析器提供额外的功能,诸如分析硬件故障(比如循环冗余纠错(CRC)错误、电压问题、网线问题、抖动、逾限(jabber)、协商错误等等)。
WinPcap0

2
获取已安装设备的高级信息
在第 1 讲中, (获取设备列表) 我们展示了如何获取适配器的基本信息 (如设备的名称和描述)。 事 实上, WinPcap 提供了其他更高级的信息。特别需要指出的是,由 pcap_findalldevs_ex() 返 回的每一个 pcap_if 结构体,都包含一个 pcap_addr 结构体,这个结构体由如下元素组成: • 一个地址列表 • 一个掩码列表 (each of which corresponds to an entry in the addresses list). • 一个广播地址列表 (each of which corresponds to an entry in the addresses list). • 一个目的地址列表 (each of which corresponds to an entry in the addresses list). 另外,函数 pcap_findalldevs_ex() 还能返回远程适配器信息和一个位于所给的本地文件夹的 pcap 文件列表。 下面的范例使用了 ifprint()函数来打印出 pcap_if 结构体中所有的内容。程序对每一个由 pcap_findalldevs_ex() 函数返回的 pcap_if ,都调用 ifprint()函数来实现打印。
6
#else
sockaddrlen = sizeof (struct sockaddr_storage);
#endif
if(getnameinfo(sockaddr,
name 和 description 表示一个适配器名称和一个可以让人们理解的描述。
Winpcap功能强大

Winpcap功能强大,效率高,使用方便,但是,使用前的准备工作要费一番功夫,步骤如下:步骤1:安装驱动程序。
下载WinPcap Driver和DLL并安装,安装后重启机器。
步骤2:下载wpdpack(Developer’s pack)。
解压后会看到其中包含了docs、Include、lib、Examples等文件夹。
步骤3:在VC中设定Include目录及Library目录。
具体做法:打开VC后,Tools->Option->Directories,在include files中添加……\wpdpack\Include 目录(步骤2中得到的);在Library files中添加……\wpdpack\Lib目录。
步骤4:Project->settings->Link,在Object/library modules中加上wpcap.lib。
然后测试下:#include "pcap.h"void 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("\n\t\tDescription: (%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);}以上是在vc6里面的测试winpcap 驱动简介winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
WinPcap开发包的使用

矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WinPcap开发(一):零基础入门
*原创作者:追影人
0×00 前言
网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。
而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。
0×01 winpcap是什么?
winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。
著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。
有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。
需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。
所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。
0×02 你需要准备些什么?
本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。
在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。
但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpc ap开发库支持的编程语言,自己能动手实践编写一些例子。
Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。
本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。
0×03 你能学到什么?
有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:
1. Winpcap获取网卡基本信息及收发数据包
2. 存活主机探测
3. 端口扫描
4. Arp欺骗
5. 中间人攻击的简单实现
6. 流量统计与分析
0×04 知识补充
进行下面的介绍前,我们需要了解几个名词的关系。
winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。
linux 平台下对应的开发包是libpcap。
Wireshark是基于winpcap处理网络驱动层。
Wpdpack是winpcap的开发包,提供开发相关程序的接口。
0×05 环境准备
首先根据你所选择的开发语言选择对应的编译器,笔者使用c语言,利用VS2012进行相关开发。
安装好编译器后,进行相关配置。
下载wpdpack点击这里
初学者可以选择里面的Examples进行编译,可以看到找不到头文件,及相关库。
这是因为wpdpack中的相关库还没有引入到编译环境中
将wpdpack包中的Include和lib文件夹中的文件添加到VS的相关目录下即可编译通过。
将编译后的程序进行运行则出现以下错误。
这是由于运行时缺乏动态链接库导致,最简单的方法是直接下载并安装winpcap驱动程序下载
如果你觉得这样子很麻烦,也可以采用简易方法。
程序在运行时只需要winpcap在syste m32下面释放的wpcap.dll和packet.dll,还有driver下面的npf.sys,所以不需要完整安装winpcap,而选择只复制以上三个文件到对应目录中即可。
本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址http://www.verysou /code/2287464_1/arpspoof.cpp.html
0×06 枚举可用网络适配器资源
在使用winpcap进行收发数据包时,需指定对应的网卡,所以有必要列出计算机上所有可用的网络适配资源。
列取网卡信息的核心代码:
科普Tips:
“网卡”是神马?
计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡)。
网络接口板又称为通信适配器或网络适配器(network adapter)或网络接口卡NIC(Network Interface Card),但是更多的人愿意使用更为简单的名称“网卡”。
利用上面的程序,我们可以查看计算机上可利用的所有网卡资源,以便选择相应的网卡资源进行相关操作。
为了便于观察,我们在VMware虚拟机中进行,首先在对应的虚拟机设置中增加硬件选项中添加多块网卡,然后配置相应的IP,运行程序,可以得到对应网卡的名称描述、IP地址、MAC地址等。
0×07 如何构造和发送数据包
上一步我们列出了所有的可用网卡资源,在发送数据包前,需要打开对应的网卡来进行发送数据包的操作。
这里使用的函数是pcap_open_live:
函数名称:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
函数功能:获得用于捕获网络数据包的数据包捕获描述字。
参数说明:device参数为指定打开的网络设备名。
snaplen参数定义捕获数据的最大字节数。
promisc指定是否将网络接口置于混杂模式。
to_ms参数指定超时时间(毫秒)。
ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。
返回值:打开的网卡句柄
Arpspoof中将网卡的打开操作进行了如下封装,调用时直接输入网卡序号即可,程序会对参数2、3、4进行初始化设置:
使用范例:
在获取到网卡句柄并打开后,发送数据包就很容易了
ucFrame是封装好的数据包,ucFrameLen为数据包的长度。
下面我们封装一个例子,使用上述代码发送ARP请求包,用于查询某IP对应的MAC地址。
ARP协议格式
关键代码
启动wireshark进行监听,运行程序,我们可以看到如下结果,程序发出了一个ARP广播包,用于查询192.168.0.2的主机MAC,并且目标机在收到该查询包后,进行了回复,将自己的MAC地址告诉了查询发起的机器。
0×08 如何监听分析数据包
在监听数据包时,使用的关键函数为pcap_loop
函数名称:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);
参数说明:
p 是由pcap_open_live()返回的所打开的网卡的指针;
cnt用于设置所捕获数据包的个数;
callback 是回调函数,其原型为pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content)
;user值一般为NULL
结合上面的代码,我们在获得并打开网卡句柄adhandle,使用下面的代码并可捕获数据包
程序在每一个数据包到来时,都会自动调用回调函数packet_handler来对数据包进行处理,其第三个参数便是数据包内容。
上图为运行结果图,可以看到每一个数据包的时间戳信息,和长度信息。
值得注意的是,原始套接字也可以完成数据包的发送和监听工作,但是与winpcap相比,在监听数据包方面是有区别的,由于winpcap更接近与底层,所以在混杂模式下,凡是到达网卡的数据包不管目的地址是否为自身主机,winpcap均能接收到;而原始套接字只能接收到投送给自己的数据包。
0×09 总结与预告
本章中我们简单认识了winpcap的相关基础知识,学习了发送数据包和接收数据包的方法,其实不难发现,发送和接收数据包的过程都比较简单,只需要调用相关库函数即可,而更多
的精力在数据包的组织和拆分上,同时在一些场景中,算法的使用也较为重要。
在接下来的章节中,我们会看到下面的内容:
1.扫描存活主机
2.Arp欺骗的实现与应用
3.端口扫描
4.流量监控与统计分析。