毕业论文写作

毕业设计需求

免费毕设之PHP网络数据包分析工具的设计与开发(源代码+论文)

目录

 

系统设计

网络数据包分析系统的设计

整个网络数据报分析工具采用模块化的设计思想,原因是许多程序太长或太复杂,很难写在单一单元中。如果把代码分为较小的功能单元,将大大简化编程过程。模块化程序一般比单块程序容易编写、调试和修改。所以本系统采用模块化的设计思想。

模块化编程的优点如下:

(1)有效率的程序开发:使用模块化方法可以更快地开发程序,因为较小的子程序比大程序更容易理解、设计和测试。定义好模块的输入和输出之后,程序员可以给模块提供需要的输入,通 过检测输出来判断模块的正确性。然后由连接器把分立的模块连接、定位,生成一个单一的绝对地址的可执行的程序模块。最后,测试整个模块。

(2)子程序可以重用:为一个程序编写的代码经常可以用于其它的程序。在模块化编程中,可以把这些部分保存起来,以备将来使用。因为代码可以被重定位,所以保存的模块可以连接到满足其输入和输出要求的任意程序中。而在单块程序编程中,这样的部分深埋在整个程序中,不易被其它的程序使用。

(3)便于调试和修改:模块化程序一般比单块程序易于调试。因为精心定义了程序的模块接口,很容易把问题定位到特定的模块。一旦找到了有问题的模块,更正问题就相当容易了。

3.1   系统模块划分

网络数据包分析工具有四个模块组成:一是 数据包的捕获,实现从网卡获取数据包。二是 数据包的解析,这两个模块是整个分析工具的基础部分,在整个系统中有着重要的作用,三是捕获信息的分析,此模块主要是对捕获的信息进行统计,并与设定的特征值进行比较,得出简单的分析结论,四是 显示捕获数据包的信息,目的是为使用者提供一个方便进行手工分析的方式。四个模块之间的调用关系如图1。

3.2   数据包捕获模块设计

此模块是先从网卡获取各种数据包信息并复制到缓存,等待解析模块的调用。这个模块的关键部分是快速的捕获数据包,减少丢包的比率。

数据包捕获是以以太网为基础的。以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输。IEEE802.3标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。[1]

以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的 CSMA/CD 协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。如果是的话,接收该数据帧,进行物理数据帧的 CRC 校验,然后将数据帧提交给LLC 子层。[1]

3.3   数据包解析存储模块设计

在上一模块实现了数据包的捕获,并复制到缓存。解析模块主要是实现根据数据包的协议包头进行数据信息的解析,并做出适当的解释,最后把数据放入数据库中。等待分析模块读取数据。目前解析的协议有etnernet, LLC, arp/rarp, ip, tcp, udp, icmp, dns, dhcp协议包头进行了解析并把数据包信息存储到数据库中。

数据包头的解析主要是根据数据包协议的格式进行有意义字段的读取。下面以ARP协议报头来说明整个解析的过程。

首先,必须了解ARP/RARP协议的报头格式,格式如图2。

字段含义

硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;发送方IP(0-1字节):源主机硬件地址的前2个字节;发送方IP(2-3字节):源主机硬件地址的后2个字节;目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;目的IP(0-3字节):目的主机的IP地址。[3]

根据协议的格式定义,报头数据结构体(具体定义在后面给出)。进行类型的转化后对数据进行读取,并进行必要的解释。在这里最重要的是数据包的协议格式的定义。如果定义的结构有问题,后面的数据提取将是无意义的。

数据包信息的存储,是把提取的数据包头信息存储到一个地方,等待后面数据包信息分析模块的查询。存储信息要求,存入和提取信息都必须迅速,同时,要提供强大的查询功能来满足分析模块对数据的需求。

3.4   数据包信息分析模块设计

本模块的功能是通过对捕获到的数据包信息,进行简单的统计分析,对当前的网络安全情况做出合理的评价。

通过对数据包的分析,我们可以判断数据包的大小,数据包的包头信息,协议信息,以及数据包的内容等等。对于研究网络安全的人来说,掌握这方面的知识是相当重要的。现在的网络通信中,大部分数据都没有加密,我们可以轻易地从数据包中提取账号,密码之类我们关心的数据。另外,对数据包整体的信息统计也是数据包分析的一个方面。在前面的模块中我们获得了大量的数据包信息,在这个模块中我们要利用这些信息进行分析。把从数据库中查询得到的数据与入侵特征数据进行比较得到现在的网络安全分析结果。

数据包信息分析流程如图3。

3.5   数据包信息显示模块设计

数据包信息显示模块的目的是给使用者提供一个可以查看数据包信息的窗口,原则是尽力合理的显示数据包的有用信息。数据包信息将采用多种不同排列的信息显示方式,比如按IP归类,按端口归类等等。同时信息分析模块的分析结果将生成一个网页类型的文档,可以通过网页的形式来查看最后的分析结果,还应该具备安全特征的输入窗口。

信息的显示并不一定是数据库里的所有信息,主要是提供给使用者最想看的信息。信息的显示方式是表格形式,有利于使用者对数据包的信息有比较直观的了解,以便做出正确合理的判断。

 

 

系统实现

5.1   系统控制模块实现

在第四章叙述了模块化设计的优点,但是如何划分模块仍然是一个重要的问题。如果模块划分的不合理,实现起来就十分的麻烦!本系统是按功能划分的,有四个模块:一是数据包的捕获,二是 数据包的解析,三是 捕获信息的分析,四是 显示捕获数据包的信息。捕获模块实现用libpcap,数据包解析及存储用C和mysql,数据包信息分析用C语言,数据包信息显示用php。四个模块之间的调用关系如图4

在模块之间衔接运用到了线程的操作,还有几个重要的全局变量。操作流程如图5。

线程操作的核心代码如下:

打开一个线程并执行程序。

//建立一个线程运行数据包捕获函数

void p_click(GtkWidget *widget,gpointer data)

{

  pthread_mutex_lock(&mutex);

  stop=1;//捕获条件

  pthread_mutex_unlock(&mutex);

 pthread_create(&p_thread,NULL,panalyzer,NULL);//建立线程

}

//设置stop,停止运行指定线程。

void pexit(GtkWidget * widget,gpointerdata)

{

  pthread_mutex_lock(&mutex);

  stop=0;//捕获条件

  pthread_mutex_unlock(&mutex);}

5.2   数据包捕获模块实现

数据包捕获是有Libpcap开发包中的函数实现的,使用的函数有以下几个。

pcap_t *pcap_open_live(char *device,int snaplen, int promisc, int to_ms, char *ebuf)

获得用于捕获网络数据包的数据包捕获描述字。device参数为指定打开 的网络设备名。snaplen参数定义捕获数据的最大字节数。promisc指定  是否将网络接口置于混杂模式。to_ms参数指定超时时间(毫秒)。ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。 

char *pcap_lookupdev(char *errbuf)

用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络 设备名指针。如果函数出错,则返回NULL,同时errbuf中存放相关的 错误消息。

int pcap_lookupnet(char *device,bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf)

获得指定网络设备的网络号和掩码。netp参数和maskp参数都是  bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相 关的错误消息。 

int pcap_loop(pcap_t *p, intcnt,pcap_handler callback, u_char *user)

功能基本与pcap_dispatch()函数相同,只不过此函数在cnt个数据包 被处理或出现错误时才返回,但读取超时不会返回。而如果为pcap_open_live()函数指定了一个非零值的超时设置,然后调用 

int pcap_compile(pcap_t *p, structbpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)

将str参数指定的字符串编译到过滤程序中。fp是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。optimize参数控制结果代码的优化。netmask参数指定本地网络的网络掩码。[4]

捕获数据包核心代码:

void panalyzer()

{

………………

 char *device=pcap_lookupdev(ebuf);//获取网卡

 void catch_packet(u_char *args,const struct pcap_pkthdr *header,u_char*packet);

 pcap_lookupnet(device,&localnet,&netmask,ebuf);//读取网络信息

 ………………

 pcap_t *pd=pcap_open_live(device,BUFSIZ,0,1000,ebuf);//打开网络设备

 starttime();

 while(stop==1)

   {

     pcap_loop(pd,packet_number,catch_packet,NULL);//捕获数据包

   }

 endtime();

 struct pcap_stat stat;

 pcap_stats(pd,&stat);//统计捕获数据包

 ………………

 pcap_close(pd);

 return;}

函数调用关系如图6。

5.3   数据包解析及存储模块实现

解析与数据存储模块使用C 语言完成数据包的解析和数据库的连接。可解析的协议报头有:Ethernet包头,LLC,ARP/RARP,IP,TCP,UDP,DHCP,DNS,ICMP的包头格式。同时存储模块连接mysql 数据库,把解析得到的数据放入到数据库当中。数据库设计到表的建立问题。

整个报头解析的基本过程如图7。

DHCP包头数据结构的定义:

typedef struct _DHCPHdr

{

#if defined(WORD_BIGENDIAN)

 U_int8_t hops;

 U_int8_t hlen;

 u_int8_t htype;

 u_int8_t op;

 

#else

 U_int8_t op;

 u_int8_t htype;

 u_int8_t hlen;

 u_int8_t hops;

#endif

 u_int32_t xid;

 u_int16_t secs;

 u_int16_t flags;

 u_int32_t ciaddr;

 u_int32_t yiaddr;

 u_int32_t siaddr;

 u_int32_t giaddr;

 unsigned char chaddr[16];

 char sname[64];

 char file[128];

}DHCPHdr;

 

连接mysql数据库的关键语句:

………………

MYSQL mysql;

 char str[1024];

    mysql_init(&mysql);//初始化数据库

 if(!(mysql_real_connect(&mysql,"localhost","root","159753","packet",0,NULL,0)))//连接数据库

   printf("ERROR!\n");

………………

 if(mysql_query(&mysql,str)) printf("Dhcp inserterror!\n");

 //执行插入语句

 mysql_close(&mysql);

//关闭数据库

………………

5.4   数据包信息分析模块实现

数据包信息分析模块主要是对数据包信息进行数据的统计和分析,并且针对常见的入侵方式做特征的对比。涉及到的特征有:Land 攻击,TCP SYN攻击,PingOf Death攻击,WinNuke攻击,TCP/UDP端口扫描,synscan端口扫描等。函数调用流程如图8。

 

核心数据查询及对比特征代码:

………………

/*以下代码是连接数据库和进行特征比较的代码,比较的特征是synscan的扫描特征*/

res =mysql_query(&mysql,"select sourceip from ip where ");//生成mysql语句

 if(!(result = mysql_store_result(&mysql)))//返回查询结果

   {

     printf("error!\n");

   }

 Else

   {

     numRecords=mysql_num_rows(result);

     for(count=0;count<numRecords;count++)//提取查询数据

   {

     row=mysql_fetch_row(result);

    if(atoi(row[0])==39426&&atoi(row[1])==1028)//设定特征条件

       {

         n++;

       }

   }

     fputs("<br>",fp);

     if(n>0)

//输出分析结果描述

   fprintf(fp,"主机收到synscan数据包,可能受到synscan端口扫描!\n");

     else

   fprintf(fp,"主机收到数据包未发现synscan端口扫描!\n");

………………

5.5   数据包信息显示模块实现

数据包信息显示模块是用的php技术实现的。一共有十四个页面,以不同的排列顺序来显示数据包的信息。分别是首页,分析规则,分析结果,按捕获顺序显示,按IP源显示,按IP目的显示,按TCP 源端口显示,按TCP目的端口显示,按UDP源端口显示,按UDP目的端口显示,ICMP信息显示,ARP/RAPR信息显示,DNS信息显示,DHCP信息显示。原则是尽可能显示用户想要看到的有用信息。

核心显示代码:

/*以下代码是查询数据,并构件表格显示数据的核心代码*/

………………

<?php

   $conn= new mysqli ('localhost', 'root', '159753', 'packet');//连接数据库

   $conn->query("SET NAMES 'utf8'");

   $query_str= "SELECT packetnumber,cli_addr,y_addr,n_s_addr,r_a_addr,rou_addr,dns_addr,le_time,re_time,reb_time,cli_idFROM dhcp order by cli_addr";//设置查询语句

   $result= $conn->query ($query_str);

   ………………

//设定输出格式

   <table>

     <tr>

       <td>&nbsp;&nbsp;数据包ID</td>

       <td>&nbsp;&nbsp;客户地址</td>

       <td>&nbsp;&nbsp;本身地址</td>

       <td>&nbsp;&nbsp;下一个服务器地址</td>

       <td>&nbsp;&nbsp;代理地址</td>

       <td>&nbsp;&nbsp;路由器地址</td>

       <td>&nbsp;&nbsp;DNS地址</td>

       <td>&nbsp;&nbsp;IP地址租用时间</td>

       <td>&nbsp;&nbsp;更新时间</td>

       <td>&nbsp;&nbsp;重新绑定时间</td>

       <td>&nbsp;&nbsp;客户ID</td>

    </tr>

EOM;

    while(($row_data=@$result->fetch_assoc())!==NULL)

   {

   echo<<<EOM

   <tr>

       <td>{$row_data['packetnumber']}</td>

       <td>&nbsp;{$row_data['cli_addr']}</td>

       <td>&nbsp;&nbsp;{$row_data['y_addr']}</td>

       <td>&nbsp;&nbsp;&nbsp;&nbsp;{$row_data['n_s_addr']}</td>

       <td>&nbsp;&nbsp;{$row_data['r_a_addr']}</td>

       <td>&nbsp;&nbsp;{$row_data['rou_addr']}</td>

       <td>&nbsp;&nbsp;{$row_data['dns_addr']}</td>

       <td>&nbsp;&nbsp;{$row_data['le_time']}</td>

       <td>&nbsp;&nbsp;{$row_data['re_time']}</td>

       <td>&nbsp;&nbsp;{$row_data['reb_time']}</td>

       <td>&nbsp;&nbsp;{$row_data['cli_id']}</td>

       ………………

 

源文件


最新毕业设计成品

版权所有© 帮我毕业网 并保留所有权利

QQ 1370405256 微信 biyebang

QQ:629001810微信:biyebang

收缩