wnpcap开发(一)零基础入门

上传人:第*** 文档编号:61908205 上传时间:2018-12-14 格式:PDF 页数:18 大小:609.82KB
返回 下载 相关 举报
wnpcap开发(一)零基础入门_第1页
第1页 / 共18页
wnpcap开发(一)零基础入门_第2页
第2页 / 共18页
wnpcap开发(一)零基础入门_第3页
第3页 / 共18页
wnpcap开发(一)零基础入门_第4页
第4页 / 共18页
wnpcap开发(一)零基础入门_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《wnpcap开发(一)零基础入门》由会员分享,可在线阅读,更多相关《wnpcap开发(一)零基础入门(18页珍藏版)》请在金锄头文库上搜索。

1、WinPcap 开发(一):零基础入门 *原创作者:追影人 000 前言 网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造 网络流量,成为很多安全从业者需要解决的重点问题。而 winpcap 这一免费开源 项目恰好可以为 win32 应用程序提供访问网络底层的能力, 所以其成为了相关网络 编程的首选开发工具。 001 winpcap 是什么? winpcap(windows packet capture)是 windows 平台下一个免费的网络访问系 统,可用于 windows 系统下的网络编程。著名的 wireshark 便是基于 winpcap 开 发的,大家在安装

2、 wireshark 中可以看到 winpcap 驱动程序的安装过程。 有关 winpcap 的介绍网络上很多,百科里面介绍的也很详细,我就不再 copy 了。 需要注意的一点是,winpcap 并不是一个简单的 library,而是一个针对 Win32 平 台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动 态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只 能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火 墙等项目。 002 你需要准备些什么? 本系列文章主要带大家认识和了解如何利用 winpcap 网

3、络编程技术进行网络的协 议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码, 而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从 简到难,简明介绍 winpcap 架构原理、相关环境搭建及快速编写核心代码。但是在 开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门 winpc ap 开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap 提供的开发 接口原生是 c 语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装, 比如 java、.net、python,好像连易语言都有。本系列文章将使用 c 语言来进行各 种实验,

4、有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。 003 你能学到什么? 有关 winpcap 开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔 者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识: 1.Winpcap 获取网卡基本信息及收发数据包 2.存活主机探测 3.端口扫描 4.Arp 欺骗 5.中间人攻击的简单实现 6.流量统计与分析 004 知识补充 进行下面的介绍前,我们需要了解几个名词的关系。 winpcap(windows packet capture)是 windows 平台下一个免费的网络访问系 统,可用于 windows 系统下的网络编程。lin

5、ux 平台下对应的开发包是 libpcap。 Wireshark 是基于 winpcap 处理网络驱动层。 Wpdpack 是 winpcap 的开发包,提供开发相关程序的接口。 005 环境准备 首先根据你所选择的开发语言选择对应的编译器,笔者使用 c 语言,利用 VS2012 进行相关开发。 安装好编译器后,进行相关配置。下载 wpdpack 点击这里 初学者可以选择里面的 Examples 进行编译,可以看到找不到头文件,及相关库。 这是因为 wpdpack 中的相关库还没有引入到编译环境中 将 wpdpack 包中的 Include 和 lib 文件夹中的文件添加到 VS 的相关目录下

6、即可编译通过。 将编译后的程序进行运行则出现以下错误。 这是由于运行时缺乏动态链接库导致, 最简单的方法是直接下载并安装 winpcap 驱动程序 下载 如果你觉得这样子很麻烦,也可以采用简易方法。程序在运行时只需要 winpcap 在 syste m32 下面释放的 wpcap.dll 和 packet.dll, 还有 driver 下面的 npf.sys, 所以不需要完整安 装 winpcap,而选择只复制以上三个文件到对应目录中即可。 本节笔者将采用著名的 Arpspoof 源码进行相关讲解,源码下载地址 http:/www.verysou 006 枚举可用网络适配器资源 在使用 wi

7、npcap 进行收发数据包时,需指定对应的网卡,所以有必要列出计算机上所有可 用的网络适配资源。 列取网卡信息的核心代码: /该函数在 Arpspoof 程序中,笔者进行了详细注释 void ListAdapters() pcap_if_t *alldevs;/用于存储网卡链表的头指针 pcap_if_t *d;/用于遍历网卡链表的临时变量 int i = 0;/记录网卡个数 char errbufPCAP_ERRBUF_SIZE;/存储错误信息 char szGateIPAddr16;/网卡对应网关地址 char *p;/网卡名词 char szIPAddr16;/网卡对应 IP unsig

8、ned char ucPhysicalAddr6;/网卡对应的 MAC 地址 if (pcap_findalldevs( return; for (d=alldevs; d; d=d-next)/遍历网卡链表 if (d-addresses != NULL j 0; j-)/对网卡的描述信息格式化 if (d-descriptionj = 0x20) d-descriptionj = ; else break; printf(“n%d. %sntIP Address. . . . . : %sn“, i, d-description, szIPAddr);/格式化输出网卡信息 printf(“

9、tPhysical Address. . : %.2X-%.2X-%. 2X-%.2X-%.2X-%.2Xn“, ucPhysicalAddr0, ucPhysicalAddr1, ucPhysicalAddr2, ucPhysicalAddr3, ucPhysicalAddr4, ucPhysicalAddr5); printf(“tDefault Gateway . . : %sn“, szGat eIPAddr); i +; if (i=0) printf(“nNo interfaces found! Make sure WinPcap is instal led.n“); return

10、; pcap_freealldevs(alldevs);/释放网卡链表 科普 Tips: “网卡”是神马? 计算机与外界局域网的连接是通过主机箱内插入一块网络接口板 (或者是在笔记本电脑中插 入一块 PCMCIA 卡)。网络接口板又称为通信适配器或网络适配器(network adapter) 或网络接口卡 NIC(Network Interface Card),但是更多的人愿意使用更为简单的名称 “网卡”。 利用上面的程序, 我们可以查看计算机上可利用的所有网卡资源, 以便选择相应的网卡资源 进行相关操作。为了便于观察,我们在 VMware 虚拟机中进行,首先在对应的虚拟机设置 中增加硬件选项

11、中添加多块网卡,然后配置相应的 IP,运行程序,可以得到对应网卡的名 称描述、IP 地址、MAC 地址等。 007 如何构造和发送数据包 上一步我们列出了所有的可用网卡资源, 在发送数据包前, 需要打开对应的网卡来进行发送 数据包的操作。这里使用的函数是pcap_open_live: 函数名称:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) 函数功能:获得用于捕获网络数据包的数据包捕获描述字。 参数说明:device 参数为指定打开的网络设备名。snaplen 参数定义捕

12、获数据的最 大字节数。promisc 指定是否将网络接口置于混杂模式。to_ms 参数指定超时时间 (毫秒)。ebuf 参数则仅在 pcap_open_live()函数出错返回 NULL 时用于传递错 误消息。 返回值:打开的网卡句柄 Arpspoof 中将网卡的打开操作进行了如下封装,调用时直接输入网卡序号即可,程序会对 参数 2、3、4 进行初始化设置: pcap_t* OpenAdapter(int uIndexofAdapter, char szIPSelf, unsigned char ucPhysicalAddr , char szGateIPAddr) pcap_if_t *al

13、ldevs; pcap_if_t *d; pcap_t *fp = NULL; int i = 0; char errbufPCAP_ERRBUF_SIZE, *p; /* 这个 API 用来获得网卡的列表 */ if (pcap_findalldevs( return NULL; /* 显示列表的响应字段的内容 */ for (d=alldevs; d; d=d-next) if (d-addresses != NULL pcap_freealldevs(alldevs); return NULL; else / 去掉网卡注释右边的空格 for(int j = strlen(d-descri

14、p tion) - 1; j 0; j-) if (d-descriptionj = 0x20) d-description j = ; else break; printf(“* Bind on %s %s . n“, szIPSelf, d-description); return fp; i +; if (i=0) printf(“nNo interfaces found! Make sure WinPcap is instal led.n“); return FALSE; /* We dont need any more the device list. Free it */ pcap

15、_freealldevs(alldevs); return NULL; 使用范例: pcap_t *adhandle; / 网卡句柄 unsigned char ucSelf6; char szIPSelf16, szIPGate16; if (adhandle = OpenAdapter(0, szIPSelf, ucSelf, szIPGate) = NUL L) printf(“! Open adatper error!n“); return FALSE; 在获取到网卡句柄并打开后,发送数据包就很容易了 if(pcap_sendpacket(adhandle, (const unsign

16、ed char *) ucFrame, ucFrameLen) ts.tv_sec; printf(“%d n“, local_tv_sec); ltime = localtime( strftime(timestr, sizeof(timestr), “%H %M %S“, ltime); printf(“%s,%.6d len:%dn“, ctime( pcap_loop(adhandle, 0, packet_handler, NULL); 程序在每一个数据包到来时, 都会自动调用回调函数packet_handler来对数据包进行处理, 其第三个参数便是数据包内容。 上图为运行结果图,可以看到每

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号