网络攻击与防范实验报告_第1页
网络攻击与防范实验报告_第2页
网络攻击与防范实验报告_第3页
网络攻击与防范实验报告_第4页
网络攻击与防范实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验报告第13页,共13页网络攻击与防范实验报告姓名:__杨刚__学号:____200948300108005__所在班级:702班实验名称:编写自己的网络嗅探器实验日期:_2009_年_10_月_25_日指导老师:张玉清、宋杨实验评分:验收评语:参与人员:姓名班级学号邮箱角色备注杨刚702200948300108005yanggang_2050@163.com开发者有待优化实验目的:开发一个Windows平台上的网络嗅探工具通过开发基于WinPcap的嗅探器,掌握嗅探器的工作原理,熟悉WinPcap的使用,掌握基于WinPcap网络嗅探器的开发过程实验内容:能列出监测主机的所有网卡。能选择其中一个网卡进行监听能捕获并显示流经网卡的数据包,并做相应的分析和统计能设置捕获过滤规则(按协议类型、端口、地址等)在TCP、UDP、ARP、ICMP、IGMP等协议中选择至少三种进行重点分析,选择至少一种应用层协议如http、ftp等进行分析能按照协议格式进行格式化显示。有可视化操作界面,易于使用实验环境:硬件环境:处理器:PentiumIII800以上内存:1G硬盘:40G网卡:100M以上网速:ISDN128K以上软件环境:操作系统:WindowsXPwithSP3orVistaorWindows7开发工具:VisualStudio2008withSP1开发语言:C++实验设计:本实验的目标主要是利用WinPcap开发包工具,独立开发出一个网络嗅探器。因此可以首先根据WinPcap开发包提供的网络接口获取到底层的网卡信息及其数据包;然后再根据TCP/IP协议栈的结构,依次在数据链路层、网络层、数据传输层和应用层,分别进行数据包的分拆与解析,获取相应协议层的数据信息;再次经过几个最常用的协议,如针对Mac、ARP、IP、TCP、UDP、ICMP、HTTP等协议,进行测试;最后,对程序的结构框架、界面设计等不断地进行修正、改进,使自己开发的作品日臻完善。详细过程(本文所有程序源码,均摘自于本人源程序):利用WinPcap开发包工具获取本机所有网卡列表信息pcap_if_t*MyWinPcap::GetAdapterList(void){ /*Retrievethedevicelistfromthelocalmachine*/ charerrbuf[PCAP_ERRBUF_SIZE]; pcap_if_t*m_alldevs=newpcap_if_t();//??????allocatememorytosavatempall-devs?????if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL/*authisnotneeded*/,&m_alldevs,errbuf)==-1)//iferror{ CStringerrmsg; USES_CONVERSION; errmsg.Format(TEXT("Errorincap_finalldevs_ex():%s\n"),A2W(errbuf)); AfxMessageBox(errmsg); returnNULL; } elseif(NULL==m_alldevs) { AfxMessageBox(TEXT("Nointerfacesfound!MakesureWinPcapisinstalled...")); returnNULL; } else returnm_alldevs;}打开选中的网卡,获取数据包信息pcap_if_t*CYGSnifferDlg::GetSelectedAdapter(intiSelectAdapterNo,intiTotalAdapter){ inti; pcap_if_t*tmpAllDevs=tmpMyWinPcap.GetAdapterList(); pcap_if_t*pSeletedAdapter=newpcap_if_t; pSeletedAdapter=NULL; /*Jumptotheselectedadapter*/ for(pSeletedAdapter=tmpAllDevs,i=0;i<iSelectAdapterNo;pSeletedAdapter=pSeletedAdapter->next,i++);//*********turntonextpiont********* returnpSeletedAdapter; if(pSeletedAdapter) { deletepSeletedAdapter; pSeletedAdapter=NULL; }}DWORDWINAPIThread_GetFilterData(LPVOIDparam){ pcap_if_t*pSelectedAdapter=(pcap_if_t*)param;//GetSelectedAdapter charerrbuf[PCAP_ERRBUF_SIZE]; CStringerrmsg; pcap_t*adhandle; /*Openthedevice*/ if((adhandle=pcap_open(pSelectedAdapter->name,65536,PCAP_OPENFLAG_PROMISCUOUS,1000,NULL,errbuf))==NULL) { USES_CONVERSION; errmsg.Format(TEXT("Unabletoopentheadapter.%sisnotsupportedbyWinPcap"),pSelectedAdapter->name); AfxMessageBox(errmsg); /*Atthispoint,wedon'tneedanymorethedevicelist.Freeit*/ pcap_freealldevs(pSelectedAdapter); return-1; } //filterpacketdata(protocol) u_intnetmask; structbpf_programfcode; //getnetmask if(NULL!=pSelectedAdapter->addresses) netmask=((structsockaddr_in*)(pSelectedAdapter->addresses->netmask))->sin_addr.S_un.S_addr; else netmask=0xffffff; //comppilethefilter if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) { AfxMessageBox(TEXT("Unabletocompilethepacketfilter.Checkthesyntax.")); /*Freethedevicelist*/pcap_freealldevs(pSelectedAdapter); return-1; } //setthefilter if(pcap_setfilter(adhandle,&fcode)<0) { AfxMessageBox(TEXT("Errorsettingthefilter.")); /*Freethedevicelist*/pcap_freealldevs(pSelectedAdapter); return-1; } pcap_freealldevs(pSelectedAdapter); pcap_loop(adhandle,0,packet_handler,NULL); pcap_close(adhandle);return0;}调用WinPcap提供的回调函数voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data){ pcap_pkthdr*header2=newpcap_pkthdr; u_char*pkt_data2=newu_char[header->len]; memcpy(header2,header,sizeof(pcap_pkthdr)); memcpy(pkt_data2,pkt_data,header->len); //PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行; //而SendMessage必须等待其他程序处理消息后才返回,继续执行 ::PostMessage(hDlgHandle,M_MESSAGEWINPCAP,(WPARAM)header2,(LPARAM)pkt_data2);//==**PostMessage**==}解析TCP/IP协议栈的结构各层协议的头信息声明//i386islittle_endian.#ifndefLITTLE_ENDIAN#defineLITTLE_ENDIAN(1)//BYTEORDER#else#errorRedefineLITTLE_ORDER#endif//Mac头部,总长度字节typedefstructethernet_header{u_chardstmac[6];//目标mac地址u_charsrcmac[6];//源mac地址u_shorteth_type;//以太网类型}ethernet_header;/*4bytesIPaddress*/typedefstructip_address{u_charbyte1;//IP地址第个字段u_charbyte2;//IP地址第个字段u_charbyte3;//IP地址第个字段u_charbyte4;//IP地址第个字段}ip_address;//IP头部,总长度字节typedefstructip_header{#ifLITTLE_ENDIANu_charihl:4;//首部长度u_charversion:4;//版本#elseu_charversion:4;//版本u_charihl:4;//首部长度#endifu_chartos; //服务类型u_shorttot_len;//总长度u_shortid;//标识号#ifLITTLE_ENDIANu_shortfrag_off:13;//分片偏移u_shortflag:3;//标志#elseu_shortflag:3;//标志u_shortfrag_off:13;//分片偏移#endifu_charttl;//生存时间u_charprotocol;//协议u_shortchk_sum;//检验和structip_addresssrcaddr;//源IP地址structip_addressdstaddr;//目的IP地址}ip_header;//TCP头部,总长度字节typedefstructtcp_header{u_shortsrc_port;//源端口号u_shortdst_port;//目的端口号u_intseq_no;//序列号u_intack_no;//确认号#ifLITTLE_ENDIANu_charreserved_1:4;//保留位中的位首部长度u_charoffset:4;//tcp头部长度u_charflag:6;//6位标志u_charreserved_2:2;//保留位中的位#elseu_charoffset:4;//tcp头部长度u_charreserved_1:4;//保留位中的位首部长度u_charreserved_2:2;//保留位中的位u_charflag:6;//6位标志#endifu_shortwnd_size;//16位窗口大小u_shortchk_sum;//16位TCP检验和u_shorturgt_p;//16为紧急指针}tcp_header;//UDP头部,总长度字节typedefstructudp_header{u_shortsrc_port;//远端口号u_shortdst_port;//目的端口号u_shortuhl;//udp头部长度u_shortchk_sum;//16位udp检验和}udp_header;//ICMP头部,总长度字节typedefstructicmp_header{u_chartype; //类型u_charcode;//代码u_shortchk_sum;//16位检验和}icmp_header;解析数据链路层的Mac协议voidCYGSnifferDlg::ShowMacDetail(HTREEITEM&hItem,constu_char*pkt_data){ ethernet_header*mac_hdr=(ethernet_header*)pkt_data; hItem=m_treeDetailInfo.InsertItem(TEXT("MACLAYER")); CStringstr=NULL; TCHARmac_dstAddr[18]; TCHARmac_srcAddr[18]; CStringmac_strType=NULL; GetMacType(mac_strType,ntohs(mac_hdr->eth_type),false);//16-bit==u_short==ntohs()istoswapnetworktohost str.Format(TEXT("MacType=%s"),mac_strType); m_treeDetailInfo.InsertItem(str,hItem); GetMacAddress(mac_srcAddr,mac_hdr->srcmac); str.Format(TEXT("SourceMac=%s"),mac_srcAddr); m_treeDetailInfo.InsertItem(str,hItem); GetMacAddress(mac_dstAddr,mac_hdr->dstmac); str.Format(TEXT("DestMac=%s"),mac_dstAddr); m_treeDetailInfo.InsertItem(str,hItem);}解析网络层的IP、ARP、RARP等协议voidCYGSnifferDlg::GetMacType(CStringð_strType,u_shorteth_Type,boolisFirst)//&istopassaddress{ if(isFirst) iStatistic_TotalProtocol++; switch(eth_Type) { case0x0800: eth_strType=TEXT("IP"); if(isFirst) iStatistic_TotalIP++; break; case0x0806: eth_strType=TEXT("ARP"); if(isFirst) iStatistic_TotalARP++; break; case0x8035: eth_strType=TEXT("RARP"); break; case0x880B: eth_strType=TEXT("PPP"); break; case0x814C: eth_strType=TEXT("SNMP"); break; default: eth_strType=TEXT("other"); break; }}解析数据传输层的TCP、UDP、ICMP等协议voidCYGSnifferDlg::GetIPType(CString&ip_strIP,u_shortip_Type,boolisFirst){ switch(ip_Type) { case1: ip_strIP=TEXT("ICMP"); if(isFirst) iStatistic_TotalICMP++; break; case6: ip_strIP=TEXT("TCP"); if(isFirst) iStatistic_TotalTCP++; break; case17: ip_strIP=TEXT("UDP"); if(isFirst) iStatistic_TotalUDP++; break; default: ip_strIP=TEXT("other"); break; }}解析应用层的HTTP协议(基于传输层的TCP协议)boolCYGSnifferDlg::IsHTTP(constu_char*pkt_data){ ip_header*ip_hdr=(ip_header*)(pkt_data+14); u_shortip_hdrLen=ip_hdr->ihl*4; tcp_header*tcp_hdr=(tcp_header*)(pkt_data+14+ip_hdrLen); u_shorttcp_hdrLen=tcp_hdr->offset*4; u_char*http_pkt=(u_char*)(pkt_data+14+ip_hdrLen+tcp_hdrLen); u_shorthttp_pktLen=ntohs(ip_hdr->tot_len)-(ip_hdrLen+tcp_hdrLen);//u_shorthttpLen2=header->len-(14+ip_hdrLen+tcp_hdrLen); CStringchrTmp=NULL; CStringstrTmp=NULL; CStringstrHttp=NULL; inthttpPos=0; if(ip_hdr->protocol==6) { for(inti=0;i<http_pktLen;i++)//仅提取第一行是否含有HTTP字符串 { chrTmp.Format(TEXT("%c"),http_pkt[i]); strTmp+=chrTmp; if(i>2&&http_pkt[i-1]==13&&http_pkt[i]==10) break; } //AfxMessageBox(strTmp); httpPos=strTmp.Find(TEXT("HTTP"),0); if(httpPos!=-1&&httpPos!=65535)//如果第一行含有字符串HTTP,则为HTTP协议 { iStatistic_TotalHTTP++; returntrue; } else returnfalse; } returnfalse;}测试各个协议层的数据信息Mac、IP、UDP、TCP、HTTP等协议及其统计信息Mac、IP、ARP、TCP、UDP、ICMP等协议及其统计信息修正与改进,使之日臻完善运用了多线程技术,进行抓包处理,使其速度、性能得到了有效改善例如: m_hdlThread=CreateThread(NULL,0,Thread_GetFilterData,(LPVOID)pSelectAdapter,0,&dwThread);运用了消息传递技术,使其能够在主线程(即主对话框线程)与子线程(即自己新创建的抓包线程)进行通信例如:::PostMessage(hDlgHandle,M_MESSAGEWINPCAP,(WPARAM)header2,(LPARAM)pkt_data2);//==**PostMessage**==运用了文件的存储与读取方法,节省了内存的消耗//AppendpacketvoidMyWinPcap::AppendPacket(packet*pkt){ constpcap_pkthdr*header=pkt->header;constu_char*data=pkt->pkt_data; ++m_iCurNo; packet_indexindex; index.no=m_iCurNo; index.pos=m_pfileData->GetPosition(); index.len=sizeof(pcap_pkthdr)+header->len; m_pfileIndex->SeekToEnd(); m_pfileIndex->Write(&index,sizeof(packet_index)); m_pfileData->SeekToEnd(); m_pfileData->Write(header,sizeof(pcap_pkthdr)); m_pfileData->Write(data,header->len); m_pfileIndex->Flush();//writefrommemorytodiskimmediatly m_pfileData->Flush();}//Getpacketpacket*MyWinPcap::GetPacket(intm_iNo){ intiPos=(m_iNo-1)*sizeof(packet_index); packet_indexpIndex; m_pfileIndex->Seek(iPos,CFile::begin); m_pfileIndex->Read(&pIndex,sizeof(packet_index)); m_pfileDat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论