




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WinPcap开发(一):零基础入门*原创作者:追影人0×00 前言网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。0×01 winpcap是什么?winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看
2、到winpcap驱动程序的安装过程。有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。0×02 你需要准备些什么?本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这
3、里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpcap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。0×03 你能学到什么?有关wi
4、npcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:1. Winpcap获取网卡基本信息及收发数据包2. 存活主机探测3. 端口扫描4. Arp欺骗5. 中间人攻击的简单实现6. 流量统计与分析0×04 知识补充进行下面的介绍前,我们需要了解几个名词的关系。winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。linux
5、 平台下对应的开发包是libpcap。Wireshark是基于winpcap处理网络驱动层。Wpdpack是winpcap的开发包,提供开发相关程序的接口。0×05 环境准备首先根据你所选择的开发语言选择对应的编译器,笔者使用c语言,利用VS2012进行相关开发。安装好编译器后,进行相关配置。下载wpdpack点击这里 初学者可以选择里面的Examples进行编译,可以看到找不到头文件,及相关库。 这是因为wpdpack中的相关库还没有引入到编译环境中 将wpdpack包中的Include和lib文件夹中的文件添加到VS的相关目录下即可编译通
6、过。将编译后的程序进行运行则出现以下错误。 这是由于运行时缺乏动态链接库导致,最简单的方法是直接下载并安装winpcap驱动程序 下载 如果你觉得这样子很麻烦,也可以采用简易方法。程序在运行时只需要winpcap在system32下面释放的wpcap.dll和packet.dll,还有driver下面的npf.sys,所以不需要完整安装winpcap,而选择只复制以上三个文件到对应目录中即可。本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址0×06 枚举可用网络适配器资源在使用winpcap进行收发数据包时,需指定对应的网卡,所以有必要
7、列出计算机上所有可用的网络适配资源。列取网卡信息的核心代码:/该函数在Arpspoof程序中,笔者进行了详细注释void ListAdapters()pcap_if_t *alldevs;/用于存储网卡链表的头指针pcap_if_t *d;/用于遍历网卡链表的临时变量 int i = 0;/记录网卡个数char errbufPCAP_ERRBUF_SIZE;/存储错误信息char szGateIPAddr16;/网卡对应网关地址char *p;/网卡名词char szI
8、PAddr16;/网卡对应IPunsigned char ucPhysicalAddr6;/网卡对应的MAC地址 if (pcap_findalldevs(&alldevs, errbuf) = -1)/获取网卡链表 fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);
9、; return; for (d=alldevs; d; d=d->next)/遍历网卡链表 if (d->addresses != NULL && (p = strchr(d->name, '') != NULL
10、&& Getadapterbyname(p, szIPAddr, ucPhysicalAddr,szGateIPAddr)/获取网卡的对应信息for(int j = strlen(d->description) - 1; j > 0; j-)/对网卡的描述信息格式化if (d->descriptionj = 0x20)d->descriptionj = ''elsebreak;printf("n %d. %sntIP Address. . . . . : %sn", i, d->d
11、escription, szIPAddr);/格式化输出网卡信息printf("tPhysical Address. . : %.2X-%.2X-%.2X-%.2X-%.2X-%.2Xn", ucPhysicalAddr0, ucPhysicalAddr1, ucPhysicalAddr2,ucPhysicalAddr3, ucPhysicalAddr4, ucPhysicalAddr5);printf("tDefault Gateway . . : %sn", szGateIPAddr);i +;
12、60; if (i=0) printf("nNo interfaces found! Make sure WinPcap is installed.n"); return; pcap
13、_freealldevs(alldevs);/释放网卡链表科普Tips:“网卡”是神马?计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡)。网络接口板又称为通信适配器或网络适配器(network adapter)或网络接口卡NIC(Network Interface Card),但是更多的人愿意使用更为简单的名称“网卡”。利用上面的程序,我们可以查看计算机上可利用的所有网卡资源,以便选择相应的网卡资源进行相关操作。为了便于观察,我们在VMware虚拟机中进行,首先在对应的虚拟机设置中增加硬件选项中添加多块网卡,然后配置相应的IP,运行程序,可
14、以得到对应网卡的名称描述、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指定是否将网络接口置于混杂
15、模式。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 *alldevs;pcap_if_t
16、0;*d;pcap_t *fp = NULL; int i = 0; char errbufPCAP_ERRBUF_SIZE, *p; /* 这个API用来获得网卡的列表 */ if (pcap_findalldevs(&alldevs, errbuf) = -1)
17、60; fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf); return NULL; /* 显示列表的响应字段的内容 */ for (d=alldevs; d; d=d->next)
18、160; 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,
19、160; / portion of the packet to capture./ 65536 grants that the whole packet will be captured on all the MACs.1, / 混杂模式1, /读超时为1ms,越小越好errbuf / error buffer) = NULL)fprintf(stderr,"nUnable to open the adapter. %s is not supp
20、orted by WinPcapn", d->name);pcap_freealldevs(alldevs);return NULL;else/ 去掉网卡注释右边的空格for(int j = strlen(d->description) - 1; j > 0; j-)if (d->descriptionj = 0x20)d->descriptionj = ''elsebreak;printf("* Bind on %s %s .n", szIPSelf, d->description
21、);return fp;i +; if (i=0) printf("nNo interfaces found! Make sure WinPcap is installed.n"); return FALSE;
22、; /* We don't need any more the device list. Free it */ pcap_freealldevs(alldevs);return NULL; 使用范例:pcap_t *adhandle; / 网卡句柄unsigned char ucSelf6;char szIPSelf16, szIPGate16;if (adhandle = Op
23、enAdapter(0, szIPSelf, ucSelf, szIPGate) = NULL)printf("! Open adatper error!n");return FALSE;在获取到网卡句柄并打开后,发送数据包就很容易了if(pcap_sendpacket(adhandle, (const unsigned char *) ucFrame,ucFrameLen) < 0)printf("Send Packet Errorn");return FALSE;ucFrame是封装好的数据包,
24、ucFrameLen为数据包的长度。下面我们封装一个例子,使用上述代码发送ARP请求包,用于查询某IP对应的MAC地址。ARP协议格式关键代码bool sendARPData(pcap_t *adhandle)u_char ucFrameARP_LEN;/ 设置Ethernet头ETHeader eh = 0 ;memset(eh.dhost,0xff, 6);/ARP广播包目的地址为ffffffffffffmemcpy(eh.shost, ucSelf, 6);eh.type = htons(ETHERTYPE_ARP);/帧类型为ARPmemcpy(
25、ucFrame, &eh, sizeof(eh); / 设置Arp头ARPHeader ah = 0 ;ah.hrd = htons(ARPHRD_ETHER);ah.eth_type = htons(ETHERTYPE_IP);ah.maclen = 6;/硬件地址长度ah.iplen = 4;/IP地址长度ah.opcode = htons(ARP_REQUEST);/ARP请求包类型memcpy(ah.smac, ucSelf, 6); ah.saddr = inet_addr(szIPSelf); memset(ah.dmac, 0x00, 6)
26、;/ARP请求包中目的MAC地址均置0ah.daddr = inet_addr(""); /ARP请求的目的IP地址 memcpy(&ucFramesizeof(ETHeader), &ah, sizeof(ah); / 发送ARP数据包if(pcap_sendpacket(adhandle, (const unsigned char *) ucFrame,ARP_LEN) < 0)printf("Send Packet Errorn")
27、;return FALSE;return TRUE; 启动wireshark进行监听,运行程序,我们可以看到如下结果,程序发出了一个ARP广播包,用于查询的主机MAC,并且目标机在收到该查询包后,进行了回复,将自己的MAC地址告诉了查询发起的机器。0×08 如何监听分析数据包在监听数据包时,使用的关键函数为pcap_loop函数名称:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);参数说明:p 是由pcap_open_live()
28、返回的所打开的网卡的指针;cnt用于设置所捕获数据包的个数;callback 是回调函数,其原型为pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content);user值一般为NULL结合上面的代码,我们在获得并打开网卡句柄adhandle,使用下面的代码并可捕获数据包 /每次捕捉到数据包时,pcap都会自动调用这个回调函数void packet_handler(u_char *param, const struct pcap_pkthdr *he
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届浙江省丽水地区四校 化学高三第一学期期中综合测试模拟试题含解析
- 福建-全国名校联盟2026届高三联合开学摸底考试语文(含答案)
- 护士礼仪规范与沟通技巧
- 羊毛地毯专业知识培训内容课件
- 羊常见疾病防治课件
- 山东省德州市宁津县第一中学2025-2026学年高一上学期开学考试政史地试题-高中地理(解析版)
- 特殊学校美育融合计划
- 医疗机构传染病管理计划
- 液压助力转向开关故障诊断教学设计-2025-2026学年中职专业课-汽车底盘控制系统故障诊断与检测-新能源汽车运用与维修-交通运输大类
- 2024-2025学年高中语文 第一单元 中国古代戏曲和中外话剧 第2课 雷雨说课稿 新人教版必修4
- 医院培训课件:《肺源性心脏病》
- 二零二五年度炉渣资源化利用项目合作协议书
- 2025四川能投合江电力有限公司员工招聘11人笔试参考题库附答案解析
- 2025-2026学年鲁科版(五四学制)(2024)初中生物六年级上册教学计划及进度表
- 湖北省圆创高中名校联盟2026届高三第一次联合测评 英语试卷(含答案详解)
- 2025行测的考试题及答案
- 2025年《中华人民共和国工会法》工会法律知识竞赛题库(含答案解析)
- 2025年湖南省教师招聘考试(公共基础知识)历年参考题库含答案详解(5卷)
- 施工进度计划管理制度
- 中国汽车零配件出口分析及各国进口政策影响白皮书 2025
- 工伤劳动能力鉴定课件
评论
0/150
提交评论