Linux系统下Sniffer的实现(二).docx
《Linux系统下Sniffer的实现(二).docx》由会员分享,可在线阅读,更多相关《Linux系统下Sniffer的实现(二).docx(28页珍藏版)》请在咨信网上搜索。
1、Linux系统下Sniffer的实现(二)BOOL ReadTable() / 读取FILE *tab = fopen(TABLE_FILE, r) ; / 打开文件int count = fread(Tab, sizeof(int), TAB_SIZE, tab) ;fflush(tab) ; / 刷新文件流for (int i=0; i=TAB_SIZE-2; i+)if ( Tabi != -1 & Tabi+1 != -1 )Tabi+1 = Tabi+1 + Tabi ;elsebreak ;return TRUE ;int LoadPack() / 加载数据包int i ;int
2、load_packs = 0 ;FILE *pack = fopen(PACK_FILE, r) ; for (i = 0; iBUF_COUNT; i+)if ( Tabto_be_load+i != -1 & Tabto_be_load+i+1 != -1 )int size = Tabto_be_load+i+1 - Tabto_be_load+i ;int offset = Tabto_be_load+i ;if ( fread(buf+i, size, 1, pack) != 1 )printf(Read error.“n“n) ;exit(1) ;load_packs + ; /
3、更新变量else/* do nothing */fflush(pack) ; / 刷新数据流to_be_load += load_packs ; / 更新变量return load_packs ; / 返回读取的数目系统中的buffer在现实中的很多系统中,buffer是很重要的一种思想,为的就是减少读取外部存储的次数,延长设备的使用寿命。Buffer在计算机系统中,应用是很广泛的,例如,在硬盘和内存之间存在一层缓冲区,在CPU和内存之间同样也存在一层缓冲区,这层缓冲区通常被称作Cache。在本系统中,也同样利用了Buffer思想,有着传统意义上的原因,当然还考虑到用户操作时的特殊性,系统的B
4、uffer思想描述l 在任意时刻,Buffer内最多存储100个Package数据l 刚开始,加载pack0 pack99共计100个package,当要查看pack100时,则采取的方法是:保留旧的50个package, 加载新的50个package,则package编号变为:pack50 pack149,这样操作的原因是为了用户的方便,因为用户经常会查看某个报文附近的几个报文。初始状态下,假设系统已经加载了编号为0到99的数据包,如图所示图 加载前缓冲区内容在某一时刻,假设用户想查看编号为100的数据包,则需要重新加载,重新加载后的数据包如图所示图 加载后缓冲区内容使用此种Buffer思想
5、,用户操作的方便性即体现在这个方面,在对某条报文进行研究时,会经常查看它的临近报文,使用此种机制,那么便不会不断的对要查看的临近报文进行加载,减少了读取硬盘的次数。系统的显示问题在控制台上,要想建造一个好的用户操作界面,是一件比较难的事情,根据我的体验,linux下着名的Sniffer工具tcpdump的操作界面也不够友好,普通用户很难操作。在window环境下的Sniffer工具Ethereal界面比较美观,方便操作,所以,建造一个好的用户操作界面成为我此次毕设的攻克重点。本系统的显示分为两种显示模式:“detail”模式 和 “simple”模式,“detail”模式意为“详细显示模式”,
6、“simple”模式意为“简单显示模式”。在“detail”模式下,每个包得到尽可能详细的解析,解析包的每一层信息,示意如图图 详细显示模式根据上图显示的信息,可以得知此包是一个ICMP Package,具体内容属于ping Reply,更详细得知是本主机ping本主机的一个数据包。“simple”模式意为简单模式,所谓简单模式就是对每个Package尽可能的用一句话来描述,虽然尽可能的简短,但是一定要包含以下信息l Package的类型l Package的作用这种模式的重要作用是在用户对包进行检测和测量时,通常会查看相邻的几个Package,这样的模式方便用户进行“查看上一个Package”
7、和“查看下一个Package”,只要用户在这种模式下按“N”或者“n”就可以查看下一个package,只要按“L”或“l”键就可以查看上一个Package。“simple”模式的示意如图所示图 简单显示模式从图中可以看出,当前正在查看的包用“蓝色”的线条标出,方面用户的操作,当用户向上或者向下进行选择时,此蓝色线条也同样会向上或向下运动,这样做的原因是是的系统显示具有动态效果。“detail”模式的显示比较简单,只要逐层进行解析就可以了,下面我们主要讨论下“simple”模式下的显示算法。在“simple”模式下,当前控制台最多可以显示20个Package,主要是由函数List20Packag
8、es函数实现的。什么时候应该对Package标上蓝色的线条,以下代码即说明此问题if ( i = p_recorder % 20 ) / if the package is the current printf(COLOR_START) ; / color_start 无论示在简单显示模式还是在详细显示模式下,均支持以下三种操作向上操作 - 查看上一条报文向下操作 - 查看下一条报文任意操作 - 查看任一条报文第四章 Sniffer其它相关文怎样获取一个数据包?Libpcap方法Libpcap 是由洛仑兹伯克利国家实验室编写的Linux 平台下的网络数据包捕获函数库,是一种与系统无关,用于访问
9、数据链路层,是一个独立于系统接口的用户级捕包函数据库,为底层的网络数据提供了可移植框架,它的应用包括网络统计、安全监听、网络调试、性能测量、入侵检测、口令拦截等。Libpcap 可以在绝大多数类Unix 平台下工作,绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制,在捕获机制之上可以开发网络监控应用软件。采用Libpcap 实施网络数据包捕获时,将要用到一个重要的函数pcap_open_live(),它的函数原型是:pcap_t * pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char
10、*ebuf),其中,如果device 为NULL 或any,则对所有接口捕获,snaplen 代表用户期望的捕获数据包最大长度,promisc 代表设置接口为混杂模式,捕获所有到达接口的数据包,但只有在设备给定的情况下才有意义,to_ms 代表函数超时返回的时间。编程要点l 查找可以捕获数据包的设备device = pcap_lookupdev(errbuf);l 创建捕获句柄,准备进行捕获p =pcap_open_live(device, 8000, 1, 500, errbuf);l 如果用户设置了过滤条件,则编译和安装过滤代码pcap_compile(p, &fcode, filter_
11、string, 0, netmask);pcap_setfilter(p, &fcode);l 进入循环,反复捕获数据包for( ; ; )while(ptr = (char *)(pcap_next(p, &hdr) = NULL);l 对捕获的数据进行类型转换,转化成以太数据包类型eth = (struct libnet_ethernet_hdr *)ptr;l 对以太头部进行分析,判断所包含的数据包类型,做进一步的处理if(eth-ether_type = ntohs(ETHERTYPE_IP)if(eth-ether_type = ntohs(ETHERTYPE_ARP)l 关闭捕获句
12、柄pcap_close(p);Socket方法在Linux 下编写网络包捕获程序,比较简单的方法是在超级用户模式下,利用类型为SOCK_PACKET 的套接口(socket函数)来捕获链路帧。Linux SOCK_PACKET 编程要点l 设置套接口以捕获链路帧:在设置套接口之前,需要引用如下文件#include sys/#include sys/#include netinet/if_#include net/调用socket 函数的原型是:int socket(int domain, int type,int protocol);本函数涉及3 个输入参数:domain 参数表示所使用的协议
13、族;type 参数表示套接口的类型;protocol 参数表示所使用的协议族中某个特定的协议。如果函数调用成功,套接口的描述符(非负整数) 就作为函数的返回值,假如返回值为-1,就表明有错误发生。使用socket 函数捕获链路层数据帧,domain参数应指定为AF_INET 协议族,表示采用Internet 协议族;type参数指定为SOCK_PACKET,表示获取链路层数据,进而分析各层的协议数据单元;而protocol 参数采用htons(0x0003),表示可以截取所有类型的数据帧。这里htons 函数用于短整数的字节顺序转换。计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先
14、。Internet 上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet 上传输数据时就需要进行转换,否则就会出现数据不一致。在捕获数据包时socket 函数调用形式为int fd; / fd 是套接口的描述符fd=socket(AF_INET, SOCK_PACKET, htons(0x0003);l 设置网卡工作模式:要使建立的套接口能够真正捕获到同一网段其它站点的数据,还必须设置网卡工作于“混杂”模式,可以使用ioctl 函数,原型int ioctl(int d, int request,&ifr),ioctl 系统调用用于对套接口、
15、网卡等软硬件设施进行底层控制,实际的操作来自各个设备自己提供的ioctl 接口。设置网卡于“混杂”方式的Linux C 程序段struct ifreq ifr;strcpy(_name, dev); /(char *)dev 标识设备名,如:eth0i=ioctl(fd,SIOCGIFFLAGS,&ifr); / 表示要求取出工作方式if(i0)close(fd);perror(cant get flags“n);exit(0);_flags |= IFF_PROMISC; /在标志中加入“混杂”方式i=ioctl(fd,SIOCSIFFLAGS,&ifr); / 表示要求设定工作方式if(i
16、0)perror(cant set promiscuous“n);exit(0);l 从套接口读取链路帧:套接口建立以后,就可以从中循环地读取链路层数据帧。因此,还需要建立数据帧的缓冲区,并把帧头结构的指针指向这一缓冲区的首地址char epETH_FRAME_LEN;struct ethhdr *eh; int fl;eh=(struct ethhdr *)ep; / 指向帧头fl0 = read(fd, (etherpacket *)ep, sizeof(ep) ;/fl0 为截取的数据帧帧长这里帧头结构类型ethhdr 在/usr/include/linux/if_ 中定义:struct
17、 ethhdr unsigned char h_dest ETH_ALEN; /目标MAC 地址unsigned char h_sourceETH_ALEN; /源MAC 地址unsigned short h_proto; /帧中数据协议类型代码基于上述定义,一旦ep 读入帧中数据,就可以通过eh-h_dest、eh-h_source、eh-h_proto 获取帧首部信息。怎样解析一个报文?无论采用Lipcap 方法,还是采用SOCK 方法,都可获得以太网帧,由于在以太网帧首部中含有协议类型字段,所以可进一步实现上层协议包的首部提取,为篇幅起见,本处仅对Socket方法获得帧为例,介绍TCP/
18、IP 首部的提取的一般方法,以便今后作进一步的数据分析与处理。IP 报头首部提取根据h_proto 的值,可以确定帧数据将交由上层何种协议处理,常见的h_proto 值与协议的对应关系有0x0800:IP协议;0x0806:ARP 协议;0x8035:RARP 协议。因此,一旦捕获的帧中h_proto 的取值为0x800,将类型为iphdr 的结构指针指向帧头后面负载数据的起始位置,则IP 信包首部的数据结构将一览无余。以下程序段表明这一定位过程char epETH_FRAME_LEN;struct ethhdr * eh;struct iphdr *ip;int fl;eh=(struct
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 系统 Sniffer 实现
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。