网站大量收购闲置独家精品文档,联系QQ:2885784924

LAN中Sniffer的设计与实现.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LAN中Sniffer的设计与实现

LAN中Sniffer的设计与实现 靳风荣 郑雪峰 黄丽娟 (北京科技大学信息学院100083) 摘要:本文阐述了Sniffer基本原理,并给出了在Linux平台下Sniffer的设计过程与实现方法。 关键词:Sniffer、LAN、TCP、IP、ICMP、UDP 随着INTERNET的发展,安全系统的要求也与日俱增,romiscuous)。 在混杂模式下的网卡能够接收一切通过它的数据,而不管该数据目的地址是否是它。如果通过程序将网卡的工作模式设置为“混杂模式”,那么网卡将接受所有流经它的数据帧,这实际上就是Sniffer工作的基本原理:让网卡接收一切他所能接收的数据。Sniffer就是一种能将本地网卡状态设成混杂(promiscuous)状态的软件,当网卡处于这种混杂方式时,该网卡具备广播地址,它对所有遇到的每一个数据帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。可见,Sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。 在实际应用中,存在许多非以太网接入的情况,如通过DDN专线或者光纤接入等在这些情况下,必须在路由器中设置监听端口,将流经路由器的所有信息流量通过一个特定的监听端口输出,从而实现信息的监听BPF。因为本方案只要对IP、ICMP、UDP、TCP数据包和部分的端口进行分析,所以要创建一个规则集合,编译并且使用。 实际的窥探(即获取所需的数据包)。根据规则进入截取数据包程序的循环体。每收到一个数据包,就调用另外一个程序做相应的处理。当做完上面的处理后,关闭会话,结束。 图2基于pcap的系统流程 3具体实现 3.1数据包的数据结构 需要定义数据包的数据结构,在定义该结构时分别要用到以太帧头、IP数据报头以及TCP报文头结构,结构定义如下: 下面为以太帧头的格式; #include linux/if_ether.h struct etherhdr { unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ unsigned char h_source[ETH_ALEN]; /* source ether addr */ unsigned short h_proto; /* packet type ID field */ }; 根据TCP、IP协议格式和具体实现要求,容易定义出TCP和IP数据报头的格式,限于篇幅,这里不再赘述。 ICMP协议头结构和UDP协议头结构用etherpkt来定义如下: struct etherpkt {struct etherhdr eth; struct iphdr ip; union{struct tcphdr tcp; struct icmphdr icmp; struct udphdr udp; }proto; char buff[8129]; }ep; 3.2 主体程序框架 下面是用pcap库来实现网络数据截取和分析的主体程序框架: #include pcap/pcap.h #include pcap/net/bpf.h #include sys/types.h #include sys/time.h #include netinet/in.h #include signal.h #include stdio.h #include stdlib.h #include string.h #include unistd.h #include ctype.h static pcap_t *pd; main(int argc,char argv[]) {registe int cnt; char ebuf[PCAP_ERRBUF_SIZE]; /*存储错误信息的字符串*/ register char *device ,*cmdbuf; bpf_u_int32 netp ,maskp; /*执行嗅探的设备的IP地址和网络掩码*/ int snaplen; /*截获数据包的最大长度*/ struct bpf_program fcode; pcap_handler printer; u_char *pcap_userdata; cnt = -1; device = NULL; /*获取网络设备*/ device=pcap_lookupdev(ebuf); if (device == NULL) error(%s, ebuf); /*获取本地的IP地址和网络掩码*/ if((pcap_lookupnet(device,netp,maskp,ebuf

文档评论(0)

pangzilva + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档