Linux系统下简单抓包系统,使用gtk图形界面
Linux下抓包软件,使用纯C语言,gtk图形界面
·
做一个抓包工具,开发Linux系统上使用的抓包软件,为了方便,我使用了gtk库做图形界面,使用纯C语言编写,目前还没有彻底完成,但已经基本能用了,会慢慢更新完成。必须在root权限下运行。
需要提前安装gtk库
编译方式:gcc -g ninteen.c -o ninteen `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
功能:
1.捕获局域网上的所有数据包
2.对数据包进行过滤,过滤条件可以是协议,源目的IP,源目的MAC地址,源目的端口号
3.统计一段时间内数据包的情况,各种类型数据包的数量,数据传输速度等
4.网元发现,侦测以太网地址。
5.显示控制,可以选择显示的数据包的类型
演示:
抓包演示
数据包统计
网元发现
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<net/ethernet.h>
#include<netinet/in_systm.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<netinet/ip_icmp.h>
#define _FAVOR_BSD
#include<netinet/tcp.h>
#include<netinet/udp.h>
#include<netinet/if_ether.h>
#include<arpa/inet.h>
#ifdef _linux
#include<linux/sockios.h>
#include<linux/if.h>
#else
#include<sys/ioctl.h>
#include<gtk/gtk.h>
//#include<net/bpf.h>
#include<net/if.h>
#include<fcntl.h>
#endif
#define MAXSIZE 65535
#define EXIT_FAILURE 0
//gcc -g seventeen_3.c -o seventeen_3 `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
int count=1;
int count2=1;
int item=0;
int volume=20;
int decide=1;
int pac_num=0;
GtkTextBuffer *bufferin,*bufferin2;
char **mac_unit;
char **mac_unit_buf;
char* mac_item="standard:ff:ff:ff:ff:ff:ff:ff:ff\n";
char* mac_item_buf="Ethnet UNIT OF MAC ADDRESS:";
//char arr[4096]="packet\n";
//global data
int MAC_broad_num;
int MAC_short_num;
int MAC_long_num;
int MAC_num;
int MAC_byte;
int MAC_speed;
int IP_num;
int IP_byte;
int IP_speed;
int TCP_num;
int UDP_num;
int ICMP_num;
int speed;
int ARP_num;
int passedtime;
char* starttime;
char* endtime;
int starttimeint;
int endtimeint;
//
GtkWidget *entry1;
GtkWidget *entry2;
GtkWidget *entry3;
GtkWidget *entry4;
GtkWidget *entry5;
GtkWidget *entry6;
GtkWidget *entry7;
GtkWidget *entry8;
GtkWidget *entry9;
GtkWidget *entry10;
GtkWidget *entry11;
GtkWidget *entry12;
GtkWidget *entry13;
GtkWidget *entry14;
GtkWidget *entry15;
GtkWidget *entry16;
GtkWidget *entry17;
struct Filter{
char* src_mac_all;
char* src_mac_res;
char* des_mac_all;
char* des_mac_res;
char* src_ip_all;
char* src_ip_res;
char* des_ip_all;
char* des_ip_res;
char* src_port_all;
char* src_port_res;
char* des_port_all;
char* des_port_res;
char* pro_all;
char* pro_res;
}filter;
struct service_type{
int a;
int e;
int d;
int h;
char *interface;
int arp;
int ip;
int tcp;
int udp;
int icmp;
} Ser_Type;
struct packet{
char* src_mac;
char* des_mac;
char* src_ip;
char* des_ip;
char* src_port;
char* des_port;
char* type;
}pac;
char* my_strstr(char *s1, char *s2);
void paint_count();
void begin_button(GtkButton *button);
void pause_button(GtkButton *button);
void continue_button(GtkButton *button);
void refresh_button(GtkButton *button);
GtkWidget* create_Text();
GtkWidget* create_Text2();
void insert_text(char* str);
void insert_text2(char* str);
void on_check_clicked1(GtkWidget* check ,gint data);
void on_check_clicked2(GtkWidget* check ,gint data);
void enter_callback1(GtkWidget *widget,gpointer entry);
void enter_callback2(GtkWidget *widget,gpointer entry);
void enter_callback3(GtkWidget *widget,gpointer entry);
void enter_callback4(GtkWidget *widget,gpointer entry);
void enter_callback5(GtkWidget *widget,gpointer entry);
void enter_callback6(GtkWidget *widget,gpointer entry);
void enter_callback7(GtkWidget *widget,gpointer entry);
void enter_callback8(GtkWidget *widget,gpointer entry);
void enter_callback9(GtkWidget *widget,gpointer entry);
void enter_callback10(GtkWidget *widget,gpointer entry);
void enter_callback11(GtkWidget *widget,gpointer entry);
void enter_callback12(GtkWidget *widget,gpointer entry);
void enter_callback13(GtkWidget *widget,gpointer entry);
void enter_callback14(GtkWidget *widget,gpointer entry);
void print_data(char* index,int length,char*arr);
void print_ethernet(struct ether_header * eth,char* arr);
void print_arp(struct ether_arp* arp,char* arr);
void print_ip(struct ip* ip,char* arr);
void print_tcp(struct tcphdr* tcp,char*arr);
void print_icmp(struct icmp* icmp,char* arr);
void print_udp(struct udphdr* udp,char*arr);
void do_eth(struct ether_header* eth);
void do_arp(struct ether_arp* arp);
void do_ip(struct ip* ip);
void work();
void our_thread1(GtkWidget *button);
int filt();
int filt1();
int filt2();
int filt3();
int filt4();
int filt5();
int filt6();
int filt7();
int filt8();
int filt9();
int filt10();
int filt11();
int filt12();
int filt13();
int filt14();
char* mac_ntoa(u_char* d);
char* ip_ttoa(int flag);
char* ip_ftoa(int flag);
char* tcp_ftoa(int flag);
void rece_command(char *argv[]);
void deal_switch_page(GtkNotebook *notebook,gpointer page,guint page_num,gpointer user_date){
if(page_num==0){
count=1;
}
if(page_num==1){
count=0;
char tbuf[25];
time_t timer;//time_t就是long int 类型
struct tm *tblock;
timer = time(NULL);
tblock = localtime(&timer);
sprintf(tbuf,"%s", asctime(tblock));
endtime=tbuf;
endtimeint=time((time_t*)NULL);
passedtime=endtimeint-starttimeint;
MAC_speed=MAC_num/passedtime;
IP_speed=IP_num/passedtime;
speed=MAC_byte/passedtime;
paint_count();
}
if(page_num==2){
count=0;
/*
insert_text2(mac_item_buf);
strcat(mac_item,mac_item_buf);
mac_item_buf="Ethnet UNIT OF MAC ADDRESS: ";
//insert_text2("\n");
*/
}
}
int main(int argc,char *argv[]){
if(!g_thread_supported())
g_thread_init(NULL);
gdk_threads_init();
gtk_init(&argc,&argv);
GtkWidget * window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window,1000,800);
GtkWidget *notebook=gtk_notebook_new();
gtk_container_add(GTK_CONTAINER(window),notebook);
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook),GTK_POS_TOP);
//first page
GtkWidget *label=gtk_label_new("main page");
GtkWidget *box=gtk_fixed_new();
//
GtkWidget *label1=gtk_label_new("filter");
gtk_fixed_put(GTK_FIXED(box),label1,100,0);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("allow");
gtk_fixed_put(GTK_FIXED(box),label1,0,30);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("resist");
gtk_fixed_put(GTK_FIXED(box),label1,200,30);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("source ip");
gtk_fixed_put(GTK_FIXED(box),label1,0,180);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("source ip");
gtk_fixed_put(GTK_FIXED(box),label1,200,180);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("dest ip");
gtk_fixed_put(GTK_FIXED(box),label1,0,240);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("dest ip");
gtk_fixed_put(GTK_FIXED(box),label1,200,240);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("source port");
gtk_fixed_put(GTK_FIXED(box),label1,0,300);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("source port");
gtk_fixed_put(GTK_FIXED(box),label1,200,300);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("dest port");
gtk_fixed_put(GTK_FIXED(box),label1,0,360);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("dest port");
gtk_fixed_put(GTK_FIXED(box),label1,200,360);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("protocol");
gtk_fixed_put(GTK_FIXED(box),label1,0,420);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("protocol");
gtk_fixed_put(GTK_FIXED(box),label1,200,430);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("display");
gtk_fixed_put(GTK_FIXED(box),label1,100,480);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("command");
gtk_fixed_put(GTK_FIXED(box),label1,100,510);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("protocol");
gtk_fixed_put(GTK_FIXED(box),label1,100,570);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("source mac");
gtk_fixed_put(GTK_FIXED(box),label1,0,60);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("source mac");
gtk_fixed_put(GTK_FIXED(box),label1,200,60);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("dest mac");
gtk_fixed_put(GTK_FIXED(box),label1,0,120);
gtk_widget_set_size_request(label1,100,20);
label1=gtk_label_new("dest mac");
gtk_fixed_put(GTK_FIXED(box),label1,200,120);
gtk_widget_set_size_request(label1,100,20);
//check
GtkWidget*check;
check=gtk_check_button_new_with_label("all");
gtk_fixed_put(GTK_FIXED(box),check,0,540);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)1);
check=gtk_check_button_new_with_label("eth");
gtk_fixed_put(GTK_FIXED(box),check,100,540);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)2);
check=gtk_check_button_new_with_label("data");
gtk_fixed_put(GTK_FIXED(box),check,200,540);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)3);
check=gtk_check_button_new_with_label("help");
gtk_fixed_put(GTK_FIXED(box),check,300,540);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)4);
check=gtk_check_button_new_with_label("arp");
gtk_fixed_put(GTK_FIXED(box),check,0,600);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)1);
check=gtk_check_button_new_with_label("ip");
gtk_fixed_put(GTK_FIXED(box),check,100,600);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)2);
check=gtk_check_button_new_with_label("tcp");
gtk_fixed_put(GTK_FIXED(box),check,200,600);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)3);
check=gtk_check_button_new_with_label("udp");
gtk_fixed_put(GTK_FIXED(box),check,300,600);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)4);
check=gtk_check_button_new_with_label("icmp");
gtk_fixed_put(GTK_FIXED(box),check,0,630);
gtk_widget_set_size_request(check,100,30);
g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)5);
//entry
GtkWidget *entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,210);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback1),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,210);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback2),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,270);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback3),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,270);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback4),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,330);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback5),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,330);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback6),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,390);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback7),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,390);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback8),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,450);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback9),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,450);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback10),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,90);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback11),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,90);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback12),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,0,150);
gtk_widget_set_size_request(entry,180,30);
gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback13),entry);
entry=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry,200,150);
gtk_widget_set_size_request(entry,180,30);
//gtk_entry_set_text(GTK_ENTRY(entry),"all");
g_signal_connect(entry,"activate",G_CALLBACK(enter_callback14),entry);
//right display window
GtkWidget* text=create_Text();
gtk_fixed_put(GTK_FIXED(box),text,450,50);
gtk_widget_set_size_request(text,500,700);
//begin button
GtkWidget *button1=gtk_button_new_with_label("begin");
gtk_fixed_put(GTK_FIXED(box),button1,0,670);
gtk_widget_set_size_request(button1,100,30);
g_signal_connect(button1,"pressed",G_CALLBACK( begin_button),NULL);
//pause button
GtkWidget *button2=gtk_button_new_with_label("pause");
gtk_fixed_put(GTK_FIXED(box),button2,100,670);
gtk_widget_set_size_request(button2,100,30);
g_signal_connect(button2,"pressed",G_CALLBACK( pause_button),NULL);
//continue button
GtkWidget *button3=gtk_button_new_with_label("continue");
gtk_fixed_put(GTK_FIXED(box),button3,200,670);
gtk_widget_set_size_request(button3,100,30);
g_signal_connect(button3,"pressed",G_CALLBACK( continue_button),NULL);
//refresh button
GtkWidget *button4=gtk_button_new_with_label("refresh");
gtk_fixed_put(GTK_FIXED(box),button4,300,670);
gtk_widget_set_size_request(button4,100,30);
g_signal_connect(button4,"pressed",G_CALLBACK( refresh_button),NULL);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,label);
//second page
label=gtk_label_new("packet count");
box=gtk_fixed_new();
GtkWidget *label2=gtk_label_new("MAC_BROAD");
gtk_fixed_put(GTK_FIXED(box),label2,0,0);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("MAC_LONG");
gtk_fixed_put(GTK_FIXED(box),label2,0,60);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("MAC_SHORT");
gtk_fixed_put(GTK_FIXED(box),label2,0,120);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("MAC PACKET");
gtk_fixed_put(GTK_FIXED(box),label2,0,180);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("MAC SPEED");
gtk_fixed_put(GTK_FIXED(box),label2,0,240);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("MAC BYTE");
gtk_fixed_put(GTK_FIXED(box),label2,0,300);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("IP PACKET");
gtk_fixed_put(GTK_FIXED(box),label2,0,360);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("IP BYTE");
gtk_fixed_put(GTK_FIXED(box),label2,0,420);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("IP SPEED");
gtk_fixed_put(GTK_FIXED(box),label2,0,480);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("TCP");
gtk_fixed_put(GTK_FIXED(box),label2,0,540);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("UDP");
gtk_fixed_put(GTK_FIXED(box),label2,0,600);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("ARP");
gtk_fixed_put(GTK_FIXED(box),label2,0,660);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("ICMP");
gtk_fixed_put(GTK_FIXED(box),label2,0,720);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("start time");
gtk_fixed_put(GTK_FIXED(box),label2,500,0);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("end time");
gtk_fixed_put(GTK_FIXED(box),label2,500,60);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("passed time");
gtk_fixed_put(GTK_FIXED(box),label2,500,120);
gtk_widget_set_size_request(label2,100,20);
label2=gtk_label_new("speed");
gtk_fixed_put(GTK_FIXED(box),label2,500,180);
gtk_widget_set_size_request(label2,100,20);
//entry
entry1=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry1,100,0);
gtk_widget_set_size_request(entry1,200,30);
entry2=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry2,100,60);
gtk_widget_set_size_request(entry2,200,30);
entry3=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry3,100,120);
gtk_widget_set_size_request(entry3,200,30);
entry15=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry15,100,180);
gtk_widget_set_size_request(entry15,200,30);
entry4=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry4,100,240);
gtk_widget_set_size_request(entry4,200,30);
entry5=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry5,100,300);
gtk_widget_set_size_request(entry5,200,30);
entry6=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry6,100,360);
gtk_widget_set_size_request(entry6,200,30);
entry7=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry7,100,420);
gtk_widget_set_size_request(entry7,200,30);
entry8=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry8,100,480);
gtk_widget_set_size_request(entry8,200,30);
entry9=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry9,100,540);
gtk_widget_set_size_request(entry9,200,30);
entry10=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry10,100,600);
gtk_widget_set_size_request(entry10,200,30);
entry11=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry11,100,660);
gtk_widget_set_size_request(entry11,200,30);
entry12=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry12,100,720);
gtk_widget_set_size_request(entry12,200,30);
entry13=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry13,600,0);
gtk_widget_set_size_request(entry13,400,30);
entry14=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry14,600,60);
gtk_widget_set_size_request(entry14,400,30);
entry16=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry16,600,120);
gtk_widget_set_size_request(entry16,200,30);
entry17=gtk_entry_new();
gtk_fixed_put(GTK_FIXED(box),entry17,600,180);
gtk_widget_set_size_request(entry17,200,30);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,label);
//third page
label=gtk_label_new("net unit found");
box=gtk_fixed_new();
GtkWidget* text2=create_Text2();
gtk_fixed_put(GTK_FIXED(box),text2,50,50);
gtk_widget_set_size_request(text2,700,600);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,label);
//
g_signal_connect(notebook,"switch_page",G_CALLBACK(deal_switch_page),NULL);
gtk_widget_show_all(window);
mac_unit=(char**)malloc(sizeof(char*)*255);
mac_unit_buf=(char**)malloc(sizeof(char*)*255);
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
return 0;
}
void paint_count(){
char buf_num[10]={0};
sprintf(buf_num,"%d",MAC_broad_num);
gtk_entry_set_text(entry1,buf_num);
sprintf(buf_num,"%d",MAC_long_num);
gtk_entry_set_text(entry2,buf_num);
sprintf(buf_num,"%d",MAC_short_num);
gtk_entry_set_text(entry3,buf_num);
sprintf(buf_num,"%d",MAC_num);
gtk_entry_set_text(entry15,buf_num);
sprintf(buf_num,"%d",MAC_speed);
gtk_entry_set_text(entry4,buf_num);
sprintf(buf_num,"%d",MAC_byte);
gtk_entry_set_text(entry5,buf_num);
sprintf(buf_num,"%d",IP_num);
gtk_entry_set_text(entry6,buf_num);
sprintf(buf_num,"%d",IP_byte);
gtk_entry_set_text(entry7,buf_num);
sprintf(buf_num,"%d",IP_speed);
gtk_entry_set_text(entry8,buf_num);
sprintf(buf_num,"%d",TCP_num);
gtk_entry_set_text(entry9,buf_num);
sprintf(buf_num,"%d",UDP_num);
gtk_entry_set_text(entry10,buf_num);
sprintf(buf_num,"%d",ARP_num);
gtk_entry_set_text(entry11,buf_num);
sprintf(buf_num,"%d",ICMP_num);
gtk_entry_set_text(entry12,buf_num);
//sprintf(buf_num,"%d",ARP_num);
gtk_entry_set_text(entry13,starttime);
//sprintf(buf_num,"%d",speed);
gtk_entry_set_text(entry14,endtime);
sprintf(buf_num,"%d",passedtime);
gtk_entry_set_text(entry16,buf_num);
sprintf(buf_num,"%d",speed);
gtk_entry_set_text(entry17,buf_num);
}
void begin_button(GtkButton *button){
printf("1:%s\n",filter.src_ip_all);
printf("2:%s\n",filter.src_ip_res);
printf("3:%s\n",filter.des_ip_all);
printf("4:%s\n",filter.des_ip_res);
printf("5:%s\n",filter.src_port_all);
printf("6:%s\n",filter.src_port_res);
printf("7:%s\n",filter.des_port_all);
printf("8:%s\n",filter.des_port_res);
printf("9:%s\n",filter.pro_all);
printf("10:%s\n",filter.pro_res);
printf("a=%d\n",Ser_Type.a);
printf("e=%d\n",Ser_Type.e);
printf("d=%d\n",Ser_Type.d);
printf("h=%d\n",Ser_Type.h);
printf("interface is %s",Ser_Type.interface);
printf("arp=%d\n",Ser_Type.arp);
printf("ip=%d\n",Ser_Type.ip);
printf("tcp=%d\n",Ser_Type.tcp);
printf("udp=%d\n",Ser_Type.udp);
printf("icmp=%d\n",Ser_Type.icmp);
//
/*
char tbuf[25];
time_t timep;
time(&timep);
struct tm *p;
p = gmtime(&timep);
snprintf(tbuf , "%d-%d-%d %d:%d:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec);
starttime=tbuf;*/
/*char *tbuf;
time_t timer;//time_t就是long int 类型
struct tm *tblock;
timer = time(NULL);
tblock = localtime(&timer);
sprintf(tbuf,"%s", asctime(tblock));
starttime=tbuf;*/
printf("chenck1\n");
starttimeint=time((time_t*)NULL);
//
gtk_widget_set_sensitive(button,FALSE);
g_thread_create(our_thread1,button,FALSE,NULL);
// work();
}
void pause_button(GtkButton *button){
if(count>0)
count--;
}
void continue_button(GtkButton *button){
if(count<1)
count++;
}
void refresh_button(GtkButton *button){
MAC_broad_num=0;
MAC_short_num=0;
MAC_long_num=0;
MAC_num=0;
MAC_byte=0;
MAC_speed=0;
IP_num=0;
IP_byte=0;
IP_speed=0;
TCP_num=0;
UDP_num=0;
ICMP_num=0;
speed=0;
ARP_num=0;
/*
int passedtime;
char* starttime;
char* endtime=NULL;
int starttimeint;
int endtimeint;
*/
}
GtkWidget *create_Text()
{
GtkWidget *scrolled_window;
GtkWidget *view;
//GtkTextBuffer *buffer;
view = gtk_text_view_new ();
GtkTextIter iter;
bufferin = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
//bufferin=buffer;
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolled_window), view);
/*
gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);
for(int i=0;i<5;i++){
insert_text (bufferin,"i am your father!\n");
}
*/
gtk_widget_show_all (scrolled_window);
return scrolled_window;
}
GtkWidget *create_Text2()
{
GtkWidget *scrolled_window;
GtkWidget *view;
//GtkTextBuffer *buffer;
view = gtk_text_view_new ();
GtkTextIter iter;
bufferin2 = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
//bufferin=buffer;
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolled_window), view);
gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);
/*
for(int i=0;i<5;i++){
insert_text2("ffffffffffff\n");
}
*/
gtk_widget_show_all (scrolled_window);
return scrolled_window;
}
void insert_text(char* str){
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);
gtk_text_buffer_insert(bufferin,&iter,str,-1);
decide=1;
if(item>volume){
clear();
printf("-----------clear----------------");
}
}
void insert_text2(char* str){
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset(bufferin2,&iter,0);
gtk_text_buffer_insert(bufferin2,&iter,str,-1);
count2=1;
}
void on_check_clicked1(GtkWidget* check ,gint data){
switch((int)data){
case 1:
Ser_Type.a=(Ser_Type.a+1)%2;
break;
case 2:
Ser_Type.e=(Ser_Type.e+1)%2;
break;
case 3:
Ser_Type.d=(Ser_Type.d+1)%2;
break;
case 4:
Ser_Type.h=(Ser_Type.h+1)%2;
break;
default:
break;
}
}
void on_check_clicked2(GtkWidget* check ,gint data){
switch((int)data){
case 1:
Ser_Type.arp=(Ser_Type.arp+1)%2;
break;
case 2:
Ser_Type.ip=(Ser_Type.ip+1)%2;
break;
case 3:
Ser_Type.tcp=(Ser_Type.tcp+1)%2;
break;
case 4:
Ser_Type.udp=(Ser_Type.udp+1)%2;
break;
case 5:
Ser_Type.icmp=(Ser_Type.icmp+1)%2;
break;
default:
break;
}
}
void enter_callback1(GtkWidget *widget,gpointer entry){
filter.src_ip_all=gtk_entry_get_text(GTK_ENTRY(entry));
//printf("%s",filter.src_ip_all);
}
void enter_callback2(GtkWidget *widget,gpointer entry){
filter.src_ip_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback3(GtkWidget *widget,gpointer entry){
filter.des_ip_all=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback4(GtkWidget *widget,gpointer entry){
filter.des_ip_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback5(GtkWidget *widget,gpointer entry){
filter.src_port_all=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback6(GtkWidget *widget,gpointer entry){
filter.src_port_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback7(GtkWidget *widget,gpointer entry){
filter.des_port_all=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback8(GtkWidget *widget,gpointer entry){
filter.des_port_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback9(GtkWidget *widget,gpointer entry){
filter.pro_all=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback10(GtkWidget *widget,gpointer entry){
filter.pro_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback11(GtkWidget *widget,gpointer entry){
filter.src_mac_all=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback12(GtkWidget *widget,gpointer entry){
filter.src_mac_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback13(GtkWidget *widget,gpointer entry){
filter.des_mac_all=gtk_entry_get_text(GTK_ENTRY(entry));
}
void enter_callback14(GtkWidget *widget,gpointer entry){
filter.des_mac_res=gtk_entry_get_text(GTK_ENTRY(entry));
}
void our_thread1(GtkWidget *button){
work();
gdk_threads_leave();
}
void work(){
char eth_unit[200]="Ethnerat NET Unit of MAC ADDRESS\n";
char* eth_unit_buf;
struct ether_header* eth;
struct ether_arp* arp;
struct ip* ip;
struct icmp* icmp;
struct tcphdr* tcp;
struct udphdr* udp;
int sock;
int len;
char buff[MAXSIZE];
char* p;
char* q;
printf("start");
//void rece_command(char *argv[]);
printf("a=%d\n",Ser_Type.a);
printf("e=%d\n",Ser_Type.e);
printf("d=%d\n",Ser_Type.d);
printf("h=%d\n",Ser_Type.h);
printf("interface is %s\n",Ser_Type.interface);
printf("arp=%d\n",Ser_Type.arp);
printf("ip=%d\n",Ser_Type.ip);
printf("tcp=%d\n",Ser_Type.tcp);
printf("udp=%d\n",Ser_Type.udp);
printf("icmp=%d\n",Ser_Type.icmp);
filter.src_mac_all="all";
filter.des_mac_all="all";
filter.src_ip_all="all";
filter.des_ip_all="all";
filter.pro_all="all";
filter.src_port_all="all";
filter.des_port_all="all";
//filter.pro_res="tcp";
if ((sock = socket(PF_PACKET,SOCK_PACKET, htons(ETH_P_ALL))) < 0) {
perror("socket error");
return(EXIT_FAILURE);
}
while (1) {
while(count==0){
// printf("hault!\n");
}
//filter
char*dat;
printf("begin...........\n");
if ((len = read(sock, buff,MAXSIZE)) < 64) {
continue;
}
q = buff;
p=q;
eth = (struct ether_header*)q;
q += sizeof(struct ether_header);
do_eth(eth);
//printf("A\n");
if (ntohs(eth->ether_type) == ETHERTYPE_ARP) {
do_arp(arp);
//printf("B\n");
arp = (struct ether_arp*)q;
}
else if (ntohs(eth->ether_type) == ETHERTYPE_IP) {
ip = (struct ip*)q;
q += (int)(ip->ip_hl) << 2;
// printf("C\n");
dat=q;
if (ip->ip_p == IPPROTO_TCP||ip->ip_p == IPPROTO_UDP||ip->ip_p == IPPROTO_ICMP) {
do_ip(ip);
char buf_port_s[10]={0};
char buf_port_d[10]={0};
switch (ip->ip_p) {
case IPPROTO_TCP:
tcp = (struct tcphdr*)q;
q += (int)(tcp->th_off) << 2;
printf("D\n");
pac.type="tcp";
printf("E\n");
//pac.src_port=
// pac.des_port=
sprintf(buf_port_s,"%u",ntohs(tcp->th_sport));
sprintf(buf_port_d,"%u",ntohs(tcp->th_dport));
pac.src_port=buf_port_s;
pac.des_port=buf_port_d;
/*
for(int i=0;i<10;i++){
if(buf_port_s[i]=='\0'){
break;
}
if(buf_port_s[i]!=' '){
pac.src_port=buf_port_s+i;
break;
}
}
for(int i=0;i<10;i++){
if(buf_port_d[i]=='\0'){
break;
}
if(buf_port_d[i]!=' '){
pac.des_port=buf_port_d+i;
break;
}
}
*/
//print_tcp(tcp);
break;
case IPPROTO_UDP:
udp = (struct udphdr*)q;
q += sizeof(struct udphdr);
pac.type="udp";
sprintf(buf_port_s,"%5u",ntohs(udp->uh_sport));
sprintf(buf_port_d,"%5u",ntohs(udp->uh_dport));
pac.src_port=buf_port_s;
pac.des_port=buf_port_d;
//print_udp(udp);
break;
case IPPROTO_ICMP:
icmp = (struct icmp*)q;
q += sizeof(struct icmp);
pac.type="icmp";
//print_icmp(icmp);
break;
default:
printf("δ֪\n");
break;
}
}
}
printf("F\n");
printf("over!........");
if(filt()==0){
printf("trash\n");
p=q;
continue;
}
//char* my_strstr(char const *s1, char const *s2)
//
MAC_num++;
int mac_len=ntohs(eth->ether_type);
if(mac_len<1500){
MAC_short_num++;
MAC_byte+=mac_len;
}else{
MAC_byte+=1500;
}
char* des_mac=mac_ntoa(eth->ether_dhost);
char* src_mac=mac_ntoa(eth->ether_shost);
if(strcasecmp("ff:ff:ff:ff:ff:ff", mac_ntoa(eth->ether_dhost))==0){
MAC_broad_num++;
}
//printf("\ndes: %s\n",des_mac);
//printf("src: %s\n",src_mac);
if(strstr(eth_unit,des_mac)==NULL){
count2=0;
strcat(des_mac,"\n");
g_idle_add((GSourceFunc)insert_text2,(char*)des_mac);
while(count2==0){
}
strcat(eth_unit,des_mac);
}
if((ntohs(eth->ether_type) == ETHERTYPE_ARP) ){
ARP_num++;
}
if(ntohs(eth->ether_type) == ETHERTYPE_IP){
IP_num++;
IP_byte+=ntohs(ip->ip_len);
switch (ip->ip_p) {
case IPPROTO_TCP:
TCP_num++;
break;
case IPPROTO_UDP:
UDP_num++;
break;
case IPPROTO_ICMP:
ICMP_num++;
break;
default:
break;
}
}
//
char arr[4096]="PACKET: ";
//printf("......accept packet %d inedx %d.................\n",pac_num,item);
//output
//eth = (struct ether_header*)p;
//printf("G\n");
//p += sizeof(struct ether_header);
//printf("H\n");
//if(Ser_Type.e==1)
//print_ethernet(eth);
if ((ntohs(eth->ether_type) == ETHERTYPE_ARP) &&(Ser_Type.arp==1||Ser_Type.a==1)) {
//
printf("boom\n");
//arp = (struct ether_arp*)p;
//if(Ser_Type.arp==1||Ser_Type.a==1)
print_arp(arp,arr);
//arp = (struct ether_arp*)p;
}
else if (ntohs(eth->ether_type) == ETHERTYPE_IP) {
//ip = (struct ip*)p;
//p += (int)(ip->ip_hl) << 2;
if (ip->ip_p == IPPROTO_TCP||ip->ip_p == IPPROTO_UDP||ip->ip_p == IPPROTO_ICMP) {
//
//if(Ser_Type.ip==1||Ser_Type.a==1)
//print_ip(ip);
//printf("I\n");
switch (ip->ip_p) {
case IPPROTO_TCP:
printf("TCP\n");
strcat(arr,"TCP\n");
// printf("I1\n");
//tcp = (struct tcphdr*)p;
//printf("J1\n");
if(Ser_Type.e==1&&(Ser_Type.a=1||Ser_Type.tcp==1))
print_ethernet(eth,arr);
if((Ser_Type.ip==1&&Ser_Type.tcp==1)||Ser_Type.a==1)
print_ip(ip,arr);
//p += (int)(tcp->th_off) << 2;
if(Ser_Type.a==1||Ser_Type.tcp==1){
print_tcp(tcp,arr);
if(Ser_Type.d==1)
print_data(dat,(int)(tcp->th_off) << 2,arr);
}
break;
case IPPROTO_UDP:
//printf("UDP");
strcat(arr,"UDP\n");
//printf("I2\n");
//udp = (struct udphdr*)p;
//p += sizeof(struct udphdr);
if(Ser_Type.e==1&&(Ser_Type.a=1||Ser_Type.udp==1))
print_ethernet(eth,arr);
//printf("UDP2\n");
if((Ser_Type.ip==1&&Ser_Type.udp==1)||Ser_Type.a==1)
print_ip(ip,arr);
//printf("UDP3\n");
if(Ser_Type.a==1||Ser_Type.udp==1){
print_udp(udp,arr);
if(Ser_Type.d==1)
print_data(dat,sizeof(struct udphdr),arr);
}
break;
case IPPROTO_ICMP:
printf("ICMP\n");
strcat(arr,"ICMP\n");
// printf("I3\n");
//icmp = (struct icmp*)p;
//p += sizeof(struct icmp);
if(Ser_Type.e==1&&(Ser_Type.a=1||Ser_Type.icmp==1),arr)
print_ethernet(eth,arr);
if((Ser_Type.ip==1&&Ser_Type.icmp==1)||Ser_Type.a==1,arr)
print_ip(ip,arr);
if(Ser_Type.icmp==1||Ser_Type.a==1){
print_icmp(icmp,arr);
if(Ser_Type.d==1)
print_data(dat,sizeof(struct icmp),arr);
}
break;
default:
printf("δ֪\n");
break;
}
}
}else{
continue;
}
printf("over!........");
decide=0;
item++;
pac_num++;
/*
if(Ser_Type.d==1){
dat[20]='\0';
strcat(arr,dat);
}
*/
g_idle_add((GSourceFunc)insert_text,(char*)arr);
while(decide==0){
}
}
}
int filt(){
return filt1()&&filt2()&&filt3()&&filt4()&&filt5()&&filt6()&&filt7()&&filt8()&&filt9()&&filt10()&&filt11()&&filt12()&&filt13()&&filt14();
}
int filt1(){
if(filter.src_mac_all==NULL)
return 1;
if(strstr(filter.src_mac_all,"all")!=NULL)
return 1;
if(strstr(filter.src_mac_all,pac.src_mac)!=NULL)
return 1;
printf("src_mac not allowed!\n");
return 0;
}
int filt2(){
if(filter.des_mac_all==NULL)
return 1;
if(strstr(filter.des_mac_all,"all")!=NULL)
return 1;
if(strstr(filter.des_mac_all,pac.des_mac)!=NULL)
return 1;
printf("des_mac not allowed!\n");
return 0;
}
int filt3(){
if(filter.src_ip_all==NULL)
return 1;
if(strstr(filter.src_ip_all,"all")!=NULL)
return 1;
if(strstr(filter.src_ip_all,pac.src_ip)!=NULL)
return 1;
printf("src_ip not allowed!\n");
return 0;
}
int filt4(){
if(filter.des_ip_all==NULL)
return 1;
if(strstr(filter.des_ip_all,"all")!=NULL)
return 1;
// printf("%s\n",filter.des_ip_all);
//printf("%s\n",pac.des_ip);
if(strstr(filter.des_ip_all,pac.des_ip)!=NULL)
return 1;
printf("des_ip not allowed!\n");
return 0;
}
int filt5(){
if(filter.pro_all==NULL)
return 1;
if(strstr(filter.pro_all,"all")!=NULL)
return 1;
if(strstr(filter.pro_all,pac.type)!=NULL)
return 1;
printf("pro not allowed!\n");
return 0;
}
int filt6(){
if(filter.src_mac_res==NULL)
return 1;
if(strstr(filter.src_mac_res,"all")!=NULL)
{
printf("all src_mac denyed!\n");
return 0;
}
if(strstr(filter.src_mac_res,pac.src_mac)!=NULL)
{
printf("src_mac denyed!\n");
return 0;
}
return 1;
}
int filt7(){
if(filter.des_mac_res==NULL)
return 1;
if(strstr(filter.des_mac_res,"all")!=NULL)
{
printf("all des_mac denyed!\n");
return 0;
}
if(strstr(filter.des_mac_res,pac.des_mac)!=NULL)
{
printf("des_mac denyed!\n");
return 0;
}
return 1;
}
int filt8(){
if(filter.src_ip_res==NULL)
return 1;
if(strstr(filter.src_ip_res,"all")!=NULL)
{
printf("src_ip denyed!\n");
return 0;
}
if(strstr(filter.src_ip_res,pac.src_ip)!=NULL)
{
printf("src_ip denyed!\n");
return 0;
}
return 1;
}
int filt9(){
if(filter.des_ip_res==NULL)
return 1;
if(strstr(filter.des_ip_res,"all")!=NULL)
{
printf("des_ip denyed!\n");
return 0;
}
if(strstr(filter.des_ip_res,pac.des_ip)!=NULL)
{
printf("des_ip denyed!\n");
return 0;
}
return 1;
}
int filt10(){
if(filter.pro_res==NULL)
return 1;
if(strstr(filter.pro_res,"all")!=NULL)
{
printf("pro denyed\n");
return 0;
}
if(strstr(filter.pro_res,pac.type)!=NULL)
{
printf("pro denyed!\n");
return 0;
}
return 1;
}
int filt11(){
if(pac.type=="icmp")
return 1;
if(filter.src_port_all==NULL)
return 1;
if(strstr(filter.src_port_all,"all")!=NULL)
return 1;
if(strstr(filter.src_port_all,pac.src_port)!=NULL)
return 1;
printf(" source prot not allowed!\n");
return 0;
}
int filt12(){
if(pac.type=="icmp")
return 1;
if(filter.des_port_all==NULL)
return 1;
if(strstr(filter.des_port_all,"all")!=NULL)
return 1;
if(strstr(filter.des_port_all,pac.des_port)!=NULL)
return 1;
printf(" destination prot not allowed!\n");
return 0;
}
int filt13(){
if(pac.type=="icmp")
return 1;
if(filter.src_port_res==NULL)
return 1;
if(strstr(filter.src_port_res,"all")!=NULL)
{
printf("source port denyed\n");
return 0;
}
if(strstr(filter.src_port_res,pac.src_port)!=NULL)
{
printf("source port denyed!\n");
return 0;
}
return 1;
}
int filt14(){
if(pac.type=="icmp"){
printf("icmp allow\n");
return 1;
}
if(filter.des_port_res==NULL){
printf("no deny ensure\n");
return 1;
}
printf("%s\n",filter.des_port_res);
printf("%s\n",pac.des_port);
if(strstr(filter.des_port_res,"all")!=NULL)
{
printf(" destinantion port denyed\n");
return 0;
}
if(strstr(filter.des_port_res,pac.des_port)!=NULL)
{
printf("destination port denyed!\n");
return 0;
}
return 1;
}
void clear(){
GtkTextIter start,end;
gtk_text_buffer_get_start_iter(bufferin,&start);
//gtk_text_buffer_get_end_iter(bufferin,&end);
gtk_text_buffer_get_iter_at_offset(bufferin,&end,volume/2);
gtk_text_buffer_delete(bufferin,&start,&end);
item=0;
}
void print_data(char* index,int length,char*arr){
printf("\ncontent:\n ");
//char*ptr=index;
strcat(arr,"\nconntent: \n");
char mid[8]={0};
for(int i=0;i<length;i++){
printf("%02x",(unsigned char)*(index+i));
sprintf(mid,"%02x",(unsigned char)*(index+i));
strcat(arr,mid);
if(i%4==0&&i>2){
strcat(arr," ");
if(i%16==0&&i>6){
strcat(arr,"\n");
}
}
}
strcat(arr,"\n------------------------------------------------------------------\n");
}
void print_ethernet(struct ether_header* eth,char* arr) {
//GtkTextIter iter;
//gtk_text_buffer_get_start_iter(bufferin,&iter);
//gtk_text_buffer_insert(bufferin,&iter,"ETH FRAME!\n",-1);
strcat(arr ,"ETH FRAME!\n");
char atr[100]={0};
//g_idle_add((GSourceFunc)insert_text,(char*)arr);
/*item++;
if(item>volume)
clear();*/
int type = ntohs(eth->ether_type);
//insert_text(bufferin," ETH FRAME\n");
//gtk_text_buffer_insert_with_tags_by_name(bufferin,&iter,"ETH FRAME",-1,"blue_fg","lmrg",NULL);
if (type <= 1500) {
printf("IEEE 802.3 Ethernet Frame:\n");
strcat(arr,"IEEE 802.3 Ethernet Frame:\n");
}
else {
printf("Ethernet Frame:\n");
strcat(arr,"Ethernet Frame:\n");
}
printf("Destination MAC Adress: %17s\n", mac_ntoa(eth->ether_dhost));
sprintf(atr,"Destination MAC Adress: %17s\n", mac_ntoa(eth->ether_dhost));
strcat(arr,atr);
printf("Source MAC Adress: %17s\n", mac_ntoa(eth->ether_shost));
sprintf(atr,"Source MAC Adress: %17s\n", mac_ntoa(eth->ether_shost));
strcat(arr,atr);
if (type < 1500) {
printf("Lenht: %5u\n", type);
}
else {
//char atr[512]={0};
printf("Ethernet Type ox%04x\n", type);
sprintf(atr,"Ethernet Type ox%04x\n", type);
strcat(arr,atr);
}
//g_idle_add((GSourceFunc)insert_text,(char*)arr);
}
void do_eth(struct ether_header* eth) {
pac.des_mac=mac_ntoa(eth->ether_dhost);
pac.src_mac=mac_ntoa(eth->ether_shost);
}
void print_arp(struct ether_arp* arp,char* arr) {
/* GtkTextIter iter;
gtk_text_buffer_get_start_iter(bufferin,&iter);
gtk_text_buffer_insert(bufferin,&iter,"ARP!\n",-1);
*/
// insert_text(bufferin,"Protocal: ARP\n");
char atr[300]={0};
static char* arp_operation[] = { "Undefine","(ARP Request)","(ARP Reply)","(RARP Request)","(RARP Reply)" };
int op = ntohs(arp->ea_hdr.ar_op);
if (op <= 0 || 5 < op) {
op = 0;
printf("Protocol: ARP\n");
strcat(arr,"Protocol: ARP\n");
printf("Hedr Type: %2u %-11s | Protocal: Ox%04x %-9sin",
ntohs(arp->ea_hdr.ar_hrd),(ntohs(arp->ea_hdr.ar_hrd) == ARPHRD_ETHER) ? "(Ethernet)": "(Notther)",
ntohs(arp->ea_hdr.ar_pro),(ntohs(arp->ea_hdr.ar_pro) == ETHERTYPE_IP) ? "(IP)": "(Not IP)");
sprintf(atr,"Hedr Type: %2u %-11s | Protocal: Ox%04x %-9sin",
ntohs(arp->ea_hdr.ar_hrd),(ntohs(arp->ea_hdr.ar_hrd) == ARPHRD_ETHER) ? "(Ethernet)": "(Notther)",
ntohs(arp->ea_hdr.ar_pro),(ntohs(arp->ea_hdr.ar_pro) == ETHERTYPE_IP) ? "(IP)": "(Not IP)");
strcat(arr,atr);
printf("Hardlen : %3u | Addr Len : %2u | op : %4d %16s\n",
arp->ea_hdr.ar_hln,arp->ea_hdr.ar_pln,ntohs(arp->ea_hdr.ar_op),arp_operation[op]);
sprintf(atr,"Hardlen : %3u | Addr Len : %2u | op : %4d %16s\n",
arp->ea_hdr.ar_hln,arp->ea_hdr.ar_pln,ntohs(arp->ea_hdr.ar_op),arp_operation[op]);
strcat(arr,atr);
printf("Source MAC Address: %17s\n", mac_ntoa(arp->arp_sha));
sprintf(atr,"Source MAC Address: %17s\n", mac_ntoa(arp->arp_sha));
strcat(arr,atr);
printf("Source IP Address: %7s\n",inet_ntoa(*(struct in_addr*) & arp->arp_spa));
sprintf(atr,"Source IP Address: %7s\n",inet_ntoa(*(struct in_addr*) & arp->arp_spa));
strcat(arr,atr);
printf("Destination MAC Address: %17s\n", mac_ntoa(arp->arp_tha));
sprintf(atr,"Destination MAC Address: %17s\n", mac_ntoa(arp->arp_tha));
strcat(arr,atr);
printf("Destination IP Adress: %7s\n", inet_ntoa(*(struct in_addr*)&arp->arp_tpa));
sprintf(atr,"Destination IP Adress: %7s\n", inet_ntoa(*(struct in_addr*)&arp->arp_tpa));
strcat(arr,atr);
}
}
void do_arp(struct ether_arp* arp) {
static char* arp_operation[] = { "Undefine","(ARP Request)","(ARP Reply)","(RARP Request)","(RARP Reply)" };
int op = ntohs(arp->ea_hdr.ar_op);
if (op <= 0 || 5 < op) {
op = 0;
pac.type="arp";
pac.src_mac=mac_ntoa(arp->arp_sha);
pac.des_mac=mac_ntoa(arp->arp_tha);
pac.src_ip=inet_ntoa(*(struct in_addr*) & arp->arp_spa);
pac.des_ip=inet_ntoa(*(struct in_addr*)&arp->arp_tpa);
}
}
void print_ip(struct ip* ip,char*arr){
//GtkTextIter iter;
//gtk_text_buffer_get_start_iter(bufferin,&iter);
//gtk_text_buffer_insert(bufferin,&iter,"IP!\n",-1);
//g_idle_add((GSourceFunc)insert_text,(char*)"IP!\n");
/*item++;
if(item>volume)
clear();*/
strcat(arr ,"Protocal: IP\n");
char atr[100]={0};
printf("Protocal: IP\n");
strcat(arr,"Protocal: IP\n");
//insert_text(bufferin,"Protoal: IP\n");
printf("IV: %1u | HL:%2u | T:%8s | Total Length: %10u\n",ip->ip_v, ip->ip_hl, ip_ttoa(ip->ip_tos), ntohs(ip->ip_len));
sprintf(atr,"IV: %1u | HL:%2u | T:%8s | Total Length: %10u\n",ip->ip_v, ip->ip_hl, ip_ttoa(ip->ip_tos), ntohs(ip->ip_len));
strcat(arr,atr);
printf("Tdentifier: %5u | FF: %3s | FO: %5u\n",ntohs(ip->ip_id), ip_ftoa(ntohs(ip->ip_off)), ntohs(ip->ip_off) & IP_OFFMASK);
sprintf(atr,"Tdentifier: %5u | FF: %3s | FO: %5u\n",ntohs(ip->ip_id), ip_ftoa(ntohs(ip->ip_off)), ntohs(ip->ip_off) & IP_OFFMASK);
strcat(arr,atr);
printf("TTL: %3u | Pro: %3u | Head Checksum: %5u\n",ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum));
sprintf(atr,"TTL: %3u | Pro: %3u | Head Checksum: %5u\n",ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum));
strcat(arr,atr);
printf("Source IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_src)));
sprintf(atr,"Source IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_src)));
strcat(arr,atr);
//char atr1[100]={0};
printf("Destination IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_dst)));
sprintf(atr,"Destination IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_dst)));
strcat(arr,atr);
//g_idle_add((GSourceFunc)insert_text,(char*)arr);
}
void do_ip(struct ip* ip){
pac.src_ip=inet_ntoa(*(struct in_addr*)&(ip->ip_src));
pac.des_ip=inet_ntoa(*(struct in_addr*)&(ip->ip_dst));
}
void print_tcp(struct tcphdr* tcp,char*arr) {
/*GtkTextIter iter;
gtk_text_buffer_get_start_iter(bufferin,&iter);
gtk_text_buffer_insert(bufferin,&iter,"TCP!\n",-1);
item++;
if(item>volume)
clear();*/
//g_idle_add((GSourceFunc)insert_text,(char*)"TCP!\n");
//gtk_text_buffer_insert_with_tags_by_name(bufferin,&iter,"TCP",-1,"blue_fg","lmrg",NULL);
//insert_text(bufferin,"Protocal: TCP\n");
strcat(arr,"Protocol: TCP");
char atr[100]={0};
printf("Source Port: %5u | Destination Port: %5u\n",ntohs(tcp->th_sport), ntohs(tcp->th_dport));
sprintf(atr,"Source Port: %5u | Destination Port: %5u\n",ntohs(tcp->th_sport), ntohs(tcp->th_dport));
strcat(arr,atr);
printf("Sequence Number : %10lu\n",(u_long)(tcp->th_seq));
sprintf(atr,"Sequence Number : %10lu\n",(u_long)(tcp->th_seq));
strcat(arr,atr);
printf("Acknowledgement Number : %10lu\n",(u_long)(tcp->th_ack));
sprintf(atr,"Acknowledgement Number : %10lu\n",(u_long)(tcp->th_ack));
strcat(arr,atr);
printf("Do: %2u | Reserved | F: %6s | Windows Size: %5u\n", tcp->th_off, tcp_ftoa(tcp->th_flags),ntohs(tcp->th_win));
sprintf(atr,"Do: %2u | Reserved | F: %6s | Windows Size: %5u\n", tcp->th_off, tcp_ftoa(tcp->th_flags),ntohs(tcp->th_win));
strcat(arr,atr);
printf("Checksum: %5u | Urgent Pointer: %5u\n",ntohs(tcp->th_sum),ntohs(tcp->th_urp));
sprintf(atr,"Checksum: %5u | Urgent Pointer: %5u\n",ntohs(tcp->th_sum),ntohs(tcp->th_urp));
strcat(arr,atr);
}
void print_udp(struct udphdr* udp,char*arr) {
/*GtkTextIter iter;
gtk_text_buffer_get_start_iter(bufferin,&iter);
gtk_text_buffer_insert(bufferin,&iter,"UDP!\n",-1);
item++;
if(item>volume)
clear();*/
//g_idle_add((GSourceFunc)insert_text ,(char*)"ETH FRAME!\n");
//printf("UDP4\n");
//printf("%d",sizeof(udp));
char atr[256]={0};
//printf("UDP5\n");
printf("Source Port: %5u | Dest Port:%5u\n",ntohs(udp->uh_sport), ntohs(udp->uh_dport));
sprintf(atr,"Source Port: %5u | Dest Port:%5u\n",ntohs(udp->uh_sport), ntohs(udp->uh_dport));
strcat(arr,atr);
printf("Length: %5u | Checksum : %5u\n", ntohs(udp->uh_ulen), udp->uh_sum);
sprintf(atr,"Length: %5u | Checksum : %5u\n", ntohs(udp->uh_ulen), udp->uh_sum);
strcat(arr,atr);
}
void print_icmp(struct icmp* icmp,char* arr) {
char atr[100]={0};
printf("Protocal: ICMP\n");
strcat(arr,"Protocal: ICMP\n");
printf("Type: %3u | Code: %3u | Checksum: %5un",icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum));
sprintf(atr,"Type: %3u | Code: %3u | Checksum: %5un",icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum));
strcat(arr,atr);
if (icmp->icmp_type == 0 || icmp->icmp_type == 8) {
printf(" Identification: %5u | Sequence Num: %5u\n", ntohs(icmp->icmp_id), ntohs(icmp->icmp_seq));
sprintf(atr," Identification: %5u | Sequence Num: %5u\n", ntohs(icmp->icmp_id), ntohs(icmp->icmp_seq));
strcat(arr,atr);
}
else if (icmp->icmp_type == 3) {
if (icmp->icmp_code == 4) {
printf("void: %5u | Next MTU: %5u\n", ntohs(icmp->icmp_pmvoid), ntohs(icmp->icmp_nextmtu));
sprintf(atr,"void: %5u | Next MTU: %5u\n", ntohs(icmp->icmp_pmvoid), ntohs(icmp->icmp_nextmtu));
strcat(arr,atr);
}
else {
printf("Unused: %10lu\n", (u_long)ntohs(icmp->icmp_void));
sprintf(atr,"Unused: %10lu\n", (u_long)ntohs(icmp->icmp_void));
strcat(arr,atr);
}
}
else if (icmp->icmp_type == 5) {
printf(" Router IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(icmp->icmp_gwaddr)));
sprintf(atr," Router IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(icmp->icmp_gwaddr)));
strcat(arr,atr);
}
else if (icmp->icmp_type == 11) {
printf(" Unused: %10lu\n", (u_long)ntohl(icmp->icmp_void));
sprintf(atr," Unused: %10lu\n", (u_long)ntohl(icmp->icmp_void));
strcat(arr,atr);
}
}
char* mac_ntoa(u_char *d){
static char str[50];
sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", d[0], d[1], d[2], d[3], d[4], d[5]);
return str;
}
char* ip_ttoa(int flag){
static int f[] = { '1','1','1','D','T','R','C','X' };
static char str[17];
u_int mask = 0x80;
int i;
for (i = 0; i < 8; i++) {
if(((flag << i) & mask) != 0) {
str[i] = f[i];
}
else {
str[i] = '0';
}
}
str[i] = '\0';
return str;
}
char* ip_ftoa(int flag) {
static int f[] = { 'R','D','M' };
static char str[17];
u_int mask = 0x8000;
int i;
for (i = 0; i < 3; i++) {
if (((flag << i) & mask) != 0) {
str[i] = f[i];
}
else {
str[i] = '0';
}
}
str[i] = '\0';
return str;
}
char* tcp_ftoa(int flag) {
static int f[] = { 'U','A','P','R','S','F' };
static char str[17];
u_int mask = 1 << 5;
int i;
for (i = 0; i < 6; i++) {
if (((flag << i) & mask) != 0) {
str[i] = f[i];
}
else {
str[i] = '0';
}
}
str[i] = '\0';
return str;
}
void rece_command(char *argv[]){
int g=1;
if(argv[g][0]=='-'&&argv[g][1]!='p'&&argv[g][1]!='i'&&argv[g]!=NULL){
while(argv[g]!=NULL){
if(argv[g][0]=='-'&&(argv[g][1]=='p'||argv[g][1]=='i'))
break;
int k=0;
while(argv[g][k]!='\0'){
switch (argv[g][k]){
case 'a':
Ser_Type.a=1;
break;
case 'e':
Ser_Type.e=1;
break;
case 'd':
Ser_Type.d=1;
break;
case 'h':
Ser_Type.h=1;
default:
break;
}
k++;
}
g++;
}
}
if(argv[g]==NULL)
return;
if(argv[g][0]=='-'&&argv[g][1]=='i'){
Ser_Type.interface=argv[g+1];
g+=2;
}
if(argv[g]==NULL)
return;
if(argv[g][0]=='-'&&argv[g][1]=='p'){
g++;
while(argv[g]!=NULL){
if(strcmp(argv[g],"arp")==0){
Ser_Type.arp=1;
}else{
if(strcmp(argv[g],"ip")==0){
Ser_Type.ip=1;
}else{
if(strcmp(argv[g],"tcp")==0){
Ser_Type.tcp=1;
}else{
if(strcmp(argv[g],"udp")==0){
Ser_Type.udp=1;
}else{
if(strcmp(argv[g],"icmp")==0){
Ser_Type.icmp=1;
}
}
}
}
}
g++;
}
}
}
char* my_strstr(char *s1, char *s2)
{ printf("tttttttttttttt");
if(s1==NULL)
return NULL;
/*
如果s2为NULL,则返回s1
*/
if(s2==NULL)
return (char*)s1;
while(*s1)
{
/*
保存每一次开始的位置,方便返回;
*/
char *ps1 = (char*)s1;
char *ps2 = (char*)s2;
while(*ps1&&*ps2&&(*ps1==*ps2))
{
ps1++;
ps2++;
}
if(*ps2=='\0')
return (char*)s1;
if(*ps1!='\0')//检测s2有没有完整的出现在s1中;
s1++;
}
return NULL;
}
更多推荐
已为社区贡献1条内容
所有评论(0)