您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > WinPcap开发(一)零基础入门
WinPcap开发(一):零基础入门*原创作者:追影人0×00前言网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。0×01winpcap是什么?winpcap(windowspacketcapture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。0×02你需要准备些什么?本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpcap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。0×03你能学到什么?有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:1.Winpcap获取网卡基本信息及收发数据包2.存活主机探测3.端口扫描4.Arp欺骗5.中间人攻击的简单实现6.流量统计与分析0×04知识补充进行下面的介绍前,我们需要了解几个名词的关系。winpcap(windowspacketcapture)是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,所以不需要完整安装winpcap,而选择只复制以上三个文件到对应目录中即可。本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址×06枚举可用网络适配器资源在使用winpcap进行收发数据包时,需指定对应的网卡,所以有必要列出计算机上所有可用的网络适配资源。列取网卡信息的核心代码://该函数在Arpspoof程序中,笔者进行了详细注释voidListAdapters(){pcap_if_t*alldevs;//用于存储网卡链表的头指针pcap_if_t*d;//用于遍历网卡链表的临时变量inti=0;//记录网卡个数charerrbuf[PCAP_ERRBUF_SIZE];//存储错误信息charszGateIPAddr[16];//网卡对应网关地址char*p;//网卡名词charszIPAddr[16];//网卡对应IPunsignedcharucPhysicalAddr[6];//网卡对应的MAC地址if(pcap_findalldevs(&alldevs,errbuf)==-1)//获取网卡链表{fprintf(stderr,Errorinpcap_findalldevs:%s\n,errbuf);return;}for(d=alldevs;d;d=d-next)//遍历网卡链表{if(d-addresses!=NULL&&(p=strchr(d-name,'{'))!=NULL&&Getadapterbyname(p,szIPAddr,ucPhysicalAddr,szGateIPAddr))//获取网卡的对应信息{for(intj=strlen(d-description)-1;j0;j--)//对网卡的描述信息格式化{if(d-description[j]==0x20)d-description[j]='';elsebreak;}printf(\n%d.%s\n\tIPAddress.....:%s\n,i,d-description,szIPAddr);//格式化输出网卡信息printf(\tPhysicalAddress..:%.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n,ucPhysicalAddr[0],ucPhysicalAddr[1],ucPhysicalAddr[2],ucPhysicalAddr[3],ucPhysicalAddr[4],ucPhysicalAddr[5]);printf(\tDefaultGateway..:%s\n,szGateIPAddr);i++;}}if(i==0){printf(\nNointerfacesfound!MakesureWinPcapisinstalled.\n);return;}pcap_freealldevs(alldevs);//释放网卡链表}科普Tips:“网卡”是神马?计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡)。网络接口板又称为通信适配器或网络适配器(networkadapter)或网络接口卡NIC(NetworkInterfaceCard),但是更多的人愿意使用更为简单的名称“网卡”。利用上面的程序,我们可以查看计算机上可利用的所有网卡资源,以便选择相应的网卡资源进行相关操作。为了便于观察,我们在VMware虚拟机中进行,首先在对应的虚拟机设置中增加硬件选项中添加多块网卡,然后配置相应的IP,运行程序,可以得到对应网卡的名称描述、IP地址、MAC地址等。0×07如何构造和发送数据包上一步我们列出了所有的可用网卡资源,在发送数据包前,需要打开对应的网卡来进行发送数据包的操作。这里使用的函数是pcap_open_live:函数名称:pcap_t*pcap_open_live(char*device,intsnaplen,intpromisc,intto_ms,char*ebuf)函数功能:获得用于捕获网络数据包的数据包捕获描述字。参数说明:device参数为指定打开的网络设备名。snaplen参数定义捕获数据的最大字节数。promisc指定是否将网络接口置于混杂模式。to_ms参数指定超时时间(毫秒)。ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。返回值:打开的网卡句柄Arpspoof中将网卡的打开操作进行了如下封装,调用时直接输入网卡序号即可,程序会对参数2、3、4进行初始化设置:pcap_t*OpenAdapter(intuIndexofAdapter,charszIPSelf[],unsignedcharucPhysicalAddr[],charszGateIPAddr[]){pcap_if_t*alldevs;pcap_if_t*d;pcap_t*fp=NULL;inti=0;charerrbuf[PCAP_ERRBUF_SIZE],*p;/*这个API用来获得网卡的列表*/if(pcap_findalldevs(&alldevs,errbuf)==-1){fprintf(stderr,Errorinpcap_findalldevs:%s\n,errbuf);returnNULL;}/*显示列表的响应字段的内容*/for(d=alldevs;d;d=d-next){if(d-addresses!=NULL&&(p=strchr(d-name,'{'))!=NULL&&Getadapterbyname(p,szIPSelf,ucPhysicalAddr,szGateIPAddr)){if(i==uIndexofAdapter){if((fp=pcap_open_live(d-name,//设备名称65536,//portionofthepackettocapture.//65536grantsthatthewholepacketwillbecapturedonalltheMACs.1,//混杂模式1,//读超时为1ms,越小越好errbuf//errorbuffer))==NULL){fprintf(stderr,\nUnabletoopentheadapter.\%sisnotsupportedbyWinPcap\n,d-name);pcap_freealldevs(alldevs);returnNULL;}else{//去掉网卡注释右边的空格for(intj=strlen(d-description)-1;j0;j--){if(d-description[j]==0x20)d-description[j]='';elsebreak;}printf([*]Bindon%s%s...\n,szIPSelf,d-description);returnfp;}}i++;}}if(i==0){printf(\nNointerfacesfound!MakesureWinPcapisinstalled.\n);returnFALSE;}/*Wedon'tneedanymorethedevicelist.Freeit*/pcap_freealldevs(alldevs);returnNULL;}使用范例:pcap_t*adhandle;//网卡句柄unsignedcharucSelf[6];charszIPSelf[16],szIPGate[16];if((adhandle=OpenAdapter(0,szIPSelf,ucSelf,szIPGate))==NULL){printf([!]Openadatpererror!\n);returnFALSE;}在获取到网卡句柄并打开后,发送数据包就很容易了if(pcap_sendpacket(adhandle,(constunsignedchar*)ucFrame,ucFrameLen)0){printf(SendPacketError\n);returnFALSE;}ucFrame是封装好的数据包,ucFrameLen为数据包的长度。下面我们封装一个例子,使用上述代码发送ARP请求包,用于
本文标题:WinPcap开发(一)零基础入门
链接地址:https://www.777doc.com/doc-2867694 .html