版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络嗅探器的设计与实现Designandimplementationofnetworksniffer
摘要网络嗅探器无论是在网络平安还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供网络平安分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际是一把双刃剑。虽然网络嗅探器技术被黑客利用后会对网络平安构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络平安方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络平安维护的。本设计是网络嗅探器的设计与实现,介绍一种在VisualC++下用C语言和网络数据包分析开发工具来实现捕获并分析在网络上传输的数据包的简单方法。本程序实现的根本功能:指定局域网内的任一ip地址,能分析包的类型,构造,流量的大小。附加功能:输出目的ip地址,目的端口,udp数据地址,ip头部长度,udp头部长度,数据包大小。关键词:网络嗅探器数据包捕获分析网络协议WinPcap编程接口多线程目录TOC\o"1-2"\h\z\u摘要2关键词21网络嗅探概述41.1网络嗅探的背景41.2相关的网络知识41.3嗅探器设计原理51.4嗅探器的具体实现92附录〔源代码〕13小结16参考资料16网络嗅探概述1.1网络嗅探的背景网络嗅探是指利用计算机的网络接口截获目的地为其它计算机的数据报文的一种手段。网络嗅探需要用到网络嗅探器,其最早是为网络管理人员配备的工具,有了嗅探器网络管理员可以随时掌握网络的实际情况,查找网络漏洞和检测网络性能,当网络性能急剧下降的时候,可以通过嗅探器分析网络流量,找出网络阻塞的来源。嗅探器也是很多程序人员在编写网络程序时抓包测试的工具,因为我们知道网络程序都是以数据包的形式在网络中进展传输的,因此难免有协议头定义不对的。网络嗅探的根底是数据捕获,网络嗅探系统是并接在网络中来实现对于数据的捕获的,这种方式和入侵检测系统一样,因此被称为网络嗅探。网络嗅探是网络监控系统的实现根底。1.2相关网络知识我们通常所说的“Packetsniffer〞指的是一种插入到计算机网络中的偷听网络通信的设备,就像是监控能听到其他人通过的交谈一样。与电路不同,计算机网络是共享通信通道的。共享意味着计算机能够接收到发送给其他计算机的信息。捕获在网络中传输的数据信息就称为Sniffing〔窃听〕。以太网是现在应用最广泛的计算机联网方式,它就是一个共享的介质。以太网协议是在同一回路向所有主机发送数据包信息。数据XX包含有目标主机的正确地址。一般情况下只有具有该地址的主时机承受这个数据包。如果一台主机能够接收所有数据包,而不理会数据XX内容,这种方式通常称为“混杂〞模式。由于在一个普通的网络环境中,账号和口令信息以明文方式在以太网中传输,一旦入侵者获得其中一台主机的root权限,并将其置于混杂模式以窃听网络数据,从而有可能入侵网络中的所有计算机。计算机能够接收到发送给其他计算机的信息。这就意味着你不必翻开配线盒来安装你的偷听设备,你几乎在连接到你的邻居的任何一条连接上对于你的邻居进展监听。这就被称为“混杂模式〞的监听。但是这种的“共享〞技术很快就被“交换〞技术所取代,这样利用混杂模式进展监听已经不可能了,这就意味着你不得不进展实际的接线来实现监听。目前一些交换机的监视端口就提供了这种接听方式。在黑客的手中,嗅探器就变成了一个黑客利器,如利用ARP欺骗手段,很多攻击方式都要涉及到arp欺骗,如会话劫持和ip欺骗。首先要把网络置于混杂模式,再通过欺骗抓包的方式来获取目标主机的pass包,当然得在同一个交换环境下,也就是要先取得目标效劳器的同一网段的一台效劳器。arp是一种将ip转化成以ip对应的网卡的物理地址的一种协议,或者说ARP协议是一种将ip地址转化成MAC地址的一种协议,它靠维持在内存中保存的一X表来使ip得以在网络上被目标机器应答。ARP就是IP地址与物理之间的转换,当你在传送数据时,IP包里就有源IP地址、源MAC地址、目标IP地址,如果在ARP表中有相对应的MAC地址,那么它就直接,反之,它就要播送出去,对方的IP地址和你发出的目标IP地址一样,那么对方就会发一个MAC地址给源主机。而ARP欺骗就在此处开场,侵略者假设接听到你发送的IP地址,那么,它就可以仿冒目标主机的IP地址,然后返回自己主机的MAC地址给源主机。因为源主机发送的IP包没有包括目标主机的MAC地址,而ARP表里面又没有目标IP地址和目标MAC地址的对应表。所以,容易产生ARP欺骗。1.3嗅探器设计原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字〔socket〕方式来进展。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以播送形式发出的数据帧,对于其他形式的数据帧比方已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要到达此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字〔rawsocket〕来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创立了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能承受所有的数据,还需要通过ioctlsocket()来进展设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开场对网络数据包进展嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保存了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进展分析。下面先给出构造.数据包的总体构造:数据包IP头TCP头〔或其他信息头〕数据数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比拟简单,由一个8字节的头和数据局部组成,具体格式如下:16位16位源端口目的端口UDP长度UDP校验和而TCP数据头那么比拟复杂,以20个固定字节开场,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:对于此TCP数据段头的分析在编程实现中可通过数据构造_TCP来定义:typedefstruct_TCP{WORDSrcPort;//源端口WORDDstPort;//目的端口DWORDSeqNum;//顺序号DWORDAckNum;//确认号BYTEDataOff;//TCP头长BYTEFlags;//标志〔URG、ACK等〕WORDWindow;//窗口大小WORDChksum;//校验和WORDUrgPtr;//紧急指针}TCP;typedefTCP*LPTCP;typedefTCPUNALIGNED*ULPTCP;在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输〔SPARC是大端点机;Pentium是小端点机〕。如果是小端点机,就要在发送和接收时先行转换然后才能进展传输。IP数据段头格式如下:16位16位版本IHL效劳类型总长标识标志分段偏移生命期协议头校验和源地址目的地址3/6选项〔0或更多〕16位16位版本IHL效劳类型总长标识标志分段偏移生命期协议头校验和源地址目的地址选项〔0或更多〕同样,在实际编程中也需要通过一个数据构造来表示此IP数据段头,下面给出此数据构造的定义:typedefstruct_IP{union{BYTEVersion;//版本BYTEHdrLen;//IHL};BYTEServiceType;//效劳类型WORDTotalLen;//总长WORDID;//标识union{WORDFlags;//标志WORDFragOff;//分段偏移};BYTETimeToLive;//生命期BYTEProtocol;//协议WORDHdrChksum;//头校验和DWORDSrcAddr;//源地址DWORDDstAddr;//目的地址BYTEOptions;//选项}IP;typedefIP*LPIP;typedefIPUNALIGNED*ULPIP;1.4嗅探器的具体实现嗅探器工作原理根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就结合注释对程序的具体是实现进展讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。嗅探器的程序实现:〔1〕嗅探器包含的头文件:#include<winsock2.h> /*windowssocket的头文件,系统定义的*/#include<windows.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#pragmament(lib,"ws2_32.lib") /*API相关连的Ws2_32.lib静态库*/〔2〕ip数据报头构造:structipheader{ unsignedcharip_hl:4; /*headerlength(报头长度〕*/ unsignedcharip_v:4; /*version(版本)*/ unsignedcharip_tos; /*typeosservice效劳类型*/ unsignedshortintip_len; /*totallength(总长度)*/ unsignedshortintip_id; /*identification(标识符)*/ unsignedshortintip_off; /*fragmentoffsetfield(段移位域)*/ unsignedcharip_ttl; /*timetolive(生存时间)*/ unsignedcharip_p; /*protocol(协议)*/ unsignedshortintip_sum; /*checksum(校验和)*/ unsignedintip_src; /*sourceaddress(源地址)*/ unsignedintip_dst; /*destinationaddress(目的地址)*/}; 〔3〕tcp头构造:typedefstructtcpheader{ unsignedshortintsport; /*sourceport(源端口号)*/ unsignedshortintdport; /*destinationport(目的端口号)*/ unsignedintth_seq; /*sequencenumber(包的序列号)*/ unsignedintth_ack; /*acknowledgementnumber(确认应答号)*/ unsignedcharth_x:4; /*unused(未使用)*/ unsignedcharth_off:4; /*dataoffset(数据偏移量)*/ unsignedcharFlags; /*标志全*/ unsignedshortintth_win; /*windows(窗口)*/ unsignedshortintth_sum; /*checksum(校验和)*/ unsignedshortintth_urp; /*urgentpointer(紧急指针)*/}TCP_HDR;〔4〕udp数据报头构造:typedefstructudphdr{ unsignedshortsport; /*sourceport(源端口号)*/ unsignedshortdport; /*destinationport(目的端口号)*/ unsignedshortlen; /*udplength(udp长度)*/ unsignedshortcksum; /*udpchecksum(udp校验和)*/}UDP_HDR;〔5〕变量:SOCKETsock;/*进展网络连接的套接字*/该函数如果调用成功,就会返回新创立的套接字的描述符,否那么就返回INVALID_SOCKET。WSADATAwsd;存放Windowssocket初始化信息。DWORDdwBytesRet;32bit的无符号整数。SOCKADDR_INsa,saSource,saDest;用来指定ip地址和端口信息。structhostentFAR*pHostent;主机指针〔6〕循环抓包:1.tcp抓包 if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0){ printf("*******************************************\n"); pCount++; datatcp=(unsignedchar*)RecvBuf+sizeof(structipheader)+sizeof(structtcpheader); printf("-TCP-\n"); printf("\n目的IP地址:%s\n",szDestIP); printf("\n目的端口:%i\n",ntohs(pTcpheader->dport)); printf("datatcpaddress->%x\n",datatcp); printf("sizeofipheader->%i\n",sizeof(structipheader)); printf("sizeoftcpheader->%i\n",sizeof(structtcpheader)); printf("sizeoftheholepacket->%i\n",ntohs(pIpheader->ip_len)); printf("\ncharPacket%i[%i]=\"",pCount,lentcp-1); for(i=0;i<lentcp;i++){ printf("\\x%.2x",*(datatcp+i)); if(i%10==0) printf("\"\n\""); } printf("\";\n\n\n"); for(i=0;i<lentcp;i++){ if(*(datatcp+i)<=127&&*(datatcp+i)>=20) printf("%c",*(datatcp+i)); else printf("."); } printf("\n\n*******************************************\n"); }运行结果截图:2.udp抓包: if((pIpheader->ip_p)==IPPROTO_UDP&&lentcp!=0){ pCount++;dataudp=(unsignedchar*)RecvBuf+sizeof(structipheader)+sizeof(structudphdr); printf("-UDP-\n"); printf("\n目的IP地址:%s\n",szDestIP); printf("\n目的端口:%d\n",ntohs(pTcpheader->dport)); printf("UDP数据地址:%x\n",dataudp); printf("IP头部长度:%i\n",sizeof(structipheader)); printf("UDP头部长度:%i\n",sizeof(structudphdr)); printf("包的大小:%i\n",ntohs(pIpheader->ip_len)); printf("\ncharPacket%i[%i]=\"",pCount,lenudp-1); for(i=0;i<lenudp;i++){ printf("\\x%.2x",*(dataudp+i)); if(i%10==0) printf("\"\n\""); }printf("\";\n\n\n"); for(i=0;i<lenudp;i++){ if(*(dataudp+i)<=127&&*(dataudp+i)>=20) printf("%c",*(dataudp+i)); elseprintf("."); }printf("\n\n*******************************************\n"); }运行结果截图:附录〔源程序〕#include<winsock2.h> /*windowssocket的头文件,系统定义的*/#include<windows.h>#include<ws2tcpip.h>#include<stdio.h>#include<stdlib.h>#pragmament(lib,"ws2_32.lib") /*API相关连的Ws2_32.lib静态库*/#defineMAX_HOSTNAME_LAN255#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)#defineMAX_ADDR_LEN16structipheader{ unsignedcharip_hl:4; /*headerlength(报头长度〕*/ unsignedcharip_v:4; /*version(版本)*/ unsignedcharip_tos; /*typeosservice效劳类型*/ unsignedshortintip_len; /*totallength(总长度)*/ unsignedshortintip_id; /*identification(标识符)*/ unsignedshortintip_off; /*fragmentoffsetfield(段移位域)*/ unsignedcharip_ttl; /*timetolive(生存时间)*/ unsignedcharip_p; /*protocol(协议)*/ unsignedshortintip_sum; /*checksum(校验和)*/ unsignedintip_src; /*sourceaddress(源地址)*/ unsignedintip_dst; /*destinationaddress(目的地址)*/}; /*totalipheaderlength:20bytes(=160bits)*/typedefstructtcpheader{ unsignedshortintsport; /*sourceport(源端口号)*/ unsignedshortintdport; /*destinationport(目的端口号)*/ unsignedintth_seq; /*sequencenumber(包的序列号)*/ unsignedintth_ack; /*acknowledgementnumber(确认应答号)*/ unsignedcharth_x:4; /*unused(未使用)*/ unsignedcharth_off:4; /*dataoffset(数据偏移量)*/ unsignedcharFlags; /*标志全*/ unsignedshortintth_win; /*windows(窗口)*/ unsignedshortintth_sum; /*checksum(校验和)*/ unsignedshortintth_urp; /*urgentpointer(紧急指针)*/}TCP_HDR;typedefstructudphdr{ unsignedshortsport; /*sourceport(源端口号)*/ unsignedshortdport; /*destinationport(目的端口号)*/ unsignedshortlen; /*udplength(udp长度)*/ unsignedshortcksum; /*udpchecksum(udp校验和)*/}UDP_HDR;voidmain(){ SOCKETsock; WSADATAwsd; DWORDdwBytesRet; unsignedintoptval=1; unsignedchar*dataudp,*datatcp; inti,pCount=0,lentcp,lenudp; SOCKADDR_INsa,saSource,saDest; structhostentFAR*pHostent; charFARname[MAX_HOSTNAME_LAN];charszSourceIP[MAX_ADDR_LEN],szDestIP[MAX_ADDR_LEN],RecvBuf[65535]={0}; structudphdr*pUdpheader; structipheader*pIpheader; structtcpheader*pTcpheader; WSAStartup(MAKEWORD(2,1),&wsd); if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==SOCKET_ERROR) exit(1); gethostname(name,MAX_HOSTNAME_LAN); pHostent=gethostbyname(name); sa.sin_family=AF_INET; sa.sin_port=htons(6000); memcpy(&sa.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_length); bind(sock,(SOCKADDR*)&sa,sizeof(sa));/*bind()设定自己主机的IP地址和端口号*/ if((WSAGetLastError())==10013)exit(1);WSAIoctl(sock,SIO_RCVALL,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL); pIpheader=(structipheader*)RecvBuf; pTcpheader=(structtcpheader*)(RecvBuf+sizeof(structipheader)); pUdpheader=(structudphdr*)(RecvBuf+sizeof(structipheader)); while(1){ memset(RecvBuf,0,sizeof(RecvBuf)); recv(sock,RecvBuf,sizeof(RecvBuf),0); saSource.sin_addr.s_addr=pIpheader->ip_src; strncpy(szSourceIP,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN); saDest.sin_addr.s_addr=pIpheader->ip_dst; strncpy(szDestIP,inet_ntoa(saDest.sin_addr),MAX_ADDR_LEN); lentcp=(ntohs(pIpheader->ip_len)-(sizeof(structipheader)+sizeof(structtcpheader))); lenudp=(ntohs(pIpheader->ip_len)-(sizeof(structipheader)+sizeof(structudphdr))); if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0){ printf("*******************************************\n"); pCount++; datatcp=(unsignedchar*)RecvBuf+sizeof(structipheader)+sizeof(structtcpheader); printf("-TCP-\n"); printf("\n目的IP地址:%s\n",szDestIP); printf("\n目的端口:%i\n",ntohs(pTcpheader->dport)); printf("datatcpaddress->%x\n",datatcp); printf("sizeofipheader->%i\n",sizeof(structipheader)); printf("sizeoftcpheader->%i\n",sizeof(structtcpheader)); printf("sizeoftheholepacket->%i\n",ntohs(pIpheader->ip_len)); printf("\ncharPacket%i[%i]=\"",pCount,lentcp-1); for(i=0;i<lentcp;i++){ printf("\\x%.2x",*(datatcp+i)); if(i%10==0)printf("\"\n\""); } printf("\";\n\n\n"); for(i=0;i<lentcp;i++){ if(*(datatcp+i)<=127&&*(datatcp+i)>=20) printf("%c",*(datatcp+i)); else printf("."); } printf("\n\n*******************************************\n"); } if((pIpheader->ip_p)==IPPROTO_UDP&&lentcp!=0){ pCount++; dataudp=(unsignedchar*)RecvBuf+sizeof(structipheader)+sizeof(structudphdr); printf("-UDP-\n"); printf("\n目的IP地址:%s\n",szDestIP); printf("\n目的端口:%d\n",ntohs(pTcpheader->dport))
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF(石化)101-2023固体氧化性试验仪(重量法)校准规范
- 2026负责任AI进展报告-
- 皖北卫生职业学院《管理信息系统》2025-2026学年期末试卷
- 华东交通大学《语言文字规范与应用》2025-2026学年期末试卷
- 泉州轻工职业学院《外科学》2025-2026学年期末试卷
- 长春人文学院《泵与泵站》2025-2026学年期末试卷
- 福州理工学院《经济学》2025-2026学年期末试卷
- 福建师范大学《基础写作教程》2025-2026学年期末试卷
- 漳州科技职业学院《教育社会学》2025-2026学年期末试卷
- 华东交通大学《公司治理学》2025-2026学年期末试卷
- 医药生物行业定期报告:AI医疗应用商业化加速重视AI医疗底部机会
- 警务信息保密协议书
- CKD患者心理状态分期评估与干预方案
- 2026年中国安防行业发展展望及投资策略报告
- 巧手缝补衣服课件
- 化工装置投料试车的安全条件与实施标准
- DB65T 4791-2024 水工隧洞敞开式-TBM施工技术规范
- 剪刀车使用安全培训课件
- GJB1442A-2019检验工作要求
- 冶金企业烘烤器安全技术规范
- 研发样机管理办法
评论
0/150
提交评论