WinPcap开发(一):零基础入门
- 格式:doc
- 大小:464.55 KB
- 文档页数:18
使用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开发(一):零基础入门*原创作者:追影人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,好像连易语言都有。
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 程序员手册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开发环境搭建1、安装WinPcap_4_1_3.exe2、安装WinPcap开发包WpdPack_4_1_2.zip3. 开发环境●VC61)Tools->Options->Directories, 分别添加Include files和Libraries files目录2)pcap-stdinc.h#define _W644)Project->Settings->C/C++->Preprocessor definitions:WPCAP, HAVE_REMOTE5)Project->Settings->Link->Object/library modules:wpcap.lib Packet.lib或者在源代码文件中增加:#pragma comment(lib, "wpcap.lib")#pragma comment(lib, "Packet.lib")●VS20101) 执行菜单栏“视图——其他窗口——属性管理器”,可以看到“属性管理器”显示在工作区左侧。
如下图所示:2) 双击Debug | Win32下的“er“,或者右键单击->Properties。
在弹出的配置框中配置。
这个设置是全局的,对所有工程有效。
VC++ Directiories -> Include Directories和Library Directories中添加路径。
假如将wpdpack放到c盘。
则:Include Directories:c:\wpdpack\Include;Library Directories:c:\wpdpack\Lib;3)C/C++->Preprocessor(预处理器)->Preprocessor Definitions(预处理定义):添加WPCAP;HAVE_REMOTE;4) 链接器->输入->附加依赖项:添加wpcap.lib; Packet.lib;或者在源代码文件中增加:#pragma comment(lib, "wpcap.lib")#pragma comment(lib, "Packet.lib")。
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源码进行相关讲解,源码下载地址.verysource./code/2 287464_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.流量监控与统计分析。