winpcap编程_适合当讲授课件

合集下载

WinPcap基础知识(第四课:不用回调函数来捕捉数据包)

WinPcap基础知识(第四课:不用回调函数来捕捉数据包)

WinPcap基础知识(第四课:不用回调函数来捕捉数据包)这节课程中的例子程序完成的功能和上节课的一样,但是使用的是pcap_next_ex()而不是pcap_loop().基于回调捕获机制的pcap_loop()是非常优雅的,在很多情况下都是一个不错的选择。

不过,有时候处理一个回调函数显得不太现实 --- 通常这会使程序更加复杂,在使用多线程或者c++类的时候尤其如此。

在这种情况下,可以直接调用 pcap_next_ex() 来返回一个数据包-- 这样程序员可以在仅仅想使用它们的时候再处理 pcap_next_ex() 返回的数据包。

这个函数的参数和回调函数 pcap_loop() 的一样 -- 由一个网络适配器描述符作为入口参数和两个指针作为出口参数,这两个指针将在函数中被初始化,然后再返回给用户(一个指向pcap_pkthdr 结构,另一个指向一个用作数据缓冲区的内存区域)。

在下面的程序中,我们继续使用上一节课中的例子的数据处理部分的代码,把这些代码拷贝到main()函数中pcap_next_ex()的后面。

view plaincopy to clipboardprint?#define HAVE_REMOTE#include <pcap.h>#pragma comment(lib,"wpcap.lib")main(){pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;int res;char errbuf[PCAP_ERRBUF_SIZE];struct tm *ltime;char timestr[16];struct pcap_pkthdr *header;u_char *pkt_data;/* Retrieve the device list on the local machine */if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* Print the list */for(d=alldevs; d; 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 -1;}printf("Enter the interface number (1-%d):",i);scanf("%d", &inum);if(inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* Free the device list */pcap_freealldevs(alldevs);return -1;}/* Jump to the selected adapter */for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);/* Open the device */if ( (adhandle= pcap_open(d->name, // name of the device65536, // portion of the packet to capture.// 65536 guarantees that the whole packet will be captured on all the link layersPCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode 1000, // read timeoutNULL, // authentication on the remote machineerrbuf // error buffer) ) == NULL){fprintf(stderr,"\nUnable to open the adapter. %s is notsupported by WinPcap\n", d->name);/* Free the device list */pcap_freealldevs(alldevs);return -1;}printf("\nlistening on %s...\n", d->description);/* At this point, we don't need any more the device list. Free it */pcap_freealldevs(alldevs);/* Retrieve the packets */while((res = pcap_next_ex( adhandle, &header, (const u_char**)&pkt_data)) >= 0){if(res == 0)/* Timeout elapsed */continue;/* convert the timestamp to readable format */ltime=localtime(&header->_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);printf("%s,%.6d len:%d\n", timestr, header->_usec, header->len);}if(res == -1){printf("Error reading the packets: %s\n",pcap_geterr(adhandle));return -1;}return 0;}#define HAVE_REMOTE#include <pcap.h>#pragma comment(lib,"wpcap.lib")main(){pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;int res;char errbuf[PCAP_ERRBUF_SIZE];struct tm *ltime;char timestr[16];struct pcap_pkthdr *header;u_char *pkt_data;/* Retrieve the device list on the local machine */if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* Print the list */for(d=alldevs; d; 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 -1;}printf("Enter the interface number (1-%d):",i);scanf("%d", &inum);if(inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* Free the device list */pcap_freealldevs(alldevs);return -1;}/* Jump to the selected adapter */for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);/* Open the device */if ( (adhandle= pcap_open(d->name, // name of the device65536, // portion of the packet to capture.// 65536 guarantees that the whole packet will be captured on all the link layersPCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode 1000, // read timeoutNULL, // authentication on the remote machineerrbuf // error buffer) ) == NULL){fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* Free the device list */pcap_freealldevs(alldevs);return -1;}printf("\nlistening on %s...\n", d->description);/* At this point, we don't need any more the device list. Free it */pcap_freealldevs(alldevs);/* Retrieve the packets */while((res = pcap_next_ex( adhandle, &header, (constu_char**)&pkt_data)) >= 0){if(res == 0)/* Timeout elapsed */continue;/* convert the timestamp to readable format */ltime=localtime(&header->_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);printf("%s,%.6d len:%d\n", timestr, header->_usec, header->len);}if(res == -1){printf("Error reading the packets: %s\n", pcap_geterr(adhandle));return -1;}return 0;}疑问:没有完全体现出好控制的特征感觉也只是点点,可以设置一个变量,来控制是否接收下一个数据包,这点还是可以做到得,不过这里是因为数据包太多了,一般不会出现问题。

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 教程

WinPcap 教程: 循序渐进教您使用WinPcap本节将向您展示如何使用WinPcap API的一些特性。

这部分教程细化成若干节课,以循序渐进的方式介绍给读者,让读者从最基本的部分(获得设备列表)到最复杂的部分(控制发送队列并收集和统计网络流量)来了解如何使用WinPcap进行程序开发。

有时,我们会给出一些简单使用的代码片断,但同时,我们提供完整程序的链接:所有的源代码包含一些指向手册其他地方的链接,这可以让您很方便地通过点击鼠标来跳转到您想查看的函数和数据结构的内容中去。

范例程序都是用纯C语言编写, 所以,掌握基本的C语言编程知识是必须的,而且,这是一部关于处理原始网络数据包的教程,因为,我们希望读者拥有良好的网络及网络协议的知识。

用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函数。

本教程中的一些范例程序,会需要它。

获取设备列表通常,编写基于WinPcap应用程序的第一件事情,就是获得已连接的网络适配器列表。

WinPcap开发(1)-零基础介绍.doc

WinPcap开发(1)-零基础介绍.doc

WinPcap开发(1):零基础介绍。

WinPcap开发(1):零基介绍*原作者:制片人网络节目的0×00前言在网络安全中起着重要的作用。

如何快速有效地监控、分析和构建网络流量,已经成为许多安全从业者需要解决的关键问题。

Winpcap是一个免费的开源项目,它只能为win32应用程序提供访问底层网络的能力,因此它已经成为相关网络编程的首选开发工具。

什么是0×01 winpcap?Winpcap(windows数据包捕获)是windows 平台下的免费网络访问系统,可用于windows系统下的网络编程。

著名的wireshark是基于winpcap开发的。

您可以在wireshark的安装中看到winpcap驱动程序的安装过程。

互联网上有很多关于winpcap的介绍,而且百科全书也很详细,所以我不再复制了。

应该注意的是,winpcap不是一个简单的库,而是一个在Win32平台上进行数据包捕获和网络分析的架构。

它包括一个核心包过滤器、一个底层动态链接库(packet.dll)和一个高级系统独立库(wpcap.dll)。

因此,它只能“嗅探”物理线路上的数据包,而没有拦截它们的能力。

因此,它不适合个人防火墙和其他项目。

你需要准备什么?本系列文章主要带您了解如何使用winpcap网络编程技术进行网络协议分析、流量统计和网络检测扫描等。

在这里,我们不会深入和艰难地解释相关的源代码,而是以一种简单的方式结合实验来深入理解相关的原理。

在这一系列文章中,作者从简单到困难简要介绍了winpcap的体系结构原理、相关环境构建和快速核心代码编写。

但是在开始之前,读者需要有一些相关的基础:了解网络协议的基本知识,掌握winpcap开发库支持的编程语言,并自己写一些例子。

Winpcap提供的开发界面原本是用C语言编写的,但是热心的程人已经为其他语言的使用提供了封装,比如java、net、python,好像它们甚至有简单的语言。

WinPcap编程

WinPcap编程

W i n P c a p编程WinPcap是一个开源的、运行于Win32平台下的体系结构,它的主要功能是进行数据包捕获和网络分析。

它允许应用程序通过协议栈捕获和传输网络数据包,也包括内核级别的数据包过滤、网络静态引擎和支持远程数据包捕获等有用的功能。

WinPcap由两部分组成:1. 驱动程序: 扩展操作系统功能提供低层次的网络访问2. 动态链接库:运行在Win32平台上的应用程序可以非常方便地访问网络低层次的数据。

Ethereal是大名鼎鼎的捕获数据包专业软件,它的运行是在WinPcap的支持之下的,如果没有安装WinPcap,Ethereal也无法正常捕获数据包。

在正式WinPcap编程之前,要配置运行环境。

Win32 平台下WinPcap应用程序需要以下四个动态链接库才能正常运行:这四个动态链接库在WinPcap驱动程序里。

如果应用程序出现一下提示,那就是没有安装驱动程序的原因了。

被过滤广告也可以不安装WinPcap驱动程序。

但是需要把上面提到的四个动态链接库文件拷贝到系统分区/WINDOWS/system32目录下或者接下来配置编程环境。

如果一个源文件使用了WinPcap提供的库函数,那么就需要在该文件开始的位置添加包含文件(或者在引用的文件中),即#include “”也许会出现下面的错误:fatal error C1083: 无法打开包括文件:“”: No such file or directory这个错误表明找不到文件这个头文件在驱动程序安装完成后也是没有的,它是开发包里面的一个头文件所以,如果要运行程序还需要到官方网站上去下载WinPcap SDK―WpdPackWinPcap SDk里面包含库文件,头文件,文档文件和一些例子。

解压缩后把Include目录添加到IDE的包含文件中(Tools->Option->Directory; VS 2003/2005 工具->选项->项目和解决方案/项目->VC++目录)error LNK2019: 无法解析的外部符号_pcap_findalldevs_ex,该符号在函数XXX 中被引用如果发生上面的错误就表明缺少库文件,需要添加到工程中Project->Settings->Link->Object/library modules; VS 2003/2005 项目->添加现有项->所有文件)error C2065: “PCAP_SRC_IF_STRING”: 未声明的标识符error C3861: “pcap_findalldevs_ex”: 找不到标识符error C2065: “PCAP_OPENFLAG_PROMISCUOUS”: 未声明的标识符error C3861: “pcap_open”: 找不到标识符新的版本里WinPcap支持远程数据包获取,发生上面的错误很有可能是新的版本导致不兼容的问题,所以还应当添加一个头文件,即#include ""如果还有问题,可以到WinPcaP官方网站上找FAQ。

第7章 Winpcap编程技术

第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基础知识(第九课:统计网络的通信量)这节课我们将要学习WinPcap的另外一个高级特性:对网络通信量进行统计。

统计引擎使得内核级的包过滤器能有效的把收集到的包分类。

你可以查阅NPF 驱动内部手册看到更多的细节。

为了用这个功能来监视网络,程序员必须要打开一个适配器,并且把它设为统计模式。

可以用函数pcap_setmode()来完成这个功能。

特别的,在这个函数里面MODE_STAT必须作为模式参数。

用统计模式,我们写一个监视TCP通信负载的应用程序,只需要很少行代码。

下面是例子代码:1.#include <stdlib.h>2.#include <stdio.h>3.4.#include <pcap.h>5.6.void usage();7.8.void dispatcher_handler(u_char *, const struct pcap_pkthd r *, const u_char *);9.10.11.void main(int argc, char **argv)12.{13.pcap_t *fp;14.char errbuf[PCAP_ERRBUF_SIZE];15.struct timeval st_ts;16.u_int netmask;17.struct bpf_program fcode;18.19./* Check the validity of the command line */20.if (argc != 2)21.{age();23.return;24.}25.26./* Open the output adapter */27.if ( (fp= pcap_open(argv[1], 100, PCAP_OPENFLAG_PR OMISCUOUS, 1000, NULL, errbuf) ) == NULL)28.{29.fprintf(stderr,"\nUnable to open adapter %s.\n", errbuf );30.return;31.}32.33./* Don't care about netmask, it won't be used for this f ilter */mask=0xffffff;35.36.//compile the filter37.if (pcap_compile(fp, &fcode, "tcp", 1, netmask) <0 )38.{39.fprintf(stderr,"\nUnable to compile the packet filter. Ch eck the syntax.\n");40./* Free the device list */41.return;42.}43.44.//set the filter45.if (pcap_setfilter(fp, &fcode)<0)46.{47.fprintf(stderr,"\nError setting the filter.\n");48.pcap_close(fp);49./* Free the device list */50.return;51.}52.53./* Put the interface in statstics mode */54.if (pcap_setmode(fp, MODE_STAT)<0)55.{56.fprintf(stderr,"\nError setting the mode.\n");57.pcap_close(fp);58./* Free the device list */59.return;60.}61.62.63.printf("TCP traffic summary:\n");64.65./* Start the main loop */66.pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts);67.68.pcap_close(fp);69.return;70.}71.72.void dispatcher_handler(u_char *state, const struct pcap_pkthdr *header, const u_char *pkt_data)73.{74.struct timeval *old_ts = (struct timeval *)state;75.u_int delay;RGE_INTEGER Bps,Pps;77.struct tm ltime;78.char timestr[16];79.time_t local_tv_sec;80.81./* Calculate the delay in microseconds from the last sa mple. */82./* This value is obtained from the timestamp that the associated with the sample. */83.delay=(header->_sec - old_ts->tv_sec) * 1000000 - old_ts->tv_usec + header->_usec;84./* Get the number of Bits per second */85.Bps.QuadPart=(((*(LONGLONG*)(pkt_data + 8)) * 8 * 1 000000) / (delay));86./* ^ ^87.| |88.| |89.| |90.converts bytes in bits -- |91.|92.delay is expressed in microseconds --93.*/94.95./* Get the number of Packets per second */96.Pps.QuadPart=(((*(LONGLONG*)(pkt_data)) * 1000000 ) / (delay));97.98./* Convert the timestamp to readable format */99.local_tv_sec = header->_sec;100.localtime_s(<ime, &local_tv_sec);101.strftime( timestr, sizeof timestr, "%H:%M:%S", <ime);102.103./* Print timestamp*/104.printf("%s ", timestr);105.106./* Print the samples */107.printf("BPS=%I64u ", Bps.QuadPart);108.printf("PPS=%I64u\n", Pps.QuadPart);109.110.//store current timestamp111.old_ts->tv_sec=header->_sec;112.old_ts->tv_usec=header->_usec;113.}114.115.116.void usage()117.{118.119.printf("\nShows the TCP traffic load, in bits per second and packets per second.\nCopyright (C) 2002 Loris Degioanni.\ n");120.printf("\nUsage:\n");121.printf("\t tcptop adapter\n");122.printf("\t You can use \"WinDump -D\" if you don't know the name of your adapters.\n");123.124.exit(0); 125.}。

winpcap 编程

[中原工学院] [TCP/IP作业]——WinPcap编程学生:郑仙玉学号:201300824401 班级:网络13卓越目录3.WinPcap编程 (3)3.1获取网络适配器信息 (3)3.2 抓包 (22)创建一个使用wpcap.dll的应用程序 (22)3.3 包过滤 (27)3.4 数据包统计 (29)3.WinPcap编程3.1获取网络适配器信息任务目标:获取本机网络适配器的信息任务描述:(1)安装配置WinPcap开发环境(2)获取本机所有网络适配器,并显示每个适配器的名称、描述、是否Loopback、地址家族、地址家族名称、IP地址、子网掩码、广播地址。

任务提示:参考WinPcap开发包下“Examples-pcap”目录中的例程。

实验内容:(1).安装配置WinPcap开发环境:1.下载并安装最新版本的WinPcap安装包。

地址是:/install/default.htm2.下载最新版本的WinPcap开发包。

地址是:/devel.htm3.安装WinPcap,可以复制步骤1的链接到浏览器上进行下载,并进行安装。

安装步骤如下:1.点击1或2进行下载、安装2.点next3.选i agree4.点install5.选finish,然后就行了6.解压开发包到你想要的位置,我把自己的开发包解压到了E盘的winpcap文件夹下,如下图所示:其中docs目录中包含了WinPcap相关文档,Examples-pcap和Examples-remote都是使用WinPcap的一些例子程序,Include目录包含的是头文件,Lib目录中包含的是库文件。

4.双击打开老师给的程序ServerClientDemo5.双击ServerClientDemo的运行程序在2013运行环境下:6.(1)在菜单栏中选中视图(2)在下拉窗口选中其他窗口(3)选中属性管理器,如下图:7.双击Debug | Win32下的“er“,或者右键单击->Properties。

吉林大学远程教育课件--WindowsAPI编


case WM_SIZE: MoveWindow (hwndEdit, 0, 0,
LOWORD (lParam), HIWORD (lParam), TRUE);
return 0; case WM_COMMAND:// 菜单命令 if (lParam && LOWORD (wParam) == EDITID)
//创建编辑框
hwndEdit = CreateWindow ("edit", NULL,
WS_CHILD | WS_VISIBLE | WS_HSCROLL
| WS_VSCROLL |WS_BORDER | ES_LEFT |
ES_MULTILINE |ES_NOHIDESEL |
ES_AUTOHSCROLL | ES_AUTOVSCROLL,
lstrcpy (szFileName, (PSTR) (((LPCREATESTRUCT)
lParam)->lpCreateParams)) ;
if (strlen (szFileName) > 0)
{
GetFileTitle (szFileName, szTitleName, sizeof (szTitleName)); //获取文件名
case IDM_FIND://查找 SendMessage (hwndEdit, EM_GETSEL,
NULL,(LPARAM) &iOffset); hDlgModeless = PopFindFindDlg (hwnd); return 0; case IDM_NEXT://查找下一处 SendMessage (hwndEdit, EM_GETSEL, NULL,(LPARAM) &iOffset); if (PopFindValidFind ()) PopFindNextText (hwndEdit, &iOffset); else hDlgModeless = PopFindFindDlg (hwnd); return 0; case IDM_REPLACE://替换 SendMessage (hwndEdit, EM_GETSEL, NULL,(LPARAM) &iOffset); hDlgModeless = PopFindReplaceDlg (hwnd); return 0; }

WinPcap开发(一):零基础入门

WinPcap开发〔一〕:零基础入门*原创追影人0×00 前言网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题.而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具.0×01 winpcap是什么?winpcap<windows packet capture>是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程.著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程.有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了.需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态库〔packe t.dll〕和一个高层的不依赖于系统的库〔wpcap.dll〕.所以它只能"嗅探"到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目.0×02 你需要准备些什么?本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计与网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解.在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建与快速编写核心代码.但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpcap开发库支持的编程语言,自己能动手实践编写一些例子.Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、p ython,好像连易语言都有.本系列文章将使用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在system32下面释放的wpcap.dll和packet.dll,还有driver下面的npf.sys,所以不需要完整安装winp cap,而选择只复制以上三个文件到对应目录中即可.本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址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, intsnaplen, intpromisc, i ntto_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函数名称:intpcap_loop<pcap_t * p,intt, pcap_handler callback, uchar * u ser>;参数说明:p 是由pcap_open_live<>返回的所打开的网卡的指针;t用于设置所捕获数据包的个数;callback 是回调函数,其原型为pcap_callback<u_char* argument,conststructp cap_pkthdr* packet_header,constu_char* packet_content>;user值一般为NULL结合上面的代码,我们在获得并打开网卡句柄adhandle,使用下面的代码并可捕获数据包程序在每一个数据包到来时,都会自动调用回调函数packet_handler来对数据包进行处理,其第三个参数便是数据包内容.上图为运行结果图,可以看到每一个数据包的时间戳信息,和长度信息.值得注意的是,原始套接字也可以完成数据包的发送和监听工作,但是与winpcap相比,在监听数据包方面是有区别的,由于winpcap更接近与底层,所以在混杂模式下,凡是到达网卡的数据包不管目的地址是否为自身主机,winpcap均能接收到;而原始套接字只能接收到投送给自己的数据包.0×09 总结与预告本章中我们简单认识了winpcap的相关基础知识,学习了发送数据包和接收数据包的方法,其实不难发现,发送和接收数据包的过程都比较简单,只需要调用相关库函数即可,而更多的精力在数据包的组织和拆分上,同时在一些场景中,算法的使用也较为重要.在接下来的章节中,我们会看到下面的内容:1.扫描存活主机2.Arp欺骗的实现与应用3.端口扫描4.流量监控与统计分析。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

要向VC++6.0中添加一个新的包含文件所在的路径,你必 须打开Tool菜单,选择Options,然后选择Directories选项卡, 在Show directories下拉框中选择Include files,并且将新的 路径添加到Directories中去 。
二、获得设备列表
通常,编写基于WinPcap应用程序的第一件事情,就是获得已 连接的网络适配器列表。WinPcap提供了 pcap_findalldevs_ex( ) 函数来实现这个功能:
由 pcap_findalldevs_ex()返回的每一个 pcap_if 结构体, 都包含一个 pcap_addr 结构体,这个结构体由如下元素组成:
通过返回的结构,我们可以得到探测到的网卡设备的更 详尽信息。
例子:
二、打开适配器开始捕获数据包
现在,我们已经知道如何获取适配器的信息了,那我们就开始 一项更具意义的工作,打开适配器并捕获数据包。本节中,我们会 编写一个程序,将每一个通过适配器的数据包打印出来。

Sniffer,中文可以翻译为嗅探器,是一种基于被动侦听原理的网络 分析方式。使用这种技术方式,可以监视网络的状态、数据流动情况 以及网络上传输的信息。当信息以明文的形式在网络上传输时,便可 以使用网络监听的方式来进行攻击。将网络接口设置在监听模式,便 可以将网上传输的源源不断的信息截获。 wireshark(2006年之前称为Ethereal)一是全球相当行流行的开放 源代码的网络协议分析软件,功能强大而且支持平台最多,它可以实 时检测网络通讯数据,也可以检测其抓取的网络通讯数据快照文件;可 以通过图形界面浏览这些数据,可以查看网络通讯数据包中每一层的 详细内容;Wireshark还拥有许多强大的特性:包含有强显示过滤器语 言和查看TCP会话重构流的能力。它可以支持七百多种协议的解析和 多种媒体类型。
pcap_setfilter() 设置过滤器
pcap_next_ex() 循环捕获数据包
PacketHandler() 处理数据包
pcap_freealldevs() 关闭网络设备
一、编程环境设定
在每一个使用了库的源程序中,将 pcap.h 头文件包含 (include)进来。
要在一个VC++6.0工程中,添加一个新的库,你必须打开 Project菜单,选择Settings,然后选择Link选项卡,然后把 新库的名字(wpcap.lib)添加到Object/Library modules下的文 本框中。 要向VC++6.0中添加一个新的库所在的路径,你必须打开 Tool菜单,选择Options,然后选择Directories选项卡,在 Show directories下拉框中选择Library files,并且将新的路 径添加到Directories中去 。
三、哪些程序在使用WinPcap
Text in here WinPcap可以被用来制作许多类型的网络工具。特别地,一 些基于WinPcap的典型应用有:
●网络与协议分析器 (network and protocol analyzers)
●网络监视器 (network monitors) ●网络流量记录器 (traffic loggers) ●网络流量发生器 (traffic generators)
打开设备的函数是 pcap_open()。
参数: source,: string containing the source name to open. snaplen,: length of the packet that has to be retained.(only the first 'snaplen' bytes are stored in the buffer and passed to the user application. ) flags,: keeps several flags that can be needed for capturing packets. (e.g., PCAP_OPENFLAG_PROMISCUOUS ) read_timeout,: read timeout in milliseconds. auth,: it can be NULL in case of a local host. errbuf,: contain the error in case this function fails. 返回值: A pointer to a 'pcap_t' which can be used as a parameter to the following calls. (This structure is opaque to the user) In case of problems, it returns NULL and the 'errbuf' variable keeps the error message.
捕获系统需要占用操作系统的协议 栈,来访问通过网络的原始数据。这就 需要有部分内容要运行在操作系统内核 中,能直接访问网络接口驱动。 在Wiket Filter(NPF);
二、WinPcap 主要功能
WinPcap提供了以下功能:
pcap_if 结构下图所示, 它包含了一个适配器的详细信息。
struct pcap_if { pcap_if * next //if not NULL, a pointer to the next element in the list; NULL for the last element of the list char * name //a pointer to a string giving a name for the device to pass to pcap_open_live() char * description //if not NULL, a pointer to a string giving a human-readable description of the device pcap_addr * addresses //a pointer to the first element of a list of addresses for the interface u_int flags //PCAP_IF_ interface flags. Currently the only possible flag is PCAP_IF_LOOPBACK, //that is set if the interface is a loopback interface. }
int pcap_findalldevs_ex ( char struct pcap_rmtauth pcap_if_t char )
* source, * auth, ** alldevs, * errbuf
功能: Create a list of network devices that can be opened with pcap_open(). 它除了可以列出本地机器的网络设备,还可以列出远程机器上的设备。 此外,它还能列出所有可用的 pcap文件到指定的文件夹。
Libpcap(UNIX)库 Winpcap(Windows)库
WinPcap是一个基于Win32平台的,用于 捕获网络数据包并进行分析的开源库。
利用网络数据包捕获库函数直接访问网 络,免费、公用。为应用程序提供了一组 API接口,编程容易,源码级移植方便。
引用WinPcap主页上的一段内容: WinPcap基于Win32平台,用于捕获数据包和进行网络分析。它包括了一个 内核级的数据包过滤器,一个低层动态链接库(packet.dll),一个高层的, 依赖于系统的库(wpcap.dll)。
捕获原始数据包,无论它是发往某台机器的,还是在其他 设备(共享媒介)上进行交换的 在数据包发送给某应用程序前,根据用户指定的规则过滤 数据包 将原始数据包通过网络发送出去 收集并统计网络流量信息 Tips:以上这些功能需要借助安装在Win32内核中的网络设备驱 动程序才能实现,再加上几个动态链接库DLL。

四、 WinPcap不能胜任的事 情
WinPcap能 独立地 通过主机协议发送和接受数据,如 同TCP-IP。这就意味着WinPcap不能阻止、过滤或操纵同一 机器上的其他应用程序的通讯:它仅仅能简单地"监视"在 网络上传输的数据包。所以,它不能提供类似网络流量控 制、服务质量调度和个人防火墙之类的支持。
Text in here
●用户级网桥及路由 (user-level bridges and routers)
●网络入侵检测系统 (network intrusion detection systems)
●网络扫描器 (network scanners) ●安全工具 (security tools)
特别地,大部分windows平台下有数据 包捕获功能的软件都使用了winpcap作 为编程接口,比较著名的有:
一、编程环境设定 二、获得设备列表
三、打开适配器开始捕获数据包
使用 WinPcap 编程
四、过滤数据包 五、解析数据包
六、发送数据包 七、收集并统计网络流量
pcap_findalldevs() 获取 网络设备列表
pcap_open_live() 打开设备, 设为混杂模式
pcap_compile() 编译过滤器
如果使用Hub等基于共享的网络的情况下,网络上所有的机器都可以 “听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说, 工作站A不会捕获属于工作站B的数据,而是简单地忽略这些数据)。如果 某个工作站的网络接口处于混杂模式,那么它就可以捕获网络上所有的数 据包和帧。 但是现代网络常常采用交换机作为网络连接设备枢纽,在通常情况下, 交换机不会让网络中每一台主机侦听到其他主机的通讯,因此Sniffer技术在 这时采用网络端口镜像技术进行配合。
相关文档
最新文档