⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wizspy.c

📁 Linux 上的socket嗅探器
💻 C
📖 第 1 页 / 共 5 页
字号:
    // ource ether addr
    sprintf(itemsg[4],"%02X%02X%02X%02X%02X%02X",
                ethhdr.h_source[0],ethhdr.h_source[1],ethhdr.h_source[2],
                ethhdr.h_source[3],ethhdr.h_source[4],ethhdr.h_source[5]);


    sprintf(itemsg[5],"[%d]",ethhdr.h_proto);
    for(freei=0;freei<MAX_ETHER_TYPE_NUM;freei++)
    {
        if(ethhdr.h_proto==eth_p_type[freei].type)
        {
             sprintf(itemsg[5],"%s [%d]",eth_p_type[freei].info,ethhdr.h_proto);
             break;
        }
    }

    if(areae_ethrownum>=200)
    {
        gtk_clist_remove(GTK_CLIST(spyareae_ethlist.ctrl),areae_ethrownum-1);
        areae_ethrownum=areae_ethrownum-1;
    }

    index=gtk_clist_insert(GTK_CLIST(spyareae_ethlist.ctrl),0,areae_ethlist_defaulttitle);
    for(freei=0;freei<6;freei++)
        gtk_clist_set_text(GTK_CLIST(spyareae_ethlist.ctrl),index,freei,(gchar *)itemsg[freei]);
    gtk_clist_set_row_data (GTK_CLIST(spyareae_ethlist.ctrl), index	,(gpointer)lpkt);
    areae_ethrownum++;

/*----------------------  add ip packet to list---------------------------*/
    if(lpkt->dlen<ETH_HLEN+20||ethhdr.h_proto!=ETH_P_IP)
        return ;

    BufGetIPhdr(&iphdr,(unsigned char *)(lpkt->data+ETH_HLEN));
    
    /* ID */
    sprintf(itemsg[0],"%ld",lpkt->ID);
    /* time */
    sprintf(itemsg[1],"%d-%02d-%02d %02d:%02d:%02d",
        lpkt->recvtm.year,lpkt->recvtm.month,lpkt->recvtm.day,
        lpkt->recvtm.hour,lpkt->recvtm.minute,lpkt->recvtm.second);
    /* Version  */     
    sprintf(itemsg[2],"%d",iphdr.version);

    /* Protocol */
    sprintf(itemsg[3],"%d",iphdr.protocol);
    for(freei=0;freei<MAX_IPPROTOCOL_NUM;freei++)
    {
       if(iphdr.protocol==ip_p_type[freei].type)
       {
            sprintf(itemsg[3],"%s",ip_p_type[freei].name);
            break;
       }
    }

    /* Source IP */
    sprintf(itemsg[4],"%d.%d.%d.%d",
        (int)((iphdr.sourceIP>>24)&0xFF),
        (int)((iphdr.sourceIP>>16)&0xFF),
        (int)((iphdr.sourceIP>>8)&0xFF),
        (int)((iphdr.sourceIP)&0xFF)
        );
     /* Dest IP */
     sprintf(itemsg[5],"%d.%d.%d.%d",
         (int)((iphdr.destIP>>24)&0xFF),
         (int)((iphdr.destIP>>16)&0xFF),
         (int)((iphdr.destIP>>8)&0xFF),
         (int)((iphdr.destIP)&0xFF)
         ); 
    
    /* IHL */
    sprintf(itemsg[6],"%d",iphdr.head_len*4);
    /* Type of service */
    sprintf(itemsg[7],"%d",iphdr.tos);
    /* Total Length */
    sprintf(itemsg[8],"%d",iphdr.packet_len);
    /* Identification */
    sprintf(itemsg[9],"%d",iphdr.ip_id);

    /* fragment offset field */
    sprintf(itemsg[10],"%d", iphdr.frag_off);
    /* Time to Live */
    sprintf(itemsg[11],"%d",iphdr.ttl);
    /* Header Checksum */
    sprintf(itemsg[12],"%d",iphdr.checksum);


    if(areae_iprownum>=200)
    {
        gtk_clist_remove(GTK_CLIST(spyareae_iplist.ctrl),areae_iprownum-1);
        areae_iprownum=areae_iprownum-1;
    }

    index=gtk_clist_insert(GTK_CLIST(spyareae_iplist.ctrl),0,areae_iplist_defaulttitle);
    gtk_clist_set_row_data (GTK_CLIST(spyareae_iplist.ctrl), index	,(gpointer)lpkt);

    for(freei=0;freei<13;freei++)
        gtk_clist_set_text(GTK_CLIST(spyareae_iplist.ctrl),index,freei,(gchar *)itemsg[freei]);
    areae_iprownum++;
         
}


/*   set packet receive option   */

#include <stdarg.h>

void wizspy_DlgOnDebugMessage( char *pszMsg, ... )
{
    static gulong count=0;
    static char pszErr[ 1024 ];
    char *msgstart=NULL;
    sprintf(pszErr,"%06ld:",++count);
    msgstart=pszErr+strlen(pszErr); 
    va_list args;
    va_start( args, pszMsg );
    vsprintf( msgstart, pszMsg, args );  pszErr[ 1023 ] = '\0';
    va_end( args );
    if(count%120==0)
        wizspy_areaa_settext(pszErr);
    else
        wizspy_areaa_addtext(pszErr);
    uWait(50);
}


gint wiz_spy_checkpacket(SPYLIST * lpkt)
{
    static ETHHDR ethhdr;
    static IPHDR iphdr; 
    gint freei,found;
    
    // check ether type
    found=0;
    memset(&ethhdr,0,sizeof(ETHHDR));    
    BufGetETHhdr(&ethhdr,(unsigned char *)(lpkt->data));
    for(freei=0;freei<MAX_ETHER_TYPE_NUM;freei++)
    {
        if(ether_packettype_used[freei].itemdata==ethhdr.h_proto
            &&ether_packettype_used[freei].itemname[0]!=0)
        {
            found = freei+1;
            break;
        }
    }

    if(!found)return 0;
    else if(ethhdr.h_proto!=ETH_P_IP)
        return found;
    // check ip protocal
    found=0;
    memset(&iphdr,0,sizeof(IPHDR));
    BufGetIPhdr(&iphdr,(unsigned char *)(lpkt->data+ETH_HLEN));

    for(freei=0;freei<MAX_IPPROTOCOL_NUM;freei++)
    {
        if(iptype_used[freei].itemdata==iphdr.protocol
            &&iptype_used[freei].itemname[0]!=0)
        {
            found = freei+1;
            break;
        }
    }
    if(!found)return 0;

    // check source ip
    found=0;
    for(freei=0;freei<MAX_NOUSEIPNUM;freei++)
    {
        if(wizspy_areab4_srcip[freei].itemdata==iphdr.sourceIP
            &&wizspy_areab4_srcip[freei].itemname[0]!=0)
        {
            found = freei+1;
            break;
        }
    }
    
    if(ifsrcenableall)
        found=!found;
    if(!found)return 0;

    // check dest ip
    found=0;
    for(freei=0;freei<MAX_NOUSEIPNUM;freei++)
    {
        if(wizspy_areab4_destip[freei].itemdata==iphdr.destIP
            &&wizspy_areab4_destip[freei].itemname[0]!=0)
        {
            found = freei+1;
            break;
        }
    }
    if(ifdestenableall)
        found=!found;
    if(!found)return 0;
    
    return found;
}


int wizspy_DlgOnDelPacket(SPYLIST * lpkt)
{
    /* del packet from area E */
    if(lpkt!=NULL)
    {
        int row=0;
        row=gtk_clist_find_row_from_data (GTK_CLIST(spyareae_ethlist.ctrl),(gpointer)lpkt);
        if(row>=0)
            gtk_clist_remove(GTK_CLIST(spyareae_ethlist.ctrl),row);
         row=gtk_clist_find_row_from_data (GTK_CLIST(spyareae_iplist.ctrl),(gpointer)lpkt);
        if(row>=0)
            gtk_clist_remove(GTK_CLIST(spyareae_iplist.ctrl),row);

    }


    uWait(50);
    return 1;
}

int wizspy_DlgOnGetPacket(SPYLIST * lpkt)
{
     /* add this packet to area E */        
     if(lpkt!=NULL&&lpkt->dlen>=ETH_HLEN)
     {         
         if(wiz_spy_checkpacket(lpkt))
         {
              wizspy_DlgOnDebugMessage("Receive data..");
              wizspy_areae_addpacket(lpkt);
         }
     }

    uWait(50);
    return 1;
}


/*           main    dialogs       */
void wizspy_dialog_destroy( GtkWidget *window, gpointer fundata)
{
    /* we must close spy, and free all memmory alloced */

    SpySetState(SPY_CLOSE);   
}

GtkWidget* get_wizspy_dialog( GtkWidget *window)
{
    GtkWidget *areaA, *areaC, *areaD, *areaE;
    GtkWidget *span_ha, *span_hb, *span_va, *frame;
    gint freei;
    /*   --------- init setting data ------------ */
    memset(ether_packettype_used,0,sizeof(GtkListBoxItemData)*MAX_ETHER_TYPE_NUM);
    memset(ether_packettype_unused,0,sizeof(GtkListBoxItemData)*MAX_ETHER_TYPE_NUM); 
    memset(iptype_used,0,sizeof(GtkListBoxItemData)*MAX_IPPROTOCOL_NUM);
    memset(iptype_unused,0,sizeof(GtkListBoxItemData)*MAX_IPPROTOCOL_NUM);     
    memset(wizspy_areab4_srcip,0,sizeof(GtkListBoxItemData)*MAX_NOUSEIPNUM);
    memset(wizspy_areab4_destip,0,sizeof(GtkListBoxItemData)*MAX_NOUSEIPNUM);                                                  
    ifsrcenableall=0;
    ifdestenableall=0;
    // ethtype
    for(freei=0;freei<MAX_ETHER_TYPE_NUM;freei++)
    {
        ether_packettype_unused[freei].itemdata=eth_p_type[freei].type;
        strcpy(ether_packettype_unused[freei].itemname,eth_p_type[freei].name);
    }
    // ip protocal
    for(freei=0;freei<MAX_IPPROTOCOL_NUM;freei++)
    {
        iptype_unused[freei].itemdata=ip_p_type[freei].type;
        strcpy(iptype_unused[freei].itemname,ip_p_type[freei].name);
    }     

// ip address invald
    
/*             init setting end              */

    
/*
   va          span_va    return
   |+ha        span_ha
   | |-A       area A,    message list [text area]
   | |-E       area E,    packet list, [clist]
   |+hb        span_hb
     |-C       area C,    packet tree, [tree view]
     |-D       area D,    frame show,  [draw area]      
*/

    /* create and link span */
    span_va = gtk_vpaned_new ();
    span_ha = gtk_hpaned_new ();
    span_hb = gtk_hpaned_new ();

    gtk_paned_add1 (GTK_PANED (span_va), span_ha);
    gtk_paned_add2 (GTK_PANED (span_va), span_hb);
    /* span_ha.1 = area A */
    areaA= textarea_createlist(NULL,&spytext_areaa);
    gtk_widget_set_size_request (GTK_WIDGET (areaA), 300, 240);
    frame=gtk_frame_new("Message log:");
    gtk_container_add (GTK_CONTAINER (frame), areaA);
    gtk_paned_add1 (GTK_PANED (span_ha), frame);
    /* span_vb.1 = area E */
    areaE= wizspy_areae_create(NULL);
    gtk_widget_set_size_request (GTK_WIDGET (areaE), 500, 240);
    frame=gtk_frame_new("Packet list:");
    gtk_container_add (GTK_CONTAINER (frame), areaE);
    gtk_paned_add2 (GTK_PANED (span_ha), frame);
    /* span_hb.1 = area C */
    areaC= wizspy_areac_create(NULL);
    gtk_widget_set_size_request (GTK_WIDGET (areaC), 300, 240);
    frame=gtk_frame_new("Packet content tree:");
    gtk_container_add (GTK_CONTAINER (frame), areaC);
    gtk_paned_add1 (GTK_PANED (span_hb), frame);
    /* span_hb.2 = area D */
    areaD= wizspy_aread_create(NULL);
    gtk_widget_set_size_request (GTK_WIDGET (areaD), 500, 240);
    frame=gtk_frame_new("Packet data :");
    gtk_container_add (GTK_CONTAINER (frame), areaD);
    gtk_paned_add2 (GTK_PANED (span_hb), frame);

    if(window!=NULL)
    {
        gtk_container_add (GTK_CONTAINER (window), span_va);
        gtk_widget_show (span_va);
    }

    /* Here we connect the "destroy" event to a signal handler */
    g_signal_connect (G_OBJECT (span_va), "destroy", G_CALLBACK (wizspy_dialog_destroy), NULL);
                                 
    SpySetFunction(wizspy_DlgOnGetPacket,wizspy_DlgOnDelPacket,wizspy_DlgOnDebugMessage);
    

    return span_va;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -