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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- ncurses interface for data injector
  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. #ifdef HAVE_CTYPE_H
  26.    #include <ctype.h>
  27. #endif
  28. #include "include/ec_interface.h"
  29. #include "include/ec_interface_sniff_data.h"
  30. #include "include/ec_decodedata.h"
  31. #include "include/ec_error.h"
  32. #ifdef DEBUG
  33.    #include "include/ec_debug.h"
  34. #endif
  35. #define BOTTOM_COLOR 1        // color schemes
  36. #define TITLE_COLOR  2
  37. #define MAIN_COLOR   3
  38. #define POINT_COLOR  4
  39. #define SEL_COLOR    5
  40. #define HELP_COLOR   6
  41. #define SNIFF_COLOR  7
  42. // protos...
  43. void Interface_Inject_Redraw(void);
  44. int Interface_Inject_Run(u_char *inject_data, char proto, char *app);
  45. int strescape(char *src, char *dst);
  46. // global variables
  47. extern WINDOW *main_window;
  48. extern WINDOW *data_source_win, *data_dest_win, *data_source, *data_dest;
  49. extern int W_MAINX1, W_MAINY1, W_MAINX2, W_MAINY2;
  50. extern int W_BOTTOMY2;
  51. //---------------------------
  52. void Interface_Inject_Redraw(void)
  53. {
  54.    Interface_Sniff_Data_Redraw();
  55. #ifdef DEBUG
  56.    Debug_msg("Interface_Inject_Redraw");
  57. #endif
  58.    doupdate();
  59. }
  60. int Interface_Inject_Run(u_char *inject_data, char proto, char *app)
  61. {
  62.    WINDOW *inject_window, *i_win;
  63.    int dimY = 10;
  64.    int dimX = 60;
  65.    char inject_sequence[MAX_INJECT];
  66.    int len;
  67. #ifdef DEBUG
  68.    Debug_msg("Interface_Inject_Run -- %c %s", proto, app);
  69. #endif
  70.    i_win = newwin(dimY+2, dimX+2, W_BOTTOMY2/2 - dimY/2, W_MAINX2/2 - dimX/2);
  71.    inject_window = newwin(dimY, dimX, W_BOTTOMY2/2 - dimY/2 +1, W_MAINX2/2 - dimX/2 +1);
  72.    wbkgdset(i_win, COLOR_PAIR(HELP_COLOR));
  73.    wattron(i_win, A_BOLD);
  74.    box(i_win,ACS_VLINE,ACS_HLINE);
  75.    mvwprintw(i_win,  0, 2, "Type characters to be injected (max %d):", MAX_INJECT);
  76.    wbkgdset(inject_window, COLOR_PAIR(BOTTOM_COLOR));
  77.    wmove(inject_window, 0, 0);
  78.    echo();
  79.    scrollok(inject_window, TRUE);
  80.    keypad(inject_window, TRUE);
  81.    curs_set(TRUE);
  82.    wnoutrefresh(i_win);
  83.    wnoutrefresh(inject_window);
  84.    doupdate();
  85.    mvwgetnstr(inject_window, 1, 0, inject_sequence, MAX_INJECT);
  86. #ifdef DEBUG
  87.    Debug_msg("Interface_Inject_Run -- inject_sequence len -- [%d]", strlen(inject_sequence));
  88. #endif
  89.    noecho();
  90.    curs_set(FALSE);
  91.    delwin(i_win);
  92.    delwin(inject_window);
  93.    doupdate();
  94.    len = strescape(inject_sequence, inject_data);
  95. #ifdef DEBUG
  96.    Debug_msg("Interface_Inject_Run -- inject_data len -- [%d]", len);
  97. #endif
  98.    return len;
  99. }
  100. static int hextoint(int c)
  101. {
  102.    if (!isascii((u_char) c))       return (-1);
  103.    if (isdigit((u_char) c))        return (c - '0');
  104.    if ((c >= 'a') && (c <= 'f'))   return (c + 10 - 'a');
  105.    if ((c >= 'A') && (c <= 'F'))   return (c + 10 - 'A');
  106.    return (-1);
  107. }
  108. int strescape(char *src, char *dst)
  109. {
  110.    char  *olddst = dst;
  111.    int   c;
  112.    int   val;
  113. // if (dst != NULL)
  114. //    Error_msg("ec_interface_inject.c:%d dst must be NULL !", __LINE__);
  115. //
  116. // dst = (char *)calloc(strlen(src)+1, sizeof(char));
  117.    while ((c = *src++) != '')
  118.    {
  119.       if (c == '\')
  120.       {
  121.          switch ((c = *src++))
  122.          {
  123.             case '':
  124.                goto strend;
  125.             default:
  126.                *dst++ = (char) c;
  127.                break;
  128.             case 'n':
  129.                *dst++ = 'n';
  130.                break;
  131.             case 'r':
  132.                *dst++ = 'r';
  133.                break;
  134.             case 'b':
  135.                *dst++ = 'b';
  136.                break;
  137.             case 't':
  138.                *dst++ = 't';
  139.                break;
  140.             case 'f':
  141.                *dst++ = 'f';
  142.                break;
  143.             case 'v':
  144.                *dst++ = 'v';
  145.                break;
  146.             /*  and up to 3 octal digits */    // taken from magic.c part of dsniff source code...
  147.             case '0':
  148.             case '1':
  149.             case '2':
  150.             case '3':
  151.             case '4':
  152.             case '5':
  153.             case '6':
  154.             case '7':
  155.                val = c - '0';
  156.                c = *src++;  /* try for 2 */
  157.                if (c >= '0' && c <= '7') {
  158.                   val = (val << 3) | (c - '0');
  159.                   c = *src++;  /* try for 3 */
  160.                   if (c >= '0' && c <= '7')
  161.                      val = (val << 3) | (c - '0');
  162.                   else --src;
  163.                }
  164.                else --src;
  165.                *dst++ = (char) val;
  166.                break;
  167.             case 'x':
  168.                val = 'x';      /* Default if no digits */
  169.                c = hextoint(*src++);     /* Get next char */
  170.                if (c >= 0) {
  171.                        val = c;
  172.                        c = hextoint(*src++);
  173.                        if (c >= 0) val = (val << 4) + c;
  174.                        else --src;
  175.                }
  176.                else --src;
  177.                *dst++ = (char) val;
  178.                break;
  179.          }
  180.       }
  181.       else if (c == 8 || c == 263)  // the backspace
  182.          dst--;
  183.       else
  184.          *dst++ = (char) c;
  185.    }
  186. strend:
  187.    *dst = '';
  188.    return (dst - olddst);
  189. }
  190. #endif
  191. /* EOF */