您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 入侵实验二网络数据包的捕获及协议的简单分析
湖南大学入侵检测技术实验报告实验二网络数据包的捕获及协议的简单分析一、实验目的网络数据包的捕获及协议的简单分析。网络数据包是基于网络的入侵检测系统的重要数据源,网络数据包的捕获是基于网络的入侵检测系统实现的第一步。通过该实验,熟悉并掌握Linux环境下基于Lipbcap的网络数据包的捕获方法,理解和掌握基于网络入侵检测系统的源数据的捕获、协议分析的基本原理和实现方法。能够熟练应用Libcap开发包中的函数完成网络环境下功能较为简单的网络捕获包和分析程序。二、实验内容1、学习libpcap开发包的功能,并在linux下配置好libpcap环境。2、在linux系统下基于Libpcap编写C程序,实现对数据包的捕获、过滤和简单分析。三、了解libpcap编程Libpcap的抓包流程1.查找网络设备:目的是发现可用的网卡,实现的函数为pcap_lookupdev(),如果当前有多个网卡,函数就会返回一个网络设备名的指针列表。2.打开网络设备:利用上一步中的返回值,可以决定使用哪个网卡,通过函数pcap_open_live()打开网卡,返回用于捕捉网络数据包的秒数字。3.获得网络参数:这里是利用函数pcap_lookupnet(),可以获得指定网络设备的IP地址和子网掩码。4.编译过滤策略:Lipcap的主要功能就是提供数据包的过滤,函数pcap_compile()来实现。5.设置过滤器:在上一步的基础上利用pcap_setfilter()函数来设置。6.利用回调函数,捕获数据包:函数pcap_loop()和pcap_dispatch()来抓去数据包,也可以利用函数pcap_next()和pcap_next_ex()来完成同样的工作。7.关闭网络设备:pcap_close()函数关系设备,释放资源。libpcap利用BPF来过滤数据包湖南大学入侵检测技术实验报告过滤数据包需要完成3件事:1.构造一个过滤表达式2.编译这个表达式3.应用这个过滤器基于Libpcap实现一个网络数据包嗅探器捕获所有流经本网卡的数据包实现流程:1.查找网络设备2.打开网络设备3.查找设备信息4.输入过滤规则5.编译输入规则设置输入规则6.开始捕获数据包7.调用数据包分析模块8.输出MAC,IP,协议以及数据帧9.结束四、libpcap安装需要以下四个安装包:先安装bison、flex、m4,最后安装libpcap第一步:解压:tar-xvfbison-2.4.1.tar.gz.gz//因为都是.tar.gz的压缩包,使用tar解压命令第二步:检查:./configure//检查计算机建立包所必须的完整性;根据需要改变默认的路径;激活/禁用编译程序中的各种选项;改变程序将要被安装的路径;第三步:编译:(sudo)make//(有时候需要root权限)第四步:安装:(sudo)makeinstall//(有时候需要root权限)bison-2.4.1.tar.gz.gz、flex-2.5.35.tar.gz.gz、m4-1.4.13.tar.gz.gz都用上述方法安装,最后同样方法安装libpcap-1.5.3.tar.gz.gz最后将解压到的libpcap-1.5.3目录下的pcap目录复制到根目录下的/usr/include里,再将/usr/lib目录下的libpcap.so.1.5.3复制一份改名为libpcap.so.1放到/usr/lib。五、实验代码标准的与上比对的简单实现代码:#includepcap.h#includestdio.hintmain(intargc,char*argv[]){湖南大学入侵检测技术实验报告pcap_t*handle;/*会议手柄*/char*dev;/*嗅探装置*/charerrbuf[PCAP_ERRBUF_SIZE];/*错误字符串*/structbpf_programfp;/*编译过滤器*/charfilter_exp[]=port80;/*过滤器表达式*/bpf_u_int32mask;/*网络掩码*/bpf_u_int32net;/*IP*/structpcap_pkthdrheader;/*PCAP返回的头部*/constu_char*packet;/*实际的数据包*//*查找网络设备*/dev=pcap_lookupdev(errbuf);//如果当前有多个网卡,函数就会返回一个网络设备名的指针列表。if(dev==NULL){fprintf(stderr,找不到默认的设备:%s\n,errbuf);return(2);}/*获得网络参数*/if(pcap_lookupnet(dev,&net,&mask,errbuf)==-1){//获得指定网络设备的IP地址和子网掩码fprintf(stderr,无法获取网络掩码设备%s:%s\n,dev,errbuf);net=0;mask=0;}/*打开网络设备,混杂模式下打开会话*/handle=pcap_open_live(dev,BUFSIZ,1,1000,errbuf);//利用第一步中的返回值,可以决定使用哪个网卡,打开网卡,返回用于捕捉网络数据包的秒数字。if(handle==NULL){fprintf(stderr,无法打开设备%s:%s\n,dev,errbuf);return(2);}/*编译和应用过滤器*/if(pcap_compile(handle,&fp,filter_exp,0,net)==-1)//数据包的过滤{fprintf(stderr,无法解析过滤器%s:%s\n,filter_exp,pcap_geterr(handle));return(2);}/*设置过滤器*/if(pcap_setfilter(handle,&fp)==-1){//在上一步的基础上利用pcap_setfilter()函数来设置fprintf(stderr,无法安装过滤器%s:%s\n,filter_exp,pcap_geterr(handle));return(2);}/*抓包*/packet=pcap_next(handle,&header);//利用回调函数,捕获数据包/*打印长度*/printf(Jackedapacketwithlengthof[%d]\n,header.len);/*关闭网络设备,关闭会话,释放资源*/pcap_close(handle);return(0);}湖南大学入侵检测技术实验报告实验结果:这是没有联网或者断网时出现的结果。完成进一步数据包分析的代码:#includestdio.h#includepcap.h#includetime.h#includenetinet/in.h#includearpa/inet.h#includeerrno.h#includestring.h//链路层数据包格式typedefstruct{u_charDestMac[6];u_charSrcMac[6];u_charEtype[2];}ETHHEADER;//IP层数据包格式typedefstruct{intheader_len:4;intversion:4;u_chartos:8;inttotal_len:16;intident:16;intflags:16;u_charttl:8;u_charproto:8;intchecksum:16;u_charsourceIP[4];u_chardestIP[4];}IPHEADER;//协议映射表char*Proto[]={湖南大学入侵检测技术实验报告Reserved,ICMP,IGMP,GGP,IP,ST,TCP};//回调函数,分析数据包voidpcap_handle(u_char*user,conststructpcap_pkthdr*header,constu_char*pkt_data){//第一个参数是pcap_loop的最后一个参数,当收到足够数量的包后pcap_loop会调用pcap_handle回调函数,同时将pcap_loop()的user参数传递给它//第二个参数是收到的数据包的pcap_pkthdr类型的指针//第三个参数是收到的数据包数据ETHHEADER*eth_header=(ETHHEADER*)pkt_data;printf(---------------BeginAnalysis-----------------\n);printf(----------------------------------------------\n);printf(Packetlength:%d\n,header-len);//解析数据包IP头部if(header-len=14){IPHEADER*ip_header=(IPHEADER*)(pkt_data+14);//解析协议类型charstrType[100];//协议类型if(ip_header-proto7)strcpy(strType,IP/UNKNWN);elsestrcpy(strType,Proto[ip_header-proto]);//打印源物理地址,目的物理地址printf(SourceMAC:%02X-%02X-%02X-%02X-%02X-%02X==,eth_header-SrcMac[0],eth_header-SrcMac[1],eth_header-SrcMac[2],eth_header-SrcMac[3],eth_header-SrcMac[4],eth_header-SrcMac[5]);printf(DestMAC:%02X-%02X-%02X-%02X-%02X-%02X\n,eth_header-DestMac[0],eth_header-DestMac[1],eth_header-DestMac[2],eth_header-DestMac[3],eth_header-DestMac[4],eth_header-DestMac[5]);//打印源IP,目的IPprintf(SourceIP:%d.%d.%d.%d==,ip_header-sourceIP[0],ip_header-sourceIP[1],ip_header-sourceIP[2],ip_header-sourceIP[3]);湖南大学入侵检测技术实验报告printf(DestIP:%d.%d.%d.%d\n,ip_header-destIP[0],ip_header-destIP[1],ip_header-destIP[2],ip_header-destIP[3]);//打印协议类型printf(Protocol:%s\n,strType);//显示数据帧内容,十六位一行for(inti=0;i(int)header-len;++i){printf(%02x,pkt_data[i]);if((i+1)%16==0)printf(\n);}printf(\n\n);}}intmain(intargc,char**argv){char*device=eth0;//默认网络接口charerrbuf[1024];pcap_t*phandle;bpf_u_int32ipaddress,ipmask;structbpf_programfcode;intdatalink;/*获取网络接口*/if((device=pcap_lookupdev(errbuf))==NULL){//这个函数返回第一个合适的网络接口的字符串指针,如果出错,则errbuf存放出错信息字符串,errbuf至少应该是PCAP_ERRBUF_SIZE个字节长度的perror(errbuf);return1;}elseprintf(device:%s\n,device);/*打开网络接口*/phandle=pcap_open_live(device,20
本文标题:入侵实验二网络数据包的捕获及协议的简单分析
链接地址:https://www.777doc.com/doc-2683783 .html