资源描述:
《linux系统下sniffer的实现(二)论文》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Linux系统下Sniffer的实现(二)论文BOOLReadTable()//读取Table.DAT{FILE*tab=fopen(TABLE_FILE,"r");//打开文件intcount=fread(Tab,sizeof(int),TAB_SIZE,tab);fflush(tab);//刷新文件流for(inti=0;i=TAB_SIZE-2;i++)if(Tabi!=-1Tabi+1!=-1)Tabi+1=Tabi+1+Tabi;elsebreak;returnTRUE;}intLoadPack()//加载数
2、据包{inti;intload_packs=0;FILE*pack=fopen(PACK_FILE,"r");for(i=0;iBUF_COUNT;i++){if(Tabto_be_load+i!=-1Tabto_be_load+i+1!=-1){intsize=Tabto_be_load+i+1-Tabto_be_load+i;intoffset=Tabto_be_load+i;if(fread(buf+i,size,1,pack)!=1){printf("Readerror.../n/n");exit(1);}lo
3、ad_packs++;//更新变量}else{/*donothing*/}}fflush(pack);//刷新数据流to_be_load+=load_packs;//更新变量returnload_packs;//返回读取的数目}3.4.2系统中的buffer在现实中的很多系统中,buffer是很重要的一种思想,为的就是减少读取外部存储的次数,延长设备的使用寿命。Buffer在计算机系统中,应用是很广泛的,例如,在硬盘和内存之间存在一层缓冲区,在CPU和内存之间同样也存在一层缓冲区if_ether.h#includeif
4、.h调用socket函数的原型是:intsocket(intdomain,inttype,intprotocol);本函数涉及3个输入参数:domain参数表示所使用的协议族;type参数表示套接口的类型;protocol参数表示所使用的协议族中某个特定的协议。如果函数调用成功,套接口的描述符(非负整数)就作为函数的返回值,假如返回值为-1,就表明有错误发生。使用socket函数捕获链路层数据帧,domain参数应指定为AF_I协议族,表示采用Inter协议族;type参数指定为SOCK_PACKET,表示获取链路层数
5、据,进而分析各层的协议数据单元;而protocol参数采用htons(0x0003),表示可以截取所有类型的数据帧。这里htons函数用于短整数的字节顺序转换。计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Inter上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Inter上传输数据时就需要进行转换,否则就会出现数据不一致。在捕获数据包时socket函数调用形式为:intfd;//fd是套接口的描述符fd=socket(AF_I,SOCK_PACKET,hton
6、s(0x0003));l设置网卡工作模式:要使建立的套接口能够真正捕获到同一网段其它站点的数据,还必须设置网卡工作于“混杂”模式,可以使用ioctl函数,原型如下:intioctl(intd,intrequest,ifr),ioctl系统调用用于对套接口、网卡等软硬件设施进行底层控制,实际的操作来自各个设备自己提供的ioctl接口。设置网卡于“混杂”方式的LinuxC程序段如下:structifreqifr;strcpy(ifr.ifr_name,dev);//(char*)dev标识设备名,如:eth0i=ioctl
7、(fd,SIOCGIFFLAGS,ifr);//表示要求取出工作方式if(i0){close(fd);perror("can'tgetflags/n");exit(0);}ifr.ifr_flags
8、=IFF_PROMISC;//在标志中加入“混杂”方式i=ioctl(fd,SIOCSIFFLAGS,ifr);//表示要求设定工作方式if(i0){perror("can'tsetpromiscuous/n");exit(0);}l从套接口读取链路帧:套接口建立以后,就可以从中循环地读取链路层数据帧。因此,还需要建立数据
9、帧的缓冲区,并把帧头结构的指针指向这一缓冲区的首charepETH_FRAME_LEN;structethhdr*eh;intfl;eh=(structethhdr*)ep;//指向帧头fl0=read(fd,(etherpacket*)ep,sizeof(ep));//fl0为截取的数据帧帧长这里帧头结构类型ethhdr在/us