WinPcap开发〔一〕:零基础入门 - 安全编程.docx

上传人:安*** 文档编号:19273204 上传时间:2022-06-05 格式:DOCX 页数:23 大小:571.04KB
返回 下载 相关 举报
WinPcap开发〔一〕:零基础入门 - 安全编程.docx_第1页
第1页 / 共23页
WinPcap开发〔一〕:零基础入门 - 安全编程.docx_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《WinPcap开发〔一〕:零基础入门 - 安全编程.docx》由会员分享,可在线阅读,更多相关《WinPcap开发〔一〕:零基础入门 - 安全编程.docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、WinPcap开发一:零基础入门-安全编程-次元立方网-电脑知识与技术互动沟通平台网络编程在网络安全方面具有举足轻重的作用,怎样快速高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好能够为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。001winpcap是什么?winpcap(windowspacketcapture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中能够看到winpca

2、p驱动程序的安装经过。有关winpcap的介绍网络上很多,百科里面介绍的也很具体,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库packet.dll和一个高层的不依靠于系统的库wpcap.dll。所以它只能嗅探到物理线路上的数据包,而不具备拦截的能力,因而不适用于个人防火墙等项目。002你需要准备些什么?本系列文章主要带大家认识和了解怎样利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是

3、以轻松的方式结合实验来对相关原理进行深化理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开场前,读者需要有一些相关基础:了解网络协议相关基础知识,把握一门winpcap开发库支持的编程语言,本人能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比方java、.net、python,好似连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者能够将其转换成本人熟悉的语言来动手实践。003你能学到什么?有关winpcap开发的文章在网上很容易找到,但是更多的都是对

4、于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:1.Winpcap获取网卡基本信息及收发数据包2.存活主机探测3.端口扫描4.Arp欺骗5.中间人攻击的简单实现6.流量统计与分析004知识补充进行下面的介绍前,我们需要了解几个名词的关系。winpcap(windowspacketcapture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。linux平台下对应的开发包是libpcap。Wireshark是基于winpcap处理网络驱动层。Wpdpack是winpcap的开发包,提供开发相关程序的接口。005环境准备首先根据你所

5、选择的开发语言选择对应的编译器,笔者使用c语言,利用VS2021进行相关开发。安装好编译器后,进行相关配置。下载wpdpack点击这里初学者能够选择里面的Examples进行编译,能够看到找不到头文件,及相关库。这是由于wpdpack中的相关库还没有引入到编译环境中将wpdpack包中的Include和lib文件夹中的文件添加到VS的相关目录下即可编译通过。将编译后的程序进行运行则出现下面错误。这是由于运行时缺乏动态链接库导致,最简单的方法是直接下载并安装winpcap驱动程序下载假如你觉得这样子很费事,可以以采用简易方法。程序在运行时只需要winpcap在system32下面释放的wpcap

6、.dll和packet.dll,还有driver下面的npf.sys,所以不需要完好安装winpcap,而选择只复制以上三个文件到对应目录中即可。本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址:/verysource/code/2287464_1/arpspoof.cpp.006枚举可用网络适配器资源在使用winpcap进行收发数据包时,需指定对应的网卡,所以有必要列出计算机上所有可用的网络适配资源。列取网卡信息的核心代码:/该函数在Arpspoof程序中,笔者进行了具体注释voidListAdapters()pcap_if_t*alldevs;/用于存储网卡链表的头指针p

7、cap_if_t*d;/用于遍历网卡链表的临时变量inti=0;/记录网卡个数charerrbufPCAP_ERRBUF_SIZE;/存储错误信息charszGateIPAddr16;/网卡对应网关地址char*p;/网卡名词charszIPAddr16;/网卡对应IPunsignedcharucPhysicalAddr6;/网卡对应的MAC地址if(pcap_findalldevs(alldevs,errbuf)=-1)/获取网卡链表fprintf(stderr,Errorinpcap_findalldevs:%s,errbuf);return;for(d=alldevs;d;d=d-nex

8、t)/遍历网卡链表if(d-addresses!=NULL(p=strchr(d-name,)!=NULLGetadapterbyname(p,szIPAddr,ucPhysicalAddr,szGateIPAddr)/获取网卡的对应信息for(intj=strlen(d-description)-1;jj-)/对网卡的描绘信息格式化if(d-descriptionj=0x20)d-descriptionj=elsebreak;printf(%d.%sIPAddress.:%s,i,d-description,szIPAddr);/格式化输出网卡信息printf(PhysicalAddress

9、.:%.2X-%.2X-%.2X-%.2X-%.2X-%.2X,ucPhysicalAddr0,ucPhysicalAddr1,ucPhysicalAddr2,ucPhysicalAddr3,ucPhysicalAddr4,ucPhysicalAddr5);printf(DefaultGateway.:%s,szGateIPAddr);i+;if(i=0)printf(Nointerfacesfound!MakesureWinPcapisinstalled.return;pcap_freealldevs(alldevs);/释放网卡链表科普Tips:网卡是神马?计算机与外界局域网的连接是通过主

10、机箱内插入一块网络接口板或者是在笔记本电脑中插入一块PCMCIA卡。网络接口板又称为通信适配器或网络适配器networkadapter或网络接口卡NICNetworkInterfaceCard,但是更多的人愿意使用更为简单的名称网卡。利用上面的程序,我们能够查看计算机上可利用的所有网卡资源,以便选择相应的网卡资源进行相关操作。为了便于观察,我们在VMware虚拟机中进行,首先在对应的虚拟机设置中增加硬件选项中添加多块网卡,然后配置相应的IP,运行程序,能够得到对应网卡的名称描绘、IP地址、MAC地址等。007怎样构造和发送数据包上一步我们列出了所有的可用网卡资源,在发送数据包前,需要打开对应的

11、网卡来进行发送数据包的操作。这里使用的函数是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中将网卡的打开

12、操作进行了如下封装,调用时直接输入网卡序号即可,程序会对参数2、3、4进行初始化设置:pcap_t*OpenAdapter(intuIndexofAdapter,charszIPSelf,unsignedcharucPhysicalAddr,charszGateIPAddr)pcap_if_t*alldevs;pcap_if_t*d;pcap_t*fp=NULL;inti=0;charerrbufPCAP_ERRBUF_SIZE,*p;/*这个API用来获得网卡的列表*/if(pcap_findalldevs(alldevs,errbuf)=-1)fprintf(stderr,Errorinp

13、cap_findalldevs:%s,errbuf);returnNULL;/*显示列表的响应字段的内容*/for(d=alldevs;d;d=d-next)if(d-addresses!=NULL(p=strchr(d-name,)!=NULLGetadapterbyname(p,szIPSelf,ucPhysicalAddr,szGateIPAddr)if(i=uIndexofAdapter)if(fp=pcap_open_live(d-name,/设备名称65536,/portionofthepackettocapture./65536grantsthatthewholepacketwi

14、llbecapturedonalltheMACs.1,/混杂形式1,/读超时为1ms,越小越好errbuf/errorbuffer)=NULL)fprintf(stderr,Unabletoopentheadapter.%sisnotsupportedbyWinPcap,d-name);pcap_freealldevs(alldevs);returnNULL;else/去掉网卡注释右边的空格for(intj=strlen(d-description)-1;jj-)if(d-descriptionj=0x20)d-descriptionj=elsebreak;printf(*Bindon%s%s

15、.,szIPSelf,d-description);returnfp;i+;if(i=0)printf(Nointerfacesfound!MakesureWinPcapisinstalled.returnFALSE;/*Wedontneedanymorethedevicelist.Freeit*/pcap_freealldevs(alldevs);returnNULL;使用范例:pcap_t*adhandle;/网卡句柄unsignedcharucSelf6;charszIPSelf16,szIPGate16;if(adhandle=OpenAdapter(0,szIPSelf,ucSelf

16、,szIPGate)=NULL)printf(!Openadatpererror!returnFALSE;在获取到网卡句柄并打开后,发送数据包就很容易了if(pcap_sendpacket(adhandle,(constunsignedchar*)ucFrame,ucFrameLen)0)printf(SendPacketErrorreturnFALSE;ucFrame是封装好的数据包,ucFrameLen为数据包的长度。下面我们封装一个例子,使用上述代码发送ARP请求包,用于查询某IP对应的MAC地址。ARP协议格式关键代码boolsendARPData(pcap_t*adhandle)u_

17、charucFrameARP_LEN;/设置Ethernet头ETHeadereh=0;memset(eh.dhost,0xff,6);/ARP广播包目的地址为ffffffffffffmemcpy(eh.shost,ucSelf,6);eh.type=htons(ETHERTYPE_ARP);/帧类型为ARPmemcpy(ucFrame,eh,sizeof(eh);/设置Arp头ARPHeaderah=0;ah.hrd=htons(ARPHRD_ETHER);ah.eth_type=htons(ETHERTYPE_IP);ah.maclen=6;/硬件地址长度ah.iplen=4;/IP地址长

18、度ah.opcode=htons(ARP_REQUEST);/ARP请求包类型memcpy(ah.smac,ucSelf,6);ah.saddr=inet_addr(szIPSelf);memset(ah.dmac,0x00,6);/ARP请求包中目的MAC地址均置0ah.daddr=inet_addr(192.168.0.2/ARP请求的目的IP地址memcpy(ucFramesizeof(ETHeader),ah,sizeof(ah);/发送ARP数据包if(pcap_sendpacket(adhandle,(constunsignedchar*)ucFrame,ARP_LEN)0)pri

19、ntf(SendPacketErrorreturnFALSE;returnTRUE;启动wireshark进行监听,运行程序,我们能够看到如下结果,程序发出了一个ARP广播包,用于查询192.168.0.2的主机MAC,并且目的机在收到该查询包后,进行了回复,将本人的MAC地址告诉了查询发起的机器。008怎样监听分析数据包在监听数据包时,使用的关键函数为pcap_loop函数名称:intpcap_loop(pcap_t*p,intcnt,pcap_handlercallback,uchar*user);参数讲明:p是由pcap_open_live()返回的所打开的网卡的指针;cnt用于设置所捕

20、获数据包的个数;callback是回调函数,其原型为pcap_callback(u_char*argument,conststructpcap_pkthdr*packet_header,constu_char*packet_content);user值一般为NULL结合上面的代码,我们在获得并打开网卡句柄adhandle,使用下面的代码并可捕获数据包/每次捕捉到数据包时,pcap都会自动调用这个回调函数voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data)structtm*ltime

21、;chartimestr16;time_tlocal_tv_sec;/将时间戳转换成可识别的格式local_tv_sec=header-ts.tv_sec;printf(%d,local_tv_sec);ltime=localtime(local_tv_sec);strftime(timestr,sizeof(timestr),%H%M%S,ltime);printf(%s,%.6dlen:%d,ctime(local_tv_sec),header-ts.tv_usec,header-len);pcap_loop(adhandle,0,packet_handler,NULL);程序在每一个数据

22、包到来时,都会自动调用回调函数packet_handler来对数据包进行处理,其第三个参数便是数据包内容。上图为运行结果图,能够看到每一个数据包的时间戳信息,和长度信息。值得注意的是,原始套接字可以以完成数据包的发送和监听工作,但是与winpcap相比,在监听数据包方面是有区别的,由于winpcap更接近与底层,所以在混杂形式下,但凡到达网卡的数据包不管目的地址能否为本身主机,winpcap均能接收到;而原始套接字只能接收到投送给本人的数据包。009总结与预告本章中我们简单认识了winpcap的相关基础知识,学习了发送数据包和接收数据包的方法,其实不难发现,发送和接收数据包的经过都比拟简单,只需要调用相关库函数即可,而更多的精神在数据包的组织和拆分上,同时在一些场景中,算法的使用也较为重要。在接下来的章节中,我们会看到下面的内容:1.扫描存活主机2.Arp欺骗的实现与应用3.端口扫描4.流量监控与统计分析

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

当前位置:首页 > 应用文书 > 策划方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁