1、引言
現如今已經進入互聯網時代,無論是工作還好娛樂都已經離不開互聯網,與此同時,網絡相關的問題也時不時的侵擾着我們,這需要我們具有一定網絡相關知識來解決相關問題,而這時,一款工作便利,免費的網絡分析工具必不可少。目前抓包軟件也有很多,但能夠自動分析數據包的卻不多,為此我們計划開發一這個能自動分析的抓包軟件。
2、總體設計
2.1、設計簡述
本軟件是一個能自動分析本機所在網絡中虛假數據包的功能。本軟件分為抓包模塊(cp模塊),分析虛假虛假數據包模塊(ping模塊),數據顯示邏輯模塊和界面模塊。
2.2、運行環境
2.2.1、硬件平台
X64架構的pc機
2.2.2、軟件平台
64位的linux操作系統。
3、總體結構
本軟件由四部分組成,如下圖:
1.界面模塊:該模塊主要負責數據信息的顯示,以及設置抓取數據包的條件。
2.數據顯示邏輯模塊:該模塊主要負責從抓包模塊(cp模塊)獲得數據包,然后把該數據包放入虛假數據包分析模塊(ping模塊)進行分析。最后把數據包送給界面模塊顯示。
3.cp模塊:該模塊主要負責從本機所在網絡中抓取數據包,同時提供提取數據包信息的接口。
4.ping模塊:接收來自數據顯示邏輯模塊的數據包的源ip地址,然后ping該ip如果能通則該數據包不是虛假數據包,反之則是虛假數據包。
4、功能模塊設計
4.1、界面和數據顯示邏輯模塊
本軟件的界面主要使用qt,所以界面和數據顯示邏輯可以算作一個模塊。因為界面可以不同直接寫代碼,直接用工具生成代碼。數據顯示邏輯模塊實際就是從cp模塊取數據包和調用cp模塊取數據包具體信息的函數來取得需要顯示的信息,然后調用ping模塊的接口判斷數據包是否為虛假數據包,最后調用相應的控件的對象的方法顯示到界面上。具體如下圖:
4.2、cp模塊
4.2.1功能需求
本模塊主要提供數據包抓取的功能,具體需要實現的功能如下:
1、從網絡中抓出數據包保存到struct Packet結構體中(后面會提供該結構體的定義)
2、提供獲得抓取到數據包的各種信息的接口(后面會提供定義)。
3、提供發送數據包的功能。
4.2.2模塊關鍵數據結構
1.Filter結構體:該結構體是指明本軟件抓取那些數據包,也就是過濾數據包。
typedef struct Filter
{
int src_port; /*port=-1:Capture all packet ;
*port>0 :Ports used in this program
*fun:Source port
*/
int dst_port; /*port=-1:Capture all packet ;
*port>0 :Ports used in this program
*fun:Destination port
*/
char src_ip[16]; /*Capture source ip address is *src_ip*/
char dst_ip[16]; /*Capture destination ip address is *dst_ip*/
BOOL is_tcp; /*Capture TCP packets*/
BOOL is_udp; /*Capture UDP packets*/
BOOL nic_mode; /*NIC mode*/
BOOL is_recv_only; /*Do you only capture the received packets?*/
BOOL is_send_only; /*Do you only capture packets sent?*/
}Filter;
2.Packet結構體:抓取到數據包需要保存的結構體
typedef struct Packet
{
struct ethhdr eth; /*data link layer:Frame head*/
union{ /*network layer*/
struct iphdr iph; /*IP head*/
}neth;
union tran_layer /*transport layer*/
{
struct tcphdr tcph;/*TCP head*/
struct udphdr udph;/*UDP head*/
}tranh;
char data[1500]; /*Data*/
int data_len; /*Data length*/
}Packet;
3.發送數據包時所需的結構體
typedef struct IpPkt
{
char dst_ip[16];//目的IP
char src_ip[16];//源IP
short dst_port;//目的端口
short src_port;//源端口
int data_len;//數據長度
char data[1500]; //數據
}IpPkt;
4.2.3模塊接口函數設計
1、初始化接口函數
BOOL PCP_init(Filter *filter);
作用:初始化本模塊。
參數:參數為Filter 結構體指針,指明需要抓那些數據包,即過濾數據包。
返回值:返回TRUE(0)為成功,FALSE(-1)為失敗。
2、獲得數據包的接口
BOOL PCP_get_pkt(Packet* pkt);
作用:獲取一個數據包。
參數:參數為Packet結構體指針,抓取到的數據包會填充到該指針指向的內存中。
返回值:返回TRUE(0)為成功,FALSE(-1)為失敗。
3.提取數據包信息的控制函數
BOOL PCP_control(Packet *pkt,int type,void *output);
作用:提取數據包的信息。
參數:pkt為抓取到的數據包;type為提取數據包信息的類型;output為提取到信息的輸出。
描述 |
type |
output |
獲得源MAC地址 |
1 |
Char*(字符串) |
獲得目的MAC地址 |
2 |
Char*(字符串) |
獲得源IP |
3 |
Char*(字符串) |
獲得目的IP |
4 |
Char*(字符串) |
獲得數據包的類型 |
5 |
Char*(字符串) |
獲得源端口(如果是tcp或udp) |
6 |
Short int |
獲得目的端口(如果是tcp或udp) |
7 |
Short int |
|
|
|
返回值:返回TRUE(0)為成功,FALSE(-1)為失敗。
4、發送數據包接口
BOOL PCP_ip_pkt_send(char src_ip_type,IpPkt *ip_pkt);
作用:發送數據包。
參數:src_ip_type表示源ip是你指定還是隨機生成。p_pkt為你所發送數據包的信息,其中當src_ip_type為1時p_pkt里的源ip項為為隨機生成的,即使填了也是無效的。
描述 |
src_ip_type |
指定源ip |
2 |
隨機生成ip |
1 |
返回值:返回TRUE(0)為成功,FALSE(-1)為失敗。
5.模塊關閉
BOOL PCP_close(void);
作用:釋放資源。
返回值:返回TRUE(0)為成功,FALSE(-1)為失敗。
4.3、ping模塊
4.3.1功能需求
該模塊主要是判斷數據是否為虛假數據包。本模塊根據傳過來的ip看能否ping通,如果能則不是虛假數據包,反之只是虛假數據包。
4.3.2模塊接口函數設計
1、判斷數據包的真假性接口
int ping(char *ip_addr);
作用:ping指定的ip地址是否能通。
參數:ip_addr為需要ping的ip地址
返回值:0為真數據包,-1為假數據包。
github地址:https://github.com/524wolf/PCP