WinPcap开发-零基础知识入门基础
- 格式:doc
- 大小:491.57 KB
- 文档页数:19
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 程序员手册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的内部机制,我们需要对网络分析与嗅探、网络模型与硬件基础作必要了解。
1.1 什么是网络分析与嗅探网络分析(Network analysis) (也称为网络流量分析、协议分析、嗅探、数据包分析、窃听,等等)就是通过捕获网络流量并深入检查,来决定网络中发生了什么情况的过程。
一个网络分析器对通用协议的数据包进行解码,并以可读的格式显示网络流量的内容。
嗅探器(sniffer)是一种监视网络上所传输数据的程序。
未经授权的嗅探器对网络安全构成威胁,因为它们很难被发现并且可在任何地方被插入,这使得它们成为黑客最喜欢使用的一种工具。
网络分析器之间的差别,在于诸如支持能解码的协议数量、用户接口、图形化与统计能力等主要特性的不同。
其它的差别还包括了推理能力(比如,专家分析特性)与数据包解码的质量。
尽管几个不同的网络分析器针对同一个协议进行解码,但在实际环境中可能其中的一些会比另外一些工作得更好。
图2-1为Wireshark网络分析器的显示窗口。
一个典型的网络分析器用三个窗格显示所捕获的网络流量:图2-1 Wireshark网络分析器的显示窗口概要该窗格对所捕获的内容显示一行概要。
包含日期、时间、源地址、目标地址、与最高层协议的名字与信息字段。
详情该窗格提供所捕获数据包所包含的每层细节信息(采用树形结构)。
数据该窗格用十六进制与文本格式显示原始的被捕获数据。
一个网络分析器是由硬件与软件共同组成。
可以是一个带有特定软件的单独硬件设备,或者是安装在台式电脑或膝上电脑之上的一个软件。
尽管每种产品之间具有差别,但都是由下列五个基本部分组成。
硬件多数网络分析器是基于软件的,并工作于标准的操作系统与网卡之上。
然而,一些硬件网络分析器提供额外的功能,诸如分析硬件故障(比如循环冗余纠错(CRC)错误、电压问题、网线问题、抖动、逾限(jabber)、协商错误等等)。
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平台下一个免费,公共的网络访问系统。
矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。
第2章利用Winpcap获取计算机网卡信息一个主机可以拥有多张网卡,在进行网络编程之前,我们都会先得到计算机网卡配置的有关信息。
网卡的相关信息主要包括该网卡的名称,网卡的描述和相关配置的IP地址配置信息(IP地址、子网掩码、网关)以及网卡的MAC地址等。
本章的主要内容是利用Winpcap 提供的相关函数,取得网卡的名称以及IP地址配置的相关信息。
2.1 存储计算机网卡信息的数据结构在计算机中,由于存在多个网卡,所以常常使用链表的结构体来保存每个网卡节点的信息。
主机网卡链表每个节点的主要包含的信息如下:数据结构pcap_if(接口的信息)网卡节点pcap_if的数据结构。
struct pcap_if {struct pcap_if *next; // 指向下一个节点char *name; // 网卡名称char *description; // 网卡描述struct pcap_addr *addresses; // 网卡IP地址信息u_int flags; // 标记,目前只支持换回地址标记为PCAP_IF_LOOPBACK };IP地址信息的数据结构pcap_addr的结构如下:数据结构pcap_addr(地址信息)struct pcap_addr {struct pcap_addr *next; // 下一个IP地址信息节点(一个网卡可以绑定多个IP)struct sockaddr *addr; // IP 信息地址的结构struct sockaddr *netmask; // 子网掩码的信息结构struct sockaddr *broadaddr; // 广播IP地址信息struct sockaddr *dstaddr; //目标IP地址信息,如果不是点对点网络,该字段为NULL };2.2 winpcap获取网卡信息的相关函数在进行Winpcap编程之前,先介绍Winpcap编程的主要流程与相关步骤。
一些需要知道的细节描述(前言):这一部分展示了如何使用WINPC AP-API的不同的功能,它作为一个使用指南被划分为一系列的课时来带领读者循序渐进的体会PCAP的程序设计的魅力:从简单的基本功能(如获取网卡的列表,数据包的捕获等)到统计和收集网络流量等高级功能。
在这里将提供一些简单但完整的代码作为参考:所有的这些原代码都有和它相关的详细信息的连接以便单击这些功能和数据结构时能够即使跳转到相关的文献。
这些例子是用C语言写的,所以在学习之前首先要有一定的C语言的基础,当然PCAP作为一个网络底层的驱动,要想学好它也必须具备一定的网络方面的知识。
(一)得到网络驱动列表用PCAP写应用程序的第一件事往往就是要获得本地的网卡列表。
PCAP提供了pcap_find allde vs()这个函数来实现此功能,这个API返回一个 pcap_i f结构的连表,连表的每项内容都含有全面的网卡信息:尤其是字段名字和含有名字的描述以及有关驱动器的易读信息。
得到网络驱动列表的程序如下:程序代码: [ 复制代码到剪贴板 ]#includ e "pcap.h"main(){pcap_i f_t *alldev s;pcap_i f_t *d;int i=0;char errbuf[PCAP_E RRBUF_SIZE];/* 这个API用来获得网卡的列表 */if (pcap_f indal ldevs(&alldev s, errbuf) == -1){fprint f(stderr,"Errorin pcap_f indal ldevs: %s\n", errbuf);exit(1);}/* 显示列表的响应字段的内容 */for(d=alldev s;d;d=d->next){printf("%d. %s", ++i, d->name);if (d->descri ption)printf(" (%s)\n", d->descri ption);else printf(" (No descri ption availa ble)\n");}if(i==0){printf("\nNo interf acesfound! Make sure WinPca p is instal led.\n"); return;}/* We don‘t need any more the device list. Free it */pcap_f reeal ldevs(alldev s);}[code]有关这段程序的一些说明:首先pcap_find allde vs()同其他的li bpcap函数一样有一个err buf参数,当有异常情况发生时,这个参数会被PCAP填充为某个特定的错误字串。
基于WinPcap的程序开发一、WinPcap介绍1、WinPcap简介大多数Unix操作系统提供了一套允许应用程序直接与网络相互联系的系统调用。
这些指令对于那些需要通过网络捕获连续的包数据而不用内核进行过多的干预的包捕获应用程序非常有用。
在Windows 环境下,WinPcap就是这样一类工具。
WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。
大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。
这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。
然而,有时候“简便方法”并不能满足实际需要。
有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。
基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。
基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。
2、WinPcap的目的和用途开发WinPcap的目的是为Win32应用程序提供一种直接访问底层网络的能力。
通过WinPcap,网络应用程序可以实现如下功能:1)捕获原始数据包,包括发送到本主机以及在共享网络上的数据包。
2)数据过滤。
在将数据包发送给应用程序之前按照用户的规定对捕获的数据包进行过滤。
3)发送原始数据包。
向网络发送原始数据包。
4)数据包统计。
对网络通信进行统计。
上述功能都通过一个设备驱动(这个驱动程序安装在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从名字上来看表明它的主要目的是捕获数据包,但是它还为原始网络提供了一些其它的功能,其中之一就是用户可以发送数据包,这也就是本节的主要内容。
需要指出的是原来的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()只是提供一个简单的直接的发送数据的方法,而发送队列提供一个高级的强大的和最优的机制来发送一组数据包,队列实际上是一个装有要发送数据的一个容器,它有一个最大值来表明它所能够容纳的最大比特数。
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.流量监控与统计分析。