信息安全实践第十次作业-网络嗅探器_第1页
信息安全实践第十次作业-网络嗅探器_第2页
信息安全实践第十次作业-网络嗅探器_第3页
信息安全实践第十次作业-网络嗅探器_第4页
信息安全实践第十次作业-网络嗅探器_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、四 川 大 学 计 算 机 学 院、软 件 学 院实 验 报 告 学号: 姓名:专业:_软件工程_ 班级: 第 10 周 课程名称 信息安全产品开发实践 实验课时4实验项目网络嗅探器实验时间2013.11.15实验目的 使用Libpcap库捕获局域网中的IP包,要求:1、打印数据包的源与目的物理地址;2、打印源与目的地址;3、打印出上层协议类型;4、如果上层协议为TCP或UDP协议,打印目的与源端口信息;5、如果上层协议为TCP或UDP协议,将数据以16进制与ASCII的两种方式同时打印出来,不可打印字符以.代替实验环境 虚拟机 Red Hat Enterprise Linux-VMware

2、Workstation 实验内容(算法、程序、步骤和方法) 在实验之前,必须先弄懂整个嗅探器工作流程,这对编写主函数很有帮助:1、 使用pcap_lookupdev()函数查找网络设备,不过这里就不需要了,我们手动输入网卡eth0寻找嗅探对象。2、 使用pcap_open_live()函数打开网络设备设置嗅探器。3、 使用pcap_lookupnet()函数获得指定网络设备的网络号和掩码获得过滤策略需要的参数。4、 使用pcap_compile()函数将过滤策略编译到过滤程序中设置过滤策略。5、 使用pcap_setfilter()函数设置过滤器将过滤策略放进嗅探器中。6、 使用pcap_lo

3、op()函数捕获数据包启动嗅探器捕获数据包。7、 当pcap_loop()捕获到数据包时,调用pcap_loop()的第3个参数回调函数got_packet()(名字自己取),got_packet()处理pcap_loop()传过来的包(每捕获到一个就调用一次回调函数,got_packet()是对单个包的处理)。以上就是嗅探器的大体结构,同时也是主函数的主要结构(在这里你需要注意的是每个变量、每个函数参数的意义与作用)。接下来就是回调函数的实现了,在这里你需要先了解一个包其实不过是一串数据,而这些数据在固定的顺序、位置会显示固定大小(除了数据包本身最后的有效载荷)固定显示内容类型的数据(数据包

4、是一层一层封装的),我们只需要利用指针把包本身分为几部分,然后把信息放入几种结构体中(由结构体解析这些数据),然后我们就可以从这些结构体中元素获得这个包的内容。当然,做到这些我们必须了解:1、 一个包是怎么组成的先了解包的数据是按什么顺序是放置的,然后利用指针和siziof(对应的结构体)跳到包对应的地方。2、 那些结构体(如以太网头部、IP头部、TCP头部)的组成,这个可以在/usr/include/net中的头文件里面找,当然网上找就更方便了。 剩下的就是从结构体中获取需要的信息并按格式打印出来了。(接上)实验内容(算法、程序、步骤和方法)#include#include#include#

5、include#include#include#include#include#include#include#include#include#include#include#include#include#define DEFAULT_SNAPLEN 1518/被pcap捕捉的最大字节数/打印16进制和asciivoid print(u_char*payload,int len,int offset,int maxlen)printf(%.5d ,offset);/打印偏移量(宽度为5)int max=maxlen;/数据包的有效载荷和长度int i;for(i=0;i0)/还没打完prin

6、tf(%.2x ,payloadmax-(len-i);else/已打完,最后一个后面有空格printf( );printf( );for(i=0;i16;i+)/打印16个字节的asciipayloadif(isprint(payloadmax-(len-i)/为可打印字符printf(%c,payloadmax-(len-i);else/打印不出来的用.表示printf(.);/打印数据包void print_data(u_char *payload,int len)int line_width=16;/一行16个字节int len_rem=len;/剩余长度int maxlen=len;

7、/数据包的有效载荷和长度int offset=0;/偏移量while(1)if(len_remline_width)/最后一次打印if(len_rem=0)/已打印完break;else /还没打印完print(payload,len_rem,offset,maxlen);/调用print函数,传入payload地址、剩余长度、偏移量和数据包的有效载荷和长度offset=offset+len_rem;/偏移量后移printf(n);break;else/不是最后一次打印print(payload,len_rem,offset,maxlen);/调用print函数,传入payload地址、剩余长

8、度、偏移量和数据包的有效载荷和长度offset=offset+16;/偏移量后移(由于非最后一次打印,所以固定打16个字节 - 偏移量后移16个字节)printf(n);len_rem=len_rem-line_width;/剩余长度减少/打印mac地址void print_mac(u_char* macadd)int i;for(i=0;i5;i+)printf(%.2x:,macaddi);/16进制,两位宽度printf(%.2x,macaddi);/打印ip地址void print_ip(u_char* ipadd)int i;for(i=0;its).tv_sec);/显示时间pri

9、ntf(Packet number:%dn,+packet_num);/显示当前包编号printf(Packet length:%dn,h-len);/显示包长度(脱机长度)int i;eth=(struct ether_header *)p;printf(Source Mac Address: );print_mac(eth-ether_shost);/调用print_mac函数,传入源主机的mac地址printf(n);printf(Destination Mac Address:);print_mac(eth-ether_dhost);/调用print_mac函数,传入目的主机的mac地

10、址printf(n);/判断网络层协议unsigned int typeno;typeno=ntohs(eth-ether_type);switch(typeno)case ETHERTYPE_IP:printf(IPV4n);break;case ETHERTYPE_PUP:printf(PUPn);break;case ETHERTYPE_ARP:printf(ARPn);break;default:printf(unknown network layer typesn);if(typeno=ETHERTYPE_IP)/为IP协议iph=(struct ip*)(p+sizeof(stru

11、ct ether_header);/获得ip包头部地址printf(Source Ip Address:);print_ip(u_char*)&(iph-ip_src);/调用print_ip函数,传入源主机的ip地址printf(n);printf(Destination Ip address:);print_ip(u_char *)&(iph-ip_dst);/调用print_ip函数,传入目的主机的ip地址printf(n);/判断传输层协议printf(Transport layer protocal:n);if(iph-ip_p=1)printf(ICMPn);else if(iph

12、-ip_p=2)printf(IGMPn);else if(iph-ip_p=6)/为TCP协议printf(TCPn);tcph=(struct tcphdr*)(p+sizeof(struct ether_header)+sizeof(struct ip);/获得tcp头部地址printf(destport :%dn,ntohs(tcph-dest);/打印目的端口号printf(sourport:%dn,ntohs(tcph-source);/打印源端口号printf(Payload);printf(%d bytes): n,h-len);/打印数据长度print_data(p,h-le

13、n);/调用print_data函数,传入数据包的有效载荷和长度(脱机长度)else if(iph-ip_p=17)/为UDP协议printf(UDPn);udph=(struct udphdr*)(p+sizeof(struct ether_header)+sizeof(struct ip);/获得udp头部地址printf(dest port:%dn,ntohs(udph-dest);/打印目的端口号printf(source port:%dn,ntohs(udph-source);/打印源端口号printf(Payload);printf(%d bytes): n,h-len);/打印数

14、据长度print_data(p,h-len);/调用print_data函数,传入数据包的有效载荷和长度(脱机长度)else printf(unknown protocoln);int main(int argc,char* argv)char ebufPCAP_ERRBUF_SIZE;/错误信息字符串pcap_t *pd;/会话句柄struct bpf_program fcode;/被编译的过滤器版本的地址的引用bpf_u_int32 netaddr=0,mask=0;/执行嗅探的设备的IP地址和网络掩码int i=0;/检查主函数参数if(argc =1)printf(usage:%s,a

15、rgv0);exit(1);/打开网络设备 /设备为主函数参数,被pcap捕捉的最大字节数为DEFAULT_SNAPLEN,混杂模式,1000ms超时if(pd=pcap_open_live(argv1,DEFAULT_SNAPLEN,1,1000,ebuf)=NULL)(void)fprintf(stderr,%s,ebuf);exit(1);/获得指定网络设备的网络号和掩码if(i=pcap_lookupnet(argv1, &netaddr, &mask, ebuf)=-1)(void)fprintf(stderr,%s,ebuf);exit(1);/将过滤策略编译到过滤程序中/策略为ip,把网络层为ip的包都捕获pcap_compile(pd,&fcode,ip,1,mask);/设置过滤器pcap_setfilter(pd,&fcode);/捕获数据包/第二参数为-1 - 一直捕获直至错误发生,回调函数为packet_processif(pcap_loop(pd,-1,got_packet,NU

温馨提示

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

评论

0/150

提交评论