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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- PlugIns module
  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 PERMIT_PLUGINS   // don't compile if plug-in not supported
  18. #include <dlfcn.h>
  19. #include <unistd.h>
  20. #include <stdarg.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <signal.h>
  25. #include <dirent.h>
  26. #include <sys/time.h>
  27. #include <errno.h>
  28. #include "include/ec_plugins.h"
  29. #include "include/ec_error.h"
  30. #ifdef HAVE_NCURSES
  31.    #include <ncurses.h>
  32.    #include "include/ec_interface_plugins.h"
  33.    extern WINDOW *plugin_window, *main_window;
  34.    extern short scroll_yp;
  35.    extern int W_MAINX1, W_MAINY1, W_MAINX2, W_MAINY2;
  36. #endif
  37. #ifdef DEBUG
  38.    #include "include/ec_debug.h"
  39. #endif
  40. #ifdef OPENBSD
  41. // The below define is a lie since we are really doing RTLD_LAZY since the
  42. // system doesn't support RTLD_NOW.
  43. #define RTLD_NOW 1
  44. #define RTLD_GLOBAL 0
  45. #endif
  46. PLUGINS *Plugins_list = NULL;
  47. // protos....
  48. int Plugin_Input(char *string, short size, short mode);
  49. void Plugin_Output(char *message, ...);
  50. void Plugin_SYS_Output(char *message, ...);
  51. void Plugin_RunPlugIn(char *name, char **argv);
  52. int Plugin_MakePlugList(void);
  53. char *Plugin_Getname(char *plugin);
  54. int Plugin_Input_GetChar_Block(char *string, short size);
  55. int Plugin_Input_GetChar_NonBlock(char *string, short size);
  56. // --------------------------
  57. void Plugin_RunPlugIn(char *name, char **argv)
  58. {
  59.    static void *handle;
  60.    char *Ette_Ver;
  61.    void (*Start)(char **);
  62. #ifdef DEBUG
  63.    Debug_msg("Plugin_RunPlugIn -- starting %s plugin", name);
  64. #endif
  65.    handle = dlopen(name, RTLD_NOW | RTLD_GLOBAL);
  66.    if (!handle)
  67.    {
  68.       #ifdef DEBUG
  69.          Debug_msg("Plugin_RunPlugIn -- dlopen() | %s", dlerror());
  70.       #endif
  71.       Plugin_SYS_Output("Error Opening %s... (dlopen)", name);
  72.       return;
  73.    }
  74.    Ette_Ver = dlsym(handle, "Ettercap_Version");
  75.    if (Ette_Ver == NULL || strcmp(Ette_Ver, VERSION) )
  76.    {
  77. Plugin_SYS_Output("This plugin is NOT compatible with ettercap %s", VERSION);
  78. Plugin_SYS_Output("It was compiled under ettercap %s", Ette_Ver);
  79. dlclose(handle);
  80. return;
  81.    }
  82.    Start = dlsym(handle, "PlugIn_Start");
  83.    if (Start == NULL)
  84.    {
  85.       #ifdef DEBUG
  86.          Debug_msg("Plugin_RunPlugIn -- dlsym() | %s", dlerror());
  87.       #endif
  88.       Plugin_SYS_Output("Error Opening %s... (dlsym)", name);
  89.       return;
  90.    }
  91.    Plugin_SYS_Output("Starting %s plugin...", name);
  92.    (*Start)(argv);   // lounch the plugin
  93.    if (!Options.normal)
  94.       Plugin_SYS_Output("%s plugin ended.  (press 'q' to quit...)", name);
  95.    else
  96.       Plugin_SYS_Output("%s plugin ended.", name);
  97.    dlclose(handle);
  98. #ifdef DEBUG
  99.    Debug_msg("Plugin_RunPlugIn -- shutting down %s plugin", name);
  100. #endif
  101. }
  102. int Plugin_Input(char *string, short size, short mode)
  103. {
  104.    int nchars;
  105.    if (mode == P_BLOCK)
  106.       nchars = Plugin_Input_GetChar_Block(string, size);
  107.    else // P_NONBLOCK
  108.       nchars = Plugin_Input_GetChar_NonBlock(string, size);
  109.    return nchars;
  110. }
  111. void Plugin_Output(char *message, ...)
  112. {
  113.    va_list ap;
  114.    char plug_output[250];  // should be enough
  115. #ifndef HAVE_VPRINTF
  116. #errors "Must have vsprintf()."
  117. #endif
  118.    va_start(ap, message);
  119.    vsnprintf(plug_output, 250, message, ap);
  120.    va_end(ap);
  121. #ifdef HAVE_NCURSES
  122.    if (!Options.normal)
  123.    {
  124.       wprintw(plugin_window, "%s", plug_output);
  125.       pnoutrefresh(plugin_window, scroll_yp, 0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 - 2);
  126.       doupdate();
  127.    }
  128.    else
  129. #endif
  130.    {
  131.       fprintf(stdout, "%s", plug_output);
  132.       fflush(stdout);
  133.    }
  134. }
  135. void Plugin_SYS_Output(char *message, ...)
  136. {
  137.    va_list ap;
  138.    char plug_output[250];  // should be enough
  139. #ifndef HAVE_VPRINTF
  140. #errors "Must have vsprintf()."
  141. #endif
  142.    va_start(ap, message);
  143.    vsnprintf(plug_output, 250, message, ap);
  144.    va_end(ap);
  145. #ifdef HAVE_NCURSES
  146.    if (!Options.normal)
  147.    {
  148.       #define HELP_COLOR 6
  149.       #define NORM_COLOR 1
  150.       wbkgdset(plugin_window, COLOR_PAIR(HELP_COLOR)); wattron(plugin_window, A_BOLD);
  151.       wprintw(plugin_window, "n%sn", plug_output);
  152.       wbkgdset(plugin_window, COLOR_PAIR(NORM_COLOR)); wattroff(plugin_window, A_BOLD);
  153.       pnoutrefresh(plugin_window, scroll_yp, 0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 - 2);
  154.       doupdate();
  155.    }
  156.    else
  157. #endif
  158.    {
  159.       fprintf(stdout, "n33[36m %s 33[0mn", plug_output);
  160.       fflush(stdout);
  161.    }
  162. }
  163. int Plugin_MakePlugList(void)
  164. {
  165.    struct dirent **namelist;
  166.    static void *handle;
  167.    char name[100];
  168.    char *Plug_Info;
  169.    char *Ette_Ver;
  170.    short *Plug_Ver;
  171.    short i, k, j=0;
  172.    #include "include/ec_install_path.h"   // char *path = "...";
  173.    #define MAX_PLUGIN 100
  174. #ifdef DEBUG
  175.       Debug_msg("Plugin_MakePlugList -- %s", path);
  176. #endif
  177.    if ( (Plugins_list = (PLUGINS *)calloc(MAX_PLUGIN, sizeof(PLUGINS))) == NULL)
  178.     Error_msg("ec_plugin:%d calloc() | ERRNO : %d | %s", __LINE__, errno, sys_errlist[errno]);
  179.    for(k=0; k<2; k++)
  180.    {
  181.       short n=0, m=0;
  182.       if (k)
  183.          m = scandir(path, &namelist, 0, alphasort);
  184.       else
  185.          n = scandir(".", &namelist, 0, alphasort);
  186.       if ( (n > 0) || (m > 0) )
  187.       {
  188.          short num;
  189.          if (k) num = m;
  190.          else num = n;
  191.           for(i=0; i<num; i++)
  192.             if ( strstr(namelist[i]->d_name, "ec_") && strstr(namelist[i]->d_name, ".so") )
  193.             {
  194.                Plugins_list[j].name = strdup(namelist[i]->d_name);
  195.                if (k) strcpy(name, path);
  196.                else strcpy(name, "./");
  197.                Plugins_list[j].path = strdup(name);
  198.                strcat(name, namelist[i]->d_name);
  199.                #ifdef DEBUG
  200.                   Debug_msg("t %s  %s", Plugins_list[j].path, Plugins_list[j].name );
  201.                #endif
  202.                handle = dlopen(name, RTLD_NOW | RTLD_GLOBAL);
  203.                if (handle)
  204.                {
  205.                   Plug_Info = dlsym(handle, "PlugIn_Info");
  206.                   if (Plug_Info == NULL)
  207.                      Plugins_list[j].description = strdup("No info available...");
  208.                   else
  209.                      Plugins_list[j].description = strdup(Plug_Info);
  210.                   Plug_Ver = dlsym(handle, "PlugIn_Version");
  211.                   if (Plug_Ver == NULL)
  212.                      Plugins_list[j].version = 0;
  213.                   else
  214.                      Plugins_list[j].version = (float)(*Plug_Ver)/10;
  215.                   Ette_Ver = dlsym(handle, "Ettercap_Version");
  216.                   if (Ette_Ver == NULL || strcmp(Ette_Ver, VERSION) )
  217.                      Plugins_list[j].description = strdup("Compiled under a different ettercap version");
  218.                   dlclose(handle);
  219.                }
  220.                else
  221.                {
  222.                   Plugins_list[j].version = -1;
  223.                   Plugins_list[j].description = strdup("Seems to be an invalid plugin...");
  224.                }
  225.                j++;
  226.                if (j == MAX_PLUGIN) return j;
  227.             }
  228.       }
  229.    }
  230.    return j;
  231. }
  232. char *Plugin_Getname(char *plugin)     // parses  "ec_dummy.so"  and return  "dummy"
  233. {
  234.    char *name;
  235.    name = strdup(plugin);
  236.    name[strlen(name)-3] = 0;
  237.    return name+3;
  238. }
  239. int Plugin_Input_GetChar_Block(char *string, short size)   // the real input
  240. {
  241.    int nchars=0;
  242.    #ifdef HAVE_NCURSES
  243.       if (!Options.normal)
  244.       {
  245.          pnoutrefresh(plugin_window, scroll_yp, 0, W_MAINY1 + 3, 3, W_MAINY2 - 3 , W_MAINX2 - 2);
  246.          doupdate();
  247.       }
  248.    #endif
  249.    memset(string, 0, size);
  250.    for(;;)
  251.    {
  252.       #ifdef HAVE_NCURSES
  253.          if (!Options.normal)
  254.          {
  255.             int c = 0;
  256.             static int p_text = 0;
  257.             static char text[200] = "";
  258.             c = wgetch(main_window);
  259.             if ( c == 8 || c == 263 || c == KEY_BACKSPACE)  // BACKSPACE
  260.             {
  261.                plugin_window->_curx--;
  262.                pechochar(plugin_window, ' ');
  263.                plugin_window->_curx--;
  264.                text[p_text] = 0;
  265.                if ( p_text > 0 ) p_text--;
  266.             }
  267.             else
  268.             {
  269.                pechochar(plugin_window, c);
  270.                if (p_text < 200) text[p_text++] = c;
  271.             }
  272.             if ( c == 'n')
  273.             {
  274.                strcpy(string, text);
  275.                memset(text, 0, 200);
  276.                nchars = p_text;
  277.                p_text = 0;
  278.                string[strlen(string)-1] = 0;  // remove the n
  279.                break;
  280.             }
  281.          }
  282.          else
  283.       #endif
  284.          {
  285.             read(0, string + nchars, 1);
  286.             if (string[nchars] == 8)
  287.             {
  288.                nchars -= 2;
  289.                string[nchars+1] = 0;
  290.             }
  291.          }
  292.       if (nchars++ >= size || string[nchars-1] == 'n')
  293.          break;
  294.    }
  295.    return nchars;
  296. }
  297. int Plugin_Input_GetChar_NonBlock(char *string, short size)   // the real input
  298. {
  299.    int nchars=0;
  300.    fd_set msk_fd;
  301.    struct timeval TimeOut;
  302.    memset(&TimeOut, 0, sizeof(TimeOut));  //  timeout = 0
  303.    FD_ZERO(&msk_fd);
  304.    for(;;)
  305.    {
  306.       FD_SET(0, &msk_fd);
  307.       select(FOPEN_MAX, &msk_fd, (fd_set *) 0, (fd_set *) 0, &TimeOut);
  308.       if (FD_ISSET(0, &msk_fd))
  309.       {
  310.          #ifdef HAVE_NCURSES
  311.             if (!Options.normal)
  312.             {
  313.                int c = 0;
  314.                static int p_text = 0;
  315.                static char text[200] = "";
  316.                c = wgetch(main_window);
  317.                if ( c == 8 || c == 263 || c == KEY_BACKSPACE)  // BACKSPACE
  318.                {
  319.                   plugin_window->_curx--;
  320.                   pechochar(plugin_window, ' ');
  321.                   plugin_window->_curx--;
  322.                   text[p_text] = 0;
  323.                   if ( p_text > 0 ) p_text--;
  324.                }
  325.                else
  326.                {
  327.                   pechochar(plugin_window, c);
  328.                   if (p_text < 200) text[p_text++] = c;
  329.                }
  330.                if ( c == 'n')
  331.                {
  332.                   strcpy(string, text);
  333.                   memset(text, 0, 200);
  334.                   nchars = p_text;
  335.                   p_text = 0;
  336.                   string[strlen(string)-1] = 0;  // remove the n
  337.                   break;
  338.                }
  339.             }
  340.             else
  341.          #endif
  342.             {
  343.                read(0, string + nchars, 1);
  344.                if (string[nchars] == 8)
  345.                {
  346.                   nchars -= 2;
  347.                   string[nchars+1] = 0;
  348.                }
  349.             }
  350.          if (nchars++ >= size || string[nchars-1] == 'n')
  351.             break;
  352.       }
  353.       else                    // no input
  354.           break;
  355.    }
  356.    return nchars;
  357. }
  358. #endif   // PERMIT_PLUGINS
  359. /* EOF */