当前位置:首页 > 网络嗅探技术探索与设计毕业论文 - 图文
山东农业大学学士学位论文
}
int icon=type[TYPE_TCP]?1:0; m_tree.SetItemImage(h,icon,icon); }
else if(h==udp){ //对UDP数据包过滤 type[TYPE_UDP]=!type[TYPE_UDP]; int icon=type[TYPE_UDP]?1:0; m_tree.SetItemImage(h,icon,icon); } ……
*pResult = 0;
(3)开始捕获数据包
网卡的工作模式设置完毕,只需要调用捕捉函数pcap来进行对数据包抓取就可以实现截获数据包。在具体的实现过程中,通过建立一个捕获线程来实现数据包的捕获,以减少在网络繁忙时,其数据流量超过计算机的数据处理速度而出现漏包的情况。
while((res=pcap (pthis->adhandle,&header,&pkt_data))>=0) {
}
if(res==0) { ……
Continue; } else {
……
5.3数据包的分析
调用WinPcap底层驱动接收函数接收的数据包,除了包含用户数据外,还包含时间戳、IP、TCP报头等原始信息,所以获取数据包以后,可以方便的对数据包进行分析。在具体的实现过程中每捕获一个数据包就调用一次协议分析函数,实现对数据包的分析。数据包分析的主要依据是网络协议中定义的各种包的类型和包的格式,下面就是对部分典型数据报的分析实现:
功能:解析以太网数据帧,取出源MAC地址和目的MAC地址,判
24
山东农业大学学士学位论文
断其类型。
EtherHead::EtherHead(const unsigned char *buf,int buflen) {
unsigned char *pos;
pos=(unsigned char *)buf;
for(int i=0;i<6;i++){//得到目的MAC地址 }
for(i=0;i<6;i++){//得到源MAC地址 srcaddr[i]=*pos;
pos++;
}
type=(*pos)*0x100+(*(pos+1));//类型IP、ARP、RARP。
destaddr[i]=*pos; pos++;
}
功能:解析IP数据包,取出源IP地址和目的IP地址等信息,判断其类型。
IPGram::IPGram(const unsigned char *buf,int buflen) {
unsigned char *pos;
pos=(unsigned char *)buf; version=*pos/16; //版本 IHL=*pos; //头部长度 pos++;
servicetype=*pos; //服务类型
……
srcaddr=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x10pos+=4;
destaddr=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x10…… }
功能:解析TCP数据包,取出源端口和目的端口、序号、确认号等
25
0+(*(pos+3)); //源IP地址
0+(*(pos+3));//目的IP地址
山东农业大学学士学位论文
信息。
TCPGram::TCPGram(const unsigned char *buf,int buflen) {
unsigned char *pos;
pos=(unsigned char *)buf;
srcport=(*pos)*0x100+(*(pos+1));//获得源端口 pos+=2;
destport=(*pos)*0x100+(*(pos+1));//获得目的端口 pos+=2;
seqnum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));//获得序号
pos+=4;
acknum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));//获得确认号
……
pos=(unsigned char *)(buf+headlen*4);//得到TCP包的内容 }
UDP、ICMP数据包的分析类似,详细代码不再赘余。 5.4实现过程中的难点
网络嗅探软件首先要解决的就是数据包的截获。但是在网络的实际应用中,其中会有许多管理员不关心的数据,它们严重影响了监听系统的工作效率。为改进软件对敏感数据包截获的效率,在截获数据包之前对数据包进行过滤。可通过设置过滤规则,按特定的主机以及特定的协议端口对数据包有选择的截获,然后再将敏感数据向上层模块提交。可以从以下几个角度设置过滤条件:
26
datalen=buflen-headlen*4; if(datalen>0){
data=new unsigned char[datalen]; memcpy(data,buf+headlen*4,datalen); } else{ }
data=NULL; data=0;
山东农业大学学士学位论文
1)根据协议进行过滤。即根据数据包中的协议字段的内容对数据包进行过滤(我实现的嗅探器软件过滤原理就是协议过滤)。
2)根据数据包的长度进行过滤。每一个数据包都有一定的长度,可以设置过滤条件,指定范围,抓取长度在某一范围内的数据包。
3)根据IP地址过滤。这可以根据发送数据包的源IP地址,或者是接收数据包的目的IP地址进行过滤。只接收程序中指定的来源于或发送于某一IP地址的数据包。 5.5嗅探程序运行截图
图5-1 运行开始时的界面
27
共分享92篇相关文档