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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- ncurses interface for data sniffing-logging
  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 <sys/time.h>
  21. #include <sys/types.h>
  22. #include <unistd.h>
  23. #include <signal.h>
  24. #include <time.h>
  25. #include "include/ec_interface.h"
  26. #include "include/ec_interface_inject.h"
  27. #include "include/ec_decodedata.h"
  28. #include "include/ec_dissector.h"
  29. #include "include/ec_doppleganger.h"
  30. #include "include/ec_illithid.h"
  31. #include "include/ec_buffer.h"
  32. #ifdef DEBUG
  33.    #include "include/ec_debug.h"
  34. #endif
  35. #define PAD_BUFFER 500        // buffered lines for sniffing
  36. #define BOTTOM_COLOR 1        // color schemes
  37. #define TITLE_COLOR  2
  38. #define MAIN_COLOR   3
  39. #define POINT_COLOR  4
  40. #define SEL_COLOR    5
  41. #define HELP_COLOR   6
  42. #define SNIFF_COLOR  7
  43. #define KEY_TAB      't'     // they aren't defined in ncurses.h :(
  44. #define KEY_RETURN   10
  45. #define KEY_CTRL_L   12
  46. #define ASCII_VIEW      0        // data in the sniffing windows...
  47. #define HEX_VIEW        1
  48. // protos...
  49. void Interface_Sniff_Data_Run(char *ipsource, int portsource, char *ipdest, int portdest, char *macsource, char *macdest, char proto, char *app, short mode);
  50. void Interface_Sniff_Data_Redraw(void);
  51. void Interface_Sniff_Data_KeyTab(char *ipsource, int portsource, char *ipdest, int portdest);
  52. void Interface_Sniff_Data_SniffData(char *source, char *dest, int portsource, int portdest, char proto);
  53. void Interface_Sniff_Data_LogToFile(char *ipsource, int portsource, char *ipdest, int portdest);
  54. void Interface_Sniff_Data_Winch(void);
  55. void Interface_Sniff_Data_StopCont(void);
  56. void Interface_Sniff_Data_View(short mode);
  57. void Interface_Sniff_Data_Scroll(short direction);
  58. void Interface_Sniff_Data_DrawScroller(void);
  59. void Interface_Sniff_Data_Inject(char proto, char *app);
  60. // global variables
  61. extern WINDOW *main_window, *bottom_window;
  62. WINDOW *data_source_win, *data_dest_win, *data_source, *data_dest;
  63. WINDOW *win_pointer;
  64. extern int W_MAINX1, W_MAINY1, W_MAINX2, W_MAINY2;
  65. extern int W_BOTTOMY2;
  66. extern int Conn_Pointer;
  67. short log_source, log_dest;
  68. short view;
  69. short stop = 0;
  70. short inject = -1;
  71. int inject_tod=0, inject_tos=0;
  72. short scroll_yd = 0, scroll_ys = 0;
  73. FILE *file_source, *file_dest;
  74. //---------------------------
  75. void Interface_Sniff_Data_Winch(void)  // TODO better handling...
  76. {
  77. #ifdef DEBUG
  78.    Debug_msg("Interface_Sniff_Data_WinchtTODO");
  79. #endif
  80.    Interface_Sniff_Data_Redraw();
  81. }
  82. void Interface_Sniff_Data_Redraw(void)
  83. {
  84.    Interface_Redraw();
  85. #ifdef DEBUG
  86.    Debug_msg("Interface_Sniff_Data_Redraw");
  87. #endif
  88.    redrawwin(data_dest_win);
  89.    redrawwin(data_source_win);
  90.    wnoutrefresh(data_dest_win);
  91.    wnoutrefresh(data_source_win);
  92.    pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  93.    pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  94.    doupdate();
  95. }
  96. void Interface_Sniff_Data_KeyTab(char *ipsource, int portsource, char *ipdest, int portdest)
  97. {
  98.    win_pointer = (win_pointer == data_source_win) ? data_dest_win : data_source_win;
  99.    wattroff(data_source_win, A_BOLD);
  100.    wattroff(data_dest_win, A_BOLD);
  101.    wattron(win_pointer, A_BOLD);
  102.    box(data_source_win,ACS_VLINE,ACS_HLINE);
  103.    box(data_dest_win,ACS_VLINE,ACS_HLINE);
  104.    mvwprintw(data_source_win, 0, 1, "%s:%d", ipsource, portsource);
  105.    mvwprintw(data_dest_win, 0, 1, "%s:%d", ipdest, portdest);
  106.    Interface_Sniff_Data_DrawScroller();
  107.    if (log_source) mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, W_MAINX2 / 2 - 10, "LOGGED");
  108.    if (log_dest) mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, W_MAINX2 / 2 - 10, "LOGGED");
  109.    switch(view)
  110.    {
  111.       case ASCII_VIEW:
  112.                         mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2, "ASCII");
  113.                         mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2, "ASCII");
  114.                         break;
  115.       case HEX_VIEW:
  116.                         mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2, "HEX");
  117.                         mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2, "HEX");
  118.                         break;
  119.    }
  120.    if (stop) mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2, "STOPPED");
  121.    if (stop) mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2, "STOPPED");
  122.    mvwprintw(win_pointer, 0, W_MAINX2 / 2 - 10, "active");
  123.    redrawwin(data_dest_win);
  124.    redrawwin(data_source_win);
  125.    wnoutrefresh(data_dest_win);
  126.    wnoutrefresh(data_source_win);
  127.    pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  128.    pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  129.    doupdate();
  130. }
  131. void Interface_Sniff_Data_LogToFile(char *ipsource, int portsource, char *ipdest, int portdest)
  132. {
  133.    WINDOW *question_window;
  134.    char question[100];
  135.    char filename[50];
  136.    char answer;
  137.    time_t tt;
  138.    struct tm *dd;
  139.    char date[8];
  140. #ifdef DEBUG
  141.    Debug_msg("Interface_Sniff_Data_LogToFile");
  142. #endif
  143.    tt = time(NULL);
  144.    dd = localtime(&tt);
  145.    sprintf(date, "%04d%02d%02d", dd->tm_year+1900, dd->tm_mon+1, dd->tm_mday);
  146.    if (win_pointer == data_source_win)
  147.    {
  148.       strcpy(question, "Do U want to log SOURCE-to-DEST to this file ? (y/n)");
  149.       sprintf(filename, "%s-%s:%d-%s:%d.log", date, ipsource, portsource, ipdest, portdest);
  150.    }
  151.    else
  152.    {
  153.       strcpy(question, "Do U want to log DEST-to-SOURCE to this file ? (y/n)");
  154.       sprintf(filename, "%s-%s:%d-%s:%d.log", date, ipdest, portdest, ipsource, portsource);
  155.    }
  156.    question_window = newwin(7, strlen(question) + 4,0,0);
  157.    mvwin(question_window, W_MAINY1+(W_MAINY2-W_MAINY1)/2-2, W_MAINX2/2 - (strlen(question)+4)/2 );
  158.    wbkgdset(question_window, COLOR_PAIR(TITLE_COLOR));
  159.    wattron(question_window, A_BOLD);
  160.    box(question_window,ACS_VLINE,ACS_HLINE);
  161.    mvwprintw(question_window,  2, 2, question);
  162.    wnoutrefresh(question_window);
  163.    doupdate();
  164.    wbkgdset(question_window, COLOR_PAIR(HELP_COLOR));
  165.    mvwprintw(question_window,  4, 7, filename);
  166.    answer = wgetch(question_window);
  167.    delwin(question_window);
  168.    if ( (answer == 'y') || (answer == 'Y') )
  169.    {
  170.       if (win_pointer == data_source_win)
  171.       {
  172.          file_source = fopen(filename, "a");
  173.          log_source = 1;
  174.          mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, W_MAINX2 / 2 - 10, "LOGGED");
  175.       }
  176.       else
  177.       {
  178.          file_dest = fopen(filename, "a");
  179.          log_dest = 1;
  180.          mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, W_MAINX2 / 2 - 10, "LOGGED");
  181.       }
  182.    }
  183.    else
  184.    {
  185.       if (win_pointer == data_source_win)
  186.       {
  187.          if (log_source) fclose(file_source);
  188.          log_source = 0;
  189.          wmove(data_source_win, W_MAINY2 - W_MAINY1 - 4, W_MAINX2 / 2 - 10);
  190.          whline(data_source_win, ACS_HLINE, 6);
  191.       }
  192.       else
  193.       {
  194.          if (log_dest) fclose(file_dest);
  195.          log_dest = 0;
  196.          wmove(data_dest_win, W_MAINY2 - W_MAINY1 - 4, W_MAINX2 / 2 - 10);
  197.          whline(data_dest_win, ACS_HLINE, 6);
  198.       }
  199.    }
  200. #ifdef DEBUG
  201.    Debug_msg("Interface_Sniff_Data_LogToFile returns -- %c", answer);
  202.    if ( (answer == 'y') || (answer == 'Y') ) Debug_msg("t %s", filename);
  203. #endif
  204.    Interface_Sniff_Data_Redraw();
  205. }
  206. void Interface_Sniff_Data_StopCont(void)
  207. {
  208. #ifdef DEBUG
  209.    Debug_msg("Interface_Sniff_Data_StopCont");
  210. #endif
  211.    if (stop == 0)
  212.    {
  213.       mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2, "STOPPED");
  214.       mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2, "STOPPED");
  215.       stop = 1;
  216.    }
  217.    else
  218.    {
  219.       wmove(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2);   whline(data_source_win, ACS_HLINE, 7);
  220.       wmove(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2); whline(data_dest_win, ACS_HLINE, 7);
  221.       Interface_Sniff_Data_View(view);
  222.       stop = 0;
  223.    }
  224.    redrawwin(data_dest_win);
  225.    redrawwin(data_source_win);
  226.    wnoutrefresh(data_dest_win);
  227.    wnoutrefresh(data_source_win);
  228.    pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  229.    pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  230.    doupdate();
  231. }
  232. void Interface_Sniff_Data_View(short mode)
  233. {
  234. #ifdef DEBUG
  235.    Debug_msg("Interface_Sniff_Data_View -- %d", mode);
  236. #endif
  237.    switch(mode)
  238.    {
  239.       case ASCII_VIEW:
  240.                         wmove(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2);   whline(data_source_win, ACS_HLINE, 7);
  241.                         wmove(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2); whline(data_dest_win, ACS_HLINE, 7);
  242.                         mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2, "ASCII");
  243.                         mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2, "ASCII");
  244.                         break;
  245.       case HEX_VIEW:
  246.                         wmove(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2);   whline(data_source_win, ACS_HLINE, 7);
  247.                         wmove(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2); whline(data_dest_win, ACS_HLINE, 7);
  248.                         mvwprintw(data_source_win, W_MAINY2 - W_MAINY1 - 4, 2, "HEX");
  249.                         mvwprintw(data_dest_win, W_MAINY2 - W_MAINY1 - 4, 2, "HEX");
  250.                         break;
  251.    }
  252.    view = mode;
  253.    redrawwin(data_dest_win);
  254.    redrawwin(data_source_win);
  255.    wnoutrefresh(data_dest_win);
  256.    wnoutrefresh(data_source_win);
  257.    pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  258.    pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  259.    doupdate();
  260. }
  261. void Interface_Sniff_Data_SniffData(char *source, char *dest, int portsource, int portdest, char proto)
  262. {
  263.    SNIFFED_DATA data_from_illithid;
  264.    int datalen;
  265.    memset(&data_from_illithid, 0, sizeof(SNIFFED_DATA));
  266.    datalen = Buffer_Get(pipe_with_illithid_data, &data_from_illithid, sizeof(SNIFFED_DATA));
  267.    if (datalen<=0)
  268.    {
  269.        usleep(1000);
  270.        return;
  271.    }
  272.    // Not from our stream
  273.    if (!Illithid_ToBeSniffed(source, portsource, dest, portdest, &data_from_illithid) || proto!=data_from_illithid.proto)
  274.        return;
  275.    if (!strcmp(source, data_from_illithid.ip_source))
  276.    {
  277.       if (log_source) { write(fileno(file_source), &data_from_illithid.data, data_from_illithid.datasize); fflush(file_source);}
  278.       if (!stop)
  279.          switch (view)
  280.          {
  281.             case ASCII_VIEW:
  282.                            wprintw(data_source, "%s", Decodedata_GetAsciiData(data_from_illithid.data, data_from_illithid.datasize));
  283.                            pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  284.                            break;
  285.             case HEX_VIEW:
  286.                            if (data_from_illithid.proto == 'T')
  287.                               wprintw(data_source, "n> S %lx A %lx (%s) <n%s",
  288.                                                 data_from_illithid.seq,
  289.                                                 data_from_illithid.ack_seq,
  290.                                                 Decodedata_TCPFlags(data_from_illithid.flags),
  291.                                                 Decodedata_GetHexData(data_from_illithid.data, data_from_illithid.datasize, W_MAINX2/2 - 4));
  292.                            else
  293.                               wprintw(data_source, "%s", Decodedata_GetHexData(data_from_illithid.data, data_from_illithid.datasize, W_MAINX2/2 - 4));
  294.                            pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  295.                            break;
  296.          }
  297.    }
  298.    else
  299.    {
  300.       if (log_dest) { write(fileno(file_dest), &data_from_illithid.data, data_from_illithid.datasize); fflush(file_dest);}
  301.       if (!stop)
  302.          switch (view)
  303.          {
  304.             case ASCII_VIEW:
  305.                            wprintw(data_dest, "%s", Decodedata_GetAsciiData(data_from_illithid.data, data_from_illithid.datasize));
  306.                            pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  307.                            break;
  308.             case HEX_VIEW:
  309.                            if (data_from_illithid.proto == 'T')
  310.                               wprintw(data_dest, "n> S %lx A %lx (%s) <n%s",
  311.                                                 data_from_illithid.seq,
  312.                                                 data_from_illithid.ack_seq,
  313.                                                 Decodedata_TCPFlags(data_from_illithid.flags),
  314.                                                 Decodedata_GetHexData(data_from_illithid.data, data_from_illithid.datasize, W_MAINX2/2 - 4));
  315.                            else
  316.                               wprintw(data_dest, "%s", Decodedata_GetHexData(data_from_illithid.data, data_from_illithid.datasize, W_MAINX2/2 - 4));
  317.                            pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  318.                            break;
  319.          }
  320.    }
  321.    if (inject == -1) inject = 0; // ok we have taken at least one packet
  322.    doupdate();
  323. }
  324. void Interface_Sniff_Data_DrawScroller(void)
  325. {
  326.    short sheight = (W_MAINY2-10)*(W_MAINY2-10)/PAD_BUFFER;
  327.    short svpos = (W_MAINY2-6)*scroll_ys/PAD_BUFFER;
  328.    short dvpos = (W_MAINY2-6)*scroll_yd/PAD_BUFFER;
  329.    sheight = (sheight < 1) ? 1 : sheight;
  330.    svpos = (svpos == 0) ? 1 : svpos;
  331.    svpos = (svpos > W_MAINY2-9-sheight) ? W_MAINY2-9-sheight : svpos;
  332.    dvpos = (dvpos == 0) ? 1 : dvpos;
  333.    dvpos = (dvpos > W_MAINY2-9-sheight) ? W_MAINY2-9-sheight : dvpos;
  334.    wattron(win_pointer, A_BOLD);
  335.    mvwvline(data_source_win, 1, W_MAINX2 / 2 - 3, ACS_VLINE, W_MAINY2-10);
  336.    wattron(data_source_win, A_REVERSE);
  337.    mvwvline(data_source_win, svpos, W_MAINX2 / 2 - 3, ' ', sheight);
  338.    wnoutrefresh(data_source_win);
  339.    wattroff(data_source_win, A_REVERSE);
  340.    mvwvline(data_dest_win, 1, W_MAINX2 / 2 - 3, ACS_VLINE, W_MAINY2-10);
  341.    wattron(data_dest_win, A_REVERSE);
  342.    mvwvline(data_dest_win, dvpos, W_MAINX2 / 2 - 3, ' ', sheight);
  343.    wnoutrefresh(data_dest_win);
  344.    wattroff(data_dest_win, A_REVERSE);
  345. }
  346. void Interface_Sniff_Data_Scroll(short direction)
  347. {
  348.    if (win_pointer == data_source_win)
  349.    {
  350.       scroll_ys += direction;
  351.       scroll_ys = (scroll_ys < 0) ? 0 : scroll_ys;
  352.       scroll_ys = (scroll_ys > PAD_BUFFER - (W_MAINY2-10)) ? PAD_BUFFER - (W_MAINY2-10) : scroll_ys;
  353.       pnoutrefresh(data_source, scroll_ys,0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 / 2 - 2);
  354.       Interface_Sniff_Data_DrawScroller();
  355.    }
  356.    else
  357.    {
  358.       scroll_yd += direction;
  359.       scroll_yd = (scroll_yd < 0) ? 0 : scroll_yd;
  360.       scroll_yd = (scroll_yd > PAD_BUFFER - (W_MAINY2-10)) ? PAD_BUFFER - (W_MAINY2-10) : scroll_yd;
  361.       pnoutrefresh(data_dest, scroll_yd,0, W_MAINY1 + 3, W_MAINX2 / 2 + 2, W_MAINY2 - 3 , W_MAINX2 - 2);
  362.       Interface_Sniff_Data_DrawScroller();
  363.    }
  364.    doupdate();
  365. }
  366. void Interface_Sniff_Data_Inject(char proto, char *app)
  367. {
  368.    char inject_data[MAX_INJECT];
  369.    int data_len;
  370.    char answer;
  371. #ifdef DEBUG
  372.    Debug_msg("Interface_Sniff_Data_Inject");
  373. #endif
  374.    if (inject == -1 && proto == 'T')
  375.    {
  376.       Interface_PopUp("Before injecting we need to sniff at least one packet...");
  377.       Interface_Sniff_Data_Redraw();
  378.       return;
  379.    }
  380.    if (inject == 0)
  381.    {
  382.       answer = Interface_PopUp("Do U really want to inject character in this connection (y/n)?");
  383.       Interface_Sniff_Data_Redraw();
  384.       if ((answer != 'y') && (answer != 'Y'))
  385.          return;
  386.    }
  387.    inject = 1;  // on exit the connection must be RSTted
  388.    memset(inject_data, 0, MAX_INJECT);
  389.    data_len = Interface_Inject_Run(inject_data, proto, app);
  390.    Interface_Sniff_Data_Redraw();
  391.    if (win_pointer == data_dest_win)
  392.    {
  393.       write(pipe_inject_stod[1], inject_data, data_len);
  394.       wmove(bottom_window, 1, 30);
  395.       wbkgdset(bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  396.       wprintw(bottom_window, "%d ", inject_tos += data_len);
  397.       wbkgdset(bottom_window, COLOR_PAIR(SNIFF_COLOR));
  398.       wprintw(bottom_window, "chars injected to %s", Host_Source.ip);
  399.    }
  400.    else
  401.    {
  402.       write(pipe_inject_dtos[1], inject_data, data_len);
  403.       wmove(bottom_window, 0, 30);
  404.       wbkgdset(bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  405.       wprintw(bottom_window, "%d ", inject_tod += data_len);
  406.       wbkgdset(bottom_window, COLOR_PAIR(SNIFF_COLOR));
  407.       wprintw(bottom_window, "chars injected to %s", Host_Dest.ip);
  408.    }
  409.    wnoutrefresh(bottom_window);
  410.    doupdate();
  411. }
  412. void Interface_Sniff_Data_Run(char *ipsource, int portsource, char *ipdest, int portdest, char *macsource, char *macdest, char proto, char *app, short mode)
  413. {
  414.    int KeyPress;
  415.    int dimY = W_MAINY2 - W_MAINY1 - 3;
  416.    int dimX = W_MAINX2 / 2 - 2;
  417.    fd_set msk_fd;
  418.    struct timeval TimeOut;
  419.    int Illithid_data_pid = 0, dopple_pid = 0;
  420.    Buffer_Flush(pipe_with_illithid_data);
  421.    pipe(pipe_inject_stod);
  422.    pipe(pipe_inject_dtos);
  423.    if ( mode <= PUBLICARP ) // PUBLICARP or ARPBASED
  424.    {
  425.       if ( mode == PUBLICARP )
  426.          dopple_pid = Doppleganger_Run(Options.netiface, ipsource, ipdest, macsource, macdest);
  427.       Illithid_data_pid = Illithid_ARPBased_GetData(Options.netiface, proto, ipsource, portsource, ipdest, portdest, macsource, macdest);
  428.    }
  429. #ifdef DEBUG
  430.    Debug_msg("Interface_Sniff_Data_Run -- %d -- %c [%s:%d] [%s:%d] [%s] [%s]", mode, proto, ipsource, portsource, ipdest, portdest, macsource, macdest );
  431. #endif
  432.    init_pair(SNIFF_COLOR, COLOR_CYAN, COLOR_BLACK);
  433.    data_source_win = newwin(dimY, dimX, W_MAINY1 + 2, 2);
  434.    data_dest_win = newwin(dimY, dimX, W_MAINY1 + 2, W_MAINX2 / 2 + 1);
  435.    data_source = newpad(PAD_BUFFER, dimX - 2);
  436.    data_dest = newpad(PAD_BUFFER, dimX - 2);
  437.    win_pointer = data_source_win;
  438.    wbkgdset(data_source_win, COLOR_PAIR(SNIFF_COLOR));
  439.    wbkgdset(data_dest_win, COLOR_PAIR(SNIFF_COLOR));
  440.    wattron(data_source_win, A_BOLD);
  441.    box(data_source_win,ACS_VLINE,ACS_HLINE);
  442.    box(data_dest_win,ACS_VLINE,ACS_HLINE);
  443.    mvwprintw(data_source_win, 0, 1, "%s:%d", ipsource, portsource);
  444.    mvwprintw(data_dest_win, 0, 1, "%s:%d", ipdest, portdest);
  445.    mvwprintw(data_source_win, 0, W_MAINX2 / 2 - 10, "active");
  446.    scrollok(data_source, TRUE);
  447.    scrollok(data_dest, TRUE);
  448.    scroll_yd = PAD_BUFFER - (W_MAINY2-10);
  449.    scroll_ys = PAD_BUFFER - (W_MAINY2-10);
  450.    wmove(data_source, scroll_ys, 0);
  451.    wmove(data_dest, scroll_yd, 0);
  452.    wbkgdset(main_window, COLOR_PAIR(MAIN_COLOR));
  453.    Interface_Sniff_Data_DrawScroller();
  454.    werase(main_window);
  455.    werase(bottom_window);
  456.    wmove(bottom_window, 0, 1);
  457.    wbkgdset(bottom_window, COLOR_PAIR(SNIFF_COLOR));
  458.    wprintw(bottom_window, "Protocol: ");
  459.    wbkgdset(bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  460.    if (proto == 'T')
  461.       wprintw(bottom_window, "TCP");
  462.    else
  463.       wprintw(bottom_window, "UDP");
  464.    wmove(bottom_window, 1, 1);
  465.    wbkgdset(bottom_window, COLOR_PAIR(SNIFF_COLOR));
  466.    wprintw(bottom_window, "Application: ");
  467.    wbkgdset(bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  468.    wprintw(bottom_window, app);
  469.    redrawwin(main_window);
  470.    wnoutrefresh(main_window);
  471.    wnoutrefresh(bottom_window);
  472.    wnoutrefresh(data_source_win);
  473.    wnoutrefresh(data_dest_win);
  474.    doupdate();
  475.    if (Options.hexview)
  476.    {
  477.       view = HEX_VIEW;
  478.       Options.hexview = 0;
  479.    }
  480.    Interface_Sniff_Data_View(view);    // default view
  481.    memset(&TimeOut, 0, sizeof(TimeOut));  //  timeout = 0
  482.    FD_ZERO(&msk_fd);
  483.    loop
  484.    {
  485.       FD_SET(0, &msk_fd);
  486.       select(FOPEN_MAX, &msk_fd, (fd_set *) 0, (fd_set *) 0, &TimeOut);
  487.       Interface_Sniff_Data_SniffData(ipsource, ipdest, portsource, portdest, proto);
  488.       if (FD_ISSET(0, &msk_fd))
  489.       {
  490.          KeyPress = wgetch(main_window);
  491.          switch (KeyPress)
  492.          {
  493.             case KEY_DOWN:
  494.                   Interface_Sniff_Data_Scroll( +1 );
  495.                   break;
  496.             case KEY_UP:
  497.                   Interface_Sniff_Data_Scroll( -1 );
  498.                   break;
  499.             case KEY_NPAGE:
  500.                   Interface_Sniff_Data_Scroll( W_MAINY2-10 );     //PGDOWN
  501.                   break;
  502.             case KEY_PPAGE:
  503.                   Interface_Sniff_Data_Scroll( -(W_MAINY2-10) );  //PGUP
  504.                   break;
  505.             case 'L':
  506.             case 'l':
  507.                   Interface_Sniff_Data_LogToFile(ipsource, portsource, ipdest, portdest);
  508.                   break;
  509.             case 'A':
  510.             case 'a':
  511.                   Interface_Sniff_Data_View(ASCII_VIEW);
  512.                   break;
  513.             case 'X':
  514.             case 'x':
  515.                   Interface_Sniff_Data_View(HEX_VIEW);
  516.                   break;
  517.             case 'S':
  518.             case 's':
  519.                   Interface_Sniff_Data_StopCont();
  520.                   break;
  521.             case 'I':
  522.             case 'i':
  523.                   if ( mode == ARPBASED )
  524.                   {
  525.                      if (strstr(app, "ssh") || strstr(app, "SSH"))
  526.                      {
  527.                         Interface_PopUp("You CAN'T inject in a crypted connection !!");
  528.                         Interface_Sniff_Data_Redraw();
  529.                      }
  530.                      else
  531.                         Interface_Sniff_Data_Inject(proto, app);
  532.                   }
  533.                   else
  534.                   {
  535.                      Interface_PopUp("Characters injection only supported in ARP Based mode !!");
  536.                      Interface_Sniff_Data_Redraw();
  537.                   }
  538.                   break;
  539.             case KEY_TAB:
  540.                   Interface_Sniff_Data_KeyTab(ipsource, portsource, ipdest, portdest);
  541.                   break;
  542.             case KEY_CTRL_L:  // CTRL+L refresh the screen
  543.                   Interface_Sniff_Data_Redraw();
  544.                   break;
  545.             case KEY_F(1):
  546.             case 'H':
  547.             case 'h':{
  548.                         static char *help[] = {
  549.                         "[qQ][F10] - quit (and stop sniffing)",
  550.                         "[tab]     - switch between window",
  551.                         "[pgUp]    - scroll back (as well as UpArrow)",
  552.                         "[pgDw]    - scroll forward (as well as DownArrow)",
  553.                         "[iI]      - inject characters in the connection",
  554.                         "[aA]      - ASCII view",
  555.                         "[xX]      - HEX view",
  556.                         "[sS]      - stop/cont the sniff (only visualization)",
  557.                         "[lL]      - Log to file",
  558.                         NULL};
  559.                         Interface_HelpWindow(help);
  560.                      }
  561.                      Interface_Sniff_Data_Redraw();
  562.                   break;
  563.             case KEY_F(10):
  564.             case 'Q':
  565.             case 'q':
  566.                      if (inject == 1 && proto == 'T')
  567.                      {
  568.                         char answer;
  569.                         answer = Interface_PopUp("If U exit now the connection will be ReSeTted!! continue (y/n)?");
  570.                         Interface_Sniff_Data_Redraw();
  571.                         if ((answer != 'y') && (answer != 'Y'))
  572.                            break;
  573.                         else
  574.                            strcpy(Conn_Between_Hosts[Conn_Pointer].status, "KILLED");
  575.                      }
  576.                      if (Illithid_data_pid) kill(Illithid_data_pid, SIGTERM);
  577.                      if (dopple_pid) kill(dopple_pid, SIGTERM);
  578.                      if (log_dest) fclose(file_dest);
  579.                      if (log_source) fclose(file_source);
  580.                      log_dest = log_source = 0;
  581.                      stop = 0;
  582.                      inject = -1;
  583.                      inject_tod=0; inject_tos=0;  // reset counter
  584.                      delwin(data_source_win);
  585.                      data_source_win = NULL;    // for winching (see ec_signal.c)
  586.                      wbkgdset(bottom_window, COLOR_PAIR(BOTTOM_COLOR));
  587.                      delwin(data_dest_win);
  588.                      delwin(data_source);
  589.                      delwin(data_dest);
  590.                      werase(bottom_window);
  591.                      wnoutrefresh(bottom_window);
  592.                      wnoutrefresh(main_window);
  593.                      doupdate();
  594.                      #ifdef DEBUG
  595.                         Debug_msg("Interface_Sniff_Data_End");
  596.                      #endif
  597.                      return;
  598.                   break;
  599.          }
  600.       }
  601.    }
  602. }
  603. #endif
  604. /* EOF */