Logo Search packages:      
Sourcecode: nast version File versions  Download package

n_menu.c

/*
    nast

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

*/

#include "n_nast.h"

#ifdef HAVE_LIBNCURSES

# define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
# define CTRLD    4

void *n_sniff(void *threadid);
void *t_arp(void *threadarg);
int check_filter(char *filt);
int s_select(void);
int r_select(void);

int sport,dport;
u_long ip_src, ip_dst;
libnet_t *L = NULL;
libnet_plist_t plist, *plist_p;

static u_short ports[] =
{
   21, 22, 23, 25, 43, 53, 79, 80, 110, 119, 143, 220, 513, 514
};

char *choices[] =
{
   "  (S)niffer  ",
     "  (A)nalyzer  ",
     "  (O)ptions  ",
     (char *)NULL,
};

char *sniffer[] =
{
   "Start Sniff            ",
     "Stop Sniff             ",
     "Filter                 ",
     "Promisc                ",
     "ASCII                  ",
     "HEX                    ",
     "Log Payload            ",
     "Log TCPDUMP format     ",
     "Read TCPDUMP File      ",
     "Log all packets        ",
     (char *)NULL,
};

char *analyzer[] =
{
   "Check Sniffers          ",
     "Hosts List              ",
     "TCP Stream              ",
     "Find Gateway            ",
     "Reset Connection        ",
     "Port Scanner            ",
     "Multi Port Scanner      ",
     "Find Link               ",
     "Daemon Banner           ",
     "Check ARP Poinsoning    ",
     "Byte Counting           ",
     (char *)NULL,
};

char *options[] =
{
   "Interface        ",
     "Log Report       ",
     "Daemonize        ",
     "Stop Application ",
     "Version          ",
     "Help             ",
     "Exit             ",
     (char *)NULL,
};

void nmenu()
{
   ITEM **my_items;
   int ris;
   int n_choices, i;

   ris = 0;

   n_choices = ARRAY_SIZE(choices);
   my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
   for(i = 0; i < n_choices; ++i)
     my_items[i] = new_item(choices[i], choices[i]);

   my_nmenu = new_menu((ITEM **)my_items);

   my_nmenu_win = newwin(3,COLS, 3, 0);
   keypad(my_nmenu_win, TRUE);
   wbkgd(my_nmenu_win,COLOR_PAIR(5));

   if(flg==0)
     {
      menu_opts_on(my_nmenu, O_SHOWDESC);
      mvwprintw(my_nmenu_win,1,1,"   (S)niffer       (A)nalyzer      (O)ptions");
     }
   else menu_opts_off(my_nmenu, O_SHOWDESC);
   mvwprintw(my_nmenu_win,1,COLS-8,"(F1)");

   set_menu_win(my_nmenu, my_nmenu_win);
   set_menu_sub(my_nmenu, derwin(my_nmenu_win, 2, COLS-2, 1, 1));

   if(flg==1)
     set_menu_format(my_nmenu, 1, 3);
   set_menu_mark(my_nmenu, " ");

   wcolor_set(my_nmenu_win,3,NULL);
   box(my_nmenu_win, 0, 0);

   post_menu(my_nmenu);
   wrefresh(my_nmenu_win);

}

int sniffer_menu()
{
   ITEM **my_items;
   int c, ris;
   MENU *my_menu;
   WINDOW *my_menu_win;
   int n_choices, i, y;

   y = 1;
   ris = 0;
   mvar = 1;
      /* Create items */
   n_choices = ARRAY_SIZE(sniffer);
   my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
   for(i = 0; i < n_choices; ++i)
     my_items[i] = new_item(sniffer[i], sniffer[i]);

      /* Crate menu */

   my_menu = new_menu((ITEM **)my_items);

      /* Set menu option not to show the description */
   menu_opts_off(my_menu, O_SHOWDESC);

      /* Create the window to be associated with the menu */
   my_menu_win = newwin(12, 27, 5, 0);
   keypad(my_menu_win, TRUE);
   wbkgd(my_menu_win,COLOR_PAIR(3));

   set_menu_win(my_menu, my_menu_win);
   set_menu_sub(my_menu, derwin(my_menu_win, 11, 25, 1, 1));
   set_menu_mark(my_menu, " ");
   box(my_menu_win, 0, 0);

   post_menu(my_menu);
   wrefresh(my_menu_win);

   while( (c = wgetch(my_menu_win)) != 'q')
     {       switch(c)
       {
      case KEY_UP:
        y--;
        if (!y)
          {
             menu_driver(my_menu, REQ_LAST_ITEM);
             y=10;
          }
        else
          menu_driver(my_menu, REQ_UP_ITEM);
        break;
      case KEY_DOWN:
        y++;
        if(y==11)
          {
             menu_driver(my_menu, REQ_FIRST_ITEM);
             y=1;
          }
        else
          menu_driver(my_menu, REQ_DOWN_ITEM);
        break;
      case KEY_LEFT:
        unpost_menu(my_menu);
        free_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
          free_item(my_items[i]);
        werase(my_menu_win);
        wrefresh(my_menu_win);
        return(-2);
        break;
      case KEY_RIGHT:
        unpost_menu(my_menu);
        free_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
          free_item(my_items[i]);
        werase(my_menu_win);
        wrefresh(my_menu_win);
        return(-1);
        break;
      case 10:
        curr_item = current_item(my_menu);
        switch(item_index(curr_item))
          {
           case 0:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             sniff_glob = 1;
             pthread_create( &thID[1], NULL, n_sniff , NULL);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;
           case 1:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             sniff_glob = 0;
             lg = 0;
             pthread_cancel (thID[1]);
             pthread_join (thID[1], NULL);
             winscroll(princ, -10000);
             werase(princ->win);
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             promisc = 1;
             //ascii = hex = f = l = tl = tr = 0;
             return(0);
             break;
           case 2:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert filter to apply (NULL takes no effects):");
             mvwprintw(pop_up,3,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,5,2);
             echo();
             wgetnstr(pop_up, n_filter, 60);
             noecho();
             if(strcmp(n_filter, "NULL"))
             (f=1);
             else
             {
                (f=0);
                strcpy(n_filter,"NULL");
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;
           case 3:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Do you want to set Promisc Mode (y/n)?");
             mvwprintw(pop_up,3,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,5,2);
             do
             {
                ris=wgetch(pop_up);
                if (ris == 'y')
                  promisc=1;

                else if (ris == 'n')
                  promisc=0;

             }
             while( ris != 'y' && ris != 'n');
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;

           case 4:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Do you want to set ASCII data printing (y/n)?");
             mvwprintw(pop_up,3,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,5,2);
             do
             {
                ris=wgetch(pop_up);
                if (ris == 'y')
                  ascii=1;

                else if (ris == 'n')
                  ascii=0;

             }
             while( ris != 'y' && ris != 'n');
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;

           case 5:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Do you want to set ASCII-HEX data printing (y/n)?");
             mvwprintw(pop_up,3,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,5,2);
             do
             {
                ris=wgetch(pop_up);
                if (ris == 'y')
                  hex=1;

                else if (ris == 'n')
                  hex=0;

             }
             while( ris != 'y' && ris != 'n');
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;

           case 6:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert name file for data logging");
             mvwprintw(pop_up,3,2,"(NULL takes no effects):");
             mvwprintw(pop_up,4,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,6,2);
             echo();
             wgetnstr(pop_up, ldfile, 50);
             noecho();
             if (strcmp (ldfile, "NULL")) /* != NULL */
             (ld=1);
             else
             {
                (ld=0);
                strcpy(ldfile,"NULL");
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;

           case 7:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert name file for packets logging");
             mvwprintw(pop_up,3,2,"in tcpdump format (NULL takes no effects):");
             mvwprintw(pop_up,4,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,6,2);
             echo();
             wgetnstr(pop_up, tcpdfile, 50);
             noecho();
             if (strcmp (tcpdfile, "NULL"))
             {
                /* != NULL */
                (tl=1);
                tcpdl=tcpdfile;
             }
             else
             {
                (tl=0);
                strcpy(tcpdfile,"NULL");
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;

           case 8:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert name file for packets reading");
             mvwprintw(pop_up,3,2,"in tcpdump format (NULL takes no effects):");
             mvwprintw(pop_up,4,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,6,2);
             echo();
             wgetnstr(pop_up, tcpdfile, 50);
             noecho();
             if (strcmp (tcpdfile, "NULL"))
             {
                /* != NULL */
                (tr=1);
                tcpdl=tcpdfile;
                if(check_pthread() == 1)
                  return(0);
                  sniff_glob = 1;
                  pthread_create( &thID[1], NULL, n_sniff , NULL);
                  delwin(pop_up);
                redrawscrollwin(princ,0);
                mvar = 0;
                  return(0);
             }
             else
             {
                (tr=0);
                strcpy(tcpdfile,"NULL");
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;

           case 9:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert name file for packets logging");
             mvwprintw(pop_up,3,2,"(NULL takes no effects):");
             mvwprintw(pop_up,4,2,"Remember to restart sniffer to take option working!");
             wmove(pop_up,6,2);
             echo();
             wgetnstr(pop_up, logfile, 50);
             noecho();
             if (strcmp (logfile, "NULL")) /* != NULL */
             {
                (l=1);
                logname = logfile;
                lg = 1;
             }
             else
             {
                (l=0);
                strcpy(logfile,"NULL");
                lg = 0;
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             mvar = 0;
             return(0);
             break;
          }

        break;

       }

      wrefresh(my_menu_win);

     }

      /* Unpost and free all the memory taken up */
   unpost_menu(my_menu);
   free_menu(my_menu);
   for(i = 0; i < n_choices; ++i)
     free_item(my_items[i]);
   werase(my_menu_win);
   wrefresh(my_menu_win);
   mvar = 0;
   return(0);
}

int analyzer_menu()
{

   ITEM **my_items;
   int c;
   MENU *my_menu;
   WINDOW *my_menu_win;
   int n_choices, i, y;
   char errbuf[PCAP_ERRBUF_SIZE];
   char arg[30];
   char buff[50];
   u_long anip;

   y = 1;
   anip = 0;
   mvar = 1;
   L = libnet_init (LIBNET_LINK, NULL, errbuf);
      /* Create items */
   n_choices = ARRAY_SIZE(analyzer);
   my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
   for(i = 0; i < n_choices; ++i)
     my_items[i] = new_item(analyzer[i], analyzer[i]);

      /* Crate menu */

   my_menu = new_menu((ITEM **)my_items);

      /* Set menu option not to show the description */
   menu_opts_off(my_menu, O_SHOWDESC);

      /* Create the window to be associated with the menu */
   my_menu_win = newwin(13, 28, 5, 15);
   keypad(my_menu_win, TRUE);
   wbkgd(my_menu_win,COLOR_PAIR(3));

   set_menu_win(my_menu, my_menu_win);
   set_menu_sub(my_menu, derwin(my_menu_win, 12, 26, 1, 1));
   set_menu_mark(my_menu, " ");
   box(my_menu_win, 0, 0);

   post_menu(my_menu);
   wrefresh(my_menu_win);

   while((c = wgetch(my_menu_win)) != 'q')
     {       switch(c)
       {
      case KEY_UP:
        y--;
        if (!y)
          {
             menu_driver(my_menu, REQ_LAST_ITEM);
             y=11;
          }
        else
          menu_driver(my_menu, REQ_UP_ITEM);
        break;
      case KEY_DOWN:
        y++;
        if (y==12)
          {
             menu_driver(my_menu, REQ_FIRST_ITEM);
             y=1;
          }
        else
          menu_driver(my_menu, REQ_DOWN_ITEM);
        break;
      case KEY_LEFT:
        unpost_menu(my_menu);
        free_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
          free_item(my_items[i]);
        werase(my_menu_win);
        wrefresh(my_menu_win);
        return(-2);
        break;
      case KEY_RIGHT:
        unpost_menu(my_menu);
        free_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
          free_item(my_items[i]);
        werase(my_menu_win);
        wrefresh(my_menu_win);
        return(-1);
        break;
      case 10:    /* Enter */
        curr_item = current_item(my_menu);
        switch(item_index(curr_item))
          {
           case 0:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             pop_up_win();
             mvwprintw(pop_up,2,15,"Promisc check");
             mvwprintw(pop_up,3,2,"Insert IP to scan or \"all\" for all nodes");
             wmove(pop_up,5,2);
             echo();
             wgetnstr(pop_up, arg, 50);
             noecho();
             if (strcmp (arg, "all"))
             {
                anip = libnet_name2addr4(L, arg, LIBNET_RESOLVE);
                if (anip==-1)
                  {
                   libnet_destroy(L);
                   if(w_error(0, "Error: cannot resolve %s\n\n", optarg) == -1)
                     return(0);
                  }
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             psearch (dev, anip, lr);
             return(0);
             break;

           case 1:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             map_lan(dev, 1, NULL);
             return(0);
             break;

           case 2:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             sport = dport = 0;
             pop_up_win();

             mvwprintw(pop_up,2,2,"Insert Src IP: (NULL will takes no effects)");
             wmove(pop_up,3,2);
             echo();
             wgetnstr(pop_up, buff, 50);
             noecho();
             if (!strcmp(buff,"NULL"))
             {
                delwin(pop_up);
                redrawscrollwin(princ,0);
                return(0);
             }

             if ((ip_src = libnet_name2addr4(L, dn (buff), LIBNET_RESOLVE))==-1)
             {
                w_error(0, "Error: %s", libnet_geterror(L));
                redrawscrollwin(princ,0);
                return(0);
             }
             
             mvwprintw(pop_up,5,2,"Insert Dst IP: (NULL will takes no effects)");
             wmove(pop_up,6,2);
             echo();
             wgetnstr(pop_up, buff, 50);
             noecho();

             if (!strcmp(buff,"NULL"))
             {
                delwin(pop_up);
                redrawscrollwin(princ,0);
                return(0);
             }

             if ((ip_dst = libnet_name2addr4(L, dn (buff), LIBNET_RESOLVE))==-1)
             {
                w_error(0, "Error: %s", libnet_geterror(L));
                redrawscrollwin(princ,0);
                return 0;
             }

             delwin(pop_up);
             redrawscrollwin(princ,0);
             nmenu();

             memset(&th_data[0], 0, sizeof(th_data[0]));
            /*passing thread data*/
             th_data[0].ip_src=ip_src;
             th_data[0].ip_dst=ip_dst;
             th_data[0].sport=0;
             th_data[0].dport=0;
             strcpy(th_data[0].device,dev);
             stream_glob = 1;
             pthread_create(&thID[3], NULL, conn_db ,(void *) &th_data[0]);
             libnet_destroy(L);
             s_select();
             return(0);
             break;

           case 3:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             fgw (dev);
             return(0);
             break;

           case 4:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             sport = dport = 0;
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert Src IP: (NULL will takes no effects)");
             wmove(pop_up,3,2);
             echo();
             wgetnstr(pop_up, buff, 50);
             noecho();
             if (!strcmp(buff,"NULL"))
             {
                delwin(pop_up);
                redrawscrollwin(princ,0);
                return(0);
             }

             if ((ip_src=libnet_name2addr4(L, dn (buff), LIBNET_RESOLVE))==-1)
             {
                w_error(0, "Error: %s", libnet_geterror(L));
                redrawscrollwin(princ,0);
                return 0;
             }

             mvwprintw(pop_up,5,2,"Insert Dst IP: (NULL will takes no effects)");
             wmove(pop_up,6,2);
             echo();
             wgetnstr(pop_up, buff, 50);
             noecho();

             if (!strcmp(buff,"NULL"))
             {
                delwin(pop_up);
                redrawscrollwin(princ,0);
                return(0);
             }

             if ((ip_dst=libnet_name2addr4(L, dn (buff), LIBNET_RESOLVE))==-1)
             {
                w_error(0, "Error: %s", libnet_geterror(L));
                redrawscrollwin(princ,0);
                return 0;
             }

             memset(&th_r_data[0], 0, sizeof(th_r_data[0]));
            /*passing thread data*/
             th_r_data[0].ip_src=ip_src;
             th_r_data[0].ip_dst=ip_dst;
             th_r_data[0].sport=0;
             th_r_data[0].dport=0;
             strcpy(th_r_data[0].device,dev);
             rst_glob = 1;
             pthread_create( &thID[2], NULL, conn_db_r ,(void *) &th_r_data[0]);
             libnet_destroy(L);
             nmenu();
             r_select();
             return(0);
             break;

           case 5:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             pop_up_win();
             mvwprintw(pop_up,2,18,"- Port Scanner -");
             mvwprintw(pop_up,4,2,"Insert IP to scan (NULL will take no effect):");
             wmove(pop_up,5,2);
             echo();
             wgetnstr(pop_up, buff, 50);
             noecho();
             if (!strcmp(buff,"NULL"))
             {
                delwin(pop_up);
                redrawscrollwin(princ,0);
                return(0);
             }

             if ((ip_dst = libnet_name2addr4(L, dn (buff), LIBNET_RESOLVE))==-1)
             {
                w_error(1, "Error: %s", libnet_geterror(L));
             }

             do
             {
                mvwprintw(pop_up,7,2,"Insert Port range: ");
                wmove(pop_up,8,2);
                echo();
                wgetnstr(pop_up, buff, 50);
                noecho();
             }
             while (atoi(buff) < 1 || atoi(buff) > 65536);
             plist_p = &plist;
             if (libnet_plist_chain_new(L, &plist_p, buff) == -1)
             {
                if(w_error(0, "Bad token in port list: %s\n",libnet_geterror(L))==-1)
                  return(0);
             }
             delwin(pop_up);
             nmenu();
             redrawscrollwin(princ,0);
             port(dev,ip_dst,plist_p,lr);
             return(0);
             break;

           case 6:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             pop_up_win();
             mvwprintw(pop_up,2,18,"- MULTI Port Scanner -");
             mvwprintw(pop_up,4,2,"Insert IP to scan (NULL will take no effect):");
             do
             {
                mvwprintw(pop_up,5,2,"Insert Port range: ");
                wmove(pop_up,8,2);
                echo();
                wgetnstr(pop_up, buff, 50);
                noecho();
             }
             while (atoi(buff) < 1 || atoi(buff) > 65536);
             plist_p = &plist;
             if (libnet_plist_chain_new(L, &plist_p, buff) == -1)
             {
                if(w_error(0, "Bad token in port list: %s\n",libnet_geterror(L))==-1)
                  return(0);
             }
             delwin(pop_up);
             nmenu();
             redrawscrollwin(princ,0);
             mhport (dev,plist_p,lr);
             return(0);
             break;

           case 7:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             flink(dev);
             return(0);
             break;

           case 8:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             mport(dev,ports,lr);
             return(0);
             break;

           case 9:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             memset(&th_arp_data[0], 0, sizeof(th_arp_data[0]));
            /*passing thread data*/
             th_arp_data[0].lr=lr;
             strcpy(th_arp_data[0].device,dev);
             arp_glob = 1;
             pthread_create( &thID[6], NULL, t_arp ,(void *) &th_arp_data[0]);
             return(0);
             break;

           case 10:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert filter to apply");
             mvwprintw(pop_up,3,2,"(null or 'any' to disable):");
             wmove(pop_up,5,2);
             echo();
             wgetnstr(pop_up, buff, 50);
             noecho();
             delwin(pop_up);
             redrawscrollwin(princ,0);
             bc_glob = 1;
             run_bc(dev,buff);
             mvar = 0;
             return(0);
             break;

          }

        break;

       }

      wrefresh(my_menu_win);

     }

      /* Unpost and free all the memory taken up */
   unpost_menu(my_menu);
   free_menu(my_menu);
   for(i = 0; i < n_choices; ++i)
     free_item(my_items[i]);
   werase(my_menu_win);
   wrefresh(my_menu_win);
   return(0);
}

int options_menu()
{

   ITEM **my_items;
   int c,ris;
   MENU *my_menu;
   WINDOW *my_menu_win;
   int n_choices, i, ok, y;
   char errbuf[PCAP_ERRBUF_SIZE];
   char temp[10];

   ris = ok = 0;
   mvar = y = 1;

      /* Create items */
   n_choices = ARRAY_SIZE(options);
   my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));
   for(i = 0; i < n_choices; ++i)
     my_items[i] = new_item(options[i], options[i]);

      /* Crate menu */

   my_menu = new_menu((ITEM **)my_items);

      /* Set menu option not to show the description */
   menu_opts_off(my_menu, O_SHOWDESC);

      /* Create the window to be associated with the menu */
   my_menu_win = newwin(9, 21, 5, 31);
   keypad(my_menu_win, TRUE);
   wbkgd(my_menu_win,COLOR_PAIR(3));

   set_menu_win(my_menu, my_menu_win);
   set_menu_sub(my_menu, derwin(my_menu_win, 8, 19, 1, 1));
   set_menu_mark(my_menu, " ");
   box(my_menu_win, 0, 0);

   post_menu(my_menu);
   wrefresh(my_menu_win);

   while((c = wgetch(my_menu_win)) != 'q')
     {       switch(c)
       {
      case KEY_UP:
        y--;
        if (!y)
          {
             menu_driver(my_menu, REQ_LAST_ITEM);
             y=7;
          }
        else
          menu_driver(my_menu, REQ_UP_ITEM);
        break;
      case KEY_DOWN:
        y++;
        if (y==8)
          {
             menu_driver(my_menu, REQ_FIRST_ITEM);
             y=1;
          }
        else
          menu_driver(my_menu, REQ_DOWN_ITEM);
        break;
      case KEY_LEFT:
        unpost_menu(my_menu);
        free_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
          free_item(my_items[i]);
        werase(my_menu_win);
        wrefresh(my_menu_win);
        return(-1);
        break;
      case KEY_RIGHT:
        unpost_menu(my_menu);
        free_menu(my_menu);
        for(i = 0; i < n_choices; ++i)
          free_item(my_items[i]);
        werase(my_menu_win);
        wrefresh(my_menu_win);
        return(-2);
        break;
      case 10:    /* Enter */
        curr_item = current_item(my_menu);
        switch(item_index(curr_item))
          {
           case 0:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             while(!ok)
             {
                pop_up_win();
                mvwprintw(pop_up,6,5,"Insert the device you want to use, please:");
                mvwprintw(pop_up,7,5,"   for the default <%s> press enter!",dev);
                wmove(pop_up,9,23);
                echo();
                wgetnstr(pop_up, temp, 10);
                if(!strcmp(temp,""))
                  strcpy(temp,dev);
                noecho();
                if ((pcap_lookupnet(temp,&netp,&maskp,errbuf))==-1)
                  {
                   w_error(0, "          Impossible to use device: %s",temp);
                  }
                else
                  {
                   ok = 1;
                   strcpy(dev,temp);
                  }
             }

             delwin(pop_up);
             redrawscrollwin(princ,0);
             return(0);
             break;

           case 1:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,2,2,"Insert name file for report logging");
             mvwprintw(pop_up,3,2,"(NULL takes no effects):");
             wmove(pop_up,5,2);
             echo();
             wgetnstr(pop_up, reportl, 50);
             noecho();
             if (strcmp (reportl, "NULL")) /* != NULL */
             {
                (lr=1);
                logname=reportl;
             }
             else
             {
                (lr=0);
                strcpy(reportl,"NULL");
             }
             delwin(pop_up);
             redrawscrollwin(princ,0);
             return(0);
             break;

           case 2:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             if(check_pthread() == 1)
             return(0);
             pop_up_win();
             /*mvwprintw(pop_up,2,2,"Do you want to demonize process (y/n)?");
             wmove(pop_up,4,2);
             do
             {
                ris=wgetch(pop_up);
                if (ris == 'y')
                  demonize=1;

                else if (ris == 'n')
                  demonize=0;

             }
             while( ris != 'y' && ris != 'n');*/
             mvwprintw(pop_up,6,18, "Not yet implemented!");
             mvwprintw(pop_up,12,19,"Press 'q' to quit");
             do
             {
                ris=wgetch(pop_up);

             }
             while( ris != 'q');
             wrefresh(pop_up);
             delwin(pop_up);
             redrawscrollwin(princ,0);
             return(0);
             break;

           case 3:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             shutdown_thread();
             return(0);
             break;

           case 4:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,5,9, "NAST - Network Analyzer Sniffer Tool");
             mvwprintw(pop_up,7,11, "Version %s (C) Embyte & Snifth", PACKAGE_VERSION);
             mvwprintw(pop_up,9,18,"Press 'q' to quit");
             do
             {
                ris=wgetch(pop_up);

             }
             while( ris != 'q');
             wrefresh(pop_up);
             return(0);
             break;

           case 5:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             help_win();
             attron(A_BOLD);
             mvwprintw(help,2,2,"[F1]          -> Menu Selection");
             mvwprintw(help,3,2,"[F2]          -> Main window interactions");
             mvwprintw(help,4,2,"[F3]          -> Info window interactions");
             mvwprintw(help,5,2,"[UP]          -> Scrolling UP windows (1 line)");
             mvwprintw(help,6,2,"[DOWN]        -> Scrolling DOWN windows (1 line)");
             mvwprintw(help,7,2,"[PgUP]        -> Scrolling UP windows (5 lines)");
             mvwprintw(help,8,2,"[PgDOWN]      -> Scrolling DOWN windows (5 lines)");
             mvwprintw(help,9,2,"[Shift + s]   -> Sniffer Menu");
             mvwprintw(help,10,2,"[Shift + a]   -> Analyzer Menu");
             mvwprintw(help,11,2,"[Shift + o]   -> Options Menu");
             mvwprintw(help,12,2,"[i]           -> Show informations about options");
             mvwprintw(help,13,2,"[x]           -> Erase Main Window");
             mvwprintw(help,14,2,"[d]           -> Erase Info window");
             mvwprintw(help,15,2,"[h]           -> This help");
             mvwprintw(help,16,2,"[q]           -> Exit all windows");
             mvwprintw(help,17,2,"When you use the sniffer pay attention that the");
             mvwprintw(help,18,2,"options MUST be selected BEFORE sniffer starting!");
             mvwprintw(help,20,2,"[Shift + q]   -> Exit NAST");
             attroff(A_BOLD);
             do
             {
                ris=wgetch(help);

             }
             while( ris != 'q');
             wrefresh(help);
             werase(help);
             nmenu();
             redrawscrollwin(princ,0);
             redrawscrollwin(winfo,0);
             return(0);
             break;

           case 6:
             unpost_menu(my_menu);
             free_menu(my_menu);
             for(i = 0; i < n_choices; ++i)
             free_item(my_items[i]);
             werase(my_menu_win);
             wrefresh(my_menu_win);
             box(my_nmenu_win, 0, 0);
             wrefresh(my_nmenu_win);
             redrawscrollwin(princ,0);
             refresh();
             pop_up_win();
             mvwprintw(pop_up,7,10,"Are you sure you want to exit (y/n)?");
             wmove(pop_up,4,2);
             do
             {
                ris=wgetch(pop_up);
                if (ris == 'y')
                  {
                   init_scr();
                   shutdown_thread();
                   endwin();
                   exit(0);
                  }

                else if (ris == 'n');
             }
             while( ris != 'y' && ris != 'n');
             delwin(pop_up);
             redrawscrollwin(princ,0);
             return(0);
             break;
          }
        break;

       }

      wrefresh(my_menu_win);

     }

      /* Unpost and free all the memory taken up */
   unpost_menu(my_menu);
   free_menu(my_menu);
   for(i = 0; i < n_choices; ++i)
     free_item(my_items[i]);
   werase(my_menu_win);
   wrefresh(my_menu_win);
   return (0);
}

void *n_sniff(void *threadid)
{
   init_scr();
   line_s = row_s = 0;
   run_sniffer (promisc, ascii, hex, f, l, tl, tr, n_filter, dev, ldfile);
   pthread_exit(NULL);
}

void *conn_db(void *threadarg)
{
   char device[30];
   u_long ip_src;
   u_long ip_dst;
   u_short sport;
   u_short dport;

   struct thread_conn *th_conn;

   th_conn = (struct thread_conn *) threadarg;

   ip_src  = th_conn->ip_src;
   ip_dst  = th_conn->ip_dst;
   sport   = th_conn->sport;
   dport   = th_conn->dport;

   strcpy(device,th_conn->device);

   connection(device,ip_src,ip_dst,sport,dport);
   pthread_exit(NULL);
}

void *conn_db_r(void *threadarg)
{
   char device[30];
   u_long ip_src;
   u_long ip_dst;
   u_short sport;
   u_short dport;

   struct thread_conn_rst *th_conn;

   th_conn = (struct thread_conn_rst *) threadarg;

   ip_src  = th_conn->ip_src;
   ip_dst  = th_conn->ip_dst;
   sport   = th_conn->sport;
   dport   = th_conn->dport;

   strcpy(device,th_conn->device);

   rst_connection_db(device,ip_src,ip_dst,sport,dport);
   pthread_exit(NULL);
}

void *t_arp(void *threadarg)
{
   char device[30];
   int lg;

   struct thread_arp *arp;

   arp=(struct thread_arp *) threadarg;

   lg = arp->lr;
   strcpy(device,arp->device);
   car(device,lg);
   pthread_exit(NULL);

};

int s_select()
{
   int i, l, c, x;

   char currfil[200];

   i = x = 0;
   l=1;

   while((c = getch()) != 'q')
     {
      switch(c)
        {
         case KEY_DOWN:
           memset(&currfil, 0, sizeof(currfil));

           if(l>=(nmax-1))
             break;

           else
             {

              wmove(winfo->win, l, 2);
              wattron(winfo->win, COLOR_PAIR(4));
              waddstr(winfo->win, sf[i].string);
              wattroff(winfo->win, COLOR_PAIR(4));
              strcpy(currfil,sf[i].sfilter);
             }
           if(l>4)
             {
              winscroll(winfo,+1);
              SAFE_SCROLL_REFRESH(winfo);
             }

           if(l==1)
             ;
           else
             {
              wmove(winfo->win, --l, 2);
              wattron(winfo->win, A_NORMAL);
              waddstr(winfo->win, sf[--i].string);
              wattroff(winfo->win, A_NORMAL);
              ++l;
              ++i;
             }
           redrawscrollwin(winfo, 0);
           strcpy(currfil,sf[i].sfilter);
           ++l;
           ++i;

           break;

         case KEY_UP:
           memset(&currfil, 0, sizeof(currfil));

           if (l<=2) break;

           winscroll(winfo,-1);
           SAFE_SCROLL_REFRESH(winfo);

           --l;
           --i;

           if(l==1)
             ;
           else
             {
              wmove(winfo->win, --l, 2);
              wattron(winfo->win, COLOR_PAIR(4));
              waddstr(winfo->win, sf[--i].string);
              wattroff(winfo->win, COLOR_PAIR(4));
              strcpy(currfil,sf[i].sfilter);
              ++l;
              ++i;

              wmove(winfo->win, l, 2);
              wattron(winfo->win, A_NORMAL);
              waddstr(winfo->win, sf[i].string);
              wattroff(winfo->win, A_NORMAL);

              redrawscrollwin(winfo, 0);

             }
           break;

         case 10:
           if(currfil==0)
             break;
           if(x)
             {
              pthread_cancel(thID[5]);
              pthread_join(thID[5],NULL);
             }
           x=1;
           streamg (dev,currfil);

           break;
        }

     }
   return 0;
}

int r_select()
{
   int i, n, c, l;
   char currfil[200];
   u_long seq;
   u_long ack;
   u_long s_ip;
   u_long d_ip;
   u_short s_port,d_port;

   seq = ack = s_ip = d_ip = s_port = d_port = i = n = 0;
   l = 1;

   while((c = getch()) != 'q')
     {
      switch(c)
        {
         case KEY_DOWN:
           memset(&currfil, 0, sizeof(currfil));
           ack=0;
           seq=0;

           if(l>=(nmax-1))
             break;

           else
             {

              wmove(winfo->win, l, 2);
              wattron(winfo->win, COLOR_PAIR(4));
              waddstr(winfo->win, sf[i].string);
              wattroff(winfo->win, COLOR_PAIR(4));
              strcpy(currfil,sf[i].sfilter);
              seq=sf[i].seq;
              ack=sf[i].ack;
              s_ip=sf[i].ip_src;
              d_ip=sf[i].ip_dst;
              s_port=sf[i].s_port;
              d_port=sf[i].d_port;
             }
           if(l>4)
             {
              winscroll(winfo,+1);
              SAFE_SCROLL_REFRESH(winfo);
             }

           if(l==1)
             ;
           else
             {
              wmove(winfo->win, --l, 2);
              wattron(winfo->win, A_NORMAL);
              waddstr(winfo->win, sf[--i].string);
              wattroff(winfo->win, A_NORMAL);
              ++l;
              ++i;
             }
           redrawscrollwin(winfo, 0);
           strcpy(currfil,sf[i].sfilter);
           seq=sf[i].seq;
           ack=sf[i].ack;
           s_ip=sf[i].ip_src;
           d_ip=sf[i].ip_dst;
           s_port=sf[i].s_port;
           d_port=sf[i].d_port;
           ++l;
           ++i;

           break;

         case KEY_UP:
           memset(&currfil, 0, sizeof(currfil));
           seq=0;
           ack=0;

           if (l<=2) break;

           winscroll(winfo,-1);
           SAFE_SCROLL_REFRESH(winfo);

           --l;
           --i;

           if(l==1)
             ;
           else
             {
              wmove(winfo->win, --l, 2);
              wattron(winfo->win, COLOR_PAIR(4));
              waddstr(winfo->win, sf[--i].string);
              wattroff(winfo->win, COLOR_PAIR(4));
              strcpy(currfil,sf[i].sfilter);
              seq=sf[i].seq;
              ack=sf[i].ack;
              s_ip=sf[i].ip_src;
              d_ip=sf[i].ip_dst;
              s_port=sf[i].s_port;
              d_port=sf[i].d_port;
              ++l;
              ++i;

              wmove(winfo->win, l, 2);
              wattron(winfo->win, A_NORMAL);
              waddstr(winfo->win, sf[i].string);
              wattroff(winfo->win, A_NORMAL);

              redrawscrollwin(winfo, 0);

             }
           break;

         case 10:
           if(currfil==0)
             break;

           for(n=0;n<3;n++)
             reset_conn(dev,s_ip,d_ip,s_port,d_port,seq,ack);
           break;
        }

     }
   return 0;
}

#endif


Generated by  Doxygen 1.6.0   Back to index