pcap文件解析工具_【免费毕设】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提取查詢數據
?? {
?? ? row=mysql_fetch_row(result);
?? ?if(atoi(row[0])==39426&&atoi(row[1])==1028)//設定特征條件
?? ??? {
?? ????? n++;
?? ??? }
?? }
?????fputs("
",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信息顯示。原則是盡可能顯示用戶想要看到的有用信息。
核心顯示代碼:
/*以下代碼是查詢數據,并構件表格顯示數據的核心代碼*/
………………
?? $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);
???………………
//設定輸出格式
??
?? ? 數據包ID 客戶地址 本身地址 下一個服務器地址 代理地址 路由器地址 DNS地址 IP地址租用時間 更新時間 重新綁定時間 客戶ID
EOM;
?? ?while(($row_data=@$result->fetch_assoc())!==NULL)
?? {
?? echo<<
?? {$row_data['packetnumber']} {$row_data['cli_addr']} {$row_data['y_addr']} {$row_data['n_s_addr']} {$row_data['r_a_addr']} {$row_data['rou_addr']} {$row_data['dns_addr']} {$row_data['le_time']} {$row_data['re_time']} {$row_data['reb_time']} {$row_data['cli_id']}
?????? ………………
源文件詳情請關注小編繼續了解,免費贈送源代碼與論文哦!
計算機畢業設計(源程序+論文+開題報告+文獻綜述+翻譯+答辯稿)
聯系QQ:2932963541進行咨詢
網站地址:http://www.webtmall.com/掃碼關注最新動態更多精彩,點擊下方“總結
以上是生活随笔為你收集整理的pcap文件解析工具_【免费毕设】PHP网络数据包分析工具的设计与开发(源代码+论文)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kettle连接不上es7_kettle
- 下一篇: 军队招收普通高中毕业生政治考核表指纹会检