具体的数据包捕获流程图如下:
内容来自www.paper51.com 图4-2 数据包捕获流程图 paper51.com 数据包捕获核心代码及主要函数说明如下: http://www.paper51.com
void DecodeProcess_callback(u_char*argument,const struct pcap_pkthdr *packet_header,const u_char *pkt); 内容来自论文无忧网 www.paper51.com
pcap_t *pcap_handle; /*Libpcap句柄*/ copyright paper51.com charerror_content[PCAP_ERRBUF_SIZE]; /*存储错误内容 */ paper51.com char*net_interface; /*网络接口*/ 内容来自论文无忧网 www.paper51.com
structbpf_program bpf_filter; /*BPF过滤规则*/ copyright paper51.com charbpf_filter_string[]=""; 内容来自www.paper51.com /*过滤规则字符串,此时为空,表示捕获所有的网络数据包,而不是捕获特定的网络数据包*/ 内容来自论文无忧网 www.paper51.com unsigned intnet_mask; /*网络掩码*/ 内容来自www.paper51.com unsigned intnet_ip; /*网络地址*/ 内容来自www.paper51.com net_interface=pcap_lookupdev(error_content); paper51.com /*获得可用的网络接口*/ copyright paper51.com
pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content); paper51.com /*获得地址*/ paper51.com pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,1,error_content); http://www.paper51.com /*打开网络接口*/ 内容来自论文无忧网 www.paper51.com pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip); 内容来自www.paper51.com /*编译BPF过滤规则*/ http://www.paper51.com pcap_setfilter(pcap_handle,&bpf_filter); 内容来自www.paper51.com
/*设置过滤规则*/ copyright paper51.com if(pcap_datalink(pcap_handle)!=DLT_EN10MB) copyright paper51.com return; 内容来自论文无忧网 www.paper51.com /*由于在解码的代码中只有以太网,所以这里检测链路是否为以太网,否,则退出*/ 内容来自www.paper51.com pcap_loop(pcap_handle,-1,DecodeProcess_callback,NULL); copyright paper51.com
/*注册回调函数,循环捕获网络数据包,然后调用回调函数对捕获的网络数据包进行分析*/ http://www.paper51.com pcap_close (pcap_handle); http://www.paper51.com 本段代码的功能是循环捕获以太网数据包,其中调用了网络接口函数、规则函数和数据包捕获函数。主要的函数功能说明如下: 内容来自www.paper51.com (1)选择监听网络接口 内容来自论文无忧网 www.paper51.com 函数原型:Char * pcap_lookupdev(char*errbuf) 内容来自论文无忧网 www.paper51.com 功能:用于寻找本机可用的网络接口,调用成功就返回指向网络接口的指针。其中errbuf为调用失败时返回的错误信息字符串。 paper51.com (2)建立监听会话 内容来自www.paper51.com 函数原型: pcap_open_live (char*device,intsnaplen,int promis,int to_ms,char*ebuf) copyright paper51.com
功能:用于获取一个捕获器描述符,调用成功就返回监听会话句柄。其中device为指向网络接口的指针,snaplen定义了监听程序所所捕获的最大字节数,promisc定义了是否将网卡设置为混杂模式,to_ms表示度操作等待的毫秒时间,ebuf为函数调用失败返回的错误信息字符串。 内容来自论文无忧网 www.paper51.com
(3)编译过滤器 内容来自论文无忧网 www.paper51.com 函数原型:int pcap_compile(pcap_t* p,struct bpf_progrm * fp,char*str,int optimize,bpf_u_int32 netmask) http://www.paper51.com 功能:将字符串形式的过滤要求编译成二进制形式存储在bpf_program结构中。从而实现通过设置过滤器来捕获感兴趣的数据包。其中,p为监听会话句柄指针,fp为指向结构bpf_program的指针,用于存放编译后的BPF程序,str为tcpdump表达式字符串指针,optimize为优化标志,netmask为子网掩码。 内容来自www.paper51.com (4)设置过滤器: 内容来自论文无忧网 www.paper51.com 函数原型:char *pcap_setfilter(pcap_t*p,struct bpf_program*fp) 内容来自论文无忧网 www.paper51.com
功能:通过调用本函数,设置内核过滤器使得编译了的过滤生效。其中,p为指向监听会话句柄的指针,fp为指向结构bpf_program的指针,一般为函数pcap_comple编译后的结果,也可以用手工编BPF代码。 copyright paper51.com (5)捕获并处理数据包: http://www.paper51.com 函数原型:int pcap_loop(pcap_t*,int cnt,pcap_handler callback,u_char*user) http://www.paper51.com 功能:捕获并处理数据包。其中p为指向监听会话句柄的指针,cnt为指向函数返回前所处理数据包的最大值,值为负时表示处理缓冲区所有的数据包,为0时处理所有的数据包,直到产生读取到EOF错误为止,callback参数指定带有3个参数的回调函数,user为用户传递给回调函数的指针,通常设置为NULL。 内容来自www.paper51.com (6)用户自定义的回调函数 内容来自www.paper51.com
函数原型:void callback(u_char*args,const struct pcap_pkthdr* header,chonst u_char* packet) copyright paper51.com 功能:在pcao_loop函数没捕获到一个数据包后被自动调用,用于对捕获到的数据包进行用户自定义的处理。其中,args为从pcap_loop函数传递过来的u_char指针,pheader为指向pcap_pkthdr结构指针,packet是指向所有捕获的数据包的指针。 内容来自论文无忧网 www.paper51.com (7)关闭监听会话句柄 paper51.com
函数原型:void pcap_close(pcap_*p) paper51.com 功能:关闭监听会话句柄,并释放资源。 copyright paper51.com 通过Winpcap函数库,我们得到了网络中传输的原始网络数据包,为了从中得到有用的数据信息,接下来就要对原始数据包进行分析,也就是进行网络协议的解析工作。 paper51.com 4.5 网络数据包分析模块的实现 paper51.com 当完成对数据包的捕获之后,接下来要完成的是数据包的分析过程。对所有网络数据包的分析,必须从链路层开始分析,然后分析网络层,再分析传输层,最后分析应用层。这是由于捕获到的数据包是一个数据帧,其中最外层的协议是链路层协议,然后从里到外分别额是网络层、传输层和应用层。 copyright paper51.com 本系统目前上未实现对应用层协议的分析,所以数据包的分析流程图如图4-3所示: http://www.paper51.com
内容来自论文无忧网 www.paper51.com 图4-3 数据包分析流程图 http://www.paper51.com 从流程图可以看到,在捕获了数据包之后,就对网络数据包进行分析,本系统对链路层只分析了以太网协议。根据以太网协议内容的分析结果,判断以太网类型的值:如果是0X0806,表示协议为ARP协议,则分析ARP协议;如果是0X0800,表示协议为IP协议,则分析IP协议;如果是0X8035,表示协议是RARP协议,则分析RARP协议。在分析IP协议时,根据协议类型的值判断传输层协议类型:如果IP协议类型字段的值是6,表示协议为TCP协议,则分析TCP协议;如果IP协议类型字段的值是17,表示协议为UDP协议,则分析UDP协议;如果IP协议类型字段的值是1,表示协议为ICMP协议,则分析ICMP协议。 内容来自www.paper51.com 在具体的实现过程中,当数据包分析完成后,将分析的结果保存到DataPacket数据结构中。Data Packet的结构如下: copyright paper51.com typedefstruct Data_Packet http://www.paper51.com { paper51.com structpcap_pkthdr *pkth; copyright paper51.com u_char *pkt; paper51.com EtherHdr *eh; 内容来自论文无忧网 www.paper51.com ARPHdr *ah; paper51.com IPHdr *iph; copyright paper51.com TCPHdr *tcph; copyright paper51.com
UDPHdr *udph; paper51.com
ICMPHdr *icmph; 内容来自论文无忧网 www.paper51.com u_char *data; paper51.com u_int16_tdatasize; 内容来自www.paper51.com u_int8_tfrag_flag; 内容来自论文无忧网 www.paper51.com
u_int16_tfrag_offset; http://www.paper51.com u_char mf; paper51.com u_char df; http://www.paper51.com u_char rf; copyright paper51.com u_int16_t sp; paper51.com u_int16_t dp; http://www.paper51.com u_int32_t sip; copyright paper51.com u_int32_t dip; 内容来自www.paper51.com int caplen; copyright paper51.com Optionsip_options[40]; 内容来自www.paper51.com intip_option_count; paper51.com Optionstcp_options[40]; 内容来自www.paper51.com inttcp_option_count; http://www.paper51.com }Packet; paper51.com 协议的解析是围绕核心数据结构Data Packet展开的,其中定义有进行协议解析所需的数据结构和保存结果信息的数据结构。通过把解码后的协议按其协议放入Data Packet结构对应的数据成员中,提供给之后的响应模块的使用。其他重要的数据结构还有以太网首部数据结构、IP数据包首部数据结构等,核心代码如下: http://www.paper51.com 1.以太网首部数据结构 http://www.paper51.com Typedefstruct Ether_Header 内容来自www.paper51.com
{ paper51.com u_int8_tether_dhost [6]; paper51.com
u_int8_tether_shost [6]; copyright paper51.com u_int16_tether_type; paper51.com
}EtherHdr; 内容来自www.paper51.com |