ec_interface.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:33k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- ncurses main interface
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include "include/ec_main.h"
  17. #ifdef HAVE_NCURSES  // don't compile if ncurses interface is not supported
  18. #include <string.h>
  19. #include <ncurses.h>
  20. #include <unistd.h>
  21. #include <stdlib.h>
  22. #include <sys/ioctl.h>
  23. #include <signal.h>
  24. #include "include/ec_interface_sniff.h"
  25. #include "include/ec_inet.h"
  26. #include "include/ec_buffer.h"
  27. #include "include/ec_fingerprint.h"
  28. #ifdef PERMIT_PLUGINS
  29.    #include "include/ec_interface_plugins.h"
  30.    #include "include/ec_plugins.h"
  31. #endif
  32. #ifdef DEBUG
  33.    #include "include/ec_debug.h"
  34. #endif
  35. #define DOWN   +1             // movements for the pointer
  36. #define UP     -1
  37. #define BOTTOM_COLOR 1        // color schemes
  38. #define TITLE_COLOR  2
  39. #define MAIN_COLOR   3
  40. #define POINT_COLOR  4
  41. #define SEL_COLOR    5
  42. #define HELP_COLOR   6
  43. #define KEY_TAB      't'     // they aren't defined in ncurses.h :(
  44. #define KEY_RETURN   10
  45. #define KEY_CTRL_L   12
  46. // Graphic Macros
  47. #define CENTER(p1,p2,len) p1 + ((unsigned)((p2-p1)/2) - (unsigned)(len/2))
  48. // prototyping...
  49. void Interface_InitTitle(char *ip, char *mac, char *subnet);
  50. void Interface_InitScreen();
  51. void Interface_CloseScreen(void);
  52. void Interface_Winch(void);
  53. void Interface_Redraw(void);
  54. void Interface_WExit(char *buffer);
  55. void Interface_Run(void);
  56. void Interface_GetWindowSize();
  57. void Interface_PointItem(char direction);
  58. void Interface_InitList(void);
  59. void Interface_KeyTab(void);
  60. void Interface_SelectItem(void);
  61. void Interface_Connect(void);
  62. char Interface_PopUp(char *question);
  63. void Interface_RefreshList(void);
  64. void Interface_HelpWindow(char *help[]);
  65. void Interface_OldStyleSniff(short mode);
  66. void Interface_CheckForPoisoner(void);
  67. void Interface_FingerPrint(void);
  68. // global variables for Interface...
  69. int W_BOTTOMX1, W_BOTTOMY1, W_BOTTOMX2, W_BOTTOMY2;
  70. int W_MAINX1, W_MAINY1, W_MAINX2, W_MAINY2;
  71. int W_TOPX1, W_TOPY1, W_TOPX2, W_TOPY2;
  72. int W_SELECTX, W_SELECTCONN, W_SELECTPLUG;
  73. int W_LIST_SOURCE, W_LIST_DEST;
  74. int Base_Pointer = 0;
  75. int Source_Pointer = 0;
  76. int Dest_Pointer = 0;
  77. int *Pointer = &Source_Pointer;
  78. int Sel_Number;
  79. // int sel_for_source = -1, sel_for_dest = -1;  TODO color selection
  80. WINDOW *main_window, *bottom_window, *top_window, *b_main_window, *b_bottom_window, *b_top_window;
  81. char title_bottom_window[100];
  82. char title_main_window[100];
  83. char title_top_window[100];
  84. short ScreenMode;
  85. // -------------------------------------------
  86. void Interface_GetWindowSize(void)
  87. {
  88.    struct winsize  ws = {0, 0, 0, 0};
  89.    ioctl(0, TIOCGWINSZ, &ws);    // syscall for the window size
  90.    W_BOTTOMX1 = 0;
  91.    W_BOTTOMY1 = ws.ws_row - 4;
  92.    W_BOTTOMX2 = ws.ws_col - 1;
  93.    W_BOTTOMY2 = ws.ws_row;
  94.    W_MAINX1 = 0;
  95.    W_MAINX2 = ws.ws_col - 1;
  96.    W_MAINY2 = W_BOTTOMY1 - 1;
  97.    W_TOPX1 = 0;
  98.    W_TOPY1 = 0;
  99.    W_TOPX2 = ws.ws_col - 1;
  100.    W_TOPY2 = W_TOPY1 + 4;
  101.    W_MAINY1 = W_TOPY2 + 1;
  102.    W_SELECTX = 25;
  103.    W_LIST_SOURCE = (W_MAINX2 - W_SELECTX * 2)/2 ;
  104.    W_LIST_DEST = W_LIST_SOURCE + W_SELECTX;
  105.    Sel_Number = W_MAINY2 - W_MAINY1 - 1;
  106.    W_SELECTCONN = W_MAINX2 - 1;
  107.    W_SELECTPLUG = W_SELECTCONN - 5;
  108. #ifdef DEBUG
  109.    Debug_msg("Interface_GetWindowSize");
  110. #endif
  111. }
  112. void Interface_Winch(void)       // TODO better handling...
  113. {
  114. #ifdef DEBUG
  115.    Debug_msg("Interface_WinchtTODO");
  116. #endif
  117. /*
  118.    clear();
  119.    Interface_GetWindowSize();
  120.    delwin(main_window); delwin(b_main_window);
  121.    delwin(top_window); delwin(b_top_window);
  122.    delwin(bottom_window); delwin(b_bottom_window);
  123.    b_main_window = newwin(W_MAINY2 - W_MAINY1 + 1, W_MAINX2 - W_MAINX1 + 1, W_MAINY1, W_MAINX1);
  124.    b_bottom_window  = newwin(W_BOTTOMY2 - W_BOTTOMY1, W_BOTTOMX2 - W_BOTTOMX1 + 1, W_BOTTOMY1, W_BOTTOMX1);
  125.    b_top_window = newwin(W_TOPY2 - W_TOPY1 + 1, W_TOPX2 - W_TOPX1 + 1, W_TOPY1, W_TOPX1);
  126.    main_window = newwin(W_MAINY2 - W_MAINY1 - 1, W_MAINX2 - W_MAINX1 - 1, W_MAINY1 + 1, W_MAINX1 + 1);
  127.    bottom_window = newwin(W_BOTTOMY2 - W_BOTTOMY1 - 2, W_BOTTOMX2 - W_BOTTOMX1 - 1, W_BOTTOMY1 + 1, W_BOTTOMX1 + 1);
  128.    top_window = newwin(W_TOPY2 - W_TOPY1 - 1, W_TOPX2 - W_TOPX1 - 1, W_TOPY1 + 1, W_TOPX1 + 1);
  129.    keypad(main_window, 1);
  130. */
  131. // Interface_GetWindowSize();
  132. // resizeterm( W_BOTTOMY2, W_MAINX2 +1);
  133.    Interface_Redraw();
  134. }
  135. void Interface_Redraw(void)
  136. {
  137. #ifdef DEBUG
  138.    Debug_msg("Interface_Redraw");
  139. #endif
  140.    clear();
  141.    box(b_main_window,ACS_VLINE,ACS_HLINE);
  142.    box(b_bottom_window,ACS_VLINE,ACS_HLINE);
  143.    box(b_top_window,ACS_VLINE,ACS_HLINE);
  144.    wbkgdset(b_main_window, COLOR_PAIR(TITLE_COLOR)); wattron(b_main_window, A_BOLD);
  145.    wbkgdset(b_top_window, COLOR_PAIR(TITLE_COLOR)); wattron(b_top_window, A_BOLD);
  146.    wbkgdset(b_bottom_window, COLOR_PAIR(TITLE_COLOR)); wattron(b_bottom_window, A_BOLD);
  147.    mvwprintw(b_main_window, 0, CENTER(W_MAINX1, W_MAINX2, strlen(title_main_window)), title_main_window);
  148.    mvwprintw(b_bottom_window, 0, CENTER(W_BOTTOMX1, W_BOTTOMX2, strlen(title_bottom_window)), title_bottom_window);
  149.    mvwprintw(b_top_window, 0, CENTER(W_TOPX1, W_TOPX2, strlen(title_top_window)), title_top_window);
  150.    wbkgdset(b_main_window, COLOR_PAIR(BOTTOM_COLOR)); wattroff(b_main_window, A_BOLD);
  151.    wbkgdset(b_top_window, COLOR_PAIR(BOTTOM_COLOR)); wattroff(b_top_window, A_BOLD);
  152.    wbkgdset(b_bottom_window, COLOR_PAIR(BOTTOM_COLOR)); wattroff(b_bottom_window, A_BOLD);
  153.    redrawwin(stdscr);
  154.    redrawwin(b_main_window);
  155.    redrawwin(b_bottom_window);
  156.    redrawwin(b_top_window);
  157.    redrawwin(main_window);
  158.    redrawwin(bottom_window);
  159.    redrawwin(top_window);
  160.    wnoutrefresh(stdscr);
  161.    wnoutrefresh(b_main_window);
  162.    wnoutrefresh(b_bottom_window);
  163.    wnoutrefresh(b_top_window);
  164.    wnoutrefresh(main_window);
  165.    wnoutrefresh(bottom_window);
  166.    wnoutrefresh(top_window);
  167.    doupdate();
  168. }
  169. void Interface_InitTitle(char *ip, char *mac, char *subnet)
  170. {
  171. #ifdef DEBUG
  172.    Debug_msg("Interface_InitTitle [%s] [%s] [%s]", ip, mac, subnet);
  173. #endif
  174.    if (Options.silent)
  175.    {
  176.       snprintf(title_main_window, 100, " ??? hosts in this LAN (%s : %s) ", ip, subnet);
  177.       snprintf(title_bottom_window, 100, " Your IP: %s MAC: %s Iface: %s Link: not tested", ip, mac, Options.netiface);
  178.    }
  179.    else
  180.    {
  181.       char link_type[10];
  182.       short type;
  183.       switch(type = Inet_CheckSwitch())
  184.       {
  185.          case 0: strcpy(link_type, "unknown");
  186.                  break;
  187.          case 1: strcpy(link_type, "HUB");
  188.                  break;
  189.          case 2: strcpy(link_type, "SWITCH");
  190.                  break;
  191.       }
  192.       snprintf(title_main_window, 100, " %3d hosts in this LAN (%s : %s) ", number_of_hosts_in_lan, ip, subnet);
  193.       snprintf(title_bottom_window, 100, " Your IP: %s MAC: %s Iface: %s Link: %s ", ip, mac, Options.netiface, link_type);
  194.    }
  195.    snprintf(title_top_window, 100, " %s %s ", PROGRAM, VERSION);
  196. }
  197. void Interface_InitScreen(void)
  198. {
  199. #ifdef DEBUG
  200.    Debug_msg("Interface_InitScreen");
  201. #endif
  202.    initscr();
  203.    cbreak();
  204.    noecho();
  205.    ScreenMode = 1;
  206.    Interface_GetWindowSize();
  207.    if (has_colors()) start_color();
  208.    curs_set(0);         // hide the cursor
  209.    init_pair(TITLE_COLOR, COLOR_YELLOW, COLOR_BLACK);
  210.    init_pair(MAIN_COLOR, COLOR_CYAN, COLOR_BLUE);
  211.    init_pair(BOTTOM_COLOR, COLOR_WHITE, COLOR_BLACK);
  212.    init_pair(POINT_COLOR, COLOR_BLUE, COLOR_CYAN);
  213.    init_pair(HELP_COLOR, COLOR_CYAN, COLOR_BLACK);
  214.    init_pair(SEL_COLOR, COLOR_WHITE, COLOR_BLUE);     // TODO choose the color
  215.    b_main_window = newwin(W_MAINY2 - W_MAINY1 + 1, W_MAINX2 - W_MAINX1 + 1, W_MAINY1, W_MAINX1);
  216.    b_bottom_window  = newwin(W_BOTTOMY2 - W_BOTTOMY1, W_BOTTOMX2 - W_BOTTOMX1 + 1, W_BOTTOMY1, W_BOTTOMX1);
  217.    b_top_window = newwin(W_TOPY2 - W_TOPY1 + 1, W_TOPX2 - W_TOPX1 + 1, W_TOPY1, W_TOPX1);
  218.    main_window = newwin(W_MAINY2 - W_MAINY1 - 1, W_MAINX2 - W_MAINX1 - 1, W_MAINY1 + 1, W_MAINX1 + 1);
  219.    bottom_window = newwin(W_BOTTOMY2 - W_BOTTOMY1 - 2, W_BOTTOMX2 - W_BOTTOMX1 - 1, W_BOTTOMY1 + 1, W_BOTTOMX1 + 1);
  220.    top_window = newwin(W_TOPY2 - W_TOPY1 - 1, W_TOPX2 - W_TOPX1 - 1, W_TOPY1 + 1, W_TOPX1 + 1);
  221.    wmove(bottom_window, 0, 0);
  222.    wmove(main_window, 0, 0);
  223.    wmove(top_window, 0, 0);
  224.    wbkgdset(main_window, COLOR_PAIR(MAIN_COLOR));     // sets the colors
  225.    wbkgdset(b_main_window, COLOR_PAIR(BOTTOM_COLOR));
  226.    wbkgdset(bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  227.    wbkgdset(b_bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  228.    wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  229.    wbkgdset(b_top_window, COLOR_PAIR(BOTTOM_COLOR));
  230.    werase(top_window);
  231.    werase(bottom_window);
  232.    werase(main_window);
  233.    wattrset(bottom_window, A_BOLD);
  234.    keypad(main_window,1);
  235.    Interface_Redraw();     // touch the screen and call doupdate()
  236.    Interface_InitList();
  237. }
  238. void Interface_InitList(void)
  239. {
  240.    int j;
  241.    int Top_Pointer;
  242. #ifdef DEBUG
  243.    Debug_msg("Interface_InitList");
  244. #endif
  245.    if (number_of_hosts_in_lan == 0) return;
  246.    if (has_colors())
  247.       wbkgdset(main_window, COLOR_PAIR(MAIN_COLOR));
  248.    else
  249.       wattroff(main_window,A_REVERSE);
  250.    werase(main_window);
  251.    Top_Pointer = (Base_Pointer+Sel_Number < number_of_hosts_in_lan) ? Base_Pointer + Sel_Number : number_of_hosts_in_lan ;
  252.    for(j=Base_Pointer; j<Top_Pointer; j++)      // prints IPs within the main_window height
  253.    {
  254.       wmove(main_window, j-Base_Pointer, W_LIST_SOURCE );
  255.       //if (sel_for_source == j) wbkgdset(main_window, COLOR_PAIR(SEL_COLOR));      // TODO  color selection
  256.       //else if (sel_for_dest == j) wbkgdset(main_window, COLOR_PAIR(SEL_COLOR));
  257.       //else wbkgdset(main_window, COLOR_PAIR(MAIN_COLOR));
  258.       wprintw(main_window, "%3d) %15s      %3d) %15s", j+1, Host_In_LAN[j].ip, j+1, Host_In_LAN[j].ip);
  259.    }
  260.    if (has_colors())
  261.       wbkgdset(main_window, COLOR_PAIR(POINT_COLOR));
  262.    else
  263.       wattron(main_window,A_REVERSE);
  264.    if (Pointer == &Source_Pointer)
  265.    {
  266.       wmove(main_window, *Pointer - Base_Pointer, W_LIST_SOURCE );
  267.       whline(main_window, ' ', W_SELECTX);
  268.       wprintw(main_window,"%3d) %15s", *Pointer+1, Host_In_LAN[*Pointer].ip);
  269.       wmove(bottom_window,0,0); whline(bottom_window, ' ', W_BOTTOMX2);
  270.       mvwprintw(bottom_window, 0, 2, "Host: %s (%s) : %s", Host_In_LAN[*Pointer].name, Host_In_LAN[*Pointer].ip, Host_In_LAN[*Pointer].mac);
  271.    }
  272.    else if (Pointer == &Dest_Pointer)
  273.    {
  274.       wmove(main_window, *Pointer - Base_Pointer, W_LIST_DEST );
  275.       whline(main_window, ' ', W_SELECTX);
  276.       wprintw(main_window, " %3d) %15s", *Pointer+1, Host_In_LAN[*Pointer].ip);
  277.       wmove(bottom_window,1,0); whline(bottom_window, ' ', W_BOTTOMX2);
  278.       mvwprintw(bottom_window, 1, 2, "Host: %s (%s) : %s", Host_In_LAN[*Pointer].name, Host_In_LAN[*Pointer].ip, Host_In_LAN[*Pointer].mac);
  279.    }
  280.    touchwin(bottom_window);
  281.    touchwin(main_window);
  282.    wnoutrefresh(bottom_window);
  283.    wnoutrefresh(main_window);
  284.    doupdate();
  285. }
  286. void Interface_PointItem(char direction)
  287. {
  288.    int Old_Pointer;
  289.    Old_Pointer = *Pointer;
  290.    *Pointer += direction;
  291.    if (*Pointer > number_of_hosts_in_lan -1 ) *Pointer = number_of_hosts_in_lan - 1;
  292.    if (*Pointer < 0) *Pointer = 0;
  293.    if ( (*Pointer - Base_Pointer + direction  >= Sel_Number) && (direction > 0) )      // scroll down
  294.    {
  295.       if (Base_Pointer + Sel_Number <= number_of_hosts_in_lan)
  296.          Base_Pointer = (Base_Pointer + direction < number_of_hosts_in_lan) ? Base_Pointer + direction : number_of_hosts_in_lan - Sel_Number;
  297.       Interface_InitList();
  298.    }
  299.    else if ( (*Pointer - Base_Pointer + direction < 0) && (direction < 0) )         // scroll up
  300.    {
  301.       if (Base_Pointer > 0)
  302.          Base_Pointer = (Base_Pointer + direction > 0) ? Base_Pointer + direction : 0;
  303.       Interface_InitList();
  304.    }
  305.    if (has_colors())
  306.       wbkgdset(main_window, COLOR_PAIR(MAIN_COLOR));
  307.    else
  308.       wattroff(main_window,A_REVERSE);
  309.    if ( (Old_Pointer >= Base_Pointer) && (Old_Pointer <= Base_Pointer + Sel_Number -1))   // DON'T redraw previous selected item if it is out of view
  310.    {
  311.       if (Pointer == &Source_Pointer)
  312.       {
  313.          wmove(main_window, Old_Pointer - Base_Pointer, W_LIST_SOURCE);
  314.          whline(main_window,' ',W_MAINX2 - 1);                          //deletes the previous position
  315.          wprintw(main_window, "%3d) %15s      %3d) %15s", Old_Pointer+1, Host_In_LAN[Old_Pointer].ip, Old_Pointer+1, Host_In_LAN[Old_Pointer].ip);
  316.       }
  317.       else if (Pointer == &Dest_Pointer)
  318.       {
  319.          wmove(main_window, Old_Pointer - Base_Pointer, W_LIST_DEST );
  320.          whline(main_window,' ',W_MAINX2 - 1);                          //deletes the previous position
  321.          wprintw(main_window, " %3d) %15s", Old_Pointer+1, Host_In_LAN[Old_Pointer].ip);
  322.       }
  323.    }
  324.    if (has_colors())
  325.       wbkgdset(main_window, COLOR_PAIR(POINT_COLOR));
  326.    else
  327.       wattron(main_window,A_REVERSE);
  328.    if (Pointer == &Source_Pointer)
  329.    {
  330.       wmove(main_window, *Pointer - Base_Pointer, W_LIST_SOURCE);
  331.       whline(main_window, ' ', W_SELECTX);                           //select new position
  332.       wprintw(main_window, "%3d) %15s", *Pointer+1, Host_In_LAN[*Pointer].ip);
  333.       wmove(bottom_window,0,0); whline(bottom_window, ' ', W_BOTTOMX2);
  334.       mvwprintw(bottom_window, 0, 2, "Host: %s (%s) : %s", Host_In_LAN[*Pointer].name, Host_In_LAN[*Pointer].ip, Host_In_LAN[*Pointer].mac);
  335.    }
  336.    else if (Pointer == &Dest_Pointer)
  337.    {
  338.       wmove(main_window, *Pointer - Base_Pointer, W_LIST_DEST);
  339.       whline(main_window, ' ', W_SELECTX);                           //select new position
  340.       wprintw(main_window, " %3d) %15s", *Pointer+1, Host_In_LAN[*Pointer].ip);
  341.       wmove(bottom_window,1,0); whline(bottom_window, ' ', W_BOTTOMX2);
  342.       mvwprintw(bottom_window, 1, 2, "Host: %s (%s) : %s", Host_In_LAN[*Pointer].name, Host_In_LAN[*Pointer].ip, Host_In_LAN[*Pointer].mac);
  343.    }
  344.    touchwin(bottom_window);
  345.    touchwin(main_window);
  346.    wnoutrefresh(bottom_window);
  347.    wnoutrefresh(main_window);
  348.    doupdate();
  349. }
  350. void Interface_KeyTab(void)
  351. {
  352.    if (Pointer == &Source_Pointer)
  353.    {
  354.       while (Dest_Pointer < Base_Pointer)
  355.          Base_Pointer = (Base_Pointer - Sel_Number > 0) ? (Base_Pointer - Sel_Number) : 0;
  356.       while (Dest_Pointer > Base_Pointer + Sel_Number -1)
  357.          Base_Pointer = (Base_Pointer + Sel_Number < number_of_hosts_in_lan) ? (Base_Pointer + Sel_Number) : number_of_hosts_in_lan - Sel_Number;
  358.       Pointer = &Dest_Pointer;
  359.    }
  360.    else
  361.    {
  362.       while (Source_Pointer < Base_Pointer)
  363.          Base_Pointer = (Base_Pointer - Sel_Number > 0) ? (Base_Pointer - Sel_Number) : 0;
  364.       while (Source_Pointer > Base_Pointer + Sel_Number -1)
  365.          Base_Pointer = (Base_Pointer + Sel_Number < number_of_hosts_in_lan) ? (Base_Pointer + Sel_Number) : number_of_hosts_in_lan - Sel_Number;
  366.       Pointer = &Source_Pointer;
  367.    }
  368. }
  369. void Interface_SelectItem(void)        // TODO  implement color selection
  370. {
  371. #ifdef DEBUG
  372.    Debug_msg("Interface_SelectItem");
  373. #endif
  374.    if (Pointer == &Source_Pointer)
  375.    {
  376.       wmove(top_window,0,0); whline(top_window, ' ', W_TOPX2);
  377.       wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  378.       wprintw(top_window, "SOURCE: ");
  379.       wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  380.       wprintw(top_window, "%15s", Host_In_LAN[Source_Pointer].ip);
  381.       memcpy(&Host_Source, &Host_In_LAN[Source_Pointer], sizeof(HOST) );
  382.       //sel_for_source = *Pointer;
  383.    }
  384.    else
  385.    {
  386.       wmove(top_window,2,0); whline(top_window, ' ', W_TOPX2);
  387.       wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  388.       wprintw(top_window, "DEST  : ");
  389.       wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  390.       wprintw(top_window, "%15s", Host_In_LAN[Dest_Pointer].ip);
  391.       memcpy(&Host_Dest, &Host_In_LAN[Dest_Pointer], sizeof(HOST) );
  392.       //sel_for_dest = *Pointer;
  393.    }
  394.    touchwin(top_window);
  395.    wnoutrefresh(top_window);
  396.    doupdate();
  397. }
  398. char Interface_PopUp(char *question)
  399. {
  400.    WINDOW *question_window;
  401.    char answer;
  402.    question_window = newwin(5, strlen(question) + 4,0,0);
  403.    mvwin(question_window, W_MAINY1+(W_MAINY2-W_MAINY1)/2-2, W_MAINX2/2 - (strlen(question)+4)/2 );
  404.    wbkgdset(question_window, COLOR_PAIR(TITLE_COLOR));
  405.    wattron(question_window, A_BOLD);
  406.    box(question_window,ACS_VLINE,ACS_HLINE);
  407.    mvwprintw(question_window,  2, 2, question);
  408.    wnoutrefresh(question_window);
  409.    doupdate();
  410.    answer = wgetch(question_window);
  411.    delwin(question_window);
  412.    touchwin(main_window);
  413.    wnoutrefresh(main_window);
  414.    doupdate();
  415. #ifdef DEBUG
  416.    Debug_msg("Interface_PopUp returns -- %c", answer);
  417. #endif
  418.    return answer;
  419. }
  420. void Interface_RefreshList(void)
  421. {
  422.    WINDOW *message_window;
  423.    char *mess = "updating the list...";
  424. #ifdef DEBUG
  425.    Debug_msg("Interface_RefreshList");
  426. #endif
  427.    message_window = newwin(5, strlen(mess) + 4,0,0);
  428.    mvwin(message_window, W_MAINY1+(W_MAINY2-W_MAINY1)/2-2, W_MAINX2/2 - (strlen(mess) + 4)/2 );
  429.    wbkgdset(message_window, COLOR_PAIR(TITLE_COLOR));
  430.    wattron(message_window, A_BOLD);
  431.    box(message_window,ACS_VLINE,ACS_HLINE);
  432.    mvwprintw(message_window,  2, 2, mess);
  433.    wnoutrefresh(message_window);
  434.    doupdate();
  435.    number_of_hosts_in_lan = Inet_HostInLAN();
  436.    Source_Pointer = Dest_Pointer = 0;
  437.    Base_Pointer = 0;
  438.    sprintf(title_main_window, "%3d", number_of_hosts_in_lan);     // devil workaround ;)
  439.    title_main_window[3] = ' ';
  440.    delwin(message_window);
  441.    touchwin(main_window);
  442.    wnoutrefresh(main_window);
  443.    doupdate();
  444. }
  445. void Interface_HelpWindow(char *help[])
  446. {
  447.    WINDOW *help_window;
  448.    int i = 2, y = 0,  max = 0;
  449.    char **counter;
  450.    int dimY = 0;
  451.    int dimX = 0;
  452.    for (counter = help; *counter; counter++)
  453.    {
  454.          max = (strlen(*counter) > max) ? strlen(*counter) : max;
  455.          y++;
  456.    }
  457.    dimY = y + 4;
  458.    dimX = max + 4;
  459.    help_window = newwin(dimY, dimX,0,0);
  460.    mvwin(help_window, W_BOTTOMY2/2 - dimY/2, W_MAINX2/2 - dimX/2);
  461.    wbkgdset(help_window, COLOR_PAIR(HELP_COLOR));
  462.    wattron(help_window, A_BOLD);
  463.    box(help_window,ACS_VLINE,ACS_HLINE);
  464.    mvwprintw(help_window, 0, 1, "Help Window");
  465.    for (counter = help; *counter; counter++)
  466.    {
  467.       mvwprintw(help_window, i++, 2, *counter);
  468.    }
  469.    wnoutrefresh(help_window);
  470.    doupdate();
  471.    wgetch(help_window);
  472.    delwin(help_window);
  473. }
  474. void Interface_Connect(void)
  475. {
  476. #ifdef DEBUG
  477.    Debug_msg("Interface_Connect");
  478. #endif
  479.    if ( (!strcmp(Host_Source.ip, "")) && (!strcmp(Host_Dest.ip, "")) )
  480.       Interface_PopUp("Before sniffing select AT LEAST source OR destination !!");
  481.    else if ( (!strcmp(Host_Source.ip, Inet_MyIPAddress())) || (!strcmp(Host_Dest.ip, Inet_MyIPAddress())) )
  482.       Interface_PopUp("You CAN'T arpsniff yourself !!");
  483.    else if ( !strcmp(Host_Source.ip, Host_Dest.ip) )
  484.       Interface_PopUp("SOURCE and DEST must be different !!");
  485.    else
  486.    {
  487.       char answer;
  488.       if (Options.silent)  answer = 'y';
  489.       else answer = Interface_PopUp("Do U really want to poison the ARP cache of the targets (y/n) ?");
  490.       if ((answer == 'y') || (answer == 'Y'))
  491.       {
  492.          wmove(top_window,0,0); whline(top_window, ' ', W_TOPX2);
  493.          wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  494.          wprintw(top_window, "SOURCE: ");
  495.          wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  496.          if (strcmp(Host_Source.ip,""))
  497.             wprintw(top_window, "%15s", Host_Source.ip);
  498.          else
  499.             wprintw(top_window, "%15s","  ANY  ");
  500.          wmove(top_window,2,0); whline(top_window, ' ', W_TOPX2);
  501.          wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  502.          wprintw(top_window, "DEST  : ");
  503.          wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  504.          if (strcmp(Host_Dest.ip,""))
  505.             wprintw(top_window, "%15s", Host_Dest.ip);
  506.          else
  507.             wprintw(top_window, "%15s","  ANY  ");
  508.          wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  509.          mvwprintw(top_window,0,25, "<"); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_URCORNER);
  510.          wmove(top_window, 1,28); waddch(top_window, ACS_LTEE); waddch(top_window, ACS_HLINE);
  511.          wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  512.          wprintw(top_window, " doppleganger "); waddch(top_window, ACS_HLINE);
  513.          if ( (!strcmp(Host_Source.ip, "")) || (!strcmp(Host_Dest.ip, "")) )
  514.             wprintw(top_window, " illithid (Public ARP) ");
  515.          else
  516.             wprintw(top_window, " illithid (ARP Based) ");
  517.          waddch(top_window, ACS_HLINE);
  518.          wprintw(top_window, " %s", PROGRAM);
  519.          wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  520.          mvwprintw(top_window,2,25, "<"); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_LRCORNER);
  521.          wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  522.          wnoutrefresh(top_window);
  523.          if ( (!strcmp(Host_Source.ip, "")) || (!strcmp(Host_Dest.ip, "")) )
  524.             Interface_Sniff_Run(PUBLICARP);   // with HALF duplex ARP poisoning
  525.          else
  526.             Interface_Sniff_Run(ARPBASED);   // with FULL duplex ARP poisoning
  527.          // wait for return, than...
  528.          memset(&Host_Source, 0, sizeof(HOST) );
  529.          memset(&Host_Dest, 0, sizeof(HOST) );
  530.          werase(top_window);
  531.          wnoutrefresh(top_window);
  532.          Interface_InitList();
  533.       }
  534.    }
  535.    doupdate();
  536. }
  537. void Interface_OldStyleSniff(short mode)
  538. {
  539. #ifdef DEBUG
  540.    Debug_msg("Interface_OldStyleSniff -- mode = %d", mode);
  541. #endif
  542.    if ( !strcmp(Host_Source.ip, Host_Dest.ip) && strcmp(Host_Source.ip, "") )
  543.       Interface_PopUp("SOURCE and DEST must be different !!");
  544.    else if ( !strcmp(Host_Source.mac, Host_Dest.mac) && strcmp(Host_Source.mac, ""))
  545.       Interface_PopUp("SOURCE and DEST must be different !!");
  546.    else if ( mode && ((!strcmp(Host_Source.mac, "")) || (!strcmp(Host_Dest.mac, ""))) )
  547.       Interface_PopUp("Before sniffing select source AND destination !!");
  548.    else
  549.    {
  550.       wmove(top_window,0,0); whline(top_window, ' ', W_TOPX2);
  551.       wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  552.       wprintw(top_window, "SOURCE: ");
  553.       wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  554.       if (mode)
  555.          wprintw(top_window, "%15s", Host_Source.mac);
  556.       else
  557.       {
  558.          if (strcmp(Host_Source.ip, ""))
  559.             wprintw(top_window, "%15s", Host_Source.ip);
  560.          else
  561.             wprintw(top_window, "%15s","  ANY  ");
  562.       }
  563.       wmove(top_window,2,0); whline(top_window, ' ', W_TOPX2);
  564.       wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  565.       wprintw(top_window, "DEST  : ");
  566.       wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  567.       if (mode)
  568.          wprintw(top_window, "%15s", Host_Dest.mac);
  569.       else
  570.       {
  571.          if (strcmp(Host_Dest.ip, ""))
  572.             wprintw(top_window, "%15s", Host_Dest.ip);
  573.          else
  574.             wprintw(top_window, "%15s","  ANY  ");
  575.       }
  576.       wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  577.       mvwprintw(top_window,0,25, "<"); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_URCORNER);
  578.       if (mode)
  579.       {
  580.          wmove(top_window, 1,28); waddch(top_window, ACS_LTEE); waddch(top_window, ACS_HLINE);
  581.          wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  582.          wprintw(top_window, " illithid (MAC based) "); waddch(top_window, ACS_HLINE); wprintw(top_window, " %s", PROGRAM);
  583.       }
  584.       else
  585.       {
  586.          wmove(top_window, 1,28); waddch(top_window, ACS_LTEE); waddch(top_window, ACS_HLINE);
  587.          wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  588.          wprintw(top_window, " illithid (IP based) "); waddch(top_window, ACS_HLINE); wprintw(top_window, " %s", PROGRAM);
  589.       }
  590.       wbkgdset(top_window, COLOR_PAIR(HELP_COLOR));
  591.       mvwprintw(top_window,2,25, "<"); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_HLINE); waddch(top_window, ACS_LRCORNER);
  592.       wbkgdset(top_window, COLOR_PAIR(BOTTOM_COLOR));
  593.       wnoutrefresh(top_window);
  594.       if (mode)
  595.          Interface_Sniff_Run(MACBASED);   // no ARP poisoning
  596.       else
  597.          Interface_Sniff_Run(IPBASED);    // no ARP poisoning
  598.       // wait for return, then...
  599.       memset(&Host_Source, 0, sizeof(HOST) );
  600.       memset(&Host_Dest, 0, sizeof(HOST) );
  601.       werase(top_window);
  602.       wnoutrefresh(top_window);
  603.       Interface_InitList();
  604.    }
  605.    doupdate();
  606. }
  607. void Interface_CheckForPoisoner(void)
  608. {
  609.    WINDOW *message_window;
  610.    SniffingHost *SniffList;
  611.    int i;
  612.    short found = 0;
  613.    char *mess = "checking for poisoners...";
  614. #ifdef DEBUG
  615.    Debug_msg("Interface_CheckForPoisoner");
  616. #endif
  617.    message_window = newwin(5, strlen(mess) + 4,0,0);
  618.    mvwin(message_window, W_MAINY1+(W_MAINY2-W_MAINY1)/2-2, W_MAINX2/2 - (strlen(mess) + 4)/2 );
  619.    wbkgdset(message_window, COLOR_PAIR(TITLE_COLOR));
  620.    wattron(message_window, A_BOLD);
  621.    box(message_window,ACS_VLINE,ACS_HLINE);
  622.    mvwprintw(message_window,  2, 2, mess);
  623.    wnoutrefresh(message_window);
  624.    doupdate();
  625.    SniffList = Inet_NoSniff();
  626.    for (i=0; i<number_of_hosts_in_lan; i++)
  627.    {
  628.       if (SniffList[i].mode == 0) break;
  629.       if (SniffList[i].mode == 1)
  630.       {
  631.          char mesg[100];
  632.          found = 1;
  633.          sprintf(mesg, "%s is replying for %s", Host_In_LAN[SniffList[i].Host_Index1].ip, Host_In_LAN[SniffList[i].Host_Index2].ip);
  634.          Interface_PopUp(mesg);
  635.       }
  636.       if (SniffList[i].mode == 2)
  637.       {
  638.          char mesg[100];
  639.          found = 1;
  640.          sprintf(mesg, "MAC of %s and %s are identical !",Host_In_LAN[SniffList[i].Host_Index1].ip,Host_In_LAN[SniffList[i].Host_Index2].ip);
  641.          Interface_PopUp(mesg);
  642.       }
  643.    }
  644.    if (!found)
  645.       Interface_PopUp("No poisoners found in this lan (seems to be safe)");
  646.    delwin(message_window);
  647.    touchwin(main_window);
  648.    wnoutrefresh(main_window);
  649.    doupdate();
  650. }
  651. void Interface_FingerPrint(void)
  652. {
  653.    WINDOW *finger_win;
  654.    WINDOW *message_window;
  655.    int dimY = 7;
  656.    int dimX = 20;
  657.    int i=0, j=0, k=0;
  658.    char mac_finger[W_MAINX2];
  659.    char *mess = "Fingerprinting ...";
  660.    char long_os_fingers[1000];
  661.    char temp[100];
  662. #ifdef DEBUG
  663.    Debug_msg("Interface_FingerPrint -- [%s] [%s]", Host_In_LAN[*Pointer].ip, Host_In_LAN[*Pointer].mac );
  664. #endif
  665.    message_window = newwin(5, strlen(mess) + 4,0,0);
  666.    mvwin(message_window, W_MAINY1+(W_MAINY2-W_MAINY1)/2-2, W_MAINX2/2 - (strlen(mess) + 4)/2 );
  667.    wbkgdset(message_window, COLOR_PAIR(TITLE_COLOR));
  668.    wattron(message_window, A_BOLD);
  669.    box(message_window,ACS_VLINE,ACS_HLINE);
  670.    mvwprintw(message_window,  2, 2, mess);
  671.    wnoutrefresh(message_window);
  672.    doupdate();
  673.    strncpy(long_os_fingers, Fingerprint_OS(Host_In_LAN[*Pointer].ip), 1000 );
  674.    strncpy(mac_finger, Fingerprint_MAC(Host_In_LAN[*Pointer].mac), W_MAINX2-4-18 );
  675.    delwin(message_window);
  676.    touchwin(main_window);
  677.    wnoutrefresh(main_window);
  678.    doupdate();
  679.    for(i=0; i < strlen(long_os_fingers); i++)
  680.    {
  681.       if (long_os_fingers[i] == 'n')
  682.       {
  683.          dimY++;
  684.          j++;
  685.          dimX = (i-k > dimX) ? i-k : dimX;   // length of the max string
  686.          k=i;
  687.       }
  688.    }
  689.    dimX = (strlen(mac_finger)>dimX) ? strlen(mac_finger) : dimX;
  690.    dimX = (dimX + 24 < W_MAINX2-1) ? dimX + 24 : W_MAINX2-1;
  691.    finger_win = newwin(dimY, dimX, 0, 0);
  692.    mvwin(finger_win, W_BOTTOMY2/2 - dimY/2, (W_MAINX2/2 - dimX/2) + 1);
  693.    wbkgdset(finger_win, COLOR_PAIR(TITLE_COLOR));
  694.    wattron(finger_win, A_BOLD);
  695.    box(finger_win,ACS_VLINE,ACS_HLINE);
  696.    mvwprintw(finger_win, 0, 2, "FingerPrint %s", Host_In_LAN[*Pointer].ip);
  697.    mvwprintw(finger_win, 2, 2, "Operating System:");
  698.    mvwprintw(finger_win, dimY-3, 2, "Network Adapter :");
  699.    wattroff(finger_win, A_BOLD);
  700.    wbkgdset(finger_win, COLOR_PAIR(BOTTOM_COLOR));
  701. if (strcmp(long_os_fingers, ""))
  702.     strncpy(temp, strtok(long_os_fingers, "n"), W_MAINX2-4-18);
  703.    mvwprintw(finger_win, 2, 20, "%s", temp);
  704.    for(i=0; i<j-1 ;i++)
  705.    {
  706.     memset(temp, 0, 100);
  707.     strncpy(temp, strtok(NULL, "n"), W_MAINX2-4-18);
  708.       mvwprintw(finger_win, 3+i, 20, "%s", temp);
  709.    }
  710.    mvwprintw(finger_win, dimY-3, 20, "%s", mac_finger);
  711.    wnoutrefresh(finger_win);
  712.    doupdate();
  713.    wgetch(finger_win);
  714.    delwin(finger_win);
  715.    touchwin(main_window);
  716.    wnoutrefresh(main_window);
  717.    doupdate();
  718. }
  719. void Interface_Run(void)
  720. {
  721.    int KeyPress;
  722. #ifdef DEBUG
  723.    Debug_msg("Interface_Run");
  724. #endif
  725.    pipe_with_illithid = Buffer_Create(2.0e5);      // creates the buffers
  726.    pipe_with_illithid_data = Buffer_Create(1.0e6); // 1Mb in shared memory !!!
  727.    if (Options.silent)
  728.    {
  729.       if (Options.arpsniff)
  730.          Interface_Connect();
  731.       if (Options.macsniff)
  732.          Interface_OldStyleSniff(1);
  733.       if (Options.sniff)
  734.          Interface_OldStyleSniff(0);
  735.       #ifdef PERMIT_PLUGINS
  736.          if (Options.plugin)
  737.             Interface_Plugins_Run();
  738.       #endif
  739.    }
  740.    if (Options.silent && !(Options.sniff || Options.macsniff || Options.arpsniff))
  741.       Options.silent = 0;
  742.    loop
  743.    {
  744.       KeyPress = wgetch(main_window);
  745.       switch (KeyPress)
  746.       {
  747.          case KEY_DOWN:
  748.                   Interface_PointItem(DOWN);
  749.                   break;
  750.          case KEY_UP:
  751.                   Interface_PointItem(UP);
  752.                   break;
  753.          case KEY_NPAGE:
  754.                   Interface_PointItem(Sel_Number-1);  //PGDOWN
  755.                   break;
  756.          case KEY_PPAGE:
  757.                   Interface_PointItem(-Sel_Number+1); //PGUP
  758.                   break;
  759.          case KEY_TAB:
  760.                   Interface_KeyTab();
  761.                   Interface_InitList();
  762.                   break;
  763.          case KEY_RETURN:
  764.                   Interface_SelectItem();
  765.                   break;
  766.          case 'A':
  767.          case 'a':
  768.                   Interface_Connect();
  769.                   break;
  770.          case 'S':
  771.          case 's':
  772.                   Interface_OldStyleSniff(0);
  773.                   break;
  774.          case 'M':
  775.          case 'm':
  776.                   Interface_OldStyleSniff(1);
  777.                   break;
  778.          case 'C':
  779.          case 'c':
  780.                   Interface_CheckForPoisoner();
  781.                   break;
  782.          case 'F':
  783.          case 'f':
  784.                   Interface_FingerPrint();
  785.                   break;
  786.          case ' ':
  787.                   werase(top_window);
  788.                   wnoutrefresh(top_window);
  789.                   doupdate();
  790.                   memset(&Host_Source, 0, sizeof(HOST));
  791.                   memset(&Host_Dest, 0, sizeof(HOST));
  792.                   break;
  793. #ifdef PERMIT_PLUGINS
  794.          case 'P':
  795.          case 'p':
  796.                   Interface_Plugins_Run();
  797.                   break;
  798. #endif
  799.          case KEY_F(1):
  800.          case 'H':
  801.          case 'h':{
  802.                      static char *help[] = {
  803.                         "[qQ][F10] - quit",
  804.                         "[return]  - select the IP",
  805.                         "[space]   - wipe/deselect the IPs",
  806.                         "[tab]     - switch between source and dest",
  807.                         "[aA]      - ARP posoning based sniffing (for switched LAN)",
  808.                         "[sS]      - IP based sniffing",
  809.                         "[mM]      - MAC based sniffing",
  810. #ifdef PERMIT_PLUGINS
  811.                         "[pP]      - run a plugin",
  812. #endif
  813.                         "[cC]      - check for other poisoner...",
  814.                         "[fF]      - OS fingerprint",
  815.                         "[rR]      - refresh the list",
  816.                         "[hH]      - this help screen",
  817.                         NULL};
  818.                      Interface_HelpWindow(help);
  819.                   }
  820.                   Interface_Redraw();
  821.                   break;
  822.          case 'R':
  823.          case 'r':
  824.                   Interface_RefreshList();
  825.                   Interface_Redraw();
  826.                   Interface_InitList();
  827.                   break;
  828.          case KEY_CTRL_L:  // CTRL+L refresh the screen
  829.                   Interface_Redraw();
  830.                   break;
  831.          case 'q':
  832.          case 'Q':
  833.                   #ifdef DEBUG
  834.                      Debug_msg("Interface_Run_END");
  835.                   #endif
  836.                   {
  837.                      char answer;
  838.                      answer = Interface_PopUp("Do U really want to exit (y/n)?");
  839.                      if ((answer == 'y') || (answer == 'Y'))
  840.                         Interface_WExit("They are safe!!  for now... ");
  841.                   }
  842.                   break;
  843.          case KEY_F(10):
  844.                   #ifdef DEBUG
  845.                      Debug_msg("Interface_Run_END");
  846.                   #endif
  847.                   Interface_WExit("Quitting... ");
  848.                   break;
  849.          default:
  850.                   //beep();
  851.                   #ifdef DEBUG
  852.                      Debug_msg("KeyPress in octal: %o  in decimal: %d", KeyPress, KeyPress);
  853.                   #endif
  854.                   break;
  855.       }
  856.    }
  857. }
  858. void Interface_CloseScreen(void)
  859. {
  860. #ifdef DEBUG
  861.    Debug_msg("Interface_CloseScreen");
  862. #endif
  863.    clear();
  864.    refresh();
  865.    endwin();
  866. }
  867. void Interface_WExit(char *buffer)
  868. {
  869. #ifdef DEBUG
  870.    Debug_msg("Interface_WExit");
  871. #endif
  872.    if (ScreenMode) Interface_CloseScreen();
  873.    printf("n");
  874.    printf(buffer);
  875.    printf("nn");
  876.    exit(0);
  877. }
  878. #endif
  879. /* EOF */